node-fetch use on unzipper


Unzipperでrequestを使うかnode-fetchを使うかという問題

経緯

unzipperのopenメソッドを使う場合にrequestを要求される課題がある。
requestに限っているわけではないものの、node-fetchを入れることはできない。
node-fetchを入れても稼働するPRを送って今後改良を追っていくほど余裕はないので
既存のunzipper提供機能の範疇でなんとか使う方法を考えた

課題

次の3つの課題があった。
ECONNRESETがそこそこ頻発する
requestがdeprecatedになって2年が経過している。
制作物の都合上、requestを用いる限りネストが解消されない部分がある

やりたいこと

zipをダウンロードして展開する

deprecateになってしまっているrequestを利用せず、documentにnode-fetchを用いる方法が記載されていないが、bufferを用いる方法は記載されていたため、
bufferを用いたnode-fetchでの代用を試みた。

requestを用いる

    const directoryFromRequest = await unzipper.Open.url( request, zipURL);

node-fetchを用いる

    const fetchZip = await fetch( zipURL )
    const zipBuffer = await res.buffer()
    const directoryFromBuffer = await unzipper.Open.buffer( zipBuffer );

効果

処理速度が1.3倍くらい体感で高速化した。
node-fetchを用いる事により、そこそこ頻発していたECONNRESETは解消した。
asyncによるネストが1段減少した。
ESModuleが使えるようになった。

参考

unzipper https://www.npmjs.com/package/unzipper
request https://www.npmjs.com/package/request
node-fetch https://www.npmjs.com/package/node-fetch

パッケージの責務ではない

今現在、世界中の多くのプロジェクトで使われているrequestの功績は非常に大きく、
ネット上の多くのサンプルも、依存パッケージもrequestを参照していることは多い。

初めて使うパッケージのサンプルにrequestが使われていることがあり、
今回のプロジェクト(2021開始のプロジェクト)でも使ってしまっていた。

開発者に限った話では全くないのだが、何にしても
お前作れるのか?ということを全発言の前頭に置かなければならない。
そうでなければお猿さん♪でしょうか? 11年間も使わせてもらってきた感謝は大きい。