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 diff --git a/src/volume.ts b/src/volume.ts index 07ddb972..5f7f7128 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 (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); @@ -2615,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;