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_ADDR,
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_ADDR, port).await;
44 });
45 EnclaveClient::builder().addr(ENCLAVE_DEFAULT_ENDPOINT_ADDR.to_string()).port(port).build()
46}
47
48pub async fn start_default_mock_enclave_server() -> EnclaveClient {
50 let client = EnclaveClient::builder()
51 .addr(ENCLAVE_DEFAULT_ENDPOINT_ADDR.to_string())
52 .port(ENCLAVE_DEFAULT_ENDPOINT_PORT)
53 .build();
54 tokio::spawn(async move {
55 start_blocking_mock_enclave_server(
56 ENCLAVE_DEFAULT_ENDPOINT_ADDR,
57 ENCLAVE_DEFAULT_ENDPOINT_PORT,
58 )
59 .await;
60 });
61 client
62}
63
64pub async fn start_blocking_mock_enclave_server(addr: IpAddr, port: u16) {
66 let enclave_server = MockEnclaveServer::new((addr, port));
67
68 let addr = enclave_server.addr();
69
70 match enclave_server.start().await {
71 Ok(handle) => {
72 handle.stopped().await;
73 }
74 Err(err) => {
75 let err = eyre::eyre!("Failed to start mock enclave server at {}: {}", addr, err);
76 error!("{:?}", err);
77 }
78 }
79}