| 'use strict'; |
| const common = require('../common'); |
| const stream = require('stream'); |
| const assert = require('assert'); |
| |
| { |
| const r = new stream.Readable({ |
| autoDestroy: true, |
| read() { |
| this.push('hello'); |
| this.push('world'); |
| this.push(null); |
| }, |
| destroy: common.mustCall((err, cb) => cb()) |
| }); |
| |
| let ended = false; |
| |
| r.resume(); |
| |
| r.on('end', common.mustCall(() => { |
| ended = true; |
| })); |
| |
| r.on('close', common.mustCall(() => { |
| assert(ended); |
| })); |
| } |
| |
| { |
| const w = new stream.Writable({ |
| autoDestroy: true, |
| write(data, enc, cb) { |
| cb(null); |
| }, |
| destroy: common.mustCall((err, cb) => cb()) |
| }); |
| |
| let finished = false; |
| |
| w.write('hello'); |
| w.write('world'); |
| w.end(); |
| |
| w.on('finish', common.mustCall(() => { |
| finished = true; |
| })); |
| |
| w.on('close', common.mustCall(() => { |
| assert(finished); |
| })); |
| } |
| |
| { |
| const t = new stream.Transform({ |
| autoDestroy: true, |
| transform(data, enc, cb) { |
| cb(null, data); |
| }, |
| destroy: common.mustCall((err, cb) => cb()) |
| }); |
| |
| let ended = false; |
| let finished = false; |
| |
| t.write('hello'); |
| t.write('world'); |
| t.end(); |
| |
| t.resume(); |
| |
| t.on('end', common.mustCall(() => { |
| ended = true; |
| })); |
| |
| t.on('finish', common.mustCall(() => { |
| finished = true; |
| })); |
| |
| t.on('close', common.mustCall(() => { |
| assert(ended); |
| assert(finished); |
| })); |
| } |
| |
| { |
| const r = new stream.Readable({ |
| read() { |
| r2.emit('error', new Error('fail')); |
| } |
| }); |
| const r2 = new stream.Readable({ |
| autoDestroy: true, |
| destroy: common.mustCall((err, cb) => cb()) |
| }); |
| |
| r.pipe(r2); |
| } |
| |
| { |
| const r = new stream.Readable({ |
| read() { |
| w.emit('error', new Error('fail')); |
| } |
| }); |
| const w = new stream.Writable({ |
| autoDestroy: true, |
| destroy: common.mustCall((err, cb) => cb()) |
| }); |
| |
| r.pipe(w); |
| } |