Skip to content

Commit 3046648

Browse files
ronagcodebytere
authored andcommitted
stream: implement throw for async iterator
PR-URL: #31316 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Minwoo Jung <nodecorelab@gmail.com>
1 parent 5a95fa4 commit 3046648

2 files changed

Lines changed: 51 additions & 20 deletions

File tree

‎lib/internal/streams/async_iterator.js‎

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,31 @@ function wrapForNext(lastPromise, iter) {
7171
constAsyncIteratorPrototype=ObjectGetPrototypeOf(
7272
ObjectGetPrototypeOf(asyncfunction*(){}).prototype);
7373

74+
functionfinish(self,err){
75+
returnnewPromise((resolve,reject)=>{
76+
conststream=self[kStream];
77+
78+
// TODO(ronag): Remove this check once finished() handles
79+
// already ended and/or destroyed streams.
80+
constended=stream.destroyed||stream.readableEnded||
81+
(stream._readableState&&stream._readableState.endEmitted);
82+
83+
if(ended){
84+
resolve(createIterResult(undefined,true));
85+
return;
86+
}
87+
88+
finished(stream,(err)=>{
89+
if(err&&err.code!=='ERR_STREAM_PREMATURE_CLOSE'){
90+
reject(err);
91+
}else{
92+
resolve(createIterResult(undefined,true));
93+
}
94+
});
95+
destroy(stream,err);
96+
});
97+
}
98+
7499
constReadableStreamAsyncIteratorPrototype=ObjectSetPrototypeOf({
75100
getstream(){
76101
returnthis[kStream];
@@ -131,27 +156,11 @@ const ReadableStreamAsyncIteratorPrototype = ObjectSetPrototypeOf({
131156
},
132157

133158
return(){
134-
returnnewPromise((resolve,reject)=>{
135-
conststream=this[kStream];
136-
137-
// TODO(ronag): Remove this check once finished() handles
138-
// already ended and/or destroyed streams.
139-
constended=stream.destroyed||stream.readableEnded||
140-
(stream._readableState&&stream._readableState.endEmitted);
141-
if(ended){
142-
resolve(createIterResult(undefined,true));
143-
return;
144-
}
159+
returnfinish(this);
160+
},
145161

146-
finished(stream,(err)=>{
147-
if(err&&err.code!=='ERR_STREAM_PREMATURE_CLOSE'){
148-
reject(err);
149-
}else{
150-
resolve(createIterResult(undefined,true));
151-
}
152-
});
153-
destroy(stream);
154-
});
162+
throw(err){
163+
returnfinish(this,err);
155164
},
156165
},AsyncIteratorPrototype);
157166

‎test/parallel/test-stream-readable-async-iterators.js‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,28 @@ async function tests() {
282282
assert.strictEqual(received,1);
283283
}
284284

285+
{
286+
// Iterator throw.
287+
288+
constreadable=newReadable({
289+
objectMode: true,
290+
read(){
291+
this.push('hello');
292+
}
293+
});
294+
295+
readable.on('error',common.mustCall((err)=>{
296+
assert.strictEqual(err.message,'kaboom');
297+
}));
298+
299+
constit=readable[Symbol.asyncIterator]();
300+
it.throw(newError('kaboom')).catch(common.mustCall((err)=>{
301+
assert.strictEqual(err.message,'kaboom');
302+
}));
303+
304+
assert.strictEqual(readable.destroyed,true);
305+
}
306+
285307
{
286308
console.log('destroyed by throw');
287309
constreadable=newReadable({

0 commit comments

Comments
 (0)