use crate::utils::{
module::{export_default, ModuleInfo},
primordials::{BasePrimordials, Primordial},
};
use queuing_strategy::{ByteLengthQueuingStrategy, CountQueuingStrategy};
use readable::{
ReadableByteStreamController, ReadableStreamBYOBReader, ReadableStreamBYOBRequest,
ReadableStreamDefaultController, ReadableStreamDefaultReader,
};
use rquickjs::{
module::{Declarations, Exports, ModuleDef},
Class, Ctx, Object, Result,
};
use writable::{WritableStream, WritableStreamDefaultController, WritableStreamDefaultWriter};
use crate::stream_web::{
readable::{ArrayConstructorPrimordials, IteratorPrimordials},
transform::{TransformStream, TransformStreamDefaultController},
utils::promise::PromisePrimordials,
writable::WritableStreamDefaultControllerPrimordials,
};
mod queuing_strategy;
pub mod readable;
mod readable_writable_pair;
mod transform;
pub mod utils;
mod writable;
pub use readable::stream::lock_readable_stream;
pub use readable::stream::tee_readable_stream;
pub use readable::stream::try_sync_drain_closed_stream;
pub use readable::stream::ReadableStream;
pub use readable::{
readable_byte_stream_controller_close_stream, readable_byte_stream_controller_enqueue_bytes,
readable_byte_stream_controller_enqueue_bytes_borrowed,
readable_stream_default_controller_close_stream,
readable_stream_default_controller_enqueue_value,
readable_stream_default_controller_error_stream, ReadableByteStreamControllerClass,
ReadableStreamDefaultControllerClass,
};
pub use readable::{CancelAlgorithm, PullAlgorithm, ReadableStreamControllerClass, StartAlgorithm};
pub use readable::{NativePull, NativePullFn, NativePullResult};
pub fn create_transform_stream<'js>(
ctx: &Ctx<'js>,
transformer: Object<'js>,
) -> Result<Object<'js>> {
init_primordials(ctx)?;
Ok(TransformStream::from_transformer(ctx.clone(), transformer)?.into_inner())
}
fn init_primordials(ctx: &Ctx<'_>) -> Result<()> {
BasePrimordials::init(ctx)?;
PromisePrimordials::init(ctx)?;
ArrayConstructorPrimordials::init(ctx)?;
WritableStreamDefaultControllerPrimordials::init(ctx)?;
IteratorPrimordials::init(ctx)?;
Ok(())
}
pub struct StreamWebModule;
impl ModuleDef for StreamWebModule {
fn declare(declare: &Declarations) -> Result<()> {
declare.declare(stringify!(ReadableStream))?;
declare.declare(stringify!(ReadableStreamDefaultReader))?;
declare.declare(stringify!(ReadableStreamBYOBReader))?;
declare.declare(stringify!(ReadableStreamDefaultController))?;
declare.declare(stringify!(ReadableByteStreamController))?;
declare.declare(stringify!(ReadableStreamBYOBRequest))?;
declare.declare(stringify!(WritableStream))?;
declare.declare(stringify!(WritableStreamDefaultWriter))?;
declare.declare(stringify!(WritableStreamDefaultController))?;
declare.declare(stringify!(TransformStream))?;
declare.declare(stringify!(TransformStreamDefaultController))?;
declare.declare(stringify!(ByteLengthQueuingStrategy))?;
declare.declare(stringify!(CountQueuingStrategy))?;
declare.declare("default")?;
Ok(())
}
#[inline]
fn evaluate<'js>(ctx: &Ctx<'js>, exports: &Exports<'js>) -> Result<()> {
export_default(ctx, exports, |default| {
Class::<ReadableStream>::define(default)?;
Class::<ReadableStreamDefaultReader>::define(default)?;
Class::<ReadableStreamBYOBReader>::define(default)?;
Class::<ReadableStreamDefaultController>::define(default)?;
Class::<ReadableByteStreamController>::define(default)?;
Class::<ReadableStreamBYOBRequest>::define(default)?;
Class::<WritableStream>::define(default)?;
Class::<WritableStreamDefaultWriter>::define(default)?;
Class::<WritableStreamDefaultController>::define(default)?;
Class::<ByteLengthQueuingStrategy>::define(default)?;
Class::<CountQueuingStrategy>::define(default)?;
Class::<TransformStream>::define(default)?;
Class::<TransformStreamDefaultController>::define(default)?;
Ok(())
})?;
Ok(())
}
}
impl From<StreamWebModule> for ModuleInfo<StreamWebModule> {
fn from(val: StreamWebModule) -> Self {
ModuleInfo {
name: "stream/web",
module: val,
}
}
}
pub fn init(ctx: &Ctx) -> Result<()> {
let globals = &ctx.globals();
init_primordials(ctx)?;
Class::<ByteLengthQueuingStrategy>::define(globals)?;
Class::<CountQueuingStrategy>::define(globals)?;
Class::<ReadableByteStreamController>::define(globals)?;
Class::<ReadableStream>::define(globals)?;
Class::<ReadableStreamBYOBReader>::define(globals)?;
Class::<ReadableStreamBYOBRequest>::define(globals)?;
Class::<ReadableStreamDefaultController>::define(globals)?;
Class::<ReadableStreamDefaultReader>::define(globals)?;
Class::<WritableStream>::define(globals)?;
Class::<WritableStreamDefaultController>::define(globals)?;
Class::<WritableStreamDefaultWriter>::define(globals)?;
Class::<TransformStream>::define(globals)?;
Class::<TransformStreamDefaultController>::define(globals)?;
Ok(())
}