ferrijs_std/text/
text_encoder_stream.rs1use rquickjs::{
4 atom::PredefinedAtom, convert::Coerced, prelude::This, Ctx, Function, Object, Result,
5 TypedArray, Value,
6};
7
8#[rquickjs::class]
9#[derive(rquickjs::class::Trace, rquickjs::JsLifetime)]
10pub struct TextEncoderStream<'js> {
11 readable: Value<'js>,
12 writable: Value<'js>,
13}
14
15#[rquickjs::methods(rename_all = "camelCase")]
16impl<'js> TextEncoderStream<'js> {
17 #[qjs(constructor)]
18 pub fn new(ctx: Ctx<'js>) -> Result<Self> {
19 let transform = Function::new(ctx.clone(), transform)?;
20 let transformer = Object::new(ctx.clone())?;
21 transformer.set("transform", transform)?;
22
23 let stream = crate::stream_web::create_transform_stream(&ctx, transformer)?;
24
25 Ok(Self {
26 readable: stream.get("readable")?,
27 writable: stream.get("writable")?,
28 })
29 }
30
31 #[qjs(get)]
32 fn encoding(&self) -> &str {
33 "utf-8"
34 }
35
36 #[qjs(get)]
37 fn readable(&self) -> Value<'js> {
38 self.readable.clone()
39 }
40
41 #[qjs(get)]
42 fn writable(&self) -> Value<'js> {
43 self.writable.clone()
44 }
45
46 #[qjs(prop, rename = PredefinedAtom::SymbolToStringTag, configurable)]
47 pub fn to_string_tag() -> &'static str {
48 stringify!(TextEncoderStream)
49 }
50}
51
52fn transform<'js>(ctx: Ctx<'js>, chunk: Coerced<String>, controller: Object<'js>) -> Result<()> {
53 let bytes = TypedArray::new(ctx.clone(), chunk.0.as_bytes())?;
54 let enqueue: Function = controller.get("enqueue")?;
55 enqueue.call::<_, ()>((This(controller), bytes))
56}