nym_go_ffi/
lib.rs

1// Copyright 2023-2024 - Nym Technologies SA <contact@nymtech.net>
2// SPDX-License-Identifier: Apache-2.0
3
4// due to autogenerated code
5#![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}