deno.land / std@0.166.0 / node / _tools / test / parallel / test-stream-duplex-destroy.js
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265// deno-fmt-ignore-file// deno-lint-ignore-file
// Copyright Joyent and Node contributors. All rights reserved. MIT license.// Taken from Node 18.12.0// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually
'use strict';
const common = require('../common');const { Duplex } = require('stream');const assert = require('assert');
{ const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {} });
duplex.resume();
duplex.on('end', common.mustNotCall()); duplex.on('finish', common.mustNotCall()); duplex.on('close', common.mustCall());
duplex.destroy(); assert.strictEqual(duplex.destroyed, true);}
{ const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {} }); duplex.resume();
const expected = new Error('kaboom');
duplex.on('end', common.mustNotCall()); duplex.on('finish', common.mustNotCall()); duplex.on('error', common.mustCall((err) => { assert.strictEqual(err, expected); }));
duplex.destroy(expected); assert.strictEqual(duplex.destroyed, true);}
{ const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {} });
duplex._destroy = common.mustCall(function(err, cb) { assert.strictEqual(err, expected); cb(err); });
const expected = new Error('kaboom');
duplex.on('finish', common.mustNotCall('no finish event')); duplex.on('error', common.mustCall((err) => { assert.strictEqual(err, expected); }));
duplex.destroy(expected); assert.strictEqual(duplex.destroyed, true);}
{ const expected = new Error('kaboom'); const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {}, destroy: common.mustCall(function(err, cb) { assert.strictEqual(err, expected); cb(); }) }); duplex.resume();
duplex.on('end', common.mustNotCall('no end event')); duplex.on('finish', common.mustNotCall('no finish event'));
// Error is swallowed by the custom _destroy duplex.on('error', common.mustNotCall('no error event')); duplex.on('close', common.mustCall());
duplex.destroy(expected); assert.strictEqual(duplex.destroyed, true);}
{ const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {} });
duplex._destroy = common.mustCall(function(err, cb) { assert.strictEqual(err, null); cb(); });
duplex.destroy(); assert.strictEqual(duplex.destroyed, true);}
{ const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {} }); duplex.resume();
duplex._destroy = common.mustCall(function(err, cb) { assert.strictEqual(err, null); process.nextTick(() => { this.push(null); this.end(); cb(); }); });
const fail = common.mustNotCall('no finish or end event');
duplex.on('finish', fail); duplex.on('end', fail);
duplex.destroy();
duplex.removeListener('end', fail); duplex.removeListener('finish', fail); duplex.on('end', common.mustNotCall()); duplex.on('finish', common.mustNotCall()); assert.strictEqual(duplex.destroyed, true);}
{ const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {} });
const expected = new Error('kaboom');
duplex._destroy = common.mustCall(function(err, cb) { assert.strictEqual(err, null); cb(expected); });
duplex.on('finish', common.mustNotCall('no finish event')); duplex.on('end', common.mustNotCall('no end event')); duplex.on('error', common.mustCall((err) => { assert.strictEqual(err, expected); }));
duplex.destroy(); assert.strictEqual(duplex.destroyed, true);}
{ const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {}, allowHalfOpen: true }); duplex.resume();
duplex.on('finish', common.mustNotCall()); duplex.on('end', common.mustNotCall());
duplex.destroy(); assert.strictEqual(duplex.destroyed, true);}
{ const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {}, });
duplex.destroyed = true; assert.strictEqual(duplex.destroyed, true);
// The internal destroy() mechanism should not be triggered duplex.on('finish', common.mustNotCall()); duplex.on('end', common.mustNotCall()); duplex.destroy();}
{ function MyDuplex() { assert.strictEqual(this.destroyed, false); this.destroyed = false; Duplex.call(this); }
Object.setPrototypeOf(MyDuplex.prototype, Duplex.prototype); Object.setPrototypeOf(MyDuplex, Duplex);
new MyDuplex();}
{ const duplex = new Duplex({ writable: false, autoDestroy: true, write(chunk, enc, cb) { cb(); }, read() {}, }); duplex.push(null); duplex.resume(); duplex.on('close', common.mustCall());}
{ const duplex = new Duplex({ readable: false, autoDestroy: true, write(chunk, enc, cb) { cb(); }, read() {}, }); duplex.end(); duplex.on('close', common.mustCall());}
{ const duplex = new Duplex({ allowHalfOpen: false, autoDestroy: true, write(chunk, enc, cb) { cb(); }, read() {}, }); duplex.push(null); duplex.resume(); const orgEnd = duplex.end; duplex.end = common.mustNotCall(); duplex.on('end', () => { // Ensure end() is called in next tick to allow // any pending writes to be invoked first. process.nextTick(() => { duplex.end = common.mustCall(orgEnd); }); }); duplex.on('close', common.mustCall());}{ // Check abort signal const controller = new AbortController(); const { signal } = controller; const duplex = new Duplex({ write(chunk, enc, cb) { cb(); }, read() {}, signal, }); let count = 0; duplex.on('error', common.mustCall((e) => { assert.strictEqual(count++, 0); // Ensure not called twice assert.strictEqual(e.name, 'AbortError'); })); duplex.on('close', common.mustCall()); controller.abort();}
Version Info