use std::net::SocketAddr;
use crate::transport::TransportConnection;
use crate::transport::bridge::spawn_bridge_local;
pub fn into_connection(
session: actix_ws::Session,
mut stream: actix_ws::MessageStream,
peer: Option<SocketAddr>,
) -> Box<dyn TransportConnection> {
spawn_bridge_local(
peer,
256,
move |tx| {
actix_web::rt::spawn(async move {
use futures_util::StreamExt;
while let Some(msg) = stream.next().await {
let raw = match msg {
Ok(actix_ws::Message::Binary(bin)) => {
let mut v = Vec::with_capacity(1 + bin.len());
v.push(b'B');
v.extend_from_slice(&bin);
v
}
Ok(actix_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(actix_ws::Message::Close(_)) => vec![b'C'],
Ok(_) => continue, Err(_) => break,
};
if tx.send(raw).await.is_err() {
break;
}
}
});
},
move |mut rx| {
let mut session = session;
actix_web::rt::spawn(async move {
while let Some(raw) = rx.recv().await {
if raw.first() == Some(&b'C') {
drop(session.close(None));
break;
}
if raw.len() > 1 {
drop(session.binary(raw[1..].to_vec()));
}
}
});
},
)
}