helia_ipns/
lib.rs

1//! IPNS (InterPlanetary Name System) implementation for Helia in Rust
2//!
3//! IPNS provides mutable pointers to content-addressed data.
4
5mod constants;
6mod errors;
7mod ipns_impl;
8pub mod keys;
9mod local_store;
10mod protobuf;
11pub mod record;
12pub mod routing;
13
14pub use errors::IpnsError;
15pub use local_store::{LocalStore, RecordMetadata};
16pub use record::{
17    select_best_record, sign_record, validate_ipns_record, verify_signature, IpnsRecord,
18};
19pub use routing::{
20    DhtRouter, GetOptions, HttpRouter, IpnsRouting, LocalRouter, PutOptions, RoutingEvent,
21};
22
23use async_trait::async_trait;
24use cid::Cid;
25use libp2p_identity::PeerId;
26use std::sync::Arc;
27use std::time::Duration;
28
29pub use constants::*;
30
31/// Options for publishing IPNS records
32#[derive(Debug, Clone)]
33pub struct PublishOptions {
34    pub lifetime: Option<u64>,
35    pub offline: bool,
36    pub ttl: Option<u64>,
37    pub v1_compatible: bool,
38}
39
40impl Default for PublishOptions {
41    fn default() -> Self {
42        Self {
43            lifetime: Some(DEFAULT_LIFETIME_MS),
44            offline: false,
45            ttl: Some(DEFAULT_TTL_NS / 1_000_000),
46            v1_compatible: true,
47        }
48    }
49}
50
51/// Options for resolving IPNS names
52#[derive(Debug, Clone, Default)]
53pub struct ResolveOptions {
54    pub offline: bool,
55    pub nocache: bool,
56    pub max_depth: Option<u32>,
57    pub timeout: Option<Duration>,
58}
59
60/// Result of resolving an IPNS name
61#[derive(Debug, Clone)]
62pub struct ResolveResult {
63    pub cid: Cid,
64    pub path: String,
65    pub record: IpnsRecord,
66}
67
68/// Result of publishing an IPNS record
69#[derive(Debug, Clone)]
70pub struct PublishResult {
71    pub record: IpnsRecord,
72    pub public_key: Vec<u8>,
73}
74
75/// Initialization options for IPNS
76#[derive(Debug, Clone)]
77pub struct IpnsInit {
78    pub routers: Vec<Arc<dyn IpnsRouting>>,
79    pub republish_interval: Option<Duration>,
80    pub republish_concurrency: Option<usize>,
81    pub enable_republish: bool,
82}
83
84impl Default for IpnsInit {
85    fn default() -> Self {
86        Self {
87            routers: Vec::new(),
88            republish_interval: Some(Duration::from_millis(DEFAULT_REPUBLISH_INTERVAL_MS)),
89            republish_concurrency: Some(5),
90            enable_republish: true,
91        }
92    }
93}
94
95/// The main IPNS interface
96#[async_trait]
97pub trait Ipns: Send + Sync {
98    fn routers(&self) -> &[Arc<dyn IpnsRouting>];
99
100    async fn publish(
101        &self,
102        key_name: &str,
103        value: &Cid,
104        options: PublishOptions,
105    ) -> Result<PublishResult, IpnsError>;
106
107    async fn resolve(
108        &self,
109        key: &[u8],
110        options: ResolveOptions,
111    ) -> Result<ResolveResult, IpnsError>;
112
113    async fn resolve_peer_id(
114        &self,
115        peer_id: &PeerId,
116        options: ResolveOptions,
117    ) -> Result<ResolveResult, IpnsError>;
118
119    async fn unpublish(&self, key_name: &str) -> Result<(), IpnsError>;
120
121    async fn start(&self) -> Result<(), IpnsError>;
122
123    async fn stop(&self) -> Result<(), IpnsError>;
124}
125
126/// Factory function to create an IPNS instance
127pub fn ipns(init: IpnsInit) -> Result<Arc<dyn Ipns>, IpnsError> {
128    ipns_impl::IpnsImpl::new(init)
129}