Skip to content

Commit

Permalink
fix(node/util): stricter runtime type checking (#3122)
Browse files Browse the repository at this point in the history
  • Loading branch information
petamoriken committed Jan 31, 2023
1 parent 59b00e5 commit 01a401c
Show file tree
Hide file tree
Showing 4 changed files with 329 additions and 80 deletions.
21 changes: 20 additions & 1 deletion node/internal/crypto/keys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,26 @@ import {
} from "./_keys.ts";

const getArrayBufferOrView = hideStackFrames(
(buffer, name, encoding): Buffer => {
(
buffer,
name,
encoding,
):
| ArrayBuffer
| SharedArrayBuffer
| Buffer
| DataView
| BigInt64Array
| BigUint64Array
| Float32Array
| Float64Array
| Int8Array
| Int16Array
| Int32Array
| Uint8Array
| Uint8ClampedArray
| Uint16Array
| Uint32Array => {
if (isAnyArrayBuffer(buffer)) {
return buffer;
}
Expand Down
22 changes: 17 additions & 5 deletions node/internal/util/comparisons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,15 +139,28 @@ function innerDeepEqual(
return false;
}
} else if (isArrayBufferView(val1)) {
const TypedArrayPrototypeGetSymbolToStringTag = (val: []) =>
const TypedArrayPrototypeGetSymbolToStringTag = (
val:
| BigInt64Array
| BigUint64Array
| Float32Array
| Float64Array
| Int8Array
| Int16Array
| Int32Array
| Uint8Array
| Uint8ClampedArray
| Uint16Array
| Uint32Array,
) =>
Object.getOwnPropertySymbols(val)
.map((item) => item.toString())
.toString();
if (
isTypedArray(val1) &&
isTypedArray(val2) &&
(TypedArrayPrototypeGetSymbolToStringTag(val1 as []) !==
TypedArrayPrototypeGetSymbolToStringTag(val2 as []))
(TypedArrayPrototypeGetSymbolToStringTag(val1) !==
TypedArrayPrototypeGetSymbolToStringTag(val2))
) {
return false;
}
Expand Down Expand Up @@ -189,8 +202,7 @@ function innerDeepEqual(
);
} else if (isMap(val1)) {
if (
!isMap(val2) ||
(val1 as Set<unknown>).size !== (val2 as Set<unknown>).size
!isMap(val2) || val1.size !== val2.size
) {
return false;
}
Expand Down
51 changes: 39 additions & 12 deletions node/internal/util/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,55 +30,82 @@ const _getTypedArrayToStringTag = Object.getOwnPropertyDescriptor(
Symbol.toStringTag,
)!.get!;

export function isArrayBufferView(value: unknown): boolean {
export function isArrayBufferView(
value: unknown,
): value is
| DataView
| BigInt64Array
| BigUint64Array
| Float32Array
| Float64Array
| Int8Array
| Int16Array
| Int32Array
| Uint8Array
| Uint8ClampedArray
| Uint16Array
| Uint32Array {
return ArrayBuffer.isView(value);
}

export function isBigInt64Array(value: unknown): boolean {
export function isBigInt64Array(value: unknown): value is BigInt64Array {
return _getTypedArrayToStringTag.call(value) === "BigInt64Array";
}

export function isBigUint64Array(value: unknown): boolean {
export function isBigUint64Array(value: unknown): value is BigUint64Array {
return _getTypedArrayToStringTag.call(value) === "BigUint64Array";
}

export function isFloat32Array(value: unknown): boolean {
export function isFloat32Array(value: unknown): value is Float32Array {
return _getTypedArrayToStringTag.call(value) === "Float32Array";
}

export function isFloat64Array(value: unknown): boolean {
export function isFloat64Array(value: unknown): value is Float64Array {
return _getTypedArrayToStringTag.call(value) === "Float64Array";
}

export function isInt8Array(value: unknown): boolean {
export function isInt8Array(value: unknown): value is Int8Array {
return _getTypedArrayToStringTag.call(value) === "Int8Array";
}

export function isInt16Array(value: unknown): boolean {
export function isInt16Array(value: unknown): value is Int16Array {
return _getTypedArrayToStringTag.call(value) === "Int16Array";
}

export function isInt32Array(value: unknown): boolean {
export function isInt32Array(value: unknown): value is Int32Array {
return _getTypedArrayToStringTag.call(value) === "Int32Array";
}

export function isTypedArray(value: unknown): boolean {
export function isTypedArray(value: unknown): value is
| BigInt64Array
| BigUint64Array
| Float32Array
| Float64Array
| Int8Array
| Int16Array
| Int32Array
| Uint8Array
| Uint8ClampedArray
| Uint16Array
| Uint32Array {
return _getTypedArrayToStringTag.call(value) !== undefined;
}

export function isUint8Array(value: unknown): value is Uint8Array {
return _getTypedArrayToStringTag.call(value) === "Uint8Array";
}

export function isUint8ClampedArray(value: unknown): boolean {
export function isUint8ClampedArray(
value: unknown,
): value is Uint8ClampedArray {
return _getTypedArrayToStringTag.call(value) === "Uint8ClampedArray";
}

export function isUint16Array(value: unknown): boolean {
export function isUint16Array(value: unknown): value is Uint16Array {
return _getTypedArrayToStringTag.call(value) === "Uint16Array";
}

export function isUint32Array(value: unknown): boolean {
export function isUint32Array(value: unknown): value is Uint32Array {
return _getTypedArrayToStringTag.call(value) === "Uint32Array";
}

Expand Down
Loading

0 comments on commit 01a401c

Please sign in to comment.