GeezerVison is showing github.com — stream: fix ERR_INVALID_STATE when cancelling Readable.toWeb() · nodejs/node@1278496
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 +1Lines changed: 1 addition & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -613,6 +613,7 @@ function newReadableStreamFromStreamReadable(streamReadable, options = kEmptyObj |
613 | 613 | streamReadable.pause(); |
614 | 614 |
|
615 | 615 | streamReadable.on('data', function onData(chunk) { |
| 616 | + if (wasCanceled) return; |
616 | 617 | // Copy the Buffer to detach it from the pool. |
617 | 618 | if (Buffer.isBuffer(chunk) && !objectMode) |
618 | 619 | chunk = new Uint8Array(chunk); |
|
Collapse file
Copy file name to clipboardExpand all lines: test/parallel/test-stream-readable-to-web-termination.js +22Lines changed: 22 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -42,3 +42,25 @@ const { setTimeout: delay } = require('timers/promises'); |
42 | 42 | assert.deepStrictEqual(closeResult, { value: undefined, done: true }); |
43 | 43 | })().then(common.mustCall()); |
44 | 44 | } |
| 45 | + |
| 46 | +// Cancelling a web ReadableStream while the underlying Readable is actively |
| 47 | +// producing data should not throw ERR_INVALID_STATE. The 'data' handler in |
| 48 | +// newReadableStreamFromStreamReadable must check wasCanceled before calling |
| 49 | +// controller.enqueue(). See: https://github.com/nodejs/node/issues/54205 |
| 50 | +{ |
| 51 | + const readable = new Readable({ |
| 52 | + read() { |
| 53 | + this.push(Buffer.alloc(1024)); |
| 54 | + }, |
| 55 | + }); |
| 56 | + |
| 57 | + const webStream = Readable.toWeb(readable); |
| 58 | + const reader = webStream.getReader(); |
| 59 | + |
| 60 | + (async () => { |
| 61 | + await reader.read(); |
| 62 | + await reader.read(); |
| 63 | + reader.releaseLock(); |
| 64 | + await webStream.cancel(); |
| 65 | + })().then(common.mustCall()); |
| 66 | +} |