readable-stream icon indicating copy to clipboard operation
readable-stream copied to clipboard

Readable constructor has extra properties attached

Open cjihrig opened this issue 2 years ago • 3 comments

Comparing Readable in Node.js 18.8.0 and [email protected]:

> stream.Readable
[Function: Readable] {
  ReadableState: [Function: ReadableState],
  _fromList: [Function: fromList],
  from: [Function (anonymous)],
  fromWeb: [Function (anonymous)],
  toWeb: [Function (anonymous)],
  wrap: [Function (anonymous)]
}
> const rs = await import('readable-stream')
undefined
> rs.Readable
<ref *1> [Function: Readable] {
  ReadableState: [Function: ReadableState],
  _fromList: [Function: fromList],
  from: [Function (anonymous)],
  fromWeb: [Function (anonymous)],
  toWeb: [Function (anonymous)],
  wrap: [Function (anonymous)],
  _uint8ArrayToBuffer: [Function: _uint8ArrayToBuffer],
  _isUint8Array: [Function: isUint8Array],
  isDisturbed: [Function: isDisturbed],
  isErrored: [Function: isErrored],
  isReadable: [Function: isReadable],
  Readable: [Circular *1],
  Writable: [Function: Writable] {
    WritableState: [Function: WritableState],
    fromWeb: [Function (anonymous)],
    toWeb: [Function (anonymous)]
  },
  Duplex: [Function: Duplex] {
    fromWeb: [Function (anonymous)],
    toWeb: [Function (anonymous)],
    from: [Function (anonymous)]
  },
  Transform: [Function: Transform],
  PassThrough: [Function: PassThrough],
  addAbortSignal: [Function: addAbortSignal],
  finished: [Function: eos] {
    finished: [Function: finished],
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  },
  destroy: [Function: destroyer],
  pipeline: [Function: pipeline] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  },
  compose: [Function: compose],
  Stream: <ref *2> [Function: Stream] {
    isDisturbed: [Function: isDisturbed],
    isErrored: [Function: isErrored],
    isReadable: [Function: isReadable],
    Readable: [Circular *1],
    Writable: [Function: Writable] {
      WritableState: [Function: WritableState],
      fromWeb: [Function (anonymous)],
      toWeb: [Function (anonymous)]
    },
    Duplex: [Function: Duplex] {
      fromWeb: [Function (anonymous)],
      toWeb: [Function (anonymous)],
      from: [Function (anonymous)]
    },
    Transform: [Function: Transform],
    PassThrough: [Function: PassThrough],
    pipeline: [Function: pipeline] {
      [Symbol(nodejs.util.promisify.custom)]: [Getter]
    },
    addAbortSignal: [Function: addAbortSignal],
    finished: [Function: eos] {
      finished: [Function: finished],
      [Symbol(nodejs.util.promisify.custom)]: [Getter]
    },
    destroy: [Function: destroyer],
    compose: [Function: compose],
    promises: [Getter],
    Stream: [Circular *2],
    _isUint8Array: [Function: isUint8Array],
    _uint8ArrayToBuffer: [Function: _uint8ArrayToBuffer]
  },
  default: [Circular *1]
}

cjihrig avatar Aug 31 '22 17:08 cjihrig

This is done for historic reason. This module exports Readable, while require('stream') exports Stream. I don't like it either, but I didn't think we should break it in v4. Should we do another major and fix it?

You might just get away with some other variant of https://github.com/nodejs/readable-stream/blob/main/lib/ours/index.js#L33-L64.

mcollina avatar Aug 31 '22 21:08 mcollina

For my use case, it would be cleaner. Right now I'm just deleting the extra properties off of Readable.

Maybe something to consider in the next major release, but probably not worth artificially forcing a major release just for this.

cjihrig avatar Sep 01 '22 16:09 cjihrig

Would you mind sending a PR? At least we won't forget when we bump the major next year.

mcollina avatar Sep 02 '22 08:09 mcollina