use crate::error::{NexarError, Result};
use tokio::sync::Mutex;
pub(crate) struct StreamPool {
conn: quinn::Connection,
ready: Mutex<Vec<quinn::SendStream>>,
max_ready: usize,
}
impl StreamPool {
pub fn new(conn: quinn::Connection, max_ready: usize) -> Self {
Self {
conn,
ready: Mutex::new(Vec::with_capacity(max_ready)),
max_ready,
}
}
pub async fn refill(&self) -> Result<()> {
let mut ready = self.ready.lock().await;
while ready.len() < self.max_ready {
let stream = self
.conn
.open_uni()
.await
.map_err(|e| NexarError::transport_with_source("open uni stream", e))?;
ready.push(stream);
}
Ok(())
}
pub async fn checkout(&self) -> Result<quinn::SendStream> {
{
let mut ready = self.ready.lock().await;
if let Some(stream) = ready.pop() {
return Ok(stream);
}
}
self.conn
.open_uni()
.await
.map_err(|e| NexarError::transport_with_source("open uni stream", e))
}
}