1
#![cfg(feature = "iroh")]
2
use crate::echo_protocol::{EchoChannel, EchoService};
3
use jetstream::prelude::*;
4
use jetstream_macros::service;
5
use okstd::prelude::*;
6

            
7
#[service(tracing)]
8
pub trait Echo {
9
    async fn square(&mut self, ctx: Context, i: u32) -> Result<String, Error>;
10
}
11

            
12
#[derive(Debug, Clone)]
13
struct EchoServer;
14

            
15
impl Echo for EchoServer {
16
    async fn square(&mut self, _ctx: Context, i: u32) -> Result<String, Error> {
17
        Ok((i * i).to_string())
18
    }
19
}
20

            
21
#[okstd::main]
22
async fn main() {
23
    // Initialize tracing subscriber
24
    tracing_subscriber::fmt()
25
        .with_max_level(tracing::Level::DEBUG)
26
        .with_thread_ids(true)
27
        .with_span_events(
28
            tracing_subscriber::fmt::format::FmtSpan::ENTER
29
                | tracing_subscriber::fmt::format::FmtSpan::EXIT,
30
        )
31
        .init();
32
    // Build the server router with the echo service
33
    let router = jetstream_iroh::server_builder(EchoService {
34
        inner: EchoServer {},
35
    })
36
    .await
37
    .unwrap();
38

            
39
    // get our own address. At this point we have a running router
40
    // that's ready to accept connections.
41
    let addr = router.endpoint().node_addr();
42

            
43
    // Build client transport and connect
44
    let mut transport = jetstream_iroh::client_builder::<EchoChannel>(addr)
45
        .await
46
        .unwrap();
47

            
48
    let mut ec = EchoChannel {
49
        inner: Box::new(&mut transport),
50
    };
51
    for i in 0..10 {
52
        let b = ec.square(Context::default(), i).await.unwrap();
53
        println!("square response: {i} * {i} = {b}");
54
    }
55

            
56
    router.shutdown().await.unwrap();
57
}