转换流,合并/合并可读写流

时间:2019-12-29 17:54:32

标签: javascript stream transform duplex

我在节点的转换流中苦苦挣扎。

我有2个流,分别是流1和流2。都是双流。

现在,当我写入“ Stream 2”时,我需要转换传递的数据。 例如,假设我想包装一个字符串##。反之亦然:流1: 当我向“ Stream 1”写入内容时,应将字符串中的#替换为空。

Stream 1  |     | Transform  |       | Stream 2
--------------------------------------------------
[device]  | --> |  [decode]  |  -->  |  [output]
[device]  | <-- |  [encode]  |  <--  |  [input]

下面的转换代码按预期方式工作。

const stream = require("stream");


const encode = new stream.Transform({
transform: (data, encoding, done) => {

    // feedback
    console.log("[encode] called");

    // pass transformed data back
    // err = not connected message ?!
    done(null, `#${data}#`);

}
});


const decode = new stream.Transform({
transform: (data, encoding, done) => {

    // feedback
    console.log("[decode] called");

    // pass transformed data back
    // err = not connected message ?!
    done(null, data.toString().replace(/#/g, ""));

}
});




const device = new stream.PassThrough();
const adapter = new stream.PassThrough();


device.pipe(decode).pipe(process.stdout);
adapter.pipe(encode).pipe(process.stdout);


adapter.write("Test");
process.stdout.write("\n")
device.write("#Test#");

我遇到的困难是,如何将两个转换流都包装为一个双工流?

这会创建一个循环,因为我将解码后的数据写回到了管道编码器流中

function f(uplink) {

    const wrapper = new stream.PassThrough();


    wrapper.pipe(encode).pipe(uplink);
    uplink.pipe(decode).pipe(wrapper);


    return wrapper;

}




const device = new stream.PassThrough();
//const adapter = new stream.PassThrough();



const adapter = f(device);



adapter.write("Test");
process.stdout.write("\n")
device.write("#Test#");

我应该使用独立的可写/可读流吗? 但是话又说回来,我如何将它们合并/合并为单个双工流?

0 个答案:

没有答案