@@ -47,6 +47,7 @@ const {
47
47
nonOpFlush,
48
48
kType,
49
49
kState,
50
+ nonOpCancel,
50
51
} = require ( 'internal/webstreams/util' ) ;
51
52
52
53
const {
@@ -384,8 +385,7 @@ function initializeTransformStream(
384
385
return transformStreamDefaultSourcePullAlgorithm ( stream ) ;
385
386
} ,
386
387
cancel ( reason ) {
387
- transformStreamErrorWritableAndUnblockWrite ( stream , reason ) ;
388
- return PromiseResolve ( ) ;
388
+ return transformStreamDefaultSourceCancelAlgorithm ( stream , reason ) ;
389
389
} ,
390
390
} , {
391
391
highWaterMark : readableHighWaterMark ,
@@ -427,6 +427,10 @@ function transformStreamErrorWritableAndUnblockWrite(stream, error) {
427
427
writableStreamDefaultControllerErrorIfNeeded (
428
428
writable [ kState ] . controller ,
429
429
error ) ;
430
+ transformStreamUnblockWrite ( stream ) ;
431
+ }
432
+
433
+ function transformStreamUnblockWrite ( stream ) {
430
434
if ( stream [ kState ] . backpressure )
431
435
transformStreamSetBackpressure ( stream , false ) ;
432
436
}
@@ -443,13 +447,15 @@ function setupTransformStreamDefaultController(
443
447
stream ,
444
448
controller ,
445
449
transformAlgorithm ,
446
- flushAlgorithm ) {
450
+ flushAlgorithm ,
451
+ cancelAlgorithm ) {
447
452
assert ( isTransformStream ( stream ) ) ;
448
453
assert ( stream [ kState ] . controller === undefined ) ;
449
454
controller [ kState ] = {
450
455
stream,
451
456
transformAlgorithm,
452
457
flushAlgorithm,
458
+ cancelAlgorithm,
453
459
} ;
454
460
stream [ kState ] . controller = controller ;
455
461
}
@@ -460,21 +466,26 @@ function setupTransformStreamDefaultControllerFromTransformer(
460
466
const controller = new TransformStreamDefaultController ( kSkipThrow ) ;
461
467
const transform = transformer ?. transform || defaultTransformAlgorithm ;
462
468
const flush = transformer ?. flush || nonOpFlush ;
469
+ const cancel = transformer ?. cancel || nonOpCancel ;
463
470
const transformAlgorithm =
464
471
FunctionPrototypeBind ( transform , transformer ) ;
465
472
const flushAlgorithm =
466
473
FunctionPrototypeBind ( flush , transformer ) ;
474
+ const cancelAlgorithm =
475
+ FunctionPrototypeBind ( cancel , transformer ) ;
467
476
468
477
setupTransformStreamDefaultController (
469
478
stream ,
470
479
controller ,
471
480
transformAlgorithm ,
472
- flushAlgorithm ) ;
481
+ flushAlgorithm ,
482
+ cancelAlgorithm ) ;
473
483
}
474
484
475
485
function transformStreamDefaultControllerClearAlgorithms ( controller ) {
476
486
controller [ kState ] . transformAlgorithm = undefined ;
477
487
controller [ kState ] . flushAlgorithm = undefined ;
488
+ controller [ kState ] . cancelAlgorithm = undefined ;
478
489
}
479
490
480
491
function transformStreamDefaultControllerEnqueue ( controller , chunk ) {
@@ -563,7 +574,40 @@ function transformStreamDefaultSinkWriteAlgorithm(stream, chunk) {
563
574
}
564
575
565
576
async function transformStreamDefaultSinkAbortAlgorithm ( stream , reason ) {
566
- transformStreamError ( stream , reason ) ;
577
+ const {
578
+ controller,
579
+ readable,
580
+ } = stream [ kState ] ;
581
+
582
+ if ( controller [ kState ] . finishPromise !== undefined ) {
583
+ return controller [ kState ] . finishPromise
584
+ }
585
+
586
+ const { promise, resolve, reject } = createDeferredPromise ( ) ;
587
+ controller [ kState ] . finishPromise = promise ;
588
+ const cancelPromise = ensureIsPromise (
589
+ controller [ kState ] . cancelAlgorithm ,
590
+ controller ,
591
+ reason ) ;
592
+ transformStreamDefaultControllerClearAlgorithms ( controller ) ;
593
+
594
+ PromisePrototypeThen (
595
+ cancelPromise ,
596
+ ( ) => {
597
+ if ( readable [ kState ] . state === 'errored' )
598
+ reject ( readable [ kState ] . storedError ) ;
599
+ else {
600
+ readableStreamDefaultControllerError ( readable [ kState ] . controller , reason ) ;
601
+ resolve ( ) ;
602
+ }
603
+ } ,
604
+ ( error ) => {
605
+ readableStreamDefaultControllerError ( readable [ kState ] . controller , error ) ;
606
+ reject ( error ) ;
607
+ }
608
+ ) ;
609
+
610
+ return controller [ kState ] . finishPromise ;
567
611
}
568
612
569
613
function transformStreamDefaultSinkCloseAlgorithm ( stream ) {
@@ -572,23 +616,32 @@ function transformStreamDefaultSinkCloseAlgorithm(stream) {
572
616
controller,
573
617
} = stream [ kState ] ;
574
618
619
+ if ( controller [ kState ] . finishPromise !== undefined ) {
620
+ return controller [ kState ] . finishPromise
621
+ }
622
+ const { promise, resolve, reject } = createDeferredPromise ( ) ;
623
+ controller [ kState ] . finishPromise = promise ;
575
624
const flushPromise =
576
625
ensureIsPromise (
577
626
controller [ kState ] . flushAlgorithm ,
578
627
controller ,
579
628
controller ) ;
580
629
transformStreamDefaultControllerClearAlgorithms ( controller ) ;
581
- return PromisePrototypeThen (
630
+ PromisePrototypeThen (
582
631
flushPromise ,
583
632
( ) => {
584
633
if ( readable [ kState ] . state === 'errored' )
585
- throw readable [ kState ] . storedError ;
586
- readableStreamDefaultControllerClose ( readable [ kState ] . controller ) ;
634
+ reject ( readable [ kState ] . storedError ) ;
635
+ else {
636
+ readableStreamDefaultControllerClose ( readable [ kState ] . controller ) ;
637
+ resolve ( ) ;
638
+ }
587
639
} ,
588
640
( error ) => {
589
- transformStreamError ( stream , error ) ;
590
- throw readable [ kState ] . storedError ;
641
+ readableStreamDefaultControllerError ( readable [ kState ] . controller , error ) ;
642
+ reject ( error ) ;
591
643
} ) ;
644
+ return controller [ kState ] . finishPromise ;
592
645
}
593
646
594
647
function transformStreamDefaultSourcePullAlgorithm ( stream ) {
@@ -598,6 +651,48 @@ function transformStreamDefaultSourcePullAlgorithm(stream) {
598
651
return stream [ kState ] . backpressureChange . promise ;
599
652
}
600
653
654
+ function transformStreamDefaultSourceCancelAlgorithm ( stream , reason ) {
655
+ const {
656
+ controller,
657
+ writable,
658
+ } = stream [ kState ] ;
659
+
660
+ if ( controller [ kState ] . finishPromise !== undefined ) {
661
+ return controller [ kState ] . finishPromise ;
662
+ }
663
+
664
+ const { promise, resolve, reject } = createDeferredPromise ( ) ;
665
+ controller [ kState ] . finishPromise = promise ;
666
+ const cancelPromise = ensureIsPromise (
667
+ controller [ kState ] . cancelAlgorithm ,
668
+ controller ,
669
+ reason ) ;
670
+ transformStreamDefaultControllerClearAlgorithms ( controller ) ;
671
+
672
+ PromisePrototypeThen ( cancelPromise ,
673
+ ( ) => {
674
+ if ( writable [ kState ] . state === 'errored' )
675
+ reject ( writable [ kState ] . storedError ) ;
676
+ else {
677
+ writableStreamDefaultControllerErrorIfNeeded (
678
+ writable [ kState ] . controller ,
679
+ reason ) ;
680
+ transformStreamUnblockWrite ( stream ) ;
681
+ resolve ( ) ;
682
+ }
683
+ } ,
684
+ ( error ) => {
685
+ writableStreamDefaultControllerErrorIfNeeded (
686
+ writable [ kState ] . controller ,
687
+ error ) ;
688
+ transformStreamUnblockWrite ( stream ) ;
689
+ reject ( error ) ;
690
+ }
691
+ ) ;
692
+
693
+ return controller [ kState ] . finishPromise
694
+ }
695
+
601
696
module . exports = {
602
697
TransformStream,
603
698
TransformStreamDefaultController,
0 commit comments