use agent_phone::session::HandlerOutput;
use agent_phone::{
connect, create_server, encode_did_key, generate_key_pair, ClientOptions, Handler,
ServerOptions,
};
use serde_json::Value;
use std::collections::HashMap;
use std::sync::Arc;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let responder = generate_key_pair();
let initiator = generate_key_pair();
let responder_did = encode_did_key(&responder.public_key)?;
let initiator_did = encode_did_key(&initiator.public_key)?;
let mut handlers: HashMap<String, Handler> = HashMap::new();
handlers.insert(
"echo".into(),
Arc::new(|p: Value| Box::pin(async move { Ok(HandlerOutput::Unary(p)) })),
);
let mut server = create_server(ServerOptions {
did: responder_did.clone(),
private_key: responder.private_key,
handlers,
});
server.listen(0, "127.0.0.1").await?;
let port = server.address().expect("bound").port();
println!("server listening on 127.0.0.1:{port}");
let client = connect(ClientOptions {
url: format!("ws://127.0.0.1:{port}"),
did: initiator_did,
private_key: initiator.private_key,
responder_did: responder_did.clone(),
responder_public_key: None,
})
.await?;
println!("noise-xk handshake complete; channel authenticated");
let reply = client
.call("echo", Some(serde_json::json!({"hello": "agent-phone"})))
.await?;
println!("echo result : {reply}");
assert_eq!(reply, serde_json::json!({"hello": "agent-phone"}));
client.close().await;
server.close().await;
println!("closed cleanly");
Ok(())
}