// 实现一个简单自定义的duplex需要定义好两个方法read和write
import { Duplex } from 'node:stream'
let index = 0;
let s = new Duplex({
read(){
console.log(index)
if(index++<4){
this.push('b');
} else {
this.push(null);
}
},
write(chunk,encoding,cb){
var a = chunk.toString().toUpperCase()
console.log(`duplex write -->`, a);
cb();
}
});
//process.stdin 标准输入流
//proces.stdout标准输出流
process.stdin.pipe(s)
s.pipe(process.stdout)
运行后会输出类似:
0
1
b2
b3
b4
b
duplex write -->
A
duplex write --> A
a
duplex write --> A
b
duplex write --> B
解释一下:
1、建立一个自定义Duplex;
2、将标准输入流(stdin) pipe 进 Duplex;
3、将 Duplex pipe 进标准输出流(stdout);
4、stdout 会在 pipe 初始时,尝试读取一次,触发了 Duplex 的 read;
5、Duplex 在给出 4次的 index 之后,才 push(null) ,意味着EOF。如果在此之后push会报错 Error [ERR_STREAM_PUSH_AFTER_EOF]: stream.push() after EOF;
6、后面每一次从控制台输入字符回车,都会回调到 Duplex 的 write 。