Skip to content

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

Open
@Renegade334

Description

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

Assignees

No one assigned

    Labels

    streamIssues and PRs related to the stream subsystem.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions