Skip to content

stream: readable.compose fails to return a Duplex #55203

Description

@Renegade334

The intention of readable.compose() is that the method returns the Duplex from the internals/streams/compose function unscathed.

Unfortunately, because it's merged onto Readable.prototype as a "stream-returning operator":

node/lib/stream.js

Lines 64 to 83 in 8a3482e

const streamKeys = ObjectKeys(streamReturningOperators);
for (let i = 0; i < streamKeys.length; i++) {
const key = streamKeys[i];
const op = streamReturningOperators[key];
function fn(...args) {
if (new.target) {
throw new ERR_ILLEGAL_CONSTRUCTOR();
}
return Stream.Readable.from(ReflectApply(op, this, args));
}
ObjectDefineProperty(fn, 'name', { __proto__: null, value: op.name });
ObjectDefineProperty(fn, 'length', { __proto__: null, value: op.length });
ObjectDefineProperty(Stream.Readable.prototype, key, {
__proto__: null,
value: fn,
enumerable: false,
configurable: true,
writable: true,
});
}

...its return value is passed via Readable.from(), clobbering the Duplex into a Readable.

The .compose() operator needs specifically to bypass this mechanism.

Refs: #44937

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

    Labels

    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