'use strict'; // Flags: --expose-internals const common = require('../common'); const assert = require('assert'); const test = require('node:test'); const { Blob } = require('buffer'); const { ReadableStream } = require('stream/web'); const sab = new SharedArrayBuffer(8); const sabView = new Uint8Array(sab); const sabDataView = new DataView(sab); // -- ReadableStreamBYOBReader.read() -- test('ReadableStreamBYOBReader.read() rejects SAB-backed Uint8Array', async () => { const rs = new ReadableStream({ type: 'bytes', pull(controller) { controller.enqueue(new Uint8Array([1, 2, 3])); }, }); const reader = rs.getReader({ mode: 'byob' }); await assert.rejects( reader.read(new Uint8Array(sab)), { code: 'ERR_INVALID_ARG_VALUE' }, ); reader.releaseLock(); }); test('ReadableStreamBYOBReader.read() rejects SAB-backed DataView', async () => { const rs = new ReadableStream({ type: 'bytes', pull(controller) { controller.enqueue(new Uint8Array([1, 2, 3])); }, }); const reader = rs.getReader({ mode: 'byob' }); await assert.rejects( reader.read(sabDataView), { code: 'ERR_INVALID_ARG_VALUE' }, ); reader.releaseLock(); }); test('ReadableStreamBYOBReader.read() accepts regular view', async () => { const rs = new ReadableStream({ type: 'bytes', pull(controller) { controller.enqueue(new Uint8Array([1, 2, 3])); }, }); const reader = rs.getReader({ mode: 'byob' }); const { value, done } = await reader.read(new Uint8Array(3)); assert.strictEqual(done, false); assert.deepStrictEqual(value, new Uint8Array([1, 2, 3])); reader.releaseLock(); }); // -- ReadableByteStreamController.enqueue() -- test('ReadableByteStreamController.enqueue() rejects SAB-backed Uint8Array', async () => { const sabForEnqueue = new SharedArrayBuffer(4); const sabViewForEnqueue = new Uint8Array(sabForEnqueue); sabViewForEnqueue[0] = 42; const rs = new ReadableStream({ type: 'bytes', pull: common.mustCall((controller) => { assert.throws( () => controller.enqueue(sabViewForEnqueue), { code: 'ERR_INVALID_ARG_VALUE' }, ); controller.enqueue(new Uint8Array([1])); }), }); const reader = rs.getReader(); const { value } = await reader.read(); assert.deepStrictEqual(value, new Uint8Array([1])); reader.releaseLock(); }); test('ReadableByteStreamController.enqueue() rejects SAB-backed DataView', async () => { const sabForDv = new SharedArrayBuffer(4); const dvForEnqueue = new DataView(sabForDv); const rs = new ReadableStream({ type: 'bytes', pull: common.mustCall((controller) => { assert.throws( () => controller.enqueue(dvForEnqueue), { code: 'ERR_INVALID_ARG_VALUE' }, ); controller.enqueue(new Uint8Array([2])); }), }); const reader = rs.getReader(); const { value } = await reader.read(); assert.deepStrictEqual(value, new Uint8Array([2])); reader.releaseLock(); }); // -- Blob -- test('Blob rejects SharedArrayBuffer part', () => { assert.throws( () => new Blob([sab]), { code: 'ERR_INVALID_ARG_TYPE' }, ); }); test('Blob rejects SAB-backed Uint8Array part', () => { assert.throws( () => new Blob([sabView]), { code: 'ERR_INVALID_ARG_TYPE' }, ); }); test('Blob rejects SAB-backed DataView part', () => { assert.throws( () => new Blob([sabDataView]), { code: 'ERR_INVALID_ARG_TYPE' }, ); }); // -- SharedWebIDL converters -- const { converters } = require('internal/webidl'); test('webidl converters.BufferSource rejects SharedArrayBuffer', () => { assert.throws( () => converters.BufferSource(sab), { code: 'ERR_INVALID_ARG_TYPE' }, ); }); test('webidl converters.BufferSource rejects SAB-backed Uint8Array', () => { assert.throws( () => converters.BufferSource(sabView), { code: 'ERR_INVALID_ARG_TYPE' }, ); }); test('webidl converters.BufferSource rejects SAB-backed DataView', () => { assert.throws( () => converters.BufferSource(sabDataView), { code: 'ERR_INVALID_ARG_TYPE' }, ); }); test('webidl converters.BufferSource accepts ArrayBuffer', () => { const ab = new ArrayBuffer(4); assert.strictEqual(converters.BufferSource(ab), ab); }); test('webidl converters.BufferSource accepts regular TypedArray', () => { const ta = new Uint8Array(4); assert.strictEqual(converters.BufferSource(ta), ta); }); test('webidl converters.Uint8Array rejects SAB-backed Uint8Array', () => { assert.throws( () => converters.Uint8Array(sabView), { code: 'ERR_INVALID_ARG_TYPE' }, ); }); test('webidl converters.Uint8Array rejects DataView', () => { assert.throws( () => converters.Uint8Array(sabDataView), { code: 'ERR_INVALID_ARG_TYPE' }, ); }); test('webidl converters.Uint8Array rejects non-view', () => { assert.throws( () => converters.Uint8Array('not a view'), { code: 'ERR_INVALID_ARG_TYPE' }, ); }); test('webidl converters.Uint8Array accepts regular Uint8Array', () => { const ta = new Uint8Array(4); assert.strictEqual(converters.Uint8Array(ta), ta); });