Skip to main content

nym_node_requests/
lib.rs

1// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
2// SPDX-License-Identifier: Apache-2.0
3
4pub mod api;
5pub mod error;
6
7#[cfg(feature = "client")]
8pub use crate::api::helpers::try_get_valid_nym_node_api_client;
9
10macro_rules! absolute_route {
11    ( $name:ident, $parent:expr, $suffix:expr ) => {
12        pub fn $name() -> String {
13            format!("{}{}", $parent, $suffix)
14        }
15    };
16}
17
18// still thinking how to nicely organise it
19pub mod routes {
20    pub const LANDING_PAGE: &str = "/";
21    pub const ROOT: &str = "/";
22    pub const API: &str = "/api";
23
24    pub mod api {
25        pub const V1: &str = "/v1";
26        pub const V2: &str = "/v2";
27
28        // canonical, version-neutral Swagger UI mount
29        pub const SWAGGER: &str = "/swagger";
30
31        absolute_route!(v1_absolute, super::API, V1);
32        absolute_route!(v2_absolute, super::API, V2);
33        absolute_route!(swagger_absolute, super::API, SWAGGER);
34
35        pub mod v1 {
36            use super::*;
37
38            pub const ROLES: &str = "/roles";
39            pub const BUILD_INFO: &str = "/build-information";
40            pub const HOST_INFO: &str = "/host-information";
41            pub const SYSTEM_INFO: &str = "/system-info";
42            pub const NODE_DESCRIPTION: &str = "/description";
43            pub const AUXILIARY: &str = "/auxiliary-details";
44            pub const HEALTH: &str = "/health";
45            pub const LOAD: &str = "/load";
46            pub const NETWORK: &str = "/network";
47            pub const SWAGGER: &str = "/swagger";
48
49            pub const GATEWAY: &str = "/gateway";
50            pub const MIXNODE: &str = "/mixnode";
51            pub const METRICS: &str = "/metrics";
52            pub const BRIDGES: &str = "/bridges";
53            pub const NETWORK_REQUESTER: &str = "/network-requester";
54            pub const IP_PACKET_ROUTER: &str = "/ip-packet-router";
55            pub const AUTHENTICATOR: &str = "/authenticator";
56            pub const LEWES_PROTOCOL: &str = "/lewes-protocol";
57
58            // define helper functions to get absolute routes
59            absolute_route!(health_absolute, v1_absolute(), HEALTH);
60            absolute_route!(load_absolute, v1_absolute(), LOAD);
61            absolute_route!(network_absolute, v1_absolute(), NETWORK);
62            absolute_route!(roles_absolute, v1_absolute(), ROLES);
63            absolute_route!(build_info_absolute, v1_absolute(), BUILD_INFO);
64            absolute_route!(host_info_absolute, v1_absolute(), HOST_INFO);
65            absolute_route!(system_info_absolute, v1_absolute(), SYSTEM_INFO);
66            absolute_route!(description_absolute, v1_absolute(), NODE_DESCRIPTION);
67            absolute_route!(auxiliary_absolute, v1_absolute(), AUXILIARY);
68
69            absolute_route!(gateway_absolute, v1_absolute(), GATEWAY);
70            absolute_route!(mixnode_absolute, v1_absolute(), MIXNODE);
71            absolute_route!(metrics_absolute, v1_absolute(), METRICS);
72            absolute_route!(network_requester_absolute, v1_absolute(), NETWORK_REQUESTER);
73            absolute_route!(ip_packet_router_absolute, v1_absolute(), IP_PACKET_ROUTER);
74            absolute_route!(authenticator_absolute, v1_absolute(), AUTHENTICATOR);
75            absolute_route!(lp_absolute, v1_absolute(), LEWES_PROTOCOL);
76            absolute_route!(swagger_absolute, v1_absolute(), SWAGGER);
77
78            pub mod metrics {
79                use super::*;
80
81                pub const LEGACY_MIXING: &str = "/mixing";
82                pub const PACKETS_STATS: &str = "/packets-stats";
83                pub const WIREGUARD_STATS: &str = "/wireguard-stats";
84                pub const SESSIONS: &str = "/sessions";
85                pub const VERLOC: &str = "/verloc";
86                pub const PROMETHEUS: &str = "/prometheus";
87
88                absolute_route!(legacy_mixing_absolute, metrics_absolute(), LEGACY_MIXING);
89                absolute_route!(packets_stats_absolute, metrics_absolute(), PACKETS_STATS);
90                absolute_route!(
91                    wireguard_stats_absolute,
92                    metrics_absolute(),
93                    WIREGUARD_STATS
94                );
95                absolute_route!(sessions_absolute, metrics_absolute(), SESSIONS);
96                absolute_route!(verloc_absolute, metrics_absolute(), VERLOC);
97                absolute_route!(prometheus_absolute, metrics_absolute(), PROMETHEUS);
98            }
99
100            pub mod gateway {
101                use super::*;
102
103                pub const CLIENT_INTERFACES: &str = "/client-interfaces";
104
105                absolute_route!(
106                    client_interfaces_absolute,
107                    gateway_absolute(),
108                    CLIENT_INTERFACES
109                );
110
111                pub mod client_interfaces {
112                    use super::*;
113
114                    pub const WIREGUARD: &str = "/wireguard";
115                    pub const WEBSOCKETS: &str = "/mixnet-websockets";
116
117                    absolute_route!(wireguard_absolute, client_interfaces_absolute(), WIREGUARD);
118                    absolute_route!(
119                        mixnet_websockets_absolute,
120                        client_interfaces_absolute(),
121                        WEBSOCKETS
122                    );
123                }
124            }
125
126            pub mod mixnode {
127                // use super::*;
128            }
129
130            pub mod network_requester {
131                use super::*;
132
133                pub const EXIT_POLICY: &str = "/exit-policy";
134
135                absolute_route!(
136                    exit_policy_absolute,
137                    network_requester_absolute(),
138                    EXIT_POLICY
139                );
140            }
141
142            pub mod ip_packet_router {
143                // use super::*;
144            }
145
146            pub mod network {
147                use super::*;
148                pub const UPGRADE_MODE_STATUS: &str = "/upgrade-mode-status";
149
150                absolute_route!(
151                    upgrade_mode_status_absolute,
152                    network_absolute(),
153                    UPGRADE_MODE_STATUS
154                );
155            }
156
157            pub mod lewes_protocol {
158                // use super::*;
159            }
160        }
161
162        pub mod v2 {
163            use super::*;
164
165            pub const AUXILIARY: &str = "/auxiliary-details";
166
167            absolute_route!(auxiliary_absolute, v2_absolute(), AUXILIARY);
168        }
169    }
170}
171
172#[cfg(test)]
173mod tests {
174    use super::*;
175
176    #[test]
177    fn route_expansion_works() {
178        assert_eq!("/api/v1", routes::api::v1_absolute());
179
180        assert_eq!(
181            "/api/v1/build-information",
182            routes::api::v1::build_info_absolute()
183        );
184        assert_eq!(
185            "/api/v1/host-information",
186            routes::api::v1::host_info_absolute()
187        );
188        assert_eq!("/api/v1/roles", routes::api::v1::roles_absolute());
189
190        assert_eq!("/api/v1/gateway", routes::api::v1::gateway_absolute());
191        assert_eq!(
192            "/api/v1/gateway/client-interfaces",
193            routes::api::v1::gateway::client_interfaces_absolute()
194        );
195        assert_eq!(
196            "/api/v1/gateway/client-interfaces/wireguard",
197            routes::api::v1::gateway::client_interfaces::wireguard_absolute()
198        );
199        assert_eq!(
200            "/api/v1/gateway/client-interfaces/mixnet-websockets",
201            routes::api::v1::gateway::client_interfaces::mixnet_websockets_absolute()
202        );
203
204        assert_eq!("/api/v1/mixnode", routes::api::v1::mixnode_absolute());
205        assert_eq!(
206            "/api/v1/network-requester",
207            routes::api::v1::network_requester_absolute()
208        );
209        assert_eq!(
210            "/api/v1/ip-packet-router",
211            routes::api::v1::ip_packet_router_absolute()
212        );
213    }
214}