Skip to content

Proposal: Deprecate implicit flowing of stream via on('data') #99

Description

@chrisdickinson

Via a conversation in this issue (towards the bottom of my linked comment.)

I propose that we deprecate (with the intent of eliminating) the implicit flowing of streams via .on('data'), opting instead to encourage users to use .resume() and .pipe(). It breaks the EventEmitter API contract to have side-effects based on adding a listener, which surprises users. While there are ways around it for normal listeners (namely EventEmitter.prototype.on.call(stream, 'data', fn)), they're not natural, and EventEmitter APIs that call .on will still trigger side-effect-ful behavior (for example, .once).

Benefits

  • Streams would only have two states, flowing and paused, instead of the three they have currently (the undocumented third state, "undefined").
  • Streams may be .pause()'d and .resume()'d without losing access to the third "undefined" state.

Obstacles

  • Readable#pipe could no longer rely on the implicit flowing behavior of .on('data') to start the stream (so we would likely have to call src.resume()).
  • streams1.Stream#pipe is entirely separate from `Readable#pipe. This may or may not prove to be a problem since streams1 streams implicitly flowed to begin with.
  • Messaging/education – we don't want people to get streamsN fatigue.
  • In general in io.js/node development, it's hard to tell how many packages will break due to a given change, or even to get a read on the number of users of a given feature.

Questions

  • Is the simplification of the streams state machine worth the effort (for us as well as for end users)?
  • In general, is making the API more explicit desirable? If so, what would it look like if .resume() was the only method to start flowing a stream? I.E., if this class of change represents "a good thing," why not take it even further?

/cc @iojs/streams

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions