Skip to main content

ferripfs_config/
addresses.rs

1// Ported from: kubo/config/addresses.go
2// Kubo version: v0.39.0
3// Original: https://github.com/ipfs/kubo/blob/v0.39.0/config/addresses.go
4//
5// Original work: Copyright (c) Protocol Labs, Inc.
6// Port: Copyright (c) 2026 ferripfs contributors
7// SPDX-License-Identifier: MIT OR Apache-2.0
8
9//! Address configuration for swarm, API, and gateway.
10
11use crate::Strings;
12use serde::{Deserialize, Serialize};
13
14/// Addresses configuration section
15#[derive(Debug, Clone, Default, Serialize, Deserialize)]
16#[serde(rename_all = "PascalCase")]
17pub struct Addresses {
18    /// Swarm listening addresses (multiaddr format)
19    #[serde(default)]
20    pub swarm: Vec<String>,
21
22    /// Addresses to announce to the network
23    #[serde(default)]
24    pub announce: Vec<String>,
25
26    /// Additional addresses to append to announce list
27    #[serde(default)]
28    pub append_announce: Vec<String>,
29
30    /// Addresses to never announce
31    #[serde(default)]
32    pub no_announce: Vec<String>,
33
34    /// API server address (multiaddr format)
35    #[serde(default, rename = "API")]
36    pub api: Strings,
37
38    /// Gateway server address (multiaddr format)
39    #[serde(default)]
40    pub gateway: Strings,
41}
42
43impl Addresses {
44    /// Get default swarm addresses
45    pub fn default_swarm_addresses() -> Vec<String> {
46        vec![
47            "/ip4/0.0.0.0/tcp/4001".to_string(),
48            "/ip6/::/tcp/4001".to_string(),
49            "/ip4/0.0.0.0/udp/4001/quic-v1".to_string(),
50            "/ip4/0.0.0.0/udp/4001/quic-v1/webtransport".to_string(),
51            "/ip6/::/udp/4001/quic-v1".to_string(),
52            "/ip6/::/udp/4001/quic-v1/webtransport".to_string(),
53        ]
54    }
55
56    /// Get default API address
57    pub fn default_api_address() -> String {
58        "/ip4/127.0.0.1/tcp/5001".to_string()
59    }
60
61    /// Get default gateway address
62    pub fn default_gateway_address() -> String {
63        "/ip4/127.0.0.1/tcp/8080".to_string()
64    }
65}
66
67#[cfg(test)]
68mod tests {
69    use super::*;
70
71    #[test]
72    fn test_addresses_default() {
73        let addrs = Addresses::default();
74        assert!(addrs.swarm.is_empty());
75        assert!(addrs.api.is_empty());
76    }
77
78    #[test]
79    fn test_default_swarm_addresses() {
80        let swarm = Addresses::default_swarm_addresses();
81        assert!(!swarm.is_empty());
82        assert!(swarm.iter().any(|a| a.contains("tcp/4001")));
83    }
84}