Document Dosh Rust SDK examples
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
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?;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
use anyhow::Result;
|
||||
use dosh::server::{DoshServer, DoshServerConfig, DoshServerEvent};
|
||||
use dosh::transport::{SessionEvent, TransportEvent};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
let config = DoshServerConfig::default().service("echo")?;
|
||||
let mut server = DoshServer::bind(config).await?;
|
||||
eprintln!("listening on {}", server.local_addr()?);
|
||||
|
||||
loop {
|
||||
match server.recv().await? {
|
||||
DoshServerEvent::Accepted(client) => {
|
||||
eprintln!(
|
||||
"accepted user={} session={} conn={:?}",
|
||||
client.user, client.session, client.conn_id
|
||||
);
|
||||
}
|
||||
DoshServerEvent::Session {
|
||||
conn_id,
|
||||
event: SessionEvent::Stream(TransportEvent::Open(open)),
|
||||
} => {
|
||||
server.accept_stream(conn_id, open.stream_id).await?;
|
||||
}
|
||||
DoshServerEvent::Session {
|
||||
conn_id,
|
||||
event: SessionEvent::Stream(TransportEvent::Data(data)),
|
||||
} => {
|
||||
for chunk in data.chunks {
|
||||
server.send(conn_id, data.stream_id, chunk).await?;
|
||||
}
|
||||
}
|
||||
DoshServerEvent::Session { .. } | DoshServerEvent::Ignored => {}
|
||||
}
|
||||
server.maintenance().await?;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user