mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
Convert brotli decompression errors to TypeError to match the Compression Streams spec, by extending handleKnownInternalErrors() in the adapters layer to recognize brotli error codes. This replaces the manual error event handler on DecompressionStream which was redundant with the adapter's built-in error propagation. PR-URL: https://github.com/nodejs/node/pull/62107 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Mattias Buelens <mattias@buelens.com> Reviewed-By: René <contact.9a5d6388@renegade334.me.uk>
76 lines
2.7 KiB
JavaScript
76 lines
2.7 KiB
JavaScript
'use strict';
|
|
require('../common');
|
|
const assert = require('assert');
|
|
const test = require('node:test');
|
|
const { CompressionStream, DecompressionStream } = require('stream/web');
|
|
|
|
// Verify that writing invalid (non-BufferSource) chunks to
|
|
// CompressionStream and DecompressionStream properly rejects
|
|
// on both the write and the read side, instead of hanging.
|
|
|
|
const badChunks = [
|
|
{ name: 'undefined', value: undefined, code: 'ERR_INVALID_ARG_TYPE' },
|
|
{ name: 'null', value: null, code: 'ERR_STREAM_NULL_VALUES' },
|
|
{ name: 'number', value: 3.14, code: 'ERR_INVALID_ARG_TYPE' },
|
|
{ name: 'object', value: {}, code: 'ERR_INVALID_ARG_TYPE' },
|
|
{ name: 'array', value: [65], code: 'ERR_INVALID_ARG_TYPE' },
|
|
{
|
|
name: 'SharedArrayBuffer',
|
|
value: new SharedArrayBuffer(1),
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
},
|
|
{
|
|
name: 'Uint8Array backed by SharedArrayBuffer',
|
|
value: new Uint8Array(new SharedArrayBuffer(1)),
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
},
|
|
];
|
|
|
|
for (const format of ['deflate', 'deflate-raw', 'gzip', 'brotli']) {
|
|
for (const { name, value, code } of badChunks) {
|
|
const expected = { name: 'TypeError', code };
|
|
|
|
test(`CompressionStream rejects bad chunk (${name}) for ${format}`, async () => {
|
|
const cs = new CompressionStream(format);
|
|
const writer = cs.writable.getWriter();
|
|
const reader = cs.readable.getReader();
|
|
|
|
const writePromise = writer.write(value);
|
|
const readPromise = reader.read();
|
|
|
|
await assert.rejects(writePromise, expected);
|
|
await assert.rejects(readPromise, expected);
|
|
});
|
|
|
|
test(`DecompressionStream rejects bad chunk (${name}) for ${format}`, async () => {
|
|
const ds = new DecompressionStream(format);
|
|
const writer = ds.writable.getWriter();
|
|
const reader = ds.readable.getReader();
|
|
|
|
const writePromise = writer.write(value);
|
|
const readPromise = reader.read();
|
|
|
|
await assert.rejects(writePromise, expected);
|
|
await assert.rejects(readPromise, expected);
|
|
});
|
|
}
|
|
}
|
|
|
|
// Verify that decompression errors (e.g. corrupt data) are surfaced as
|
|
// TypeError, not plain Error, per the Compression Streams spec.
|
|
for (const format of ['deflate', 'deflate-raw', 'gzip', 'brotli']) {
|
|
test(`DecompressionStream surfaces corrupt data as TypeError for ${format}`, async () => {
|
|
const ds = new DecompressionStream(format);
|
|
const writer = ds.writable.getWriter();
|
|
const reader = ds.readable.getReader();
|
|
|
|
const corruptData = new Uint8Array([0, 1, 2, 3, 4, 5]);
|
|
|
|
writer.write(corruptData).catch(() => {});
|
|
reader.read().catch(() => {});
|
|
|
|
await assert.rejects(writer.close(), { name: 'TypeError' });
|
|
await assert.rejects(reader.closed, { name: 'TypeError' });
|
|
});
|
|
}
|