Skip to content

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

@Renegade334

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    streamIssues and PRs related to the stream subsystem.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions