use bytes::Bytes;
use monocoque_zmtp::req::ReqSocket;
use std::thread;
use std::time::Duration;
use tracing::info;
fn main() {
info!("=== Monocoque REQ ↔ libzmq REP Interop Test ===\n");
let server_handle = thread::spawn(|| {
let ctx = zmq::Context::new();
let rep = ctx.socket(zmq::REP).unwrap();
rep.bind("tcp://127.0.0.1:5561").unwrap();
info!("[libzmq REP] Listening on tcp://127.0.0.1:5561");
let request = rep.recv_bytes(0).unwrap();
info!(
"[libzmq REP] Received request: {:?}",
String::from_utf8_lossy(&request)
);
rep.send("Reply from libzmq REP", 0).unwrap();
info!("[libzmq REP] Sent reply\n");
let request = rep.recv_bytes(0).unwrap();
info!(
"[libzmq REP] Received second request: {:?}",
String::from_utf8_lossy(&request)
);
rep.send("Second reply from libzmq", 0).unwrap();
info!("[libzmq REP] Sent second reply\n");
thread::sleep(Duration::from_millis(100));
});
thread::sleep(Duration::from_millis(50));
compio::runtime::Runtime::new().unwrap().block_on(async {
info!("[Monocoque REQ] Connecting to tcp://127.0.0.1:5561");
let stream = compio::net::TcpStream::connect("127.0.0.1:5561")
.await
.expect("Failed to connect");
let mut socket = ReqSocket::new(stream).await.unwrap();
info!("[Monocoque REQ] Connected\n");
info!("[Monocoque REQ] Sending first request");
socket
.send(vec![Bytes::from_static(b"Request from Monocoque REQ")])
.await
.expect("Failed to send");
let response = socket
.recv()
.await
.expect("Failed to receive")
.expect("Connection closed");
info!("[Monocoque REQ] Received response:");
{
let msg = response;
for (i, frame) in msg.iter().enumerate() {
info!(" Frame {}: {:?}", i, String::from_utf8_lossy(frame));
}
}
info!("\n[Monocoque REQ] Sending second request");
socket
.send(vec![Bytes::from_static(b"Second request")])
.await
.expect("Failed to send second request");
let response = socket
.recv()
.await
.expect("Failed to receive second reply")
.expect("Connection closed");
info!("[Monocoque REQ] Received second response:");
{
let msg = response;
for (i, frame) in msg.iter().enumerate() {
info!(" Frame {}: {:?}", i, String::from_utf8_lossy(frame));
}
}
drop(socket);
});
server_handle.join().unwrap();
info!("\n✅ REQ interop test completed successfully!");
}