1mod 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#[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#[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#[derive(Debug, Clone)]
62pub struct ResolveResult {
63 pub cid: Cid,
64 pub path: String,
65 pub record: IpnsRecord,
66}
67
68#[derive(Debug, Clone)]
70pub struct PublishResult {
71 pub record: IpnsRecord,
72 pub public_key: Vec<u8>,
73}
74
75#[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#[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
126pub fn ipns(init: IpnsInit) -> Result<Arc<dyn Ipns>, IpnsError> {
128 ipns_impl::IpnsImpl::new(init)
129}