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:
parent
30702e2678
commit
47b089ffa8
3 changed files with 84 additions and 4 deletions
|
@ -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}.`
|
||||
);
|
||||
|
|
79
cli/tests/unit/streams_internal_test.ts
Normal file
79
cli/tests/unit/streams_internal_test.ts
Normal 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);
|
||||
});
|
|
@ -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";
|
||||
|
|
Loading…
Add table
Reference in a new issue