From 5b2004ac7a977c1c40994d198fe75aa3e69190ad Mon Sep 17 00:00:00 2001 From: Taeuk Ha Date: Mon, 10 Aug 2026 17:41:21 +0900 Subject: [PATCH] stream: use validateNumber for options.min Signed-off-by: Taeuk Ha --- lib/internal/webstreams/readablestream.js | 4 +-- ...eadablebytestream-bad-buffers-and-views.js | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index e1e80eb953c0..81554033a302 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -62,6 +62,7 @@ const { const { validateAbortSignal, validateBuffer, + validateNumber, validateObject, kValidateObjectAllowObjects, kValidateObjectAllowObjectsAndNull, @@ -1095,8 +1096,7 @@ class ReadableStreamBYOBReader { // detached, but there's no API available to use to check that. const min = options?.min ?? 1; - if (typeof min !== 'number') - throw new ERR_INVALID_ARG_TYPE('options.min', 'number', min); + validateNumber(min, 'options.min'); if (!NumberIsInteger(min)) throw new ERR_INVALID_ARG_VALUE('options.min', min, 'must be an integer'); if (min <= 0) diff --git a/test/parallel/test-whatwg-readablebytestream-bad-buffers-and-views.js b/test/parallel/test-whatwg-readablebytestream-bad-buffers-and-views.js index a8f6ffc7535e..d69e5d2d683e 100644 --- a/test/parallel/test-whatwg-readablebytestream-bad-buffers-and-views.js +++ b/test/parallel/test-whatwg-readablebytestream-bad-buffers-and-views.js @@ -85,4 +85,38 @@ let pass = 0; .then(common.mustCall()); } +{ + // options.min must be a number. + const stream = new ReadableStream({ + start(c) { + c.enqueue(new Uint8Array([1, 2, 3])); + }, + type: 'bytes', + }); + const reader = stream.getReader({ mode: 'byob' }); + + assert + .rejects(reader.read(new Uint8Array(3), { min: 'not a number' }), { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + }) + .then(common.mustCall()); +} + +{ + // A valid numeric options.min still works as expected. + const stream = new ReadableStream({ + start(c) { + c.enqueue(new Uint8Array([1, 2, 3])); + }, + type: 'bytes', + }); + const reader = stream.getReader({ mode: 'byob' }); + + reader.read(new Uint8Array(3), { min: 1 }).then(common.mustCall(({ value, done }) => { + assert.strictEqual(done, false); + assert.deepStrictEqual([...value], [1, 2, 3]); + })); +} + process.on('exit', () => assert.strictEqual(pass, 2));