Skip to main content

RnsNode

Struct RnsNode 

Source
pub struct RnsNode { /* private fields */ }
Expand description

A running RNS node.

Implementations§

Source§

impl RnsNode

Source

pub fn from_config( config_path: Option<&Path>, callbacks: Box<dyn Callbacks>, ) -> Result<Self>

Start the node from a config file path. If config_path is None, uses ~/.reticulum/.

Source

pub fn from_private_config( config_dir: &Path, state_dir: &Path, underlay_mark: Option<u32>, callbacks: Box<dyn Callbacks>, ) -> Result<Self>

Start an application-private node from a dedicated configuration and state root.

Private nodes never expose the shared-instance or management servers, never load hooks, fail on unsupported/malformed enabled interfaces, and force runtime interface failures to stop startup. underlay_mark overrides the value in the Reticulum configuration.

Source

pub fn start(config: NodeConfig, callbacks: Box<dyn Callbacks>) -> Result<Self>

Start the node. Connects all interfaces, starts driver and timer threads.

Source

pub fn query(&self, request: QueryRequest) -> Result<QueryResponse, SendError>

Query the driver for state information.

Source

pub fn attach_interface(&self, name: &str) -> Result<Option<bool>, SendError>

Attach a named interface from the current on-disk configuration.

Source

pub fn detach_interface(&self, name: &str) -> Result<Option<bool>, SendError>

Detach a named interface and its spawned children.

Source

pub fn reload_interface(&self, name: &str) -> Result<Option<bool>, SendError>

Detach and attach a named interface using the current on-disk configuration.

Snapshot active Link metadata, including the negotiated direct-data MDU.

Snapshot one Link, including local send backlog, or None if unknown.

Source

pub fn state_snapshot(&self) -> Arc<StateSnapshot> ⓘ

The link and interface statistics the driver last published, read without a driver round trip.

Unlike query, links and query_link, which queue behind every earlier control event and answer exactly at that point, this returns at once even while the driver works through a long backlog or is blocked, for example in a callback. The price is freshness and ordering: the driver republishes on every tick (global.tick_interval_ms, 1 s by default) and as soon as a link or interface changes state, so the snapshot may lag by up to one tick, plus however long the driver has been blocked, and it is not a barrier: events sent before the call, sends included, may not be reflected yet. Before the first publish the snapshot is empty with sequence == 0.

Links as of the last published state_snapshot.

May lag by up to one tick and is not ordered after earlier events; use links for an exact, ordered answer.

One link as of the last published state_snapshot, or None if it was not known then.

May lag by up to one tick and is not ordered after earlier events; use query_link for an exact, ordered answer.

Source

pub fn snapshot_interfaces(&self) -> InterfaceStatsResponse

Interface statistics as of the last published state_snapshot.

May lag by up to one tick and is not ordered after earlier events; use query(QueryRequest::InterfaceStats) for an exact, ordered answer.

Source

pub fn lowest_interface_bitrate(&self) -> Result<Option<u64>, SendError>

Return the slowest positive bitrate among currently registered interfaces.

Returns Ok(None) when no registered interface advertises a usable bitrate.

Source

pub fn medium_path_timeout(&self) -> Result<f64, SendError>

Return the adaptive medium path timeout advertised by the transport engine.

The estimate covers a full MTU round trip on the slowest registered positive-bitrate interface plus the per-hop allowance, or is zero when no usable bitrate is known.

Source

pub fn begin_drain(&self, timeout: Duration) -> Result<(), SendError>

Enter drain mode and stop admitting new work.

Source

pub fn drain_status(&self) -> Result<DrainStatus, SendError>

Query current drain/lifecycle status.

Source

pub fn send_raw( &self, raw: Vec<u8>, dest_type: u8, attached_interface: Option<InterfaceId>, ) -> Result<(), SendError>

Send a raw outbound packet.

Source

pub fn register_destination( &self, dest_hash: [u8; 16], dest_type: u8, ) -> Result<(), SendError>

Register a local destination with the transport engine.

Source

pub fn deregister_destination( &self, dest_hash: [u8; 16], ) -> Result<(), SendError>

Deregister a local destination.

Deregister a link destination (stop accepting incoming links).

Register a link destination that can accept incoming links.

dest_hash: the destination hash sig_prv_bytes: Ed25519 private signing key (32 bytes) sig_pub_bytes: Ed25519 public signing key (32 bytes)

Register a link destination with an optional maximum accepted request size.

Set the required link establishment stamp cost for a destination.

Mirrors Destination.set_link_cost: the cost is clamped to 0..=LINK_COST_CAP and the clamped value is returned. Set it to 0 to disable. The cost is carried in the destination’s announce extension (emitted when destination stamping is on) so initiators grind their link request stamps to it, and, when link request stamps are enforced, incoming link requests whose stamp value is below it are dropped.

The link request stamp cost announced and required for a destination.

Mirrors Destination.get_link_cost: the configured cost, or the default LINK_REQUEST_STAMP_COST (Transport.LR_COST) when none was set. Costs are fractional since upstream 796ef2d4 and held on the 1/256 grid they are announced and checked on, so 14.2 reads back as 14.19921875.

Override Transport.LR_STAMPS_ENFORCED for this node.

When enabled, incoming link requests whose stamp value is below the destination’s link_cost are dropped. Defaults to rns_core::constants::LR_STAMPS_ENFORCED (off, as upstream).

Whether incoming link request stamps are enforced.

Source

pub fn register_request_handler<F>( &self, path: &str, allowed_list: Option<Vec<[u8; 16]>>, handler: F, ) -> Result<(), SendError>
where F: Fn([u8; 16], &str, &[u8], Option<&([u8; 16], [u8; 64])>) -> Option<Vec<u8>> + Send + 'static,

Register a request handler for a given path on established links.

Source

pub fn register_request_handler_response<F>( &self, path: &str, allowed_list: Option<Vec<[u8; 16]>>, handler: F, ) -> Result<(), SendError>
where F: Fn([u8; 16], &str, &[u8], Option<&([u8; 16], [u8; 64])>) -> Option<RequestResponse> + Send + 'static,

Register a request handler that can return resource responses with metadata.

Source

pub fn register_deferred_request_handler<F>( &self, path: &str, allowed_list: Option<Vec<[u8; 16]>>, handler: F, ) -> Result<(), SendError>
where F: Fn([u8; 16], &str, [u8; 16], &[u8], Option<&([u8; 16], [u8; 64])>) + Send + 'static,

Register a request handler whose response is completed asynchronously with RnsNode::send_deferred_response.

Source

pub fn send_deferred_response( &self, link_id: [u8; 16], request_id: [u8; 16], data: Vec<u8>, ) -> Result<(), SendError>

Complete a request accepted by a deferred request handler.

Create an outbound link to a destination.

Returns the link_id on success.

Source

pub fn send_request( &self, link_id: [u8; 16], path: &str, data: &[u8], ) -> Result<(), SendError>

Send a request on an established link.

Source

pub fn send_request_with_max_response_size( &self, link_id: [u8; 16], path: &str, data: &[u8], max_response_size: Option<usize>, ) -> Result<(), SendError>

Send a request with an optional maximum accepted response size.

Identify on a link (reveal identity to remote peer).

Tear down a link.

Source

pub fn send_resource( &self, link_id: [u8; 16], data: Vec<u8>, metadata: Option<Vec<u8>>, ) -> Result<(), SendError>

Send a resource on an established link.

Source

pub fn send_resource_with_auto_compress( &self, link_id: [u8; 16], data: Vec<u8>, metadata: Option<Vec<u8>>, auto_compress: bool, ) -> Result<(), SendError>

Send a resource on an established link, controlling automatic compression.

Set auto_compress to false when the application knows its payload is already compressed or encrypted. This skips the compression attempt; link encryption and Resource integrity checks still apply. With true, eligible payloads are fully compressed and the result is used only when smaller. Even a rejected attempt costs CPU, while disabling compression for compressible content can substantially increase transmitted bytes.

Buffered sends of at least 16 KiB that fit one Resource segment can prepare compression on a node-owned worker. Its admission budget is eight jobs and 8 MiB of owned input capacity plus reserved compressed output. Codec workspace and the running job’s temporary input are additional. Saturation, small/split Resources and worker startup failure use synchronous preparation, preserving earlier buffered sends on the same link. This improves responsiveness for eligible sends; it does not provide a latency bound under overload. Reader transfers and request responses keep their existing synchronous preparation paths.

Source

pub fn send_resource_with_options( &self, link_id: [u8; 16], data: Vec<u8>, metadata: Option<Vec<u8>>, options: ResourceSendOptions, ) -> Result<(), SendError>

Send a resource on an established link with explicit send options, including the application flag the receiver sees with the data.

Source

pub fn send_resource_reader<R: Read + Send + 'static>( &self, link_id: [u8; 16], reader: R, declared_length: u64, metadata: Option<Vec<u8>>, auto_compress: bool, ) -> Result<ResourceTransferId, SendError>

Send a Resource from a sequential reader without retaining the full logical payload in memory.

Source

pub fn send_resource_reader_with_options<R: Read + Send + 'static>( &self, link_id: [u8; 16], reader: R, declared_length: u64, metadata: Option<Vec<u8>>, options: ResourceSendOptions, ) -> Result<ResourceTransferId, SendError>

Send a Resource from a sequential reader with explicit send options.

Source

pub fn send_resource_file( &self, link_id: [u8; 16], path: impl AsRef<Path>, metadata: Option<Vec<u8>>, auto_compress: bool, ) -> Result<ResourceTransferId>

Send a file as a bounded-memory streaming Resource.

Source

pub fn set_resource_receive_mode( &self, link_id: [u8; 16], mode: ResourceReceiveMode, ) -> Result<(), SendError>

Select delivery policy for independent incoming Resources on a link.

Source

pub fn set_resource_strategy( &self, link_id: [u8; 16], strategy: u8, ) -> Result<(), SendError>

Set the resource acceptance strategy for a link.

0 = AcceptNone, 1 = AcceptAll, 2 = AcceptApp

Source

pub fn accept_resource( &self, link_id: [u8; 16], resource_hash: Vec<u8>, accept: bool, ) -> Result<(), SendError>

Accept or reject a pending resource (for AcceptApp strategy).

Source

pub fn send_channel_message( &self, link_id: [u8; 16], msgtype: u16, payload: Vec<u8>, ) -> Result<(), SendError>

Send a channel message on a link (compatibility API).

Source

pub fn try_send_channel_message( &self, link_id: [u8; 16], msgtype: u16, payload: Vec<u8>, ) -> Result<(), ChannelSendError>

Attempt to enqueue a channel message, preserving temporary backpressure. A NotReady result means no sequence was reserved; callers can retry the same payload when capacity is available. Other failures are terminal.

Source

pub fn propose_direct_connect(&self, link_id: [u8; 16]) -> Result<(), SendError>

Propose a direct P2P connection to a peer via NAT hole punching.

The link must be active and connected through a backbone node. If successful, a direct UDP connection will be established, bypassing the backbone.

Source

pub fn set_direct_connect_policy( &self, policy: HolePunchPolicy, ) -> Result<(), SendError>

Set the policy for handling incoming direct-connect proposals.

Wait for capacity and transmit a Link packet through its interface writer.

Success means the underlying transport accepted the complete packet, not that the peer received or acknowledged it. Cancellation before admission sends nothing; after admission, dropping this future does not cancel transmission. This future is independent of any async runtime. The driver’s configured event capacity also bounds the total number of admitted confirmed sends (Links, packets and announcements), including frames waiting for an interface or write. A transmission error can follow a partial write; only QueueFull from the try API guarantees that retrying cannot duplicate an admitted packet.

Try to admit a Link send without waiting for capacity.

A successful return is a receipt, not a transmission result. Await the receipt for exactly the same completion contract as send_on_link. QueueFull means nothing was admitted and the caller may retry.

Admit a best-effort direct Link datagram without blocking on queue space.

Success means the driver accepted and encoded the packet. It does not imply remote delivery, acknowledgement, or interface transmission.

Source

pub fn attach_local_ratchets(&self, owner: Arc<LocalRatchets>) -> Result<()>

Attach the same private ratchet owner used by the application’s receiver. Reattaching that Arc is idempotent; conflicting owners are rejected. The owner remains attached across destination deregistration/re-registration.

Source

pub async fn announce( &self, dest: &Destination, identity: &Identity, app_data: Option<&[u8]>, ) -> Result<(), TransmissionError>

Wait for capacity, then transmit an announcement on all selected local interfaces.

Success means all selected writers accepted the complete packet, not remote delivery or subsequent relay. An error can follow partial delivery on one or more interfaces. No eligible interface returns NoRoute. Cancelling before admission sends nothing; after admission, transmission continues. Shared-client replay metadata travels in the same admitted event as the packet, never in a separate event from a rejected send.

Source

pub fn try_announce( &self, dest: &Destination, identity: &Identity, app_data: Option<&[u8]>, ) -> Result<TransmissionReceipt, TransmissionError>

Try admission immediately; await the receipt for the exact same result as announce. QueueFull guarantees nothing was admitted.

Source

pub async fn send_packet( &self, dest: &Destination, data: &[u8], ) -> Result<PacketHash, TransmissionError>

Wait for capacity and local transmission, returning the hash for proof tracking.

Uses the same all-selected-writers contract as announce and the same admission/completion capacity as send_on_link. No remote delivery is promised; errors may follow partial transmission. Dropping an admitted future does not cancel its send. No async runtime is required.

Source

pub fn try_send_packet( &self, dest: &Destination, data: &[u8], ) -> Result<PacketSendReceipt, TransmissionError>

Try admission immediately. The receipt exposes the packet hash and resolves to the same result as send_packet, after local writes. QueueFull guarantees nothing was admitted and is safe to retry.

Source

pub fn announce_queued( &self, dest: &Destination, identity: &Identity, app_data: Option<&[u8]>, ) -> Result<(), SendError>

Build and broadcast an announce for a destination (queue-only compatibility API).

Success means driver submission, not transmission. Use announce or try_announce for confirmed local transmission.

The identity is used to sign the announce. Must be the identity that owns the destination (i.e. identity.hash() matches dest.identity_hash).

Source

pub fn send_packet_queued( &self, dest: &Destination, data: &[u8], ) -> Result<PacketHash, SendError>

Queue an encrypted (SINGLE) or plaintext (PLAIN) packet to a destination.

Queue-only compatibility API: use send_packet or try_send_packet for confirmed local transmission. The returned hash does not mean sent.

For SINGLE destinations, dest.public_key must be set (OUT direction). Returns the packet hash for proof tracking.

Source

pub fn deliver_decrypted( &self, dest: &Destination, identity: &Identity, ) -> Result<(), SendError>

Deliver single packets addressed to dest, a local destination, decrypted: through Callbacks::on_packet_received in place of on_local_delivery, decrypted on the node’s proof pool when it has one, so a receiver is not bound by decrypting on its own thread. They are decrypted with the destination’s attached ratchets (attach_local_ratchets) when it has them, else with identity, which must hold its private keys. Packets that do not decrypt are dropped and not proved. Deregistering the destination ends it.

Source

pub fn send_packet_deferred( &self, dest: &Destination, data: &[u8], ) -> Result<SendTicket, SendError>

Queue a packet for a SINGLE destination without encrypting it on this thread, unlike send_packet_queued: the node encrypts it (on its proof pool when it has one; on this thread when the process may use one CPU only) and reports the packet hash through Callbacks::on_packet_sent with the returned ticket, before sending it. A sender is then not bound by its own thread’s encryption, one X25519 key generation and exchange per packet.

dest.public_key must be set (OUT direction). Like send_packet_queued, queueing does not mean sent.

Source

pub fn register_destination_with_proof( &self, dest: &Destination, signing_key: Option<[u8; 64]>, ) -> Result<(), SendError>

Register a destination with the transport engine and set its proof strategy.

signing_key is the full 64-byte identity private key (X25519 32 bytes + Ed25519 32 bytes), needed for ProveAll/ProveApp to sign proof packets.

Source

pub fn request_path(&self, dest_hash: &DestHash) -> Result<(), SendError>

Request a path to a destination from the network.

Source

pub fn has_path(&self, dest_hash: &DestHash) -> Result<bool, SendError>

Check if a path exists to a destination (synchronous query).

Source

pub fn hops_to(&self, dest_hash: &DestHash) -> Result<Option<u8>, SendError>

Get hop count to a destination (synchronous query).

Source

pub fn recall_identity( &self, dest_hash: &DestHash, ) -> Result<Option<AnnouncedIdentity>, SendError>

Recall the identity information for a previously announced destination.

Source

pub fn recall_destination_stamp( &self, dest_hash: &DestHash, ) -> Result<Option<DestinationStampInfo>, SendError>

Stamp value and announced link request cost recorded from a known destination’s last announce.

Source

pub fn known_destinations( &self, ) -> Result<Vec<KnownDestinationEntry>, SendError>

List known destinations and their lifecycle state.

Source

pub fn retain_known_destination( &self, dest_hash: &DestHash, ) -> Result<bool, SendError>

Mark a known destination as retained.

Source

pub fn retain_identity( &self, identity_hash: &IdentityHash, ) -> Result<bool, SendError>

Mark all known destinations announced by an identity as retained.

Source

pub fn unretain_known_destination( &self, dest_hash: &DestHash, ) -> Result<bool, SendError>

Clear the retained flag on a known destination.

Source

pub fn mark_known_destination_used( &self, dest_hash: &DestHash, ) -> Result<bool, SendError>

Mark a known destination as used.

Source

pub fn load_hook( &self, name: String, wasm_bytes: Vec<u8>, attach_point: String, priority: i32, ) -> Result<Result<(), String>, SendError>

Load an in-memory WASM hook at runtime.

Source

pub fn load_hook_file( &self, name: String, path: String, hook_type: String, attach_point: String, priority: i32, ) -> Result<Result<(), String>, SendError>

Load a hook from a server-local filesystem path at runtime.

Source

pub fn load_builtin_hook( &self, name: String, builtin_id: String, attach_point: String, priority: i32, ) -> Result<Result<(), String>, SendError>

Load a registered built-in hook at runtime.

Source

pub fn unload_hook( &self, name: String, attach_point: String, ) -> Result<Result<(), String>, SendError>

Unload a hook at runtime.

Source

pub fn reload_hook( &self, name: String, attach_point: String, wasm_bytes: Vec<u8>, ) -> Result<Result<(), String>, SendError>

Reload an in-memory WASM hook at runtime (detach + recompile + reattach with same priority).

Source

pub fn reload_hook_file( &self, name: String, attach_point: String, path: String, hook_type: String, ) -> Result<Result<(), String>, SendError>

Reload a hook from a server-local filesystem path at runtime.

Source

pub fn reload_builtin_hook( &self, name: String, attach_point: String, builtin_id: String, ) -> Result<Result<(), String>, SendError>

Reload a registered built-in hook at runtime.

Source

pub fn set_hook_enabled( &self, name: String, attach_point: String, enabled: bool, ) -> Result<Result<(), String>, SendError>

Enable or disable a loaded hook at runtime.

Source

pub fn set_hook_priority( &self, name: String, attach_point: String, priority: i32, ) -> Result<Result<(), String>, SendError>

Update the priority of a loaded hook at runtime.

Source

pub fn list_hooks(&self) -> Result<Vec<HookInfo>, SendError>

List all loaded hooks.

Source

pub fn event_sender(&self) -> &EventSender

Get the event sender for direct event injection.

Source

pub fn set_tick_interval(&self, ms: u64) -> u64

Set the tick interval in milliseconds. Default is 1000 (1 second). Changes take effect on the next tick cycle. Values are clamped to the range 100..=10000. Returns the actual stored value (which may differ from ms if clamped).

Source

pub fn tick_interval(&self) -> u64

Get the current tick interval in milliseconds.

Source

pub fn shutdown(self)

Shut down the node. Blocks until the driver thread exits.

Source§

impl RnsNode

Source

pub fn wants_destination_type(&self, full_name: &str) -> bool

Reticulum.wants_destination_type: this application needs announces of the destination type full_name, such as rncp.receive.

The type is registered with the local transport and, on a shared instance client, with the shared instance, whose answer is returned. Returns false for a blocked type.

Source

pub fn unwants_destination_type(&self, full_name: &str) -> bool

Reticulum.unwants_destination_type: withdraw a need registered with Self::wants_destination_type. Returns whether it was registered.

Source

pub fn unwants_all_destination_types(&self) -> bool

Reticulum.unwants_all_destination_types: withdraw every destination type this application registered.

Source

pub fn required_announces_only(&self, enabled: bool) -> bool

Reticulum.required_announces_only: on a shared instance client, let through only announces of the types this application registered and the shared instance’s own destinations. Other nodes return false, so an application cannot squelch announces for the node as a whole.

Source

pub fn connect_shared( config: SharedClientConfig, callbacks: Box<dyn Callbacks>, ) -> Result<Self>

Connect to an existing shared instance as a client.

The client runs transport_enabled: false — it does no routing, but can register destinations and send/receive packets through the daemon.

Source

pub fn connect_shared_from_config( config_path: Option<&Path>, callbacks: Box<dyn Callbacks>, ) -> Result<Self>

Connect to a shared instance, with config loaded from a config directory.

Reads the config file to determine instance_name and ports.

Trait Implementations§

Source§

impl Drop for RnsNode

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> InterfaceConfigData for T
where T: Send + 'static,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.