Skip to main content

ferrijs_std/text/
text_encoder_stream.rs

1// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3use 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}