Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix "Cannot set property closed of" on Node 18 #836

Merged
merged 3 commits into from May 17, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Expand Up @@ -3,7 +3,7 @@ version: 2
refs:
container: &container
docker:
- image: node:14
- image: node:18
Copy link

@pratik136 pratik136 May 20, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm inclined to believe that the library should be simultaneously tested on all LTS versions of Node.js in addition to at least the major versions of the recent ones.

Theoretically they all are in active dev, or maintenance, and as such bear the potential to break. If the e2e test suite could be run on all versions, that can act as the first line of defence. Thoughts?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree. I simply changed this value because I'm not a maintainer/code-owner of this lib and this was the easiest I could do to make sure it works on Node 18.

working_directory: ~/repo
steps:
- &Versions
Expand Down
9 changes: 8 additions & 1 deletion src/volume.ts
Expand Up @@ -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') {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (this._readableState && typeof this._readableState.closed === 'boolean') {
if (typeof this._readableState?.closed === 'boolean') {

It should be possible to use optional chaining here right?

this._readableState.closed = true;
} else {
this.closed = true;
}

this._vol.close(this.fd, er => {
if (er) this.emit('error', er);
Expand Down