| 'use strict'; |
| |
| const common = require('../common'); |
| const { finished, addAbortSignal } = require('stream'); |
| const { ReadableStream, WritableStream } = require('stream/web'); |
| const assert = require('assert'); |
| |
| function createTestReadableStream() { |
| return new ReadableStream({ |
| start(controller) { |
| controller.enqueue('a'); |
| controller.enqueue('b'); |
| controller.enqueue('c'); |
| controller.close(); |
| } |
| }); |
| } |
| |
| function createTestWritableStream(values) { |
| return new WritableStream({ |
| write(chunk) { |
| values.push(chunk); |
| } |
| }); |
| } |
| |
| { |
| const rs = createTestReadableStream(); |
| |
| const reader = rs.getReader(); |
| |
| const ac = new AbortController(); |
| |
| addAbortSignal(ac.signal, rs); |
| |
| finished(rs, common.mustCall((err) => { |
| assert.strictEqual(err.name, 'AbortError'); |
| assert.rejects(reader.read(), /AbortError/).then(common.mustCall()); |
| assert.rejects(reader.closed, /AbortError/).then(common.mustCall()); |
| })); |
| |
| reader.read().then(common.mustCall((result) => { |
| assert.strictEqual(result.value, 'a'); |
| ac.abort(); |
| })); |
| } |
| |
| { |
| const rs = createTestReadableStream(); |
| |
| const ac = new AbortController(); |
| |
| addAbortSignal(ac.signal, rs); |
| |
| assert.rejects((async () => { |
| for await (const chunk of rs) { |
| if (chunk === 'b') { |
| ac.abort(); |
| } |
| } |
| })(), /AbortError/).then(common.mustCall()); |
| } |
| |
| { |
| const rs1 = createTestReadableStream(); |
| |
| const rs2 = createTestReadableStream(); |
| |
| const ac = new AbortController(); |
| |
| addAbortSignal(ac.signal, rs1); |
| addAbortSignal(ac.signal, rs2); |
| |
| const reader1 = rs1.getReader(); |
| const reader2 = rs2.getReader(); |
| |
| finished(rs1, common.mustCall((err) => { |
| assert.strictEqual(err.name, 'AbortError'); |
| assert.rejects(reader1.read(), /AbortError/).then(common.mustCall()); |
| assert.rejects(reader1.closed, /AbortError/).then(common.mustCall()); |
| })); |
| |
| finished(rs2, common.mustCall((err) => { |
| assert.strictEqual(err.name, 'AbortError'); |
| assert.rejects(reader2.read(), /AbortError/).then(common.mustCall()); |
| assert.rejects(reader2.closed, /AbortError/).then(common.mustCall()); |
| })); |
| |
| ac.abort(); |
| } |
| |
| { |
| const rs = createTestReadableStream(); |
| |
| const { 0: rs1, 1: rs2 } = rs.tee(); |
| |
| const ac = new AbortController(); |
| |
| addAbortSignal(ac.signal, rs); |
| |
| const reader1 = rs1.getReader(); |
| const reader2 = rs2.getReader(); |
| |
| finished(rs1, common.mustCall((err) => { |
| assert.strictEqual(err.name, 'AbortError'); |
| assert.rejects(reader1.read(), /AbortError/).then(common.mustCall()); |
| assert.rejects(reader1.closed, /AbortError/).then(common.mustCall()); |
| })); |
| |
| finished(rs2, common.mustCall((err) => { |
| assert.strictEqual(err.name, 'AbortError'); |
| assert.rejects(reader2.read(), /AbortError/).then(common.mustCall()); |
| assert.rejects(reader2.closed, /AbortError/).then(common.mustCall()); |
| })); |
| |
| ac.abort(); |
| } |
| |
| { |
| const values = []; |
| const ws = createTestWritableStream(values); |
| |
| const ac = new AbortController(); |
| |
| addAbortSignal(ac.signal, ws); |
| |
| const writer = ws.getWriter(); |
| |
| finished(ws, common.mustCall((err) => { |
| assert.strictEqual(err.name, 'AbortError'); |
| assert.deepStrictEqual(values, ['a']); |
| assert.rejects(writer.write('b'), /AbortError/).then(common.mustCall()); |
| assert.rejects(writer.closed, /AbortError/).then(common.mustCall()); |
| })); |
| |
| writer.write('a').then(() => { |
| ac.abort(); |
| }); |
| } |
| |
| { |
| const values = []; |
| |
| const ws1 = createTestWritableStream(values); |
| const ws2 = createTestWritableStream(values); |
| |
| const ac = new AbortController(); |
| |
| addAbortSignal(ac.signal, ws1); |
| addAbortSignal(ac.signal, ws2); |
| |
| const writer1 = ws1.getWriter(); |
| const writer2 = ws2.getWriter(); |
| |
| finished(ws1, common.mustCall((err) => { |
| assert.strictEqual(err.name, 'AbortError'); |
| assert.rejects(writer1.write('a'), /AbortError/).then(common.mustCall()); |
| assert.rejects(writer1.closed, /AbortError/).then(common.mustCall()); |
| })); |
| |
| finished(ws2, common.mustCall((err) => { |
| assert.strictEqual(err.name, 'AbortError'); |
| assert.rejects(writer2.write('a'), /AbortError/).then(common.mustCall()); |
| assert.rejects(writer2.closed, /AbortError/).then(common.mustCall()); |
| })); |
| |
| ac.abort(); |
| } |