From da9e530006ac4ddfeb72cdcb6a141c7096a88454 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Fri, 15 Mar 2019 19:58:42 +0100 Subject: [PATCH] fs: use proper .destroy() implementation for SyncWriteStream --- lib/internal/fs/sync_write_stream.js | 16 +++++--------- .../test-internal-fs-syncwritestream.js | 21 ++++++++++++------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/lib/internal/fs/sync_write_stream.js b/lib/internal/fs/sync_write_stream.js index 1e7c6a50a96d6d..0af289d7f45bd2 100644 --- a/lib/internal/fs/sync_write_stream.js +++ b/lib/internal/fs/sync_write_stream.js @@ -4,15 +4,13 @@ const { Writable } = require('stream'); const { closeSync, writeSync } = require('fs'); function SyncWriteStream(fd, options) { - Writable.call(this); + Writable.call(this, { autoDestroy: true }); options = options || {}; this.fd = fd; this.readable = false; this.autoClose = options.autoClose === undefined ? true : options.autoClose; - - this.on('end', () => this._destroy()); } Object.setPrototypeOf(SyncWriteStream.prototype, Writable.prototype); @@ -24,22 +22,18 @@ SyncWriteStream.prototype._write = function(chunk, encoding, cb) { return true; }; -SyncWriteStream.prototype._destroy = function() { +SyncWriteStream.prototype._destroy = function(err, cb) { if (this.fd === null) // already destroy()ed - return; + return cb(err); if (this.autoClose) closeSync(this.fd); this.fd = null; - return true; + cb(err); }; SyncWriteStream.prototype.destroySoon = -SyncWriteStream.prototype.destroy = function() { - this._destroy(); - this.emit('close'); - return true; -}; + SyncWriteStream.prototype.destroy; module.exports = SyncWriteStream; diff --git a/test/parallel/test-internal-fs-syncwritestream.js b/test/parallel/test-internal-fs-syncwritestream.js index 49c29e073818e8..bf4776550b6edf 100644 --- a/test/parallel/test-internal-fs-syncwritestream.js +++ b/test/parallel/test-internal-fs-syncwritestream.js @@ -19,7 +19,6 @@ const filename = path.join(tmpdir.path, 'sync-write-stream.txt'); assert.strictEqual(stream.fd, 1); assert.strictEqual(stream.readable, false); assert.strictEqual(stream.autoClose, true); - assert.strictEqual(stream.listenerCount('end'), 1); } // Verify constructing the instance with specified options. @@ -29,7 +28,6 @@ const filename = path.join(tmpdir.path, 'sync-write-stream.txt'); assert.strictEqual(stream.fd, 1); assert.strictEqual(stream.readable, false); assert.strictEqual(stream.autoClose, false); - assert.strictEqual(stream.listenerCount('end'), 1); } // Verify that the file will be written synchronously. @@ -47,21 +45,28 @@ const filename = path.join(tmpdir.path, 'sync-write-stream.txt'); const fd = fs.openSync(filename, 'w'); const stream = new SyncWriteStream(fd); - stream.on('close', common.mustCall(3)); + stream.on('close', common.mustCall()); + assert.strictEqual(stream.destroy(), stream); + assert.strictEqual(stream.fd, null); +} + +// Verify that the stream will unset the fd after destroySoon(). +{ + const fd = fs.openSync(filename, 'w'); + const stream = new SyncWriteStream(fd); - assert.strictEqual(stream.destroy(), true); + stream.on('close', common.mustCall()); + assert.strictEqual(stream.destroySoon(), stream); assert.strictEqual(stream.fd, null); - assert.strictEqual(stream.destroy(), true); - assert.strictEqual(stream.destroySoon(), true); } -// Verify that the 'end' event listener will also destroy the stream. +// Verify that calling end() will also destroy the stream. { const fd = fs.openSync(filename, 'w'); const stream = new SyncWriteStream(fd); assert.strictEqual(stream.fd, fd); - stream.emit('end'); + stream.end(); assert.strictEqual(stream.fd, null); }