1use std::net::{IpAddr, TcpListener};
5
6use derive_more::Display;
7pub use seismic_enclave::{
8 client::{
9 rpc::{BuildableServer, SyncEnclaveApiClient},
10 EnclaveClient, MockEnclaveServer, ENCLAVE_DEFAULT_ENDPOINT_IP,
11 ENCLAVE_DEFAULT_ENDPOINT_PORT,
12 },
13 SchnorrkelKeypair,
14};
15use tracing::error;
16
17#[derive(Clone, Debug, Eq, PartialEq, Display)]
19pub enum EnclaveError {
20 EncryptionError,
22 DecryptionError,
24 EphRngKeypairGenerationError(String),
26 Custom(&'static str),
28}
29
30fn get_random_port() -> u16 {
32 TcpListener::bind("127.0.0.1:0") .expect("Failed to bind to a port")
34 .local_addr()
35 .unwrap()
36 .port()
37}
38
39pub async fn start_mock_enclave_server_random_port() -> EnclaveClient {
41 let port = get_random_port();
42 tokio::spawn(async move {
43 start_blocking_mock_enclave_server(ENCLAVE_DEFAULT_ENDPOINT_IP, port).await;
44 });
45 EnclaveClient::builder()
46 .ip(ENCLAVE_DEFAULT_ENDPOINT_IP.to_string())
47 .port(port)
48 .build()
49 .expect("Failed to build enclave client")
50}
51
52pub async fn start_default_mock_enclave_server() -> EnclaveClient {
54 let client = EnclaveClient::builder()
55 .ip(ENCLAVE_DEFAULT_ENDPOINT_IP.to_string())
56 .port(ENCLAVE_DEFAULT_ENDPOINT_PORT)
57 .build()
58 .expect("Failed to build enclave client");
59 tokio::spawn(async move {
60 start_blocking_mock_enclave_server(
61 ENCLAVE_DEFAULT_ENDPOINT_IP,
62 ENCLAVE_DEFAULT_ENDPOINT_PORT,
63 )
64 .await;
65 });
66 client
67}
68
69pub async fn start_blocking_mock_enclave_server(addr: IpAddr, port: u16) {
71 let enclave_server = MockEnclaveServer::new((addr, port));
72
73 let addr = enclave_server.addr();
74
75 match enclave_server.start().await {
76 Ok(handle) => {
77 handle.stopped().await;
78 }
79 Err(err) => {
80 let err = eyre::eyre!("Failed to start mock enclave server at {}: {}", addr, err);
81 error!("{:?}", err);
82 }
83 }
84}