use base64::Engine;
use std::sync::Arc;
use std::time::Duration;
use tap_agent::agent_key_manager::AgentKeyManagerBuilder;
use tap_agent::config::AgentConfig;
use tap_agent::did::{DIDKeyGenerator, MultiResolver};
use tap_agent::key_manager::{Secret, SecretMaterial, SecretType};
use tap_agent::TapAgent;
use tokio::time::sleep;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("1. Creating Alice and Bob agents...");
let key_generator = Arc::new(DIDKeyGenerator::new());
let alice_key = key_generator.generate_did(tap_agent::did::DIDGenerationOptions::default())?;
let bob_key = key_generator.generate_did(tap_agent::did::DIDGenerationOptions::default())?;
println!(" - Alice DID: {}", alice_key.did);
println!(" - Bob DID: {}", bob_key.did);
let _did_resolver = Arc::new(MultiResolver::default());
let mut alice_builder = AgentKeyManagerBuilder::new();
let mut bob_builder = AgentKeyManagerBuilder::new();
let alice_secret = Secret {
id: alice_key.did.clone(),
type_: SecretType::JsonWebKey2020,
secret_material: SecretMaterial::JWK {
private_key_jwk: serde_json::json!({
"kty": "OKP",
"crv": "Ed25519",
"x": base64::engine::general_purpose::STANDARD.encode(&alice_key.public_key),
"d": base64::engine::general_purpose::STANDARD.encode(&alice_key.private_key)
}),
},
};
let bob_secret = Secret {
id: bob_key.did.clone(),
type_: SecretType::JsonWebKey2020,
secret_material: SecretMaterial::JWK {
private_key_jwk: serde_json::json!({
"kty": "OKP",
"crv": "Ed25519",
"x": base64::engine::general_purpose::STANDARD.encode(&bob_key.public_key),
"d": base64::engine::general_purpose::STANDARD.encode(&bob_key.private_key)
}),
},
};
alice_builder = alice_builder.add_secret(alice_key.did.clone(), alice_secret);
bob_builder = bob_builder.add_secret(bob_key.did.clone(), bob_secret);
let alice_key_manager = alice_builder
.build()
.expect("Failed to build Alice's key manager");
let bob_key_manager = bob_builder
.build()
.expect("Failed to build Bob's key manager");
let alice_config = AgentConfig::new(alice_key.did.clone())
.with_security_mode("SIGNED")
.with_debug(true);
let bob_config = AgentConfig::new(bob_key.did.clone())
.with_security_mode("SIGNED")
.with_debug(true);
let _alice = Arc::new(TapAgent::new(alice_config, Arc::new(alice_key_manager)));
let _bob = Arc::new(TapAgent::new(bob_config, Arc::new(bob_key_manager)));
println!("2. Creating message routers...");
let _alice_router = tap_node::message::DefaultPlainMessageRouter::new();
let _bob_router = tap_node::message::DefaultPlainMessageRouter::new();
let _alice_sender =
tap_node::WebSocketPlainMessageSender::new("ws://localhost:3001/ws".to_string());
let _bob_sender =
tap_node::WebSocketPlainMessageSender::new("ws://localhost:3002/ws".to_string());
println!("3. Starting WebSocket servers...");
println!("4. Sending a message from Alice to Bob...");
println!("5. WebSocket messaging simulation complete");
sleep(Duration::from_secs(1)).await;
Ok(())
}