Pull algorithm for tee - called from PullAlgorithm::Tee
(
ctx: Ctx<'js>,
state: Class<'js, TeeState<'js>>,
)
| 276 | |
| 277 | /// Pull algorithm for tee - called from PullAlgorithm::Tee |
| 278 | pub 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<()> { |
no test coverage detected