Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 2bfa87e

Browse filesBrowse files
ronagrichardlau
authored andcommitted
stream: fix fromAsyncGen
Fixes: #40497 PR-URL: #40499 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
1 parent 8fdabcb commit 2bfa87e
Copy full SHA for 2bfa87e

File tree

Expand file treeCollapse file tree

2 files changed

+37
-5
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

2 files changed

+37
-5
lines changed
Open diff view settings
Collapse file

‎lib/internal/streams/duplexify.js‎

Copy file name to clipboardExpand all lines: lib/internal/streams/duplexify.js
+10-4Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,22 +209,28 @@ function fromAsyncGen(fn) {
209209
const signal = ac.signal;
210210
const value = fn(async function*() {
211211
while (true) {
212-
const { chunk, done, cb } = await promise;
212+
const _promise = promise;
213+
promise = null;
214+
const { chunk, done, cb } = await _promise;
213215
process.nextTick(cb);
214216
if (done) return;
215217
if (signal.aborted) throw new AbortError();
216-
yield chunk;
217218
({ promise, resolve } = createDeferredPromise());
219+
yield chunk;
218220
}
219221
}(), { signal });
220222

221223
return {
222224
value,
223225
write(chunk, encoding, cb) {
224-
resolve({ chunk, done: false, cb });
226+
const _resolve = resolve;
227+
resolve = null;
228+
_resolve({ chunk, done: false, cb });
225229
},
226230
final(cb) {
227-
resolve({ done: true, cb });
231+
const _resolve = resolve;
232+
resolve = null;
233+
_resolve({ done: true, cb });
228234
},
229235
destroy(err, cb) {
230236
ac.abort();
Collapse file

‎test/parallel/test-stream-duplex-from.js‎

Copy file name to clipboardExpand all lines: test/parallel/test-stream-duplex-from.js
+27-1Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const common = require('../common');
44
const assert = require('assert');
5-
const { Duplex, Readable, Writable } = require('stream');
5+
const { Duplex, Readable, Writable, pipeline } = require('stream');
66

77
{
88
const d = Duplex.from({
@@ -118,3 +118,29 @@ const { Duplex, Readable, Writable } = require('stream');
118118
assert.strictEqual(d.readable, false);
119119
}));
120120
}
121+
122+
{
123+
// https://github.com/nodejs/node/issues/40497
124+
pipeline(
125+
['abc\ndef\nghi'],
126+
Duplex.from(async function * (source) {
127+
let rest = '';
128+
for await (const chunk of source) {
129+
const lines = (rest + chunk.toString()).split('\n');
130+
rest = lines.pop();
131+
for (const line of lines) {
132+
yield line;
133+
}
134+
}
135+
yield rest;
136+
}),
137+
async function * (source) {
138+
let ret = '';
139+
for await (const x of source) {
140+
ret += x;
141+
}
142+
assert.strictEqual(ret, 'abcdefghi');
143+
},
144+
common.mustCall(() => {}),
145+
);
146+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.