From a45d2490f52ec91d43a5d488144a19bfa743edd1 Mon Sep 17 00:00:00 2001 From: Khafra Date: Sat, 19 Aug 2023 19:11:57 -0400 Subject: [PATCH 1/4] stream: use Buffer.from when constructor is a Buffer When using BYOB streams, it's possible for the constructor in readableByteStreamControllerConvertPullIntoDescriptor to be a node Buffer. If it is, use `Buffer.from` over `new ctor`. Fixes https://github.com/nodejs/node/issues/49245 --- lib/internal/webstreams/readablestream.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index a1845574f93ee0..c916ccd20d2063 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -132,6 +132,8 @@ const { writableStreamDefaultWriterWrite, } = require('internal/webstreams/writablestream'); +const { Buffer } = require('buffer'); + const assert = require('internal/assert'); const kCancel = Symbol('kCancel'); @@ -1904,6 +1906,11 @@ function readableByteStreamControllerConvertPullIntoDescriptor(desc) { throw new ERR_INVALID_STATE.RangeError('The buffer size is invalid'); assert(!(bytesFilled % elementSize)); const transferredBuffer = transferArrayBuffer(buffer); + + if (ctor === Buffer) { + return Buffer.from(transferredBuffer, byteOffset, bytesFilled / elementSize); + } + return new ctor(transferredBuffer, byteOffset, bytesFilled / elementSize); } From 1427d62cb5c41325920145bf4bf41aece716426e Mon Sep 17 00:00:00 2001 From: Khafra Date: Sat, 19 Aug 2023 19:33:22 -0400 Subject: [PATCH 2/4] stream: use Buffer.from when constructor is a Buffer --- .../test-whatwg-readablebytestreambyob.js | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 test/parallel/test-whatwg-readablebytestreambyob.js diff --git a/test/parallel/test-whatwg-readablebytestreambyob.js b/test/parallel/test-whatwg-readablebytestreambyob.js new file mode 100644 index 00000000000000..154d92e01dde65 --- /dev/null +++ b/test/parallel/test-whatwg-readablebytestreambyob.js @@ -0,0 +1,62 @@ +'use strict'; + +const common = require('../common'); + +const { + open, +} = require('fs/promises'); + +const { + Buffer, +} = require('buffer'); + +class Source { + async start(controller) { + this.file = await open(__filename); + this.controller = controller; + } + + async pull(controller) { + const byobRequest = controller.byobRequest; + const view = byobRequest.view; + + const { + bytesRead, + } = await this.file.read({ + buffer: view, + offset: view.byteOffset, + length: view.byteLength + }); + + if (bytesRead === 0) { + await this.file.close(); + this.controller.close(); + } + + byobRequest.respond(bytesRead); + } + + get type() { return 'bytes'; } + + get autoAllocateChunkSize() { return 1024; } +} + +(async () => { + const source = new Source(); + const stream = new ReadableStream(source); + + const { emitWarning } = process; + + process.emitWarning = common.mustNotCall(); + + try { + const reader = stream.getReader({ mode: 'byob' }); + + let result; + do { + result = await reader.read(Buffer.alloc(100)); + } while (!result.done); + } finally { + process.emitWarning = emitWarning; + } +})(); From 3c8c3e08b1d061e80112dcff997a04da985e2f42 Mon Sep 17 00:00:00 2001 From: Khafra Date: Sat, 19 Aug 2023 20:20:24 -0400 Subject: [PATCH 3/4] change linebreaks --- .../test-whatwg-readablebytestreambyob.js | 124 +++++++++--------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/test/parallel/test-whatwg-readablebytestreambyob.js b/test/parallel/test-whatwg-readablebytestreambyob.js index 154d92e01dde65..aeeb54d3206a90 100644 --- a/test/parallel/test-whatwg-readablebytestreambyob.js +++ b/test/parallel/test-whatwg-readablebytestreambyob.js @@ -1,62 +1,62 @@ -'use strict'; - -const common = require('../common'); - -const { - open, -} = require('fs/promises'); - -const { - Buffer, -} = require('buffer'); - -class Source { - async start(controller) { - this.file = await open(__filename); - this.controller = controller; - } - - async pull(controller) { - const byobRequest = controller.byobRequest; - const view = byobRequest.view; - - const { - bytesRead, - } = await this.file.read({ - buffer: view, - offset: view.byteOffset, - length: view.byteLength - }); - - if (bytesRead === 0) { - await this.file.close(); - this.controller.close(); - } - - byobRequest.respond(bytesRead); - } - - get type() { return 'bytes'; } - - get autoAllocateChunkSize() { return 1024; } -} - -(async () => { - const source = new Source(); - const stream = new ReadableStream(source); - - const { emitWarning } = process; - - process.emitWarning = common.mustNotCall(); - - try { - const reader = stream.getReader({ mode: 'byob' }); - - let result; - do { - result = await reader.read(Buffer.alloc(100)); - } while (!result.done); - } finally { - process.emitWarning = emitWarning; - } -})(); +'use strict'; + +const common = require('../common'); + +const { + open, +} = require('fs/promises'); + +const { + Buffer, +} = require('buffer'); + +class Source { + async start(controller) { + this.file = await open(__filename); + this.controller = controller; + } + + async pull(controller) { + const byobRequest = controller.byobRequest; + const view = byobRequest.view; + + const { + bytesRead, + } = await this.file.read({ + buffer: view, + offset: view.byteOffset, + length: view.byteLength + }); + + if (bytesRead === 0) { + await this.file.close(); + this.controller.close(); + } + + byobRequest.respond(bytesRead); + } + + get type() { return 'bytes'; } + + get autoAllocateChunkSize() { return 1024; } +} + +(async () => { + const source = new Source(); + const stream = new ReadableStream(source); + + const { emitWarning } = process; + + process.emitWarning = common.mustNotCall(); + + try { + const reader = stream.getReader({ mode: 'byob' }); + + let result; + do { + result = await reader.read(Buffer.alloc(100)); + } while (!result.done); + } finally { + process.emitWarning = emitWarning; + } +})(); From 8f63adccc3a9bec2f709cb052bd3696c0f6b1318 Mon Sep 17 00:00:00 2001 From: Khafra Date: Sun, 20 Aug 2023 09:55:14 -0400 Subject: [PATCH 4/4] update test --- test/parallel/test-whatwg-readablebytestreambyob.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/parallel/test-whatwg-readablebytestreambyob.js b/test/parallel/test-whatwg-readablebytestreambyob.js index aeeb54d3206a90..5dbe4813dbc4f6 100644 --- a/test/parallel/test-whatwg-readablebytestreambyob.js +++ b/test/parallel/test-whatwg-readablebytestreambyob.js @@ -59,4 +59,4 @@ class Source { } finally { process.emitWarning = emitWarning; } -})(); +})().then(common.mustCall());