@@ -1812,16 +1812,14 @@ const { pipeline } = require('stream/promises');
18121812
18131813async function run () {
18141814 const ac = new AbortController ();
1815- const options = {
1816- signal: ac .signal ,
1817- };
1815+ const signal = ac .signal ;
18181816
18191817 setTimeout (() => ac .abort (), 1 );
18201818 await pipeline (
18211819 fs .createReadStream (' archive.tar' ),
18221820 zlib .createGzip (),
18231821 fs .createWriteStream (' archive.tar.gz' ),
1824- options ,
1822+ { signal } ,
18251823 );
18261824}
18271825
@@ -1837,10 +1835,10 @@ const fs = require('fs');
18371835async function run () {
18381836 await pipeline (
18391837 fs .createReadStream (' lowercase.txt' ),
1840- async function * (source ) {
1838+ async function * (source , signal ) {
18411839 source .setEncoding (' utf8' ); // Work with strings rather than `Buffer`s.
18421840 for await (const chunk of source ) {
1843- yield chunk . toUpperCase ( );
1841+ yield await processChunk (chunk, { signal } );
18441842 }
18451843 },
18461844 fs .createWriteStream (' uppercase.txt' )
@@ -1851,6 +1849,28 @@ async function run() {
18511849run ().catch (console .error );
18521850```
18531851
1852+ Remember to handle the ` signal ` argument passed into the async generator.
1853+ Especially in the case where the async generator is the source for the
1854+ pipeline (i.e. first argument) or the pipeline will never complete.
1855+
1856+ ``` js
1857+ const { pipeline } = require (' stream/promises' );
1858+ const fs = require (' fs' );
1859+
1860+ async function run () {
1861+ await pipeline (
1862+ async function * (signal ) {
1863+ await someLongRunningfn ({ signal });
1864+ yield ' asd' ;
1865+ },
1866+ fs .createWriteStream (' uppercase.txt' )
1867+ );
1868+ console .log (' Pipeline succeeded.' );
1869+ }
1870+
1871+ run ().catch (console .error );
1872+ ```
1873+
18541874` stream.pipeline() ` will call ` stream.destroy(err) ` on all streams except:
18551875* ` Readable ` streams which have emitted ` 'end' ` or ` 'close' ` .
18561876* ` Writable ` streams which have emitted ` 'finish' ` or ` 'close' ` .
@@ -3139,13 +3159,20 @@ the `Readable.from()` utility method:
31393159``` js
31403160const { Readable } = require (' stream' );
31413161
3162+ const ac = new AbortController ();
3163+ const signal = ac .signal ;
3164+
31423165async function * generate () {
31433166 yield ' a' ;
3167+ await someLongRunningFn ({ signal });
31443168 yield ' b' ;
31453169 yield ' c' ;
31463170}
31473171
31483172const readable = Readable .from (generate ());
3173+ readable .on (' close' , () => {
3174+ ac .abort ();
3175+ });
31493176
31503177readable .on (' data' , (chunk ) => {
31513178 console .log (chunk);
@@ -3165,21 +3192,31 @@ const { pipeline: pipelinePromise } = require('stream/promises');
31653192
31663193const writable = fs .createWriteStream (' ./file' );
31673194
3195+ const ac = new AbortController ();
3196+ const signal = ac .signal ;
3197+
3198+ const iterator = createIterator ({ signal });
3199+
31683200// Callback Pattern
31693201pipeline (iterator, writable, (err , value ) => {
31703202 if (err) {
31713203 console .error (err);
31723204 } else {
31733205 console .log (value, ' value returned' );
31743206 }
3207+ }).on (' close' , () => {
3208+ ac .abort ();
31753209});
31763210
31773211// Promise Pattern
31783212pipelinePromise (iterator, writable)
31793213 .then ((value ) => {
31803214 console .log (value, ' value returned' );
31813215 })
3182- .catch (console .error );
3216+ .catch ((err ) => {
3217+ console .error (err);
3218+ ac .abort ();
3219+ });
31833220```
31843221
31853222<!-- type=misc-->
0 commit comments