use std::net::SocketAddr;
use crate::transport::TransportConnection;
use crate::transport::bridge::spawn_bridge_local;
pub fn into_connection<S, E>(
sink: ntex::ws::WsSink,
mut stream: S,
peer: Option<SocketAddr>,
) -> Box<dyn TransportConnection>
where
S: futures_util::Stream<Item = Result<ntex::ws::Message, E>> + Unpin + 'static,
E: std::fmt::Debug,
{
spawn_bridge_local(
peer,
256,
move |tx| {
ntex::rt::spawn(async move {
use futures_util::StreamExt;
while let Some(msg) = stream.next().await {
let raw = match msg {
Ok(ntex::ws::Message::Binary(bin)) => {
let mut v = Vec::with_capacity(1 + bin.len());
v.push(b'B');
v.extend_from_slice(&bin);
v
}
Ok(ntex::ws::Message::Text(text)) => {
let mut v = Vec::with_capacity(1 + text.len());
v.push(b'T');
v.extend_from_slice(text.as_bytes());
v
}
Ok(ntex::ws::Message::Close(_)) => vec![b'C'],
Ok(_) => continue,
Err(e) => {
tracing::warn!(error = ?e, "ntex reader stream error");
break;
}
};
if tx.send(raw).await.is_err() {
break;
}
}
});
},
move |mut rx| {
ntex::rt::spawn(async move {
while let Some(raw) = rx.recv().await {
if raw.first() == Some(&b'C') {
let _ = sink.send(ntex::ws::Message::Close(None)).await;
break;
}
if raw.len() > 1 {
let _ = sink
.send(ntex::ws::Message::Binary(raw[1..].to_vec().into()))
.await;
}
}
});
},
)
}