简单多路复用 node.js 流 - 块连接问题

Simple multiplexing node.js stream - chunk concatenated issue

我正在尝试实现一个简单的 node.js 流 multiplexer/demultiplexer。

目前,在实现多路复用机制时,我注意到多路复用器的输出被连接成一个块。

const { PassThrough, Transform } = require("stream");

class Mux extends PassThrough {

    constructor(options) {
        super(options);
    }

    input(id, options) {

        let encode = new Transform({
            transform(chunk, encoding, cb) {

                let buf = Buffer.alloc(chunk.length + 1);
                buf.writeUInt8(id, 0);

                chunk.copy(buf, 1);

                cb(null, buf);

            },
            ...options
        });

        encode.pipe(this);

        return encode;

    };

};

const mux = new Mux();

mux.on("readable", () => {
    console.log("mux >", mux.read())
});

const in1 = mux.input(1);
const in2 = mux.input(2);


in1.write(Buffer.alloc(3).fill(255));
in2.write(Buffer.alloc(3).fill(127));

输出如下所示:mux > <Buffer 01 ff ff ff 02 7f 7f 7f>。 我本以为我会收到两个 console.log 输出。

预期输出:

mux > <Buffer 01 ff ff ff>

mux > <Buffer 02 7f 7f 7f>

有人可以解释为什么我只从两个输入中得到一个“可读”事件和一个串联的块吗?

使用 data 事件并从回调中读取:

The 'data' event is emitted whenever the stream is relinquishing ownership of a chunk of data to a consumer.

mux.on("data", d => {
    console.log("mux >", d)
});

这现在产生:

mux > <Buffer 01 ff ff ff>
mux > <Buffer 02 7f 7f 7f>

为什么 readable 只发出一次也解释了 in the docs:

The 'readable' event will also be emitted once the end of the stream data has been reached but before the 'end' event is emitted.

datareadable 表现不同。在您的情况下, readable 永远不会发出,直到到达流数据的末尾,一次 returns 所有数据。 data 在每个可用块上发出。