Skip to content

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

Description

@mcollina

process.stdout and process.stderr are not implementing Stream 2 or 3 if they are redirected to a file. They are a SyncWriteStream:

stream = new fs.SyncWriteStream(fd, { autoClose: false });
.
This is were the choice is made.:
case 'FILE':
const fs = require('internal/fs');
stream = new fs.SyncWriteStream(fd, { autoClose: false });
stream._type = 'fs';
break;

I know too little of the stdio sync/async situation to identify what should be preferred change. Ideally process.stdout and process.stderr should come from the streams implementations, but I might be wrong.
What are the implications of doing so? Why is this needed in the first place?
As an example, can we use net.Socket instead

stream = new net.Socket({
fd: fd,
readable: false,
writable: true
});
?

Issues related:
sindresorhus/is-stream#5
pinojs/pino#85
pinojs/pino#86

cc @jasnell @Fishrock123 @jsumners @catdad @sindresorhus @nodejs/streams

Activity

  1. added
    fsIssues and PRs related to file-system APIs and the fs module.
    streamIssues and PRs related to Node.js streams.
    confirmed-bugIssues and PRs for confirmed bugs.
    on Sep 28, 2016
  2. addaleax commented on Sep 28, 2016

    @addaleax
    Member

    Ideally process.stdout and process.stderr should come from the streams implementations, but I might be wrong.

    +1. It also looks like the SyncWriteStream implementation could be simplified a lot when built on top of Writable… I’ll try to put a patch together but it seems hard to estimate the semverness of that.

  3. jasnell commented on Sep 28, 2016

    @jasnell
    Member

    +1 on doing something here. As far as I understand it, the SyncWriteStream impl that was there had been intended as a kind of temporary half measure but it was never really finished. It's likely to be a semver-major change but hard to say for sure until we get a better implementation.

  4. Fishrock123 commented on Sep 28, 2016

    @Fishrock123
    Contributor

    Hmmm, I was sure there was an older issue for this.

    I think it would be ideal to change it to use net.Socket, there are a lot of subtle issues that come into play with properties not existing if someone pipes to/from a file. I doubt that would be a major change, it fixes the need for workarounds.

  5. added
    processIssues and PRs related to the process subsystem.
    fsIssues and PRs related to file-system APIs and the fs module.
    and removed
    fsIssues and PRs related to file-system APIs and the fs module.
    on Sep 28, 2016
  6. mcollina commented on Sep 28, 2016

    @mcollina
    SponsorMemberAuthor

    @Fishrock123 maybe there is, I found none mentioning SyncWriteStream directly.

  7. mcollina commented on Sep 28, 2016

    @mcollina
    SponsorMemberAuthor

    SyncWriteStream is mainly used within the debug module https://github.com/visionmedia/debug/blob/39ecd87bcc145de5ca1cbea1bf4caed02c34d30a/node.js#L164. debug lifts some chunks of code straight from core.

  8. addaleax commented on Sep 28, 2016

    @addaleax
    Member

    Suggested PR (that does nothing net.Socket-wise, so its desirability is probably up for debate): #8830

  9. silverwind commented on Sep 28, 2016

    @silverwind
    Contributor

    Is it related that process.stdin isn't a ReadStream when redirected?

    $ node -p "Object.getPrototypeOf(process.stdin)" | head -1
    ReadStream { setRawMode: [Function] }
    $ node -p "Object.getPrototypeOf(process.stdin)" < <(echo) | head -1
    Socket {
    
  10. Fishrock123 commented on Sep 28, 2016

    @Fishrock123
    Contributor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    confirmed-bugIssues and PRs for confirmed bugs.fsIssues and PRs related to file-system APIs and the fs module.processIssues and PRs related to the process subsystem.streamIssues and PRs related to Node.js streams.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions