下面举例说明了一个双工流的简单示例,它封装了一个可以写入数据的假设的底层源对象,并且可以从中读取数据,尽管使用的是与 Node.js 流不兼容的 API。 下面举例了一个双工流的简单示例,它通过可读流接口读回可写流接口的 buffer 传入的写入数据。

    1. const { Duplex } = require('stream');
    2. const kSource = Symbol('source');
    3. class MyDuplex extends Duplex {
    4. constructor(source, options) {
    5. super(options);
    6. this[kSource] = source;
    7. }
    8. _write(chunk, encoding, callback) {
    9. // 底层资源只处理字符串。
    10. if (Buffer.isBuffer(chunk))
    11. chunk = chunk.toString();
    12. this[kSource].writeSomeData(chunk);
    13. callback();
    14. }
    15. _read(size) {
    16. this[kSource].fetchSomeData(size, (data, encoding) => {
    17. this.push(Buffer.from(data, encoding));
    18. });
    19. }
    20. }

    双工流最重要的方面是,可读端和可写端相互独立于彼此地共存在同一个对象实例中。