From eb271ce2402b2dca451395e278f4c731db47264e Mon Sep 17 00:00:00 2001 From: Dominik Sokal Date: Wed, 11 May 2022 12:33:06 +0200 Subject: [PATCH 1/3] fix: setting closed flag on Node >= 18 --- src/volume.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/volume.ts b/src/volume.ts index 07ddb972..9abe01db 100644 --- a/src/volume.ts +++ b/src/volume.ts @@ -2470,7 +2470,14 @@ FsReadStream.prototype.close = function(cb) { return process.nextTick(() => this.emit('close')); } - this.closed = true; + // Since Node 18, there is only a getter for '.closed'. + // The first branch mimics other setters from Readable. + // See https://github.com/nodejs/node/blob/v18.0.0/lib/internal/streams/readable.js#L1243 + if (this._readableState && typeof this._readableState.closed === 'boolean') { + this._readableState.closed = true; + } else { + this.closed = true; + } this._vol.close(this.fd, er => { if (er) this.emit('error', er); From 4b59ff793480d1894cdbaa0689cbf1c268183b0a Mon Sep 17 00:00:00 2001 From: Dominik Sokal Date: Wed, 11 May 2022 12:33:27 +0200 Subject: [PATCH 2/3] chore: use node 18 in CI --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 289272e1..22e50042 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2 refs: container: &container docker: - - image: node:14 + - image: node:18 working_directory: ~/repo steps: - &Versions From 5a178f8208add7dcfb699fe1b9d0f4656b83a96b Mon Sep 17 00:00:00 2001 From: Dominik Sokal Date: Thu, 12 May 2022 10:05:03 +0200 Subject: [PATCH 3/3] address PR feedback + fix closing write stream --- src/volume.ts | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/volume.ts b/src/volume.ts index 9abe01db..5f7f7128 100644 --- a/src/volume.ts +++ b/src/volume.ts @@ -2473,7 +2473,7 @@ FsReadStream.prototype.close = function(cb) { // Since Node 18, there is only a getter for '.closed'. // The first branch mimics other setters from Readable. // See https://github.com/nodejs/node/blob/v18.0.0/lib/internal/streams/readable.js#L1243 - if (this._readableState && typeof this._readableState.closed === 'boolean') { + if (typeof this._readableState?.closed === 'boolean') { this._readableState.closed = true; } else { this.closed = true; @@ -2622,8 +2622,35 @@ FsWriteStream.prototype._writev = function(data, cb) { if (this.pos !== undefined) this.pos += size; }; +FsWriteStream.prototype.close = function(cb) { + if (cb) this.once('close', cb); + + if (this.closed || typeof this.fd !== 'number') { + if (typeof this.fd !== 'number') { + this.once('open', closeOnOpen); + return; + } + return process.nextTick(() => this.emit('close')); + } + + // Since Node 18, there is only a getter for '.closed'. + // The first branch mimics other setters from Writable. + // See https://github.com/nodejs/node/blob/v18.0.0/lib/internal/streams/writable.js#L766 + if (typeof this._writableState?.closed === 'boolean') { + this._writableState.closed = true; + } else { + this.closed = true; + } + + this._vol.close(this.fd, er => { + if (er) this.emit('error', er); + else this.emit('close'); + }); + + this.fd = null; +}; + FsWriteStream.prototype._destroy = FsReadStream.prototype._destroy; -FsWriteStream.prototype.close = FsReadStream.prototype.close; // There is no shutdown() for files. FsWriteStream.prototype.destroySoon = FsWriteStream.prototype.end;