lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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:
Mevents-codec/src/post/decode.rs | 2+-
Mevents-codec/src/profile/decode.rs | 2+-
Mevents/Cargo.toml | 8++++----
Mevents/bindings/ts/src/types.ts | 4++--
Mevents/src/comment.rs | 13+++++++++----
Mevents/src/follow.rs | 16+++++++++++-----
Mevents/src/job.rs | 17+++++++++++------
Mevents/src/job_feedback.rs | 13+++++++++----
Mevents/src/job_request.rs | 19+++++++++++++------
Mevents/src/job_result.rs | 13+++++++++----
Mevents/src/kinds.rs | 12++++++------
Mevents/src/lib.rs | 24+++++++++++++++++-------
Mevents/src/listing.rs | 33++++++++++++++++++++++-----------
Mevents/src/post.rs | 15++++++++++-----
Mevents/src/profile.rs | 15++++++++++-----
Mevents/src/reaction.rs | 13+++++++++----
Mevents/src/relay_document.rs | 21++++++++++++---------
Aevents/src/typeshare_kinds.rs | 15+++++++++++++++
Mnostr/Cargo.toml | 2+-
Mnostr/src/codec_adapters.rs | 3++-
Mnostr/src/event_adapters.rs | 9++++++---
Mnostr/src/util.rs | 10+++++++++-
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()?;