@@ -1812,16 +1812,14 @@ const { pipeline } = require('stream/promises');
1812
1812
1813
1813
async function run () {
1814
1814
const ac = new AbortController ();
1815
- const options = {
1816
- signal: ac .signal ,
1817
- };
1815
+ const signal = ac .signal ;
1818
1816
1819
1817
setTimeout (() => ac .abort (), 1 );
1820
1818
await pipeline (
1821
1819
fs .createReadStream (' archive.tar' ),
1822
1820
zlib .createGzip (),
1823
1821
fs .createWriteStream (' archive.tar.gz' ),
1824
- options ,
1822
+ { signal } ,
1825
1823
);
1826
1824
}
1827
1825
@@ -1837,10 +1835,10 @@ const fs = require('fs');
1837
1835
async function run () {
1838
1836
await pipeline (
1839
1837
fs .createReadStream (' lowercase.txt' ),
1840
- async function * (source ) {
1838
+ async function * (source , signal ) {
1841
1839
source .setEncoding (' utf8' ); // Work with strings rather than `Buffer`s.
1842
1840
for await (const chunk of source ) {
1843
- yield chunk . toUpperCase ( );
1841
+ yield await processChunk (chunk, { signal } );
1844
1842
}
1845
1843
},
1846
1844
fs .createWriteStream (' uppercase.txt' )
@@ -1851,6 +1849,28 @@ async function run() {
1851
1849
run ().catch (console .error );
1852
1850
```
1853
1851
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
+
1854
1874
` stream.pipeline() ` will call ` stream.destroy(err) ` on all streams except:
1855
1875
* ` Readable ` streams which have emitted ` 'end' ` or ` 'close' ` .
1856
1876
* ` Writable ` streams which have emitted ` 'finish' ` or ` 'close' ` .
@@ -3139,13 +3159,20 @@ the `Readable.from()` utility method:
3139
3159
``` js
3140
3160
const { Readable } = require (' stream' );
3141
3161
3162
+ const ac = new AbortController ();
3163
+ const signal = ac .signal ;
3164
+
3142
3165
async function * generate () {
3143
3166
yield ' a' ;
3167
+ await someLongRunningFn ({ signal });
3144
3168
yield ' b' ;
3145
3169
yield ' c' ;
3146
3170
}
3147
3171
3148
3172
const readable = Readable .from (generate ());
3173
+ readable .on (' close' , () => {
3174
+ ac .abort ();
3175
+ });
3149
3176
3150
3177
readable .on (' data' , (chunk ) => {
3151
3178
console .log (chunk);
@@ -3165,21 +3192,31 @@ const { pipeline: pipelinePromise } = require('stream/promises');
3165
3192
3166
3193
const writable = fs .createWriteStream (' ./file' );
3167
3194
3195
+ const ac = new AbortController ();
3196
+ const signal = ac .signal ;
3197
+
3198
+ const iterator = createIterator ({ signal });
3199
+
3168
3200
// Callback Pattern
3169
3201
pipeline (iterator, writable, (err , value ) => {
3170
3202
if (err) {
3171
3203
console .error (err);
3172
3204
} else {
3173
3205
console .log (value, ' value returned' );
3174
3206
}
3207
+ }).on (' close' , () => {
3208
+ ac .abort ();
3175
3209
});
3176
3210
3177
3211
// Promise Pattern
3178
3212
pipelinePromise (iterator, writable)
3179
3213
.then ((value ) => {
3180
3214
console .log (value, ' value returned' );
3181
3215
})
3182
- .catch (console .error );
3216
+ .catch ((err ) => {
3217
+ console .error (err);
3218
+ ac .abort ();
3219
+ });
3183
3220
```
3184
3221
3185
3222
<!-- type=misc-->
0 commit comments