use ringkernel::prelude::*;
use ringkernel_cpu::CpuRuntime;
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt::init();
println!("=== RingKernel Ping-Pong K2K Example ===\n");
let runtime = Arc::new(CpuRuntime::new().await?);
println!("Runtime created with K2K messaging enabled\n");
let broker = runtime
.k2k_broker()
.expect("K2K broker should be available");
println!("K2K broker obtained");
let ping_id = KernelId::new("ping");
let pong_id = KernelId::new("pong");
let ping_endpoint = broker.register(ping_id.clone());
let mut pong_endpoint = broker.register(pong_id.clone());
println!("Registered endpoints: 'ping' and 'pong'");
let stats = broker.stats();
println!(
"Broker stats: {} endpoints registered\n",
stats.registered_endpoints
);
println!("--- Starting Ping-Pong Pattern ---\n");
for round in 1..=5 {
let timestamp = HlcTimestamp::now(round);
let envelope = MessageEnvelope::empty(
round, round + 1, timestamp,
);
let receipt = ping_endpoint.send(pong_id.clone(), envelope).await?;
match receipt.status {
DeliveryStatus::Delivered => {
println!("Round {}: PING -> PONG [delivered]", round);
}
other => {
println!("Round {}: PING -> PONG [{:?}]", round, other);
}
}
if let Some(message) = pong_endpoint.try_receive() {
println!(
" PONG received: hops={}, priority={}",
message.hops, message.priority
);
let response_timestamp = HlcTimestamp::now(round + 100);
let response = MessageEnvelope::empty(
message.destination.as_str().len() as u64,
message.source.as_str().len() as u64,
response_timestamp,
);
let _response_receipt = pong_endpoint.send(ping_id.clone(), response).await?;
println!(" PONG -> PING [responded]\n");
}
}
println!("--- Ping-Pong Complete ---\n");
println!("--- Priority Messaging Demo ---\n");
for priority in [0, 100, 200, 255] {
let envelope = MessageEnvelope::empty(1, 2, HlcTimestamp::now(1));
let receipt = ping_endpoint
.send_priority(pong_id.clone(), envelope, priority)
.await?;
println!("Sent priority {} message: {:?}", priority, receipt.status);
}
println!("\nReceiving messages by priority:");
while let Some(message) = pong_endpoint.try_receive() {
println!(" Received message with priority: {}", message.priority);
}
let final_stats = broker.stats();
println!("\n--- Final Broker Stats ---");
println!(
" Registered endpoints: {}",
final_stats.registered_endpoints
);
println!(" Messages delivered: {}", final_stats.messages_delivered);
println!(" Routes configured: {}", final_stats.routes_configured);
broker.unregister(&ping_id);
broker.unregister(&pong_id);
println!("\n=== Ping-Pong Example Complete! ===");
Ok(())
}