use core::ptr::NonNull;
use core::sync::atomic::Ordering;
use bun_picohttp as picohttp;
use bun_uws::quic;
use super::ClientSession;
use crate::HttpClient;
use crate::h3_client as h3;
pub struct Stream {
pub session: bun_ptr::BackRef<ClientSession>,
pub client: Option<NonNull<HttpClient<'static>>>,
pub qstream: Option<NonNull<quic::Stream>>,
pub decoded_headers: Vec<picohttp::Header>,
pub body_buffer: Vec<u8>,
pub status_code: u16,
pub pending_body: bun_ptr::RawSlice<u8>,
pub request_body_done: bool,
pub is_streaming_body: bool,
pub headers_delivered: bool,
}
impl Stream {
pub fn new(session: &mut ClientSession, client: &mut HttpClient<'_>) -> *mut Stream {
bun_core::heap::into_raw(Box::new(Stream {
session: bun_ptr::BackRef::new_mut(session),
client: Some(client.as_erased_ptr()),
qstream: None,
decoded_headers: Vec::new(),
body_buffer: Vec::new(),
status_code: 0,
pending_body: bun_ptr::RawSlice::EMPTY,
request_body_done: false,
is_streaming_body: false,
headers_delivered: false,
}))
}
#[inline]
pub fn qstream_mut<'s>(&self) -> Option<&'s mut quic::Stream> {
self.qstream
.map(|qs| super::client_session::quic_stream_mut(qs.as_ptr()))
}
#[inline]
pub fn session_mut<'s>(&self) -> &'s mut ClientSession {
super::client_session::session_mut(self.session.as_ptr())
}
pub fn abort(&mut self) {
if let Some(qs) = self.qstream_mut() {
qs.close();
}
}
}
impl Drop for Stream {
fn drop(&mut self) {
h3::LIVE_STREAMS.fetch_sub(1, Ordering::Relaxed);
}
}