GeezerVison is showing github.com — stream: fix Writable.toWeb() hang on synchronous drain · nodejs/node@dc57173
File tree
Expand file treeCollapse file tree
Open diff view settings
Expand file treeCollapse file tree
Open diff view settings
Collapse file
Copy file name to clipboardExpand all lines: lib/internal/webstreams/adapters.js +3Lines changed: 3 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -232,6 +232,9 @@ function newWritableStreamFromStreamWritable(streamWritable, options = kEmptyObj |
232 | 232 | } |
233 | 233 | if (streamWritable.writableNeedDrain || !streamWritable.write(chunk)) { |
234 | 234 | backpressurePromise = PromiseWithResolvers(); |
| 235 | + if (!streamWritable.writableNeedDrain) { |
| 236 | + backpressurePromise.resolve(); |
| 237 | + } |
235 | 238 | return SafePromisePrototypeFinally( |
236 | 239 | backpressurePromise.promise, () => { |
237 | 240 | backpressurePromise = undefined; |
|
Collapse file
Copy file name to clipboardExpand all lines: test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js +23Lines changed: 23 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -197,3 +197,26 @@ class TestWritable extends Writable { |
197 | 197 | assert.strictEqual(chunk, arrayBuffer); |
198 | 198 | })); |
199 | 199 | } |
| 200 | + |
| 201 | +{ |
| 202 | + // Test that the stream doesn't hang when the underlying Writable |
| 203 | + // emits 'drain' synchronously during write(). |
| 204 | + // Fixes: https://github.com/nodejs/node/issues/61145 |
| 205 | + const writable = new Writable({ |
| 206 | + write(chunk, encoding, callback) { |
| 207 | + callback(); |
| 208 | + }, |
| 209 | + }); |
| 210 | + |
| 211 | + // Force synchronous 'drain' emission during write() |
| 212 | + // to simulate a stream that doesn't have Node.js's built-in kSync protection. |
| 213 | + writable.write = function(chunk) { |
| 214 | + this.emit('drain'); |
| 215 | + return false; |
| 216 | + }; |
| 217 | + |
| 218 | + const writableStream = newWritableStreamFromStreamWritable(writable); |
| 219 | + const writer = writableStream.getWriter(); |
| 220 | + writer.write(new Uint8Array([1, 2, 3])).then(common.mustCall()); |
| 221 | + writer.write(new Uint8Array([4, 5, 6])).then(common.mustCall()); |
| 222 | +} |