Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Node.jsのストリーミングAPIにPromise版が生えていた、こっち使うと便利そう

昨日こういう記事を書いた。

blog.3qe.us

↑ではがんばってパイプラインが送るイベントを監視してPromiseでラップしていたけれど、実は公式にPromise版のAPIが提供されていた。

nodejs.org

これを使うといい感じに入出力が終わったタイミングで完了するような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ライブラリのものを使えばよい。

早く知っておきたかった〜

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?