nodejs管道stdin进入zlib膨胀而不等待EOF

时间:2014-09-22 10:19:27

标签: node.js zlib

我无法从stdin(使用nodejs)实时解压缩数据流。 要求是一旦到达stdin就处理解压缩的流(最多几毫秒的延迟)。 问题是管道stdin到zlib接缝等待流关闭。

以下打印12345

$ echo 12345 | node deflate.js | node inflate.js
12345

但是以下命令行没有,因为它没有收到EOF:

$ node generator.js | node deflate.js | node inflate.js

这与zlib deflate是否可以在内部处理部分输入,或者是否应该添加到流中的问题(例如每个流块之前的块大小)有关。

deflate.js:

process.stdin
.pipe(require("zlib").createDeflate())
.pipe(process.stdout);

inflate.js

process.stdin
.pipe(require('zlib').createInflate())
.pipe(process.stdout)

generator.js:

var i = 0
setInterval(function () {
    process.stdout.write(i.toString())
    i++
},1000)

1 个答案:

答案 0 :(得分:1)

问题是没有设置Z_SYNC_FLUSH标志:

If flush is Z_SYNC_FLUSH, deflate() shall flush all pending output to next_out and align the output to a byte boundary. A synchronization point is generated in the output.

deflate.js:

var zlib = require("zlib");
var deflate = zlib.createDeflate({flush: zlib.Z_SYNC_FLUSH});
process.stdin.pipe(deflate).pipe(process.stdout);

inflate.js:

var zlib = require('zlib')
process.stdin
.pipe(zlib.createInflate({flush: zlib.Z_SYNC_FLUSH}))
.pipe(process.stdout)