From 47b089ffa8c6dc06638b3cf0d240817a744108eb Mon Sep 17 00:00:00 2001 From: Marcos Casagrande Date: Thu, 21 May 2020 02:18:43 +0200 Subject: [PATCH] fix: streams hwm validation (#5681) --- cli/js/web/streams/internals.ts | 8 +-- cli/tests/unit/streams_internal_test.ts | 79 +++++++++++++++++++++++++ cli/tests/unit/unit_tests.ts | 1 + 3 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 cli/tests/unit/streams_internal_test.ts diff --git a/cli/js/web/streams/internals.ts b/cli/js/web/streams/internals.ts index 5ef094afc6..e2e7bbc0ad 100644 --- a/cli/js/web/streams/internals.ts +++ b/cli/js/web/streams/internals.ts @@ -140,7 +140,7 @@ function createReadableStream( highWaterMark = 1, sizeAlgorithm: SizeAlgorithm = (): number => 1 ): ReadableStreamImpl { - assert(isNonNegativeNumber(highWaterMark)); + highWaterMark = validateAndNormalizeHighWaterMark(highWaterMark); const stream: ReadableStreamImpl = Object.create( ReadableStreamImpl.prototype ); @@ -168,7 +168,7 @@ function createWritableStream( highWaterMark = 1, sizeAlgorithm: SizeAlgorithm = (): number => 1 ): WritableStreamImpl { - assert(isNonNegativeNumber(highWaterMark)); + highWaterMark = validateAndNormalizeHighWaterMark(highWaterMark); const stream = Object.create(WritableStreamImpl.prototype); initializeWritableStream(stream); const controller = Object.create( @@ -324,7 +324,7 @@ function isNonNegativeNumber(v: unknown): v is number { if (typeof v !== "number") { return false; } - if (v === NaN) { + if (Number.isNaN(v)) { return false; } if (v < 0) { @@ -1872,7 +1872,7 @@ export function validateAndNormalizeHighWaterMark( highWaterMark: number ): number { highWaterMark = Number(highWaterMark); - if (highWaterMark === NaN || highWaterMark < 0) { + if (Number.isNaN(highWaterMark) || highWaterMark < 0) { throw new RangeError( `highWaterMark must be a positive number or Infinity. Received: ${highWaterMark}.` ); diff --git a/cli/tests/unit/streams_internal_test.ts b/cli/tests/unit/streams_internal_test.ts new file mode 100644 index 0000000000..f324da1945 --- /dev/null +++ b/cli/tests/unit/streams_internal_test.ts @@ -0,0 +1,79 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { unitTest, assertThrows } from "./test_util.ts"; + +unitTest(function streamReadableHwmError() { + const invalidHwm = [NaN, Number("NaN"), {}, -1, "two"]; + for (const highWaterMark of invalidHwm) { + assertThrows( + () => { + new ReadableStream( + undefined, + // @ts-ignore + { highWaterMark } + ); + }, + RangeError, + "highWaterMark must be a positive number or Infinity. Received:" + ); + } + + assertThrows(() => { + new ReadableStream( + undefined, + // @ts-ignore + { highWaterMark: Symbol("hwk") } + ); + }, TypeError); +}); + +unitTest(function streamWriteableHwmError() { + const invalidHwm = [NaN, Number("NaN"), {}, -1, "two"]; + for (const highWaterMark of invalidHwm) { + assertThrows( + () => { + new WritableStream( + undefined, + // @ts-ignore + new CountQueuingStrategy({ highWaterMark }) + ); + }, + RangeError, + "highWaterMark must be a positive number or Infinity. Received:" + ); + } + + assertThrows(() => { + new WritableStream( + undefined, + // @ts-ignore + new CountQueuingStrategy({ highWaterMark: Symbol("hwmk") }) + ); + }, TypeError); +}); + +unitTest(function streamTransformHwmError() { + const invalidHwm = [NaN, Number("NaN"), {}, -1, "two"]; + for (const highWaterMark of invalidHwm) { + assertThrows( + () => { + new TransformStream( + undefined, + undefined, + // @ts-ignore + { highWaterMark } + ); + }, + RangeError, + "highWaterMark must be a positive number or Infinity. Received:" + ); + } + + assertThrows(() => { + new TransformStream( + undefined, + undefined, + // @ts-ignore + { highWaterMark: Symbol("hwmk") } + ); + }, TypeError); +}); diff --git a/cli/tests/unit/unit_tests.ts b/cli/tests/unit/unit_tests.ts index 7327bcc051..515da9f4a0 100644 --- a/cli/tests/unit/unit_tests.ts +++ b/cli/tests/unit/unit_tests.ts @@ -52,6 +52,7 @@ import "./request_test.ts"; import "./resources_test.ts"; import "./signal_test.ts"; import "./stat_test.ts"; +import "./streams_internal_test.ts"; import "./streams_piping_test.ts"; import "./streams_transform_test.ts"; import "./streams_writable_test.ts";