use std::sync::{Arc, Mutex};
use crate::{
buffer::Data,
error::StreamError,
stream::{FinState, SharedStreamState},
};
pub struct StreamHandle(pub(super) Arc<Mutex<SharedStreamState>>);
impl StreamHandle {
pub fn received_data(
&mut self,
data: Data,
fin_read: bool,
fin_write: bool,
) -> Result<FinState, StreamError> {
let mut guard = self.0.lock().unwrap();
let SharedStreamState {
inbound,
outbound,
updates_poller,
} = &mut *guard;
inbound.received_data(data)?;
if fin_write {
inbound.received_fin_write(updates_poller)?;
}
if fin_read {
outbound.received_fin_read(updates_poller)?;
}
Ok(inbound.fin_state().and(outbound.fin_state()))
}
pub fn received_window_update(
&mut self,
update: u32,
fin_read: bool,
fin_write: bool,
) -> Result<FinState, StreamError> {
let mut guard = self.0.lock().unwrap();
let SharedStreamState {
inbound,
outbound,
updates_poller,
} = &mut *guard;
outbound.received_window_update(update, updates_poller)?;
if fin_read {
outbound.received_fin_read(updates_poller)?;
}
if fin_write {
inbound.received_fin_write(updates_poller)?;
}
Ok(inbound.fin_state().and(outbound.fin_state()))
}
pub fn try_abort(self) {
let Ok(mut guard) = self.0.lock() else {
return;
};
let SharedStreamState {
inbound,
outbound,
updates_poller,
} = &mut *guard;
let _ = inbound.received_fin_write(updates_poller);
let _ = outbound.received_fin_read(updates_poller);
}
}