'use strict'; const common = require('../common'); const assert = require('assert'); const { readFileSync, } = require('fs'); const { open, } = require('fs/promises'); const check = readFileSync(__filename, { encoding: 'utf8' }); // Make sure the ReadableStream works... (async () => { const dec = new TextDecoder(); const file = await open(__filename); let data = ''; for await (const chunk of file.readableWebStream()) data += dec.decode(chunk); assert.strictEqual(check, data); assert.throws(() => file.readableWebStream(), { code: 'ERR_INVALID_STATE', }); await file.close(); })().then(common.mustCall()); // Make sure that acquiring a ReadableStream fails if the // FileHandle is already closed. (async () => { const file = await open(__filename); await file.close(); assert.throws(() => file.readableWebStream(), { code: 'ERR_INVALID_STATE', }); })().then(common.mustCall()); // Make sure that acquiring a ReadableStream fails if the // FileHandle is already closing. (async () => { const file = await open(__filename); file.close(); assert.throws(() => file.readableWebStream(), { code: 'ERR_INVALID_STATE', }); })().then(common.mustCall()); // Make sure the ReadableStream is closed when the underlying // FileHandle is closed. (async () => { const file = await open(__filename); const readable = file.readableWebStream(); const reader = readable.getReader(); file.close(); await reader.closed; })().then(common.mustCall()); // Make sure the ReadableStream is closed when the underlying // FileHandle is closed. (async () => { const file = await open(__filename); const readable = file.readableWebStream(); file.close(); const reader = readable.getReader(); await reader.closed; })().then(common.mustCall()); // Make sure that the FileHandle is properly marked "in use" // when a ReadableStream has been acquired for it. (async () => { const file = await open(__filename); file.readableWebStream(); const mc = new MessageChannel(); mc.port1.onmessage = common.mustNotCall(); assert.throws(() => mc.port2.postMessage(file, [file]), { code: 25, name: 'DataCloneError', }); mc.port1.close(); await file.close(); })().then(common.mustCall()); // Make sure 'byob' reader works (async () => { const file = await open(__filename); const dec = new TextDecoder(); const readable = file.readableWebStream(); const reader = readable.getReader({ mode: 'byob' }); let data = ''; let result; do { const buff = new ArrayBuffer(100); result = await reader.read(new DataView(buff)); if (result.value !== undefined) { data += dec.decode(result.value); assert.ok(result.value.byteLength <= 100); } } while (!result.done); assert.strictEqual(check, data); assert.throws(() => file.readableWebStream(), { code: 'ERR_INVALID_STATE', }); await file.close(); })().then(common.mustCall()); // Make sure a warning is logged if a non-'bytes' type is passed. (async () => { const file = await open(__filename); common.expectWarning({ ExperimentalWarning: [ 'A non-"bytes" options.type has no effect. A byte-oriented steam is ' + 'always created.', ], }); const stream = file.readableWebStream({ type: 'foobar' }); await stream.cancel(); await file.close(); })().then(common.mustCall());