1#![allow(clippy::empty_line_after_doc_comments)]
6
7use nym_crypto::asymmetric::ed25519;
8use nym_sdk::mixnet::Recipient;
9use nym_sphinx_anonymous_replies::requests::AnonymousSenderTag;
10uniffi::include_scaffolding!("bindings");
11
12#[allow(clippy::enum_variant_names)]
13#[derive(Debug, thiserror::Error)]
14enum GoWrapError {
15 #[error("Couldn't init client")]
16 ClientInitError {},
17 #[error("Error getting self address")]
18 SelfAddrError {},
19 #[error("Error sending message")]
20 SendMsgError {},
21 #[error("Error sending reply")]
22 ReplyError {},
23 #[error("Could not start listening")]
24 ListenError {},
25 #[error("Couldn't init proxy client")]
26 ProxyInitError {},
27 #[error("Couldn't run proxy client")]
28 ProxyRunError {},
29 #[error("Couldn't init proxy server")]
30 ServerInitError {},
31 #[error("Couldn't get proxy server address")]
32 AddressGetterError {},
33 #[error("Couldn't run proxy server")]
34 ServerRunError {},
35}
36
37#[no_mangle]
38fn init_logging() {
39 nym_bin_common::logging::setup_tracing_logger();
40}
41
42#[no_mangle]
43fn init_ephemeral() -> Result<(), GoWrapError> {
44 match nym_ffi_shared::init_ephemeral_internal() {
45 Ok(_) => Ok(()),
46 Err(_) => Err(GoWrapError::ClientInitError {}),
47 }
48}
49
50#[no_mangle]
51fn get_self_address() -> Result<String, GoWrapError> {
52 match nym_ffi_shared::get_self_address_internal() {
53 Ok(addr) => Ok(addr),
54 Err(..) => Err(GoWrapError::SelfAddrError {}),
55 }
56}
57
58#[no_mangle]
59fn send_message(recipient: String, message: String) -> Result<(), GoWrapError> {
60 let nym_recipient_type =
61 Recipient::try_from_base58_string(recipient).expect("couldn't create Recipient");
62 match nym_ffi_shared::send_message_internal(nym_recipient_type, &message) {
63 Ok(_) => Ok(()),
64 Err(_) => Err(GoWrapError::SendMsgError {}),
65 }
66}
67
68#[no_mangle]
69fn reply(recipient: Vec<u8>, message: String) -> Result<(), GoWrapError> {
70 let mut sized_array: [u8; 16] = [0; 16];
71 sized_array.copy_from_slice(&recipient[..16]);
72 let anon_recipient_type: AnonymousSenderTag = AnonymousSenderTag::from_bytes(sized_array);
73 match nym_ffi_shared::reply_internal(anon_recipient_type, &message) {
74 Ok(_) => Ok(()),
75 Err(_) => Err(GoWrapError::ReplyError {}),
76 }
77}
78
79pub struct IncomingMessage {
80 message: String,
81 sender: Vec<u8>,
82}
83
84#[no_mangle]
85fn listen_for_incoming() -> Result<IncomingMessage, GoWrapError> {
86 match nym_ffi_shared::listen_for_incoming_internal() {
87 Ok(received) => {
88 let message = String::from_utf8_lossy(&received.message).to_string();
89 let sender = received.sender_tag.unwrap().to_bytes().to_vec();
90 let incoming = IncomingMessage { message, sender };
91 Ok(incoming)
92 }
93 Err(_) => Err(GoWrapError::ListenError {}),
94 }
95}
96
97#[no_mangle]
98fn new_proxy_client(
99 server_address: String,
100 listen_address: String,
101 listen_port: String,
102 close_timeout: u64,
103 env: Option<String>,
104 pool_size: u8,
105) -> Result<(), GoWrapError> {
106 let server_nym_addr =
107 Recipient::try_from_base58_string(server_address).expect("couldn't create Recipient");
108 match nym_ffi_shared::proxy_client_new_internal(
109 server_nym_addr,
110 &listen_address,
111 &listen_port,
112 close_timeout,
113 env,
114 pool_size as usize,
115 ) {
116 Ok(_) => Ok(()),
117 Err(_) => Err(GoWrapError::ProxyInitError {}),
118 }
119}
120
121#[no_mangle]
122fn new_proxy_client_default(
123 server_address: String,
124 env: Option<String>,
125) -> Result<(), GoWrapError> {
126 let server_nym_addr =
127 Recipient::try_from_base58_string(server_address).expect("couldn't create Recipient");
128 match nym_ffi_shared::proxy_client_new_defaults_internal(server_nym_addr, env) {
129 Ok(_) => Ok(()),
130 Err(_) => Err(GoWrapError::ProxyInitError {}),
131 }
132}
133
134fn run_proxy_client() -> Result<(), GoWrapError> {
135 match nym_ffi_shared::proxy_client_run_internal() {
136 Ok(_) => Ok(()),
137 Err(_) => Err(GoWrapError::ProxyRunError {}),
138 }
139}
140
141fn new_proxy_server(
142 upstream_address: String,
143 config_dir: String,
144 env: Option<String>,
145 gateway: Option<String>,
146) -> Result<(), GoWrapError> {
147 if gateway.is_some() {
148 let gateway_key = match gateway {
149 Some(gateway_str) => match ed25519::PublicKey::from_base58_string(&gateway_str) {
150 Ok(key) => Ok(key),
151 Err(err) => Err(anyhow::anyhow!("Failed to parse gateway key: {}", err)),
152 },
153 None => Err(anyhow::anyhow!("Gateway string is None")),
154 };
155
156 match nym_ffi_shared::proxy_server_new_internal(
157 &upstream_address,
158 &config_dir,
159 env,
160 Some(gateway_key.expect("Couldn't unwrap gateway key")),
161 ) {
162 Ok(_) => Ok(()),
163 Err(_) => Err(GoWrapError::ServerInitError {}),
164 }
165 } else {
166 match nym_ffi_shared::proxy_server_new_internal(&upstream_address, &config_dir, env, None) {
167 Ok(_) => Ok(()),
168 Err(_) => Err(GoWrapError::ServerInitError {}),
169 }
170 }
171}
172
173fn proxy_server_address() -> Result<String, GoWrapError> {
174 match nym_ffi_shared::proxy_server_address_internal() {
175 Ok(address) => Ok(address.to_string()),
176 Err(_) => Err(GoWrapError::AddressGetterError {}),
177 }
178}
179
180fn run_proxy_server() -> Result<(), GoWrapError> {
181 match nym_ffi_shared::proxy_server_run_internal() {
182 Ok(_) => Ok(()),
183 Err(_) => Err(GoWrapError::ServerRunError {}),
184 }
185}