51 lines
1.6 KiB
Rust
51 lines
1.6 KiB
Rust
use anyhow::{Result, bail};
|
|
use dosh::client::DoshClient;
|
|
use dosh::transport::{SessionEvent, TransportEvent};
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<()> {
|
|
let mut args = std::env::args().skip(1);
|
|
let host = args.next().unwrap_or_else(|| "server".to_string());
|
|
let message = args.collect::<Vec<_>>().join(" ");
|
|
let message = if message.is_empty() {
|
|
"hello from dosh".to_string()
|
|
} else {
|
|
message
|
|
};
|
|
|
|
let client = DoshClient::load()?;
|
|
let mut transport = client
|
|
.connect(host)
|
|
.service("echo")
|
|
.connect()
|
|
.await?
|
|
.into_transport();
|
|
let stream = transport.open_service("echo").await?;
|
|
|
|
loop {
|
|
match transport.recv().await? {
|
|
SessionEvent::Stream(TransportEvent::OpenOk { stream_id, .. })
|
|
if stream_id == stream =>
|
|
{
|
|
transport.send(stream, message.as_bytes().to_vec()).await?;
|
|
}
|
|
SessionEvent::Stream(TransportEvent::Data(data)) if data.stream_id == stream => {
|
|
for chunk in data.chunks {
|
|
print!("{}", String::from_utf8_lossy(&chunk));
|
|
}
|
|
println!();
|
|
transport.close(stream).await?;
|
|
return Ok(());
|
|
}
|
|
SessionEvent::Stream(TransportEvent::OpenReject { reason, .. }) => {
|
|
bail!("server rejected echo stream: {reason}");
|
|
}
|
|
SessionEvent::Stream(_)
|
|
| SessionEvent::Ping
|
|
| SessionEvent::Pong
|
|
| SessionEvent::Ignored => {}
|
|
}
|
|
transport.maintenance().await?;
|
|
}
|
|
}
|