@@ -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 {
@@ -376,8 +377,7 @@ function initializeTransformStream(
376
377
return transformStreamDefaultSourcePullAlgorithm ( stream ) ;
377
378
} ,
378
379
cancel ( reason ) {
379
- transformStreamErrorWritableAndUnblockWrite ( stream , reason ) ;
380
- return PromiseResolve ( ) ;
380
+ return transformStreamDefaultSourceCancelAlgorithm ( stream , reason ) ;
381
381
} ,
382
382
} , {
383
383
highWaterMark : readableHighWaterMark ,
@@ -419,6 +419,10 @@ function transformStreamErrorWritableAndUnblockWrite(stream, error) {
419
419
writableStreamDefaultControllerErrorIfNeeded (
420
420
writable [ kState ] . controller ,
421
421
error ) ;
422
+ transformStreamUnblockWrite ( stream ) ;
423
+ }
424
+
425
+ function transformStreamUnblockWrite ( stream ) {
422
426
if ( stream [ kState ] . backpressure )
423
427
transformStreamSetBackpressure ( stream , false ) ;
424
428
}
@@ -435,13 +439,15 @@ function setupTransformStreamDefaultController(
435
439
stream ,
436
440
controller ,
437
441
transformAlgorithm ,
438
- flushAlgorithm ) {
442
+ flushAlgorithm ,
443
+ cancelAlgorithm ) {
439
444
assert ( isTransformStream ( stream ) ) ;
440
445
assert ( stream [ kState ] . controller === undefined ) ;
441
446
controller [ kState ] = {
442
447
stream,
443
448
transformAlgorithm,
444
449
flushAlgorithm,
450
+ cancelAlgorithm,
445
451
} ;
446
452
stream [ kState ] . controller = controller ;
447
453
}
@@ -452,21 +458,26 @@ function setupTransformStreamDefaultControllerFromTransformer(
452
458
const controller = new TransformStreamDefaultController ( kSkipThrow ) ;
453
459
const transform = transformer ?. transform || defaultTransformAlgorithm ;
454
460
const flush = transformer ?. flush || nonOpFlush ;
461
+ const cancel = transformer ?. cancel || nonOpCancel ;
455
462
const transformAlgorithm =
456
463
FunctionPrototypeBind ( transform , transformer ) ;
457
464
const flushAlgorithm =
458
465
FunctionPrototypeBind ( flush , transformer ) ;
466
+ const cancelAlgorithm =
467
+ FunctionPrototypeBind ( cancel , transformer ) ;
459
468
460
469
setupTransformStreamDefaultController (
461
470
stream ,
462
471
controller ,
463
472
transformAlgorithm ,
464
- flushAlgorithm ) ;
473
+ flushAlgorithm ,
474
+ cancelAlgorithm ) ;
465
475
}
466
476
467
477
function transformStreamDefaultControllerClearAlgorithms ( controller ) {
468
478
controller [ kState ] . transformAlgorithm = undefined ;
469
479
controller [ kState ] . flushAlgorithm = undefined ;
480
+ controller [ kState ] . cancelAlgorithm = undefined ;
470
481
}
471
482
472
483
function transformStreamDefaultControllerEnqueue ( controller , chunk ) {
@@ -555,7 +566,40 @@ function transformStreamDefaultSinkWriteAlgorithm(stream, chunk) {
555
566
}
556
567
557
568
async function transformStreamDefaultSinkAbortAlgorithm ( stream , reason ) {
558
- transformStreamError ( stream , reason ) ;
569
+ const {
570
+ controller,
571
+ readable,
572
+ } = stream [ kState ] ;
573
+
574
+ if ( controller [ kState ] . finishPromise !== undefined ) {
575
+ return controller [ kState ] . finishPromise
576
+ }
577
+
578
+ const { promise, resolve, reject } = createDeferredPromise ( ) ;
579
+ controller [ kState ] . finishPromise = promise ;
580
+ const cancelPromise = ensureIsPromise (
581
+ controller [ kState ] . cancelAlgorithm ,
582
+ controller ,
583
+ reason ) ;
584
+ transformStreamDefaultControllerClearAlgorithms ( controller ) ;
585
+
586
+ PromisePrototypeThen (
587
+ cancelPromise ,
588
+ ( ) => {
589
+ if ( readable [ kState ] . state === 'errored' )
590
+ reject ( readable [ kState ] . storedError ) ;
591
+ else {
592
+ readableStreamDefaultControllerError ( readable [ kState ] . controller , reason ) ;
593
+ resolve ( ) ;
594
+ }
595
+ } ,
596
+ ( error ) => {
597
+ readableStreamDefaultControllerError ( readable [ kState ] . controller , error ) ;
598
+ reject ( error ) ;
599
+ }
600
+ ) ;
601
+
602
+ return controller [ kState ] . finishPromise ;
559
603
}
560
604
561
605
function transformStreamDefaultSinkCloseAlgorithm ( stream ) {
@@ -564,23 +608,32 @@ function transformStreamDefaultSinkCloseAlgorithm(stream) {
564
608
controller,
565
609
} = stream [ kState ] ;
566
610
611
+ if ( controller [ kState ] . finishPromise !== undefined ) {
612
+ return controller [ kState ] . finishPromise
613
+ }
614
+ const { promise, resolve, reject } = createDeferredPromise ( ) ;
615
+ controller [ kState ] . finishPromise = promise ;
567
616
const flushPromise =
568
617
ensureIsPromise (
569
618
controller [ kState ] . flushAlgorithm ,
570
619
controller ,
571
620
controller ) ;
572
621
transformStreamDefaultControllerClearAlgorithms ( controller ) ;
573
- return PromisePrototypeThen (
622
+ PromisePrototypeThen (
574
623
flushPromise ,
575
624
( ) => {
576
625
if ( readable [ kState ] . state === 'errored' )
577
- throw readable [ kState ] . storedError ;
578
- readableStreamDefaultControllerClose ( readable [ kState ] . controller ) ;
626
+ reject ( readable [ kState ] . storedError ) ;
627
+ else {
628
+ readableStreamDefaultControllerClose ( readable [ kState ] . controller ) ;
629
+ resolve ( ) ;
630
+ }
579
631
} ,
580
632
( error ) => {
581
- transformStreamError ( stream , error ) ;
582
- throw readable [ kState ] . storedError ;
633
+ readableStreamDefaultControllerError ( readable [ kState ] . controller , error ) ;
634
+ reject ( error ) ;
583
635
} ) ;
636
+ return controller [ kState ] . finishPromise ;
584
637
}
585
638
586
639
function transformStreamDefaultSourcePullAlgorithm ( stream ) {
@@ -590,6 +643,48 @@ function transformStreamDefaultSourcePullAlgorithm(stream) {
590
643
return stream [ kState ] . backpressureChange . promise ;
591
644
}
592
645
646
+ function transformStreamDefaultSourceCancelAlgorithm ( stream , reason ) {
647
+ const {
648
+ controller,
649
+ writable,
650
+ } = stream [ kState ] ;
651
+
652
+ if ( controller [ kState ] . finishPromise !== undefined ) {
653
+ return controller [ kState ] . finishPromise ;
654
+ }
655
+
656
+ const { promise, resolve, reject } = createDeferredPromise ( ) ;
657
+ controller [ kState ] . finishPromise = promise ;
658
+ const cancelPromise = ensureIsPromise (
659
+ controller [ kState ] . cancelAlgorithm ,
660
+ controller ,
661
+ reason ) ;
662
+ transformStreamDefaultControllerClearAlgorithms ( controller ) ;
663
+
664
+ PromisePrototypeThen ( cancelPromise ,
665
+ ( ) => {
666
+ if ( writable [ kState ] . state === 'errored' )
667
+ reject ( writable [ kState ] . storedError ) ;
668
+ else {
669
+ writableStreamDefaultControllerErrorIfNeeded (
670
+ writable [ kState ] . controller ,
671
+ reason ) ;
672
+ transformStreamUnblockWrite ( stream ) ;
673
+ resolve ( ) ;
674
+ }
675
+ } ,
676
+ ( error ) => {
677
+ writableStreamDefaultControllerErrorIfNeeded (
678
+ writable [ kState ] . controller ,
679
+ error ) ;
680
+ transformStreamUnblockWrite ( stream ) ;
681
+ reject ( error ) ;
682
+ }
683
+ ) ;
684
+
685
+ return controller [ kState ] . finishPromise
686
+ }
687
+
593
688
module . exports = {
594
689
TransformStream,
595
690
TransformStreamDefaultController,
0 commit comments