From 883d94c56d7457fd002532fdcc8668d9196cefc1 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Wed, 15 Jan 2020 10:29:06 +0100 Subject: [PATCH] docs: further fix async iterator example Further fixes an issue with the async iterator example where an incorrect assumption was made in regards that drain or error is always invoked after !write(). Fixes: https://github.com/nodejs/node/issues/31365 --- doc/api/stream.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index 4f9f8241d38084..8ceec71a648833 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -2647,12 +2647,22 @@ const finished = util.promisify(stream.finished); const writable = fs.createWriteStream('./file'); +function drain(writable) { + if (writable.destroyed) { + return Promise.reject(new Error('premature close')); + } + return Promise.race([ + once(writable, 'drain'), + once(writable, 'close') + .then(() => Promise.reject(new Error('premature close'))) + ]); +} + async function pump(iterable, writable) { for await (const chunk of iterable) { // Handle backpressure on write(). if (!writable.write(chunk)) { - if (writable.destroyed) return; - await once(writable, 'drain'); + await drain(writable); } } writable.end();