| 'use strict'; |
| |
| const common = require('../common'); |
| const stream = require('stream'); |
| const { |
| Readable, |
| Writable, |
| promises, |
| } = stream; |
| const { |
| finished, |
| pipeline, |
| } = require('stream/promises'); |
| const fs = require('fs'); |
| const assert = require('assert'); |
| const { promisify } = require('util'); |
| |
| assert.strictEqual(promises.pipeline, pipeline); |
| assert.strictEqual(promises.finished, finished); |
| assert.strictEqual(pipeline, promisify(stream.pipeline)); |
| assert.strictEqual(finished, promisify(stream.finished)); |
| |
| // pipeline success |
| { |
| let finished = false; |
| const processed = []; |
| const expected = [ |
| Buffer.from('a'), |
| Buffer.from('b'), |
| Buffer.from('c'), |
| ]; |
| |
| const read = new Readable({ |
| read() { } |
| }); |
| |
| const write = new Writable({ |
| write(data, enc, cb) { |
| processed.push(data); |
| cb(); |
| } |
| }); |
| |
| write.on('finish', () => { |
| finished = true; |
| }); |
| |
| for (let i = 0; i < expected.length; i++) { |
| read.push(expected[i]); |
| } |
| read.push(null); |
| |
| pipeline(read, write).then(common.mustCall((value) => { |
| assert.ok(finished); |
| assert.deepStrictEqual(processed, expected); |
| })); |
| } |
| |
| // pipeline error |
| { |
| const read = new Readable({ |
| read() { } |
| }); |
| |
| const write = new Writable({ |
| write(data, enc, cb) { |
| cb(); |
| } |
| }); |
| |
| read.push('data'); |
| setImmediate(() => read.destroy()); |
| |
| pipeline(read, write).catch(common.mustCall((err) => { |
| assert.ok(err, 'should have an error'); |
| })); |
| } |
| |
| // finished success |
| { |
| async function run() { |
| const rs = fs.createReadStream(__filename); |
| |
| let ended = false; |
| rs.resume(); |
| rs.on('end', () => { |
| ended = true; |
| }); |
| await finished(rs); |
| assert(ended); |
| } |
| |
| run().then(common.mustCall()); |
| } |
| |
| // finished error |
| { |
| const rs = fs.createReadStream('file-does-not-exist'); |
| |
| assert.rejects(finished(rs), { |
| code: 'ENOENT' |
| }).then(common.mustCall()); |
| } |