Skip to main content

pulse_platform/
ports.rs

1//! Shared Pulse Platform port configuration.
2//!
3//! Main rship servers use `5155+`.
4//! Non-main defaults stay below 5155:
5//! - Sync server:      5150
6//! - Asset Store REST: 5153
7//! - Asset Store WS:   5154
8//! - Link file server: 5152
9//! - Link local Myko:  5151
10
11/// First port in the default rship main-node range.
12pub const DEFAULT_RSHIP_PORT_BASE: u16 = 5155;
13
14/// Default Asset Store REST port (below the main-node range).
15pub const DEFAULT_ASSET_STORE_REST_PORT: u16 = 5153;
16
17/// Default Asset Store WebSocket port (below the main-node range).
18pub const DEFAULT_ASSET_STORE_WS_PORT: u16 = 5154;
19
20/// Default sync-server port (below the main-node range).
21pub const DEFAULT_SYNC_SERVER_PORT: u16 = 5150;
22
23/// Default Link file server port (below the main-node range).
24pub const DEFAULT_LINK_FILE_SERVER_PORT: u16 = 5152;
25
26/// Default Link local Myko port (below the main-node range).
27pub const DEFAULT_LINK_LOCAL_MYKO_PORT: u16 = 5151;
28
29fn env_var(name: &str) -> Option<String> {
30    #[cfg(target_arch = "wasm32")]
31    {
32        let _ = name;
33        None
34    }
35
36    #[cfg(not(target_arch = "wasm32"))]
37    {
38        std::env::var(name).ok()
39    }
40}
41
42fn env_port(name: &str) -> Option<u16> {
43    env_var(name)?.parse::<u16>().ok()
44}
45
46fn parse_port_from_addr(value: &str) -> Option<u16> {
47    let no_scheme = value.split_once("://").map_or(value, |(_, rest)| rest);
48    let host_port = no_scheme.split('/').next().unwrap_or(no_scheme);
49    host_port.rsplit(':').next()?.parse::<u16>().ok()
50}
51
52/// Base port for main rship nodes.
53#[must_use]
54pub fn rship_port_base() -> u16 {
55    env_port("RSHIP_PORT_BASE").unwrap_or(DEFAULT_RSHIP_PORT_BASE)
56}
57
58/// Main rship node port by zero-based index.
59#[must_use]
60pub fn rship_node_port(node_index: u16) -> u16 {
61    rship_port_base().saturating_add(node_index)
62}
63
64/// Default local rship WebSocket URL with `/myko` path.
65#[must_use]
66pub fn default_rship_ws_myko_url() -> String {
67    format!("ws://localhost:{}/myko", rship_node_port(0))
68}
69
70/// Default local rship WebSocket URL without path.
71#[must_use]
72pub fn default_rship_ws_url() -> String {
73    format!("ws://localhost:{}", rship_node_port(0))
74}
75
76/// Asset Store REST port.
77///
78/// Resolution order:
79/// 1. `ASSET_STORE_REST_PORT`
80/// 2. Port parsed from `ASSET_STORE_PUBLIC_ADDRESS`
81/// 3. Port parsed from `ASSET_STORE_REST_ADDR`
82/// 4. `DEFAULT_ASSET_STORE_REST_PORT`
83#[must_use]
84pub fn asset_store_rest_port() -> u16 {
85    env_port("ASSET_STORE_REST_PORT")
86        .or_else(|| env_var("ASSET_STORE_PUBLIC_ADDRESS").and_then(|v| parse_port_from_addr(&v)))
87        .or_else(|| env_var("ASSET_STORE_REST_ADDR").and_then(|v| parse_port_from_addr(&v)))
88        .unwrap_or(DEFAULT_ASSET_STORE_REST_PORT)
89}
90
91/// Asset Store WebSocket port.
92#[must_use]
93pub fn asset_store_ws_port() -> u16 {
94    env_port("ASSET_STORE_WS_PORT").unwrap_or(DEFAULT_ASSET_STORE_WS_PORT)
95}
96
97/// Sync server port.
98///
99/// Resolution order:
100/// 1. `SYNC_SERVER_PORT`
101/// 2. Port parsed from `SYNC_SERVER_ADDR`
102/// 3. Port parsed from `RSHIP_SYNC_SERVER`
103/// 4. `DEFAULT_SYNC_SERVER_PORT`
104#[must_use]
105pub fn sync_server_port() -> u16 {
106    env_port("SYNC_SERVER_PORT")
107        .or_else(|| env_var("SYNC_SERVER_ADDR").and_then(|v| parse_port_from_addr(&v)))
108        .or_else(|| env_var("RSHIP_SYNC_SERVER").and_then(|v| parse_port_from_addr(&v)))
109        .unwrap_or(DEFAULT_SYNC_SERVER_PORT)
110}
111
112/// Default local sync server URL.
113#[must_use]
114pub fn default_sync_server_ws_url() -> String {
115    format!("ws://localhost:{}", sync_server_port())
116}
117
118/// Default local sync server host:port address.
119#[must_use]
120pub fn default_sync_server_addr() -> String {
121    format!("localhost:{}", sync_server_port())
122}
123
124/// Link file server port.
125#[must_use]
126pub fn link_file_server_port() -> u16 {
127    env_port("LINK_FILE_SERVER_PORT").unwrap_or(DEFAULT_LINK_FILE_SERVER_PORT)
128}
129
130/// Link local Myko port.
131#[must_use]
132pub fn link_local_myko_port() -> u16 {
133    env_port("LINK_LOCAL_MYKO_PORT").unwrap_or(DEFAULT_LINK_LOCAL_MYKO_PORT)
134}