use iroh::endpoint::{Connection, SendStream};
use tokio::io::AsyncWriteExt;
use crate::error::{Error, Result};
#[derive(Debug)]
pub struct Channel {
connection: Connection,
send: SendStream,
}
impl Channel {
pub(crate) fn new(connection: Connection, send: SendStream) -> Self {
Self { connection, send }
}
pub async fn send(&mut self, payload: &[u8]) -> Result<()> {
self.send
.write_all(payload)
.await
.map_err(|e| Error::Transport(format!("channel write failed: {e}")))?;
self.send
.flush()
.await
.map_err(|e| Error::Transport(format!("channel flush failed: {e}")))?;
Ok(())
}
pub fn close(mut self) {
let _ = self.send.finish();
self.connection.close(0u32.into(), b"done");
}
pub fn connection(&self) -> &Connection {
&self.connection
}
}
impl Drop for Channel {
fn drop(&mut self) {
let _ = self.send.finish();
}
}