use super::{spawn_server_task, BLAZE_PORT};
use crate::{api::create_server_stream, ctx::ClientContext};
use log::{debug, error};
use std::{net::Ipv4Addr, sync::Arc};
use tokio::{
io::copy_bidirectional,
net::{TcpListener, TcpStream},
};
pub async fn start_blaze_server(ctx: Arc<ClientContext>) -> std::io::Result<()> {
let listener = TcpListener::bind((Ipv4Addr::LOCALHOST, BLAZE_PORT)).await?;
loop {
let (client_stream, _) = listener.accept().await?;
spawn_server_task(handle(client_stream, ctx.clone()));
}
}
async fn handle(mut client_stream: TcpStream, ctx: Arc<ClientContext>) {
debug!("Starting blaze connection");
let mut server_stream = match create_server_stream(
&ctx.http_client,
&ctx.base_url,
Option::as_ref(&ctx.association),
)
.await
{
Ok(stream) => stream,
Err(err) => {
error!("Failed to create server stream: {}", err);
return;
}
};
debug!("Blaze connection linked");
let _ = copy_bidirectional(&mut client_stream, &mut server_stream).await;
}