MCPcopy Create free account
hub / github.com/awslabs/llrt / tee_pull_algorithm

Function tee_pull_algorithm

modules/llrt_stream_web/src/readable/stream/tee.rs:278–440  ·  view source on GitHub ↗

Pull algorithm for tee - called from PullAlgorithm::Tee

(
    ctx: Ctx<'js>,
    state: Class<'js, TeeState<'js>>,
)

Source from the content-addressed store, hash-verified

276
277/// Pull algorithm for tee - called from PullAlgorithm::Tee
278pub fn tee_pull_algorithm<'js>(
279 ctx: Ctx<'js>,
280 state: Class<'js, TeeState<'js>>,
281) -> Result<Promise<'js>> {
282 let state_ref = state.borrow();
283
284 // If reading is true, set readAgain to true and return resolved promise
285 if state_ref.reading.load(Ordering::Acquire) {
286 state_ref.read_again.store(true, Ordering::Release);
287 return Ok(state_ref
288 .stream
289 .borrow()
290 .promise_primordials
291 .promise_resolved_with_undefined
292 .clone());
293 }
294
295 // Set reading to true
296 state_ref.reading.store(true, Ordering::Release);
297
298 let objects_class: ReadableStreamClassObjects<
299 'js,
300 ReadableStreamDefaultControllerOwned<'js>,
301 ReadableStreamDefaultReaderOwned<'js>,
302 > = ReadableStreamClassObjects {
303 stream: state_ref.stream.clone(),
304 controller: state_ref.controller.clone(),
305 reader: state_ref.reader.clone(),
306 };
307 drop(state_ref);
308
309 let mut objects = ReadableStreamObjects::from_class(objects_class.clone());
310
311 // ReadRequest that just holds TeeState
312 #[derive(Clone)]
313 struct TeeReadRequest<'js>(Class<'js, TeeState<'js>>);
314
315 impl<'js> Trace<'js> for TeeReadRequest<'js> {
316 fn trace<'a>(&self, tracer: rquickjs::class::Tracer<'a, 'js>) {
317 self.0.trace(tracer);
318 }
319 }
320
321 impl<'js> ReadableStreamReadRequest<'js> for TeeReadRequest<'js> {
322 fn chunk_steps(
323 &self,
324 objects: ReadableStreamDefaultReaderObjects<'js>,
325 chunk: Value<'js>,
326 ) -> Result<ReadableStreamDefaultReaderObjects<'js>> {
327 let ctx = chunk.ctx().clone();
328 let state = self.0.clone();
329
330 objects.with_assert_default_controller(|objects| {
331 let objects_class = objects.into_inner();
332 let f = {
333 let ctx = ctx.clone();
334 let _objects_class = objects_class.clone();
335 move || -> Result<()> {

Callers 2

chunk_stepsMethod · 0.85
callMethod · 0.85

Calls 3

TeeReadRequestClass · 0.85
loadMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected