commit 9087393c01727e730129c65a4f73a81791c24274
parent d432698502ccba62d9c4a8236f84c33f823bf27e
Author: triesap <tyson@radroots.org>
Date: Mon, 22 Dec 2025 03:23:40 +0000
events: make models no_std-ready and align timestamps
- make `radroots-events` no_std/alloc-friendly with gated serde/typeshare/ts-rs derives and core feature propagation
- add a typeshare-only kinds view and refresh generated TS bindings
- compat: post/profile published_at now u32; codecs and nostr adapters use saturating timestamp conversion
Diffstat:
22 files changed, 189 insertions(+), 90 deletions(-)
diff --git a/events-codec/src/post/decode.rs b/events-codec/src/post/decode.rs
@@ -37,7 +37,7 @@ pub fn metadata_from_event(
Ok(RadrootsPostEventMetadata {
id,
author,
- published_at: published_at as u64,
+ published_at,
kind,
post,
})
diff --git a/events-codec/src/profile/decode.rs b/events-codec/src/profile/decode.rs
@@ -68,7 +68,7 @@ pub fn metadata_from_event(
Ok(RadrootsProfileEventMetadata {
id,
author,
- published_at: published_at as u64,
+ published_at,
kind,
profile,
})
diff --git a/events/Cargo.toml b/events/Cargo.toml
@@ -9,13 +9,13 @@ build = "build.rs"
[features]
default = ["std", "serde", "ts-rs", "typeshare"]
-std = []
-serde = ["dep:serde"]
+std = ["radroots-core/std"]
+serde = ["dep:serde", "radroots-core/serde"]
ts-rs = ["dep:ts-rs"]
-typeshare = ["dep:typeshare"]
+typeshare = ["dep:typeshare", "radroots-core/typeshare"]
[dependencies]
-radroots-core = { workspace = true, default-features = false, features = ["std", "serde", "typeshare"] }
+radroots-core = { workspace = true, default-features = false }
serde = { workspace = true, default-features = false, features = ["alloc", "derive"], optional = true }
ts-rs = { workspace = true, optional = true }
typeshare = { workspace = true, optional = true }
diff --git a/events/bindings/ts/src/types.ts b/events/bindings/ts/src/types.ts
@@ -72,13 +72,13 @@ export type RadrootsPost = { content: string, };
export type RadrootsPostEventIndex = { event: RadrootsNostrEvent, metadata: RadrootsPostEventMetadata, };
-export type RadrootsPostEventMetadata = { id: string, author: string, published_at: bigint, kind: number, post: RadrootsPost, };
+export type RadrootsPostEventMetadata = { id: string, author: string, published_at: number, kind: number, post: RadrootsPost, };
export type RadrootsProfile = { name: string, display_name?: string | null, nip05?: string | null, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, lud06?: string | null, lud16?: string | null, bot?: string | null, };
export type RadrootsProfileEventIndex = { event: RadrootsNostrEvent, metadata: RadrootsProfileEventMetadata, };
-export type RadrootsProfileEventMetadata = { id: string, author: string, published_at: bigint, kind: number, profile: RadrootsProfile, };
+export type RadrootsProfileEventMetadata = { id: string, author: string, published_at: number, kind: number, profile: RadrootsProfile, };
export type RadrootsReaction = { root: RadrootsNostrEventRef, content: string, };
diff --git a/events/src/comment.rs b/events/src/comment.rs
@@ -1,12 +1,15 @@
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
use crate::{RadrootsNostrEvent, RadrootsNostrEventRef};
+#[cfg(not(feature = "std"))]
+use alloc::string::String;
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsCommentEventIndex {
pub event: RadrootsNostrEvent,
pub metadata: RadrootsCommentEventMetadata,
@@ -14,7 +17,8 @@ pub struct RadrootsCommentEventIndex {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsCommentEventMetadata {
pub id: String,
pub author: String,
@@ -25,7 +29,8 @@ pub struct RadrootsCommentEventMetadata {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsComment {
pub root: RadrootsNostrEventRef,
pub parent: RadrootsNostrEventRef,
diff --git a/events/src/follow.rs b/events/src/follow.rs
@@ -1,11 +1,14 @@
use crate::RadrootsNostrEvent;
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
+#[cfg(not(feature = "std"))]
+use alloc::{string::String, vec::Vec};
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsFollowEventIndex {
pub event: RadrootsNostrEvent,
pub metadata: RadrootsFollowEventMetadata,
@@ -13,7 +16,8 @@ pub struct RadrootsFollowEventIndex {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsFollowEventMetadata {
pub id: String,
pub author: String,
@@ -24,14 +28,16 @@ pub struct RadrootsFollowEventMetadata {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsFollow {
pub list: Vec<RadrootsFollowProfile>,
}
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsFollowProfile {
pub published_at: u32,
pub public_key: String,
diff --git a/events/src/job.rs b/events/src/job.rs
@@ -1,11 +1,14 @@
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
+#[cfg(not(feature = "std"))]
+use alloc::string::String;
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Copy)]
-#[serde(rename_all = "snake_case")]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
+#[derive(Clone, Debug, PartialEq, Eq, Copy)]
pub enum JobInputType {
Url,
Event,
@@ -15,8 +18,9 @@ pub enum JobInputType {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Copy)]
-#[serde(rename_all = "snake_case")]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
+#[derive(Clone, Debug, PartialEq, Eq, Copy)]
pub enum JobFeedbackStatus {
PaymentRequired,
Processing,
@@ -27,7 +31,8 @@ pub enum JobFeedbackStatus {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug, PartialEq, Eq)]
pub struct JobPaymentRequest {
pub amount_sat: u32,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
diff --git a/events/src/job_feedback.rs b/events/src/job_feedback.rs
@@ -1,4 +1,3 @@
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
@@ -7,9 +6,13 @@ use crate::{
job::{JobFeedbackStatus, JobPaymentRequest},
};
+#[cfg(not(feature = "std"))]
+use alloc::string::String;
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsJobFeedbackEventIndex {
pub event: RadrootsNostrEvent,
pub metadata: RadrootsJobFeedbackEventMetadata,
@@ -17,7 +20,8 @@ pub struct RadrootsJobFeedbackEventIndex {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsJobFeedbackEventMetadata {
pub id: String,
pub author: String,
@@ -28,7 +32,8 @@ pub struct RadrootsJobFeedbackEventMetadata {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RadrootsJobFeedback {
pub kind: u16,
pub status: JobFeedbackStatus,
diff --git a/events/src/job_request.rs b/events/src/job_request.rs
@@ -1,12 +1,15 @@
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
use crate::{RadrootsNostrEvent, job::JobInputType};
+#[cfg(not(feature = "std"))]
+use alloc::{string::String, vec::Vec};
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsJobRequestEventIndex {
pub event: RadrootsNostrEvent,
pub metadata: RadrootsJobRequestEventMetadata,
@@ -14,7 +17,8 @@ pub struct RadrootsJobRequestEventIndex {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsJobRequestEventMetadata {
pub id: String,
pub author: String,
@@ -25,7 +29,8 @@ pub struct RadrootsJobRequestEventMetadata {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RadrootsJobInput {
pub data: String,
pub input_type: JobInputType,
@@ -37,7 +42,8 @@ pub struct RadrootsJobInput {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RadrootsJobParam {
pub key: String,
pub value: String,
@@ -45,7 +51,8 @@ pub struct RadrootsJobParam {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RadrootsJobRequest {
pub kind: u16,
pub inputs: Vec<RadrootsJobInput>,
diff --git a/events/src/job_result.rs b/events/src/job_result.rs
@@ -1,4 +1,3 @@
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
@@ -7,9 +6,13 @@ use crate::{
job_request::RadrootsJobInput,
};
+#[cfg(not(feature = "std"))]
+use alloc::{string::String, vec::Vec};
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsJobResultEventIndex {
pub event: RadrootsNostrEvent,
pub metadata: RadrootsJobResultEventMetadata,
@@ -17,7 +20,8 @@ pub struct RadrootsJobResultEventIndex {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsJobResultEventMetadata {
pub id: String,
pub author: String,
@@ -28,7 +32,8 @@ pub struct RadrootsJobResultEventMetadata {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RadrootsJobResult {
pub kind: u16,
pub request_event: RadrootsNostrEventPtr,
diff --git a/events/src/kinds.rs b/events/src/kinds.rs
@@ -1,15 +1,15 @@
-#[typeshare::typeshare]
+#[cfg_attr(feature = "typeshare", typeshare::typeshare)]
pub const KIND_APPLICATION_HANDLER: u32 = 31990;
-#[typeshare::typeshare]
+#[cfg_attr(feature = "typeshare", typeshare::typeshare)]
pub const KIND_JOB_REQUEST_MIN: u32 = 5000;
-#[typeshare::typeshare]
+#[cfg_attr(feature = "typeshare", typeshare::typeshare)]
pub const KIND_JOB_REQUEST_MAX: u32 = 5999;
-#[typeshare::typeshare]
+#[cfg_attr(feature = "typeshare", typeshare::typeshare)]
pub const KIND_JOB_RESULT_MIN: u32 = 6000;
-#[typeshare::typeshare]
+#[cfg_attr(feature = "typeshare", typeshare::typeshare)]
pub const KIND_JOB_RESULT_MAX: u32 = 6999;
-#[typeshare::typeshare]
+#[cfg_attr(feature = "typeshare", typeshare::typeshare)]
pub const KIND_JOB_FEEDBACK: u32 = 7000;
#[inline]
diff --git a/events/src/lib.rs b/events/src/lib.rs
@@ -1,3 +1,14 @@
+#![cfg_attr(not(feature = "std"), no_std)]
+#![forbid(unsafe_code)]
+#[cfg(not(feature = "std"))]
+extern crate alloc;
+
+#[cfg(feature = "ts-rs")]
+use ts_rs::TS;
+
+#[cfg(not(feature = "std"))]
+use alloc::{string::String, vec::Vec};
+
pub mod comment;
pub mod follow;
pub mod job;
@@ -12,13 +23,10 @@ pub mod reaction;
pub mod relay_document;
pub mod tags;
-use serde::{Deserialize, Serialize};
-#[cfg(feature = "ts-rs")]
-use ts_rs::TS;
-
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsNostrEvent {
pub id: String,
pub author: String,
@@ -31,7 +39,8 @@ pub struct RadrootsNostrEvent {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsNostrEventRef {
pub id: String,
pub author: String,
@@ -44,7 +53,8 @@ pub struct RadrootsNostrEventRef {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RadrootsNostrEventPtr {
pub id: String,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
diff --git a/events/src/listing.rs b/events/src/listing.rs
@@ -2,15 +2,18 @@ use radroots_core::{
RadrootsCoreDiscountValue, RadrootsCoreMoney, RadrootsCorePercent, RadrootsCoreQuantity,
RadrootsCoreQuantityPrice,
};
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
use crate::RadrootsNostrEvent;
+#[cfg(not(feature = "std"))]
+use alloc::{string::String, vec::Vec};
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsListingEventIndex {
pub event: RadrootsNostrEvent,
pub metadata: RadrootsListingEventMetadata,
@@ -18,7 +21,8 @@ pub struct RadrootsListingEventIndex {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsListingEventMetadata {
pub id: String,
pub author: String,
@@ -29,7 +33,8 @@ pub struct RadrootsListingEventMetadata {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsListing {
pub d_tag: String,
pub product: RadrootsListingProduct,
@@ -55,7 +60,8 @@ pub struct RadrootsListing {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsListingProduct {
pub key: String,
pub title: String,
@@ -76,7 +82,8 @@ pub struct RadrootsListingProduct {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsListingQuantity {
#[cfg_attr(feature = "ts-rs", ts(type = "RadrootsCoreQuantity"))]
pub value: RadrootsCoreQuantity,
@@ -88,8 +95,9 @@ pub struct RadrootsListingQuantity {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
-#[serde(rename_all = "snake_case", tag = "kind", content = "amount")]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "snake_case", tag = "kind", content = "amount"))]
+#[derive(Clone, Debug)]
pub enum RadrootsListingDiscount {
Quantity {
ref_quantity: String,
@@ -120,7 +128,8 @@ pub enum RadrootsListingDiscount {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsListingLocation {
pub primary: String,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
@@ -139,7 +148,8 @@ pub struct RadrootsListingLocation {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsListingImage {
pub url: String,
#[cfg_attr(
@@ -151,7 +161,8 @@ pub struct RadrootsListingImage {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsListingImageSize {
pub w: u32,
pub h: u32,
diff --git a/events/src/post.rs b/events/src/post.rs
@@ -1,11 +1,14 @@
use crate::RadrootsNostrEvent;
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
+#[cfg(not(feature = "std"))]
+use alloc::string::String;
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsPostEventIndex {
pub event: RadrootsNostrEvent,
pub metadata: RadrootsPostEventMetadata,
@@ -13,18 +16,20 @@ pub struct RadrootsPostEventIndex {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsPostEventMetadata {
pub id: String,
pub author: String,
- pub published_at: u64,
+ pub published_at: u32,
pub kind: u32,
pub post: RadrootsPost,
}
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsPost {
pub content: String,
}
diff --git a/events/src/profile.rs b/events/src/profile.rs
@@ -1,11 +1,14 @@
use crate::RadrootsNostrEvent;
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
+#[cfg(not(feature = "std"))]
+use alloc::string::String;
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsProfileEventIndex {
pub event: RadrootsNostrEvent,
pub metadata: RadrootsProfileEventMetadata,
@@ -13,18 +16,20 @@ pub struct RadrootsProfileEventIndex {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsProfileEventMetadata {
pub id: String,
pub author: String,
- pub published_at: u64,
+ pub published_at: u32,
pub kind: u32,
pub profile: RadrootsProfile,
}
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsProfile {
pub name: String,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
diff --git a/events/src/reaction.rs b/events/src/reaction.rs
@@ -1,11 +1,14 @@
use crate::{RadrootsNostrEvent, RadrootsNostrEventRef};
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
+#[cfg(not(feature = "std"))]
+use alloc::string::String;
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsReactionEventIndex {
pub event: RadrootsNostrEvent,
pub metadata: RadrootsReactionEventMetadata,
@@ -13,7 +16,8 @@ pub struct RadrootsReactionEventIndex {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsReactionEventMetadata {
pub id: String,
pub author: String,
@@ -24,7 +28,8 @@ pub struct RadrootsReactionEventMetadata {
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsReaction {
pub root: RadrootsNostrEventRef,
pub content: String,
diff --git a/events/src/relay_document.rs b/events/src/relay_document.rs
@@ -1,23 +1,26 @@
-use serde::{Deserialize, Serialize};
#[cfg(feature = "ts-rs")]
use ts_rs::TS;
+#[cfg(not(feature = "std"))]
+use alloc::{string::String, vec::Vec};
+
#[cfg_attr(feature = "ts-rs", derive(TS))]
#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))]
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
+#[derive(Clone, Debug)]
pub struct RadrootsRelayDocument {
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
- name: Option<String>,
+ pub name: Option<String>,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
- description: Option<String>,
+ pub description: Option<String>,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
- pubkey: Option<String>,
+ pub pubkey: Option<String>,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
- contact: Option<String>,
+ pub contact: Option<String>,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "number[] | null"))]
- supported_nips: Option<Vec<u16>>,
+ pub supported_nips: Option<Vec<u16>>,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
- software: Option<String>,
+ pub software: Option<String>,
#[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))]
- version: Option<String>,
+ pub version: Option<String>,
}
diff --git a/events/src/typeshare_kinds.rs b/events/src/typeshare_kinds.rs
@@ -0,0 +1,15 @@
+// Typeshare-only view for kind constants; this file is not part of the crate module tree.
+
+#[typeshare::typeshare]
+pub const KIND_APPLICATION_HANDLER: u32 = 31990;
+
+#[typeshare::typeshare]
+pub const KIND_JOB_REQUEST_MIN: u32 = 5000;
+#[typeshare::typeshare]
+pub const KIND_JOB_REQUEST_MAX: u32 = 5999;
+#[typeshare::typeshare]
+pub const KIND_JOB_RESULT_MIN: u32 = 6000;
+#[typeshare::typeshare]
+pub const KIND_JOB_RESULT_MAX: u32 = 6999;
+#[typeshare::typeshare]
+pub const KIND_JOB_FEEDBACK: u32 = 7000;
diff --git a/nostr/Cargo.toml b/nostr/Cargo.toml
@@ -11,7 +11,7 @@ default = ["std", "sdk"]
std = []
sdk = ["dep:nostr-sdk"]
codec = ["dep:radroots-events", "dep:radroots-events-codec"]
-events = ["dep:radroots-events"]
+events = ["dep:radroots-events", "radroots-events/std", "radroots-events/serde"]
http = ["dep:reqwest"]
[dependencies]
diff --git a/nostr/src/codec_adapters.rs b/nostr/src/codec_adapters.rs
@@ -7,6 +7,7 @@ use radroots_events_codec::job::{
error::JobParseError, feedback::decode as fb_decode, request::decode as req_decode,
result::decode as res_decode,
};
+use crate::util::created_at_u32_saturating;
fn event_id(e: &Event) -> String {
e.id.to_hex()
@@ -17,7 +18,7 @@ fn author(e: &Event) -> String {
}
fn published_at(e: &Event) -> u32 {
- e.created_at.as_u64() as u32
+ created_at_u32_saturating(e.created_at)
}
fn kind_u32(e: &Event) -> u32 {
diff --git a/nostr/src/event_adapters.rs b/nostr/src/event_adapters.rs
@@ -7,11 +7,14 @@ use radroots_events::profile::{RadrootsProfile, RadrootsProfileEventMetadata};
use nostr::event::Event;
#[cfg(feature = "events")]
+use crate::util::created_at_u32_saturating;
+
+#[cfg(feature = "events")]
pub fn to_post_event_metadata(e: &Event) -> RadrootsPostEventMetadata {
RadrootsPostEventMetadata {
id: e.id.to_string(),
author: e.pubkey.to_string(),
- published_at: e.created_at.as_u64(),
+ published_at: created_at_u32_saturating(e.created_at),
kind: e.kind.as_u16() as u32,
post: RadrootsPost {
content: e.content.clone(),
@@ -25,7 +28,7 @@ pub fn to_profile_event_metadata(e: &Event) -> Option<RadrootsProfileEventMetada
return Some(RadrootsProfileEventMetadata {
id: e.id.to_string(),
author: e.pubkey.to_string(),
- published_at: e.created_at.as_u64(),
+ published_at: created_at_u32_saturating(e.created_at),
kind: e.kind.as_u16() as u32,
profile: p,
});
@@ -47,7 +50,7 @@ pub fn to_profile_event_metadata(e: &Event) -> Option<RadrootsProfileEventMetada
return Some(RadrootsProfileEventMetadata {
id: e.id.to_string(),
author: e.pubkey.to_string(),
- published_at: e.created_at.as_u64(),
+ published_at: created_at_u32_saturating(e.created_at),
kind: e.kind.as_u16() as u32,
profile: p,
});
diff --git a/nostr/src/util.rs b/nostr/src/util.rs
@@ -1,9 +1,17 @@
-use nostr::{key::PublicKey, nips::nip19::ToBech32};
+use nostr::{event::Event, key::PublicKey, nips::nip19::ToBech32, Timestamp};
pub fn npub_string(pk: &PublicKey) -> Option<String> {
pk.to_bech32().ok()
}
+pub fn created_at_u32_saturating(ts: Timestamp) -> u32 {
+ u32::try_from(ts.as_u64()).unwrap_or(u32::MAX)
+}
+
+pub fn event_created_at_u32_saturating(event: &Event) -> u32 {
+ created_at_u32_saturating(event.created_at)
+}
+
#[cfg(feature = "http")]
pub fn ws_to_http(ws: &str) -> Option<String> {
let mut u = reqwest::Url::parse(ws).ok()?;