Skip to content

Conversation

@addaleax
Copy link
Member

@addaleaxaddaleax commented Sep 28, 2016

Checklist
  • make -j8 test (UNIX), or vcbuild test nosign (Windows) passes
  • tests and/or benchmarks are included
  • commit message follows commit guidelines
Affected core subsystem(s)

fs, process?

Description of change

Make the internal SyncWriteStream a proper stream.Writable subclass. This allows for quite a bit of simplification, since SyncWriteStream predates the streams2/streams3 implementations.

Fixes: #8828

I’ve tried to be conservative with the changes here, e.g. by keeping the explicit readable boolean property and by keeping the .destroy() behaviour of emitting an explicit close event, although I doubt that either of these are relied upon.

Make the internal `SyncWriteStream` a proper `stream.Writable` subclass. This allows for quite a bit of simplification, since `SyncWriteStream` predates the streams2/streams3 implementations. Fixes: nodejs#8828
@addaleaxaddaleax added fs Issues and PRs related to the fs subsystem / file system. stream Issues and PRs related to the stream subsystem. process Issues and PRs related to the process subsystem. labels Sep 28, 2016
@nodejs-github-botnodejs-github-bot added the fs Issues and PRs related to the fs subsystem / file system. label Sep 28, 2016
// when stdout/stderr point to files.

if (process.argv[2] === 'child'){
console.log(JSON.stringify([process.stdout, process.stderr].map((stdio) => ({
Copy link
Member

Choose a reason for hiding this comment

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

Nit: Perhaps a note here quickly indicating that the console.log is intentional and part of the test? There are plenty of places around in the tests where console.log is used without serving much purpose.

Copy link
Member

@jasnelljasnell left a comment

Choose a reason for hiding this comment

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

LGTM with green CI and citgm.

@addaleax
Copy link
MemberAuthor

@jasnell Done!

CI: https://ci.nodejs.org/job/node-test-commit/5355/
CITGM: https://ci.nodejs.org/view/Node.js-citgm/job/citgm-smoker/399/

Copy link
Contributor

@Fishrock123Fishrock123 left a comment

Choose a reason for hiding this comment

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

LGTM if tests pass, maybe also run citgm on it.

That being said, I think this is only a step, and we should switch to net.Socket so that people don't reply on things that may not be in Socket, and don;t have to patch for Socket functionality.

@Fishrock123
Copy link
Contributor

Actually, that is due to an understanding of mine that net.Socket inherits from WriteStream. If it does not, we should probably not proceed with this? Checking...

@Fishrock123
Copy link
Contributor

Hmmm, net.Socket inherits from stream.Duplex, does that change anything here?

@thefourtheye
Copy link
Contributor

cc @nodejs/streams

@addaleax
Copy link
MemberAuthor

Hmmm, net.Socket inherits from stream.Duplex, does that change anything here?

Hmmm. On the one hand, Duplexes are not technically Writables according the prototype chain… on the other hand, we should probably makeinstanceof work properly for Duplexes using Symbol.hasInstance? I guess I’ll open a PR for that in a bit, too.

@addaleaxaddaleax mentioned this pull request Sep 28, 2016
4 tasks
@mcollina
Copy link
Member

@Fishrock123

That being said, I think this is only a step, and we should switch to net.Socket so that people don't reply on things that may not be in Socket, and don't have to patch for Socket functionality.

I agree. But that might be a semver-major change.

The debug module depends on SyncWriteStream to be there and working as expected.
@thealphanerd is debug in CITGM?

@addaleax can you verify that debug still works with this change?

I'm flagging this as semver-minor, pending CITGM and the assessment on debug.

@mcollinamcollina added the semver-minor PRs that contain new features and should be released in the next minor version. label Sep 29, 2016
@addaleax
Copy link
MemberAuthor

@thealphanerd is debug in CITGM?

debug doesn’t appear to have a proper test suite? :(

@addaleax can you verify that debug still works with this change?

Ostensibly, yes. I’m not even sure what they are using it for, so I’d probably have to take the time to look into it in more detail.

@mcollina
Copy link
Member

Ostensibly, yes. I’m not even sure what they are using it for, so I’d probably have to take the time to look into it in more detail.

They lifted some code from core back then. Not sure exactly why, so feel free to have a look, you might also want to send them a PR. You can just run any Express app with DEBUG=* and redirect the output to a file, if that works, we are grand with this.

LGTM

@addaleax
Copy link
MemberAuthor

You can just run any Express app with DEBUG=* and redirect the output to a file, if that works, we are grand with this.

I’ll try that later then. :)

@jasnell
Copy link
Member

jasnell commented Sep 30, 2016

@addaleax ... +1 to exploring if we can fixup instanceof with Duplex separately.
@mcollina and @Fishrock123 ... i definitely think switching to net.Socket later on as a semver-major is the right way to go but we'll have to smoke test that fairly extensively I think. In particular, the fact that socket is a Duplex could throw a few people off given that it would need to be half-closed (e.g. no reading, just writing)

@addaleax
Copy link
MemberAuthor

+1 to exploring if we can fixup instanceof with Duplex separately.

Just in case you haven’t seen it, that would be #8834. :)

@jasnell
Copy link
Member

ha! yeah, hadn't made it that far through the notifications ;-)

@Fishrock123
Copy link
Contributor

In particular, the fact that socket is a Duplex could throw a few people off given that it would need to be half-closed (e.g. no reading, just writing)

Again, doubtful. My experience so far is that people become confused when stdio is suddenly not sockets when dealing with files.

@mcollina
Copy link
Member

In particular, the fact that socket is a Duplex could throw a few people off given that it would need to be half-closed (e.g. no reading, just writing)

Again, doubtful. My experience so far is that people become confused when stdio is suddenly not sockets when dealing with files.

I agree with you @Fishrock123. This PR improve things anyway.

@addaleax
Copy link
MemberAuthor

I’d like to land this on Monday if there are no objections; we can still talk about making SyncWriteStream a proper Socket later.

@Fishrock123Fishrock123 added this to the v6.8.0 milestone Oct 10, 2016
addaleax added a commit to addaleax/node that referenced this pull request Oct 10, 2016
Make the internal `SyncWriteStream` a proper `stream.Writable` subclass. This allows for quite a bit of simplification, since `SyncWriteStream` predates the streams2/streams3 implementations. Fixes: nodejs#8828 PR-URL: nodejs#8830 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Jeremiah Senkpiel <[email protected]>
@addaleax
Copy link
MemberAuthor

Landed in a60f607

@addaleaxaddaleax deleted the fs-sws branch October 10, 2016 16:22
jasnell pushed a commit that referenced this pull request Oct 10, 2016
Make the internal `SyncWriteStream` a proper `stream.Writable` subclass. This allows for quite a bit of simplification, since `SyncWriteStream` predates the streams2/streams3 implementations. Fixes: #8828 PR-URL: #8830 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Jeremiah Senkpiel <[email protected]>
@Fishrock123
Copy link
Contributor

@addaleax requires internals... think you could backport?

@addaleax
Copy link
MemberAuthor

@Fishrock123 will do :)

addaleax added a commit to addaleax/node that referenced this pull request Oct 11, 2016
Make the internal `SyncWriteStream` a proper `stream.Writable` subclass. This allows for quite a bit of simplification, since `SyncWriteStream` predates the streams2/streams3 implementations. Fixes: nodejs#8828 PR-URL: nodejs#8830 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Jeremiah Senkpiel <[email protected]>
Fishrock123 pushed a commit that referenced this pull request Oct 11, 2016
Make the internal `SyncWriteStream` a proper `stream.Writable` subclass. This allows for quite a bit of simplification, since `SyncWriteStream` predates the streams2/streams3 implementations. Fixes: #8828 PR-URL: #8830 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Jeremiah Senkpiel <[email protected]> (backport info) Refs: #9030
Fishrock123 added a commit that referenced this pull request Oct 12, 2016
* fs: - `SyncWriteStream` now inherits from `Stream.Writable`. (Anna Henningsen) #8830 - Practically, this means that when stdio is piped to a file, stdout and stderr will still be `Writable` streams. - `fs.existsSync()` has been undeprecated. `fs.exists()` remains deprecated. (Dan Fabulich) #8364 * http: `http.request()` now accepts a `timeout` option. (Rene Weber) #8101 * module: The module loader now maintains its own realpath cache. (Anna Henningsen) #8100 * npm: Upgraded to 3.10.8 (Kat Marchán) #8706 * stream: `Duplex` streams now show proper `instanceof Stream.Writable`. (Anna Henningsen) #8834 * timers: Improved `setTimeout`/`Interval` performance by up to 22%. (Brian White) #8661 PR-URL: #9034
Fishrock123 added a commit that referenced this pull request Oct 12, 2016
* fs: - `SyncWriteStream` now inherits from `Stream.Writable`. (Anna Henningsen) #8830 - Practically, this means that when stdio is piped to a file, stdout and stderr will still be `Writable` streams. - `fs.existsSync()` has been undeprecated. `fs.exists()` remains deprecated. (Dan Fabulich) #8364 * http: `http.request()` now accepts a `timeout` option. (Rene Weber) #8101 * module: The module loader now maintains its own realpath cache. (Anna Henningsen) #8100 * npm: Upgraded to 3.10.8 (Kat Marchán) #8706 * stream: `Duplex` streams now show proper `instanceof Stream.Writable`. (Anna Henningsen) #8834 * timers: Improved `setTimeout`/`Interval` performance by up to 22%. (Brian White) #8661 PR-URL: #9034
imyller added a commit to imyller/meta-nodejs that referenced this pull request Oct 13, 2016
 * fs: - `SyncWriteStream` now inherits from `Stream.Writable`. (Anna Henningsen) nodejs/node#8830 - Practically, this means that when stdio is piped to a file, stdout and stderr will still be `Writable` streams. - `fs.existsSync()` has been undeprecated. `fs.exists()` remains deprecated. (Dan Fabulich) nodejs/node#8364 * http: `http.request()` now accepts a `timeout` option. (Rene Weber) nodejs/node#8101 * module: The module loader now maintains its own realpath cache. (Anna Henningsen) nodejs/node#8100 * npm: Upgraded to 3.10.8 (Kat Marchan) nodejs/node#8706 * stream: `Duplex` streams now show proper `instanceof Stream.Writable`. (Anna Henningsen) nodejs/node#8834 * timers: Improved `setTimeout`/`Interval` performance by up to 22%. (Brian White) nodejs/node#8661 Signed-off-by: Ilkka Myller <[email protected]>
imyller added a commit to imyller/meta-nodejs that referenced this pull request Oct 13, 2016
 * fs: - `SyncWriteStream` now inherits from `Stream.Writable`. (Anna Henningsen) nodejs/node#8830 - Practically, this means that when stdio is piped to a file, stdout and stderr will still be `Writable` streams. - `fs.existsSync()` has been undeprecated. `fs.exists()` remains deprecated. (Dan Fabulich) nodejs/node#8364 * http: `http.request()` now accepts a `timeout` option. (Rene Weber) nodejs/node#8101 * module: The module loader now maintains its own realpath cache. (Anna Henningsen) nodejs/node#8100 * npm: Upgraded to 3.10.8 (Kat Marchan) nodejs/node#8706 * stream: `Duplex` streams now show proper `instanceof Stream.Writable`. (Anna Henningsen) nodejs/node#8834 * timers: Improved `setTimeout`/`Interval` performance by up to 22%. (Brian White) nodejs/node#8661 Signed-off-by: Ilkka Myller <[email protected]>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fsIssues and PRs related to the fs subsystem / file system.processIssues and PRs related to the process subsystem.semver-minorPRs that contain new features and should be released in the next minor version.streamIssues and PRs related to the stream subsystem.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fs: make process.stdout and stderr descend from Writable.

6 participants

@addaleax@Fishrock123@thefourtheye@mcollina@jasnell@nodejs-github-bot