0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 09:31:22 -05:00

fix: streams hwm validation (#5681)

This commit is contained in:
Marcos Casagrande 2020-05-21 02:18:43 +02:00 committed by GitHub
parent 30702e2678
commit 47b089ffa8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 84 additions and 4 deletions

View file

@ -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}.`
);

View file

@ -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);
});

View file

@ -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";