9db748e8dd
* Improve SDK rustdoc and add ARCHITECTURE.md files - Rewrite lib.rs module docs with quick-start example and module overview - Add stream example and include_str! ARCHITECTURE.md to mixnet module - Add ARCHITECTURE.md for mixnet, client_pool, and stream modules - Add rustdoc to MixnetClientBuilder, MixnetClientSender, MixnetMessageSender - Add cancel safety and drop behavior annotations to async methods - Add TcpProxy deprecation notice pointing to stream module * Fix rustdoc errors and add stepwise comments to remaining examples Rustdoc fixes: - Add missing .unwrap() on connect_new example - Replace broken turbofish intra-doc link in MixnetClientBuilder - Fix NymProxyServer::new args in tcp_proxy example - Wrap BandwidthImporter example in scoped block to fix borrow-then-move - Change misleading "5-hop routing" to "multi-hop routing" - Fix copy-paste "forget me" in send_remember_me error message - Fix wrong cargo run command in stream_simple_read_write - Fix DecayWrapper description * Cut down doc comment length * Trimmed down SDK ARCHITECTURE files * Slim Rust SDK docs and rename opener to dialer - Merge tour page into SDK landing page, delete tour.mdx - Trim all three tutorials: cut boilerplate, duplicated code, and misplaced content - Make FFI page evergreen with Go and C++ snippets, link to repo examples - Rename "opener" to "dialer" in stream docs, source ARCHITECTURE.md, and rustdoc - Add reply-to-open arrow in stream mermaid diagram - Replace remaining Unicode dashes in mermaid flowchart * - elevate streams in rustdoc: examples on lib.rs, MixnetClient, open_stream, listener - add stream quick reference to mixnet ARCHITECTURE.md - add stream types to key types list in ARCHITECTURE.md - add docs.rs links for AsyncRead/AsyncWrite and stream submodule - tcp_proxy: replace bold deprecation with warning box * - replace individual example doc pages with GitHub-linked tables - add step-by-step inline comments to all SDK example source files - add doc comments to examples missing them (simple, surb_reply, builder, etc.) - expand mixnet tutorial with persistent identity and split_sender sections - add tcpproxy tutorial - rename "API Reference" to "TypeDoc Reference" in TS SDK sidebar - rename "Misc" to "Extras" in developer sidebar, move VPN CLI up - remove echo server from tools - update message-queue callout to reference actual modules - fix mixnet/examples redirect collision * Add missing mut to example code * Update ARCHITECTURE.md with LP Framing + stream examples with sequencing * Update doc comment in utils.rs * Standardise commenting style across Rust SDK examples * Fix inline doc examples and trim re-export boilerplate * Update sdk/rust/nym-sdk/examples/bandwidth.rs Co-authored-by: Simon Wicky <simon@nymtech.net> * Fix review comments --------- Co-authored-by: Simon Wicky <simon@nymtech.net>
156 lines
5.5 KiB
Rust
156 lines
5.5 KiB
Rust
// Copyright 2025 - Nym Technologies SA <contact@nymtech.net>
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
//! # Nym SDK
|
|
//!
|
|
//! Rust SDK for building privacy-preserving applications on the [Nym mixnet](https://nymtech.net),
|
|
//! a decentralized network that provides network-level privacy through packet mixing,
|
|
//! timing obfuscation, and Sphinx packet encryption.
|
|
//!
|
|
//! For tutorials and conceptual guides, see the
|
|
//! [Nym developer portal](https://nymtech.net/docs/developers/rust).
|
|
//!
|
|
//! # Getting started
|
|
//!
|
|
//! **Start with [`mixnet::MixnetClient::connect_new`]** for a quick ephemeral client, or
|
|
//! [`mixnet::MixnetClientBuilder`] when you need to configure storage, gateway selection,
|
|
//! or network settings.
|
|
//!
|
|
//! ```no_run
|
|
//! use nym_sdk::mixnet::{self, MixnetMessageSender};
|
|
//!
|
|
//! # #[tokio::main]
|
|
//! # async fn main() {
|
|
//! let mut client = mixnet::MixnetClient::connect_new().await.unwrap();
|
|
//! let addr = *client.nym_address();
|
|
//!
|
|
//! client.send_plain_message(addr, "hello mixnet!").await.unwrap();
|
|
//!
|
|
//! // Always disconnect for clean shutdown
|
|
//! client.disconnect().await;
|
|
//! # }
|
|
//! ```
|
|
//!
|
|
//! ## Stream I/O
|
|
//!
|
|
//! For persistent bidirectional byte channels (like a TCP socket), use
|
|
//! [`MixnetClient::open_stream`](mixnet::MixnetClient::open_stream) and
|
|
//! [`MixnetClient::listener`](mixnet::MixnetClient::listener).
|
|
//! Streams implement [`AsyncRead`](tokio::io::AsyncRead) +
|
|
//! [`AsyncWrite`](tokio::io::AsyncWrite) — see [`mixnet::stream`] for
|
|
//! the full API:
|
|
//!
|
|
//! ```no_run
|
|
//! use nym_sdk::mixnet;
|
|
//! use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
|
//!
|
|
//! # #[tokio::main]
|
|
//! # async fn main() {
|
|
//! let mut sender = mixnet::MixnetClient::connect_new().await.unwrap();
|
|
//! let mut receiver = mixnet::MixnetClient::connect_new().await.unwrap();
|
|
//! let recv_addr = *receiver.nym_address();
|
|
//!
|
|
//! let mut listener = receiver.listener().unwrap();
|
|
//! let mut tx = sender.open_stream(recv_addr, None).await.unwrap();
|
|
//! let mut rx = listener.accept().await.unwrap();
|
|
//!
|
|
//! tx.write_all(b"hello via stream").await.unwrap();
|
|
//! tx.flush().await.unwrap();
|
|
//!
|
|
//! let mut buf = vec![0u8; 1024];
|
|
//! let n = rx.read(&mut buf).await.unwrap();
|
|
//!
|
|
//! sender.disconnect().await;
|
|
//! receiver.disconnect().await;
|
|
//! # }
|
|
//! ```
|
|
//!
|
|
//! See [`mixnet::stream`] for the full stream API, and the
|
|
//! [stream tutorial](https://nymtech.net/docs/developers/rust/stream/tutorial)
|
|
//! for a step-by-step walkthrough.
|
|
//!
|
|
//! # Modules
|
|
//!
|
|
//! | Module | Purpose |
|
|
//! |--------|---------|
|
|
//! | [`mixnet`] | Core client — messages, streams, builder, storage |
|
|
//! | [`client_pool`] | Pre-warmed pool of ephemeral clients |
|
|
//! | [`tcp_proxy`] | TCP tunnelling over the mixnet (deprecated — prefer streams) |
|
|
//! | [`bandwidth`] | Bandwidth credential management |
|
|
//!
|
|
//! # Feature flags
|
|
//!
|
|
//! **Feature gates are not yet implemented.** Importing `nym-sdk` currently pulls in all
|
|
//! modules and their full dependency trees. Work is planned to gate modules behind Cargo
|
|
//! features so you can import only what you need.
|
|
//!
|
|
//! # Network configuration
|
|
//!
|
|
//! By default, the SDK connects to the Nym mainnet. Customize with
|
|
//! [`NymNetworkDetails`] or environment variables.
|
|
|
|
mod error;
|
|
|
|
pub mod bandwidth;
|
|
pub mod client_pool;
|
|
pub mod ip_packet_client;
|
|
pub mod ipr_wrapper;
|
|
pub mod mixnet;
|
|
pub mod tcp_proxy;
|
|
|
|
pub use error::{Error, Result};
|
|
|
|
// Re-exports: gateway transceiver types (deprecated internals)
|
|
#[allow(deprecated)]
|
|
pub use nym_client_core::client::mix_traffic::transceiver::{
|
|
ErasedGatewayError, GatewayPacketRouter, GatewayReceiver, GatewaySender, GatewayTransceiver,
|
|
LocalGateway, LocalGatewayError, MockGateway, MockGatewayError, PacketRouter, RemoteGateway,
|
|
};
|
|
|
|
// Re-exports: topology
|
|
/// Fetches network topology from the Nym API.
|
|
pub use nym_client_core::client::topology_control::NymApiTopologyProvider;
|
|
/// Configuration for [`NymApiTopologyProvider`].
|
|
pub use nym_client_core::client::topology_control::NymApiTopologyProviderConfig;
|
|
/// Trait for custom topology providers. Implement this to fetch topology
|
|
/// from alternative sources (see `custom_topology_provider` example).
|
|
pub use nym_client_core::client::topology_control::TopologyProvider;
|
|
|
|
// Re-exports: config
|
|
/// Debug/development configuration for mixnet clients.
|
|
pub use nym_client_core::config::DebugConfig;
|
|
/// Controls whether client identity persists across restarts.
|
|
pub use nym_client_core::config::RememberMe;
|
|
|
|
// Re-exports: network defaults
|
|
/// Cosmos chain configuration (chain ID, RPC, gas).
|
|
pub use nym_network_defaults::ChainDetails;
|
|
/// Token denomination details (borrowed).
|
|
pub use nym_network_defaults::DenomDetails;
|
|
/// Token denomination details (owned).
|
|
pub use nym_network_defaults::DenomDetailsOwned;
|
|
/// Nym smart contract addresses.
|
|
pub use nym_network_defaults::NymContracts;
|
|
/// Complete network configuration (endpoints, contracts, chain details).
|
|
///
|
|
/// ```rust,no_run
|
|
/// use nym_sdk::NymNetworkDetails;
|
|
///
|
|
/// // Load from environment (defaults to mainnet)
|
|
/// let network = NymNetworkDetails::new_from_env();
|
|
/// println!("API: {:?}", network.endpoints);
|
|
/// ```
|
|
pub use nym_network_defaults::NymNetworkDetails;
|
|
/// Validator/API endpoint configuration.
|
|
pub use nym_network_defaults::ValidatorDetails;
|
|
|
|
// Re-exports: task management
|
|
/// Cancellation token for graceful shutdown.
|
|
pub use nym_task::ShutdownToken;
|
|
/// Tracks spawned tasks for coordinated shutdown.
|
|
pub use nym_task::ShutdownTracker;
|
|
|
|
// Re-exports: API client
|
|
/// Client identification sent with Nym API requests.
|
|
pub use nym_validator_client::UserAgent;
|