use std::{collections::HashMap, sync::Arc};
use anyhow::{anyhow, Result};
use quinn::{Connection, RecvStream};
use tokio::sync::Mutex;
use crate::common::frame::FrameReader;
#[derive(Debug)]
pub struct ClientConnection {
pub connection: Connection,
pub recv_stream: Option<FrameReader>,
pub binary_streams: HashMap<String, Arc<Mutex<RecvStream>>>,
}
impl ClientConnection {
pub async fn new(connection: Connection) -> Result<Self> {
let binary_streams: HashMap<String, Arc<Mutex<RecvStream>>> = HashMap::new();
Ok(Self {
connection,
binary_streams,
recv_stream: None,
})
}
pub async fn get_recv_stream(&mut self) -> Result<Option<FrameReader>> {
let (_, recv_stream) = self
.connection
.accept_bi()
.await
.map_err(|e| anyhow!("Failed to open bi stream: {}", e))?;
let recv_stream = FrameReader::new(Arc::new(Mutex::new(recv_stream)));
self.recv_stream = Some(recv_stream);
Ok(self.recv_stream.clone())
}
}