stream: make classic reads wake on return/throw/abort · nodejs/node@55ef82a · GitHub
Skip to content

Commit 55ef82a

Browse files
jasnelladuh95
authored andcommitted
stream: make classic reads wake on return/throw/abort
Signed-off-by: James M Snell <jasnell@gmail.com> Assisted-by: Opencode PR-URL: #66079 Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
1 parent 4e8df7c commit 55ef82a

3 files changed

Lines changed: 138 additions & 39 deletions

File tree

‎lib/internal/streams/iter/classic.js‎

Lines changed: 78 additions & 39 deletions

‎test/parallel/test-stream-iter-readable-interop.js‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
const common = require('../common');
88
const assert = require('assert');
99
const { Readable } = require('stream');
10+
const { setImmediate } = require('timers/promises');
1011
const {
1112
from,
1213
pull,
@@ -588,6 +589,38 @@ async function testAbortSignal() {
588589
assert.ok(chunks.length >= 2);
589590
}
590591

592+
async function testReturnWhileReadIsPending() {
593+
const readable = new Readable({ read() {} });
594+
const iterator = from(readable)[Symbol.asyncIterator]();
595+
const pending = iterator.next();
596+
await setImmediate();
597+
598+
assert.deepStrictEqual(await iterator.return('stopped'), {
599+
value: 'stopped',
600+
done: true,
601+
});
602+
assert.deepStrictEqual(await pending, { value: undefined, done: true });
603+
await setImmediate();
604+
assert.strictEqual(readable.destroyed, true);
605+
assert.strictEqual(readable.listenerCount('readable'), 0);
606+
}
607+
608+
async function testAbortWhileReadIsPending() {
609+
const readable = new Readable({ read() {} });
610+
const controller = new AbortController();
611+
const iterator = pull(readable, {
612+
signal: controller.signal,
613+
})[Symbol.asyncIterator]();
614+
const pending = iterator.next();
615+
await setImmediate();
616+
617+
controller.abort();
618+
await assert.rejects(pending, { name: 'AbortError' });
619+
await setImmediate();
620+
assert.strictEqual(readable.destroyed, true);
621+
assert.strictEqual(readable.listenerCount('readable'), 0);
622+
}
623+
591624
// =============================================================================
592625
// kValidatedSource identity - from() returns same object for validated sources
593626
// =============================================================================
@@ -637,4 +670,6 @@ Promise.all([
637670
testDuplexStream(),
638671
testSetEncodingDynamic(),
639672
testAbortSignal(),
673+
testReturnWhileReadIsPending(),
674+
testAbortWhileReadIsPending(),
640675
]).then(common.mustCall());

‎test/parallel/test-stream-iter-to-readable.js‎

Lines changed: 25 additions & 0 deletions

0 commit comments

Comments
 (0)