summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/js/web/streams/internals.ts8
-rw-r--r--cli/tests/unit/streams_internal_test.ts79
-rw-r--r--cli/tests/unit/unit_tests.ts1
3 files changed, 84 insertions, 4 deletions
diff --git a/cli/js/web/streams/internals.ts b/cli/js/web/streams/internals.ts
index 5ef094afc..e2e7bbc0a 100644
--- a/cli/js/web/streams/internals.ts
+++ b/cli/js/web/streams/internals.ts
@@ -140,7 +140,7 @@ function createReadableStream<T>(
highWaterMark = 1,
sizeAlgorithm: SizeAlgorithm<T> = (): number => 1
): ReadableStreamImpl<T> {
- assert(isNonNegativeNumber(highWaterMark));
+ highWaterMark = validateAndNormalizeHighWaterMark(highWaterMark);
const stream: ReadableStreamImpl<T> = Object.create(
ReadableStreamImpl.prototype
);
@@ -168,7 +168,7 @@ function createWritableStream<W>(
highWaterMark = 1,
sizeAlgorithm: SizeAlgorithm<W> = (): number => 1
): WritableStreamImpl<W> {
- 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 000000000..f324da194
--- /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<number>(
+ undefined,
+ // @ts-ignore
+ { highWaterMark }
+ );
+ },
+ RangeError,
+ "highWaterMark must be a positive number or Infinity. Received:"
+ );
+ }
+
+ assertThrows(() => {
+ new ReadableStream<number>(
+ 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 7327bcc05..515da9f4a 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";