From 404e2ddfe8a56705f43b39248e041cb33e6ef582 Mon Sep 17 00:00:00 2001 From: Yuki Kishimoto Date: Fri, 24 Jan 2025 09:42:39 +0100 Subject: [PATCH] sdk: add redb example Signed-off-by: Yuki Kishimoto --- Cargo.lock | 1 + crates/nostr-sdk/Cargo.toml | 4 ++ crates/nostr-sdk/examples/redb.rs | 63 +++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 crates/nostr-sdk/examples/redb.rs diff --git a/Cargo.lock b/Cargo.lock index ba5f427fa..48789af61 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2830,6 +2830,7 @@ dependencies = [ "nostr-indexeddb", "nostr-lmdb", "nostr-ndb", + "nostr-redb", "nostr-relay-pool", "tokio", "tracing", diff --git a/crates/nostr-sdk/Cargo.toml b/crates/nostr-sdk/Cargo.toml index 05b5611f3..b310c6128 100644 --- a/crates/nostr-sdk/Cargo.toml +++ b/crates/nostr-sdk/Cargo.toml @@ -53,6 +53,7 @@ nostr-indexeddb = { workspace = true, optional = true } [dev-dependencies] nostr-connect.workspace = true +nostr-redb.workspace = true tokio = { workspace = true, features = ["macros"] } tracing-subscriber = { workspace = true, features = ["env-filter"] } @@ -88,6 +89,9 @@ required-features = ["all-nips"] name = "nostrdb" required-features = ["ndb"] +[[example]] +name = "redb" + [[example]] name = "stream-events" diff --git a/crates/nostr-sdk/examples/redb.rs b/crates/nostr-sdk/examples/redb.rs new file mode 100644 index 000000000..3874f75a7 --- /dev/null +++ b/crates/nostr-sdk/examples/redb.rs @@ -0,0 +1,63 @@ +// Copyright (c) 2022-2023 Yuki Kishimoto +// Copyright (c) 2023-2024 Rust Nostr Developers +// Distributed under the MIT software license + +use nostr_redb::NostrRedb; +use nostr_sdk::prelude::*; + +#[tokio::main] +async fn main() -> Result<()> { + tracing_subscriber::fmt::init(); + + let keys = Keys::parse("nsec1ufnus6pju578ste3v90xd5m2decpuzpql2295m3sknqcjzyys9ls0qlc85")?; + + let database = NostrRedb::persistent("./db/nostr-redb")?; + let client: Client = ClientBuilder::default() + .signer(keys.clone()) + .database(database) + .build(); + + client.add_relay("wss://relay.damus.io").await?; + client.add_relay("wss://nostr.wine").await?; + client.add_relay("wss://nostr.oxtr.dev").await?; + + client.connect().await; + + // Publish a text note + let builder = EventBuilder::text_note("Hello world"); + client.send_event_builder(builder).await?; + + // Negentropy sync + let filter = Filter::new().author(keys.public_key()); + let (tx, mut rx) = SyncProgress::channel(); + let opts = SyncOptions::default().progress(tx); + + tokio::spawn(async move { + while rx.changed().await.is_ok() { + let progress = *rx.borrow_and_update(); + if progress.total > 0 { + println!("{:.2}%", progress.percentage() * 100.0); + } + } + }); + let output = client.sync(filter, &opts).await?; + + println!("Local: {}", output.local.len()); + println!("Remote: {}", output.remote.len()); + println!("Sent: {}", output.sent.len()); + println!("Received: {}", output.received.len()); + println!("Failures:"); + for (url, map) in output.send_failures.iter() { + println!("* '{url}':"); + for (id, e) in map.iter() { + println!(" - {id}: {e}"); + } + } + + // Query events from database + let filter = Filter::new().author(keys.public_key()).limit(10); + let events = client.database().query(vec![filter]).await?; + println!("Events: {events:?}"); + + Ok(()) +}