| 'use strict'; |
| // Flags: --no-warnings --expose-internals |
| require('../common'); |
| const assert = require('assert'); |
| const test = require('node:test'); |
| const { Duplex, Writable } = require('stream'); |
| const { |
| newWritableStreamFromStreamWritable, |
| newReadableWritablePairFromDuplex, |
| } = require('internal/webstreams/adapters'); |
| |
| // Verify that when the underlying Node.js stream throws synchronously from |
| // write(), the writable web stream properly rejects but does not destroy |
| // the stream (destroy-on-sync-throw is only used internally by |
| // CompressionStream/DecompressionStream). |
| |
| test('WritableStream from Node.js stream handles sync write throw', async () => { |
| const error = new TypeError('invalid chunk'); |
| const writable = new Writable({ |
| write() { |
| throw error; |
| }, |
| }); |
| |
| const ws = newWritableStreamFromStreamWritable(writable); |
| const writer = ws.getWriter(); |
| |
| await assert.rejects(writer.write('bad'), (err) => { |
| assert.strictEqual(err, error); |
| return true; |
| }); |
| |
| // Standalone writable should not be destroyed on sync write error |
| assert.strictEqual(writable.destroyed, false); |
| }); |
| |
| test('Duplex-backed pair does NOT destroy on sync write throw', async () => { |
| const error = new TypeError('invalid chunk'); |
| const duplex = new Duplex({ |
| read() {}, |
| write() { |
| throw error; |
| }, |
| }); |
| |
| const { writable, readable } = newReadableWritablePairFromDuplex(duplex); |
| const writer = writable.getWriter(); |
| |
| await assert.rejects(writer.write('bad'), (err) => { |
| assert.strictEqual(err, error); |
| return true; |
| }); |
| |
| // A plain Duplex should NOT be destroyed on sync write error |
| assert.strictEqual(duplex.destroyed, false); |
| |
| // The readable side should still be usable |
| const reader = readable.getReader(); |
| reader.cancel(); |
| }); |
| |
| test('WritableStream from Node.js stream - valid writes still work', async () => { |
| const chunks = []; |
| const writable = new Writable({ |
| write(chunk, _encoding, cb) { |
| chunks.push(chunk); |
| cb(); |
| }, |
| }); |
| |
| const ws = newWritableStreamFromStreamWritable(writable); |
| const writer = ws.getWriter(); |
| |
| await writer.write(Buffer.from('hello')); |
| await writer.write(Buffer.from(' world')); |
| await writer.close(); |
| |
| assert.strictEqual(Buffer.concat(chunks).toString(), 'hello world'); |
| }); |