昨日こういう記事を書いた。
↑ではがんばってパイプラインが送るイベントを監視してPromiseでラップしていたけれど、実は公式にPromise版のAPIが提供されていた。
これを使うといい感じに入出力が終わったタイミングで完了するようなPromise
を返してくれる。
これまでは以下のように書いていたコードが・・・
const runStream = async (input: NodeJS.ReadableStream, output: NodeJS.WritableStream) => { const SEP = "\n\n"; const p = new Promise((resolve, reject) => { const stream = input.pipe(split(SEP)).pipe(tr).pipe(output); stream.on('finish', () => { console.log('done!'); resolve('ok'); }); input.on('error', (err) => { console.error(err); reject(err); }); stream.on('error', (err) => { console.error(err); reject(err); }); }); return await p; };
こう書けばよくなる。
import stp from 'stream/promises'; const runStream = async (input: NodeJS.ReadableStream, output: NodeJS.WritableStream) => { const SEP = "\n\n"; return await stp.pipeline(input, split(SEP), tr, output); };
.pipe
を使ってチェインさせるかわりに、pipeline
メソッドに渡すようにすればよい。これを利用するにはstream/promises
モジュールを利用する必要があるが、それ以外の部分は元のstream
ライブラリのものを使えばよい。
早く知っておきたかった〜