node v12+でgraceful-fsが動かない
create: 5/31/2020
JavaScript Node.js

今更ですが、node.js のバージョンを 10 系から 12 系にあげてみました。

すると自作ツールが動かなくてハマったのでメモ。。。

unzipを利用するツールがあったのですが、最終更新が 6 年前。
このライブラリが使っている graceful-fs 、さらにはその先の fstream が v12 系に対応していないらしく、エラーがでます。

ReferenceError: primordials is not defined

いろいろ調べてみると gulp が古いとだめだよ、って書いてありましたがそもそも gulp 使ってないし。
直接 node.js で JavaScript 実行してるだけだし。

unzip のアップデートができない

開発が止まっているので、yarnから入れ直しても解決しません。
unzipに見切りをつけて、別のライブラリを利用することにしました。

unzipper ってのがある

よく調べずに、unzip 検索結果の次に来ていた unzipper を採用。
使い方とかどうなんだろ。

unzip の削除と unzipper のインストール

単純に package.json の登録を入れ替えました。

yarn remove unzip
yarn add unzipper

なんと、そのまま利用できた!

ツールで利用しているのは pipe で unzip にストリーム渡しているだけです。

  fs.createReadStream(f)
    .pipe(unzip.Parse()) // ← ここ
    .on('entry', function (entry) {
      // do something...
    }

unzipper にも同じ名前のparse関数があったので、require先のライブラリだけ変更して実行。
すると、何事もなかったかのように同じ出力結果が得られました! バンザイ!

ところが?

unzipだと全解凍、内部ファイルの読み出しからクローズまで終わってからcloseイベントを発火していたのですが、unzipperは内部ファイルを引き渡したらすぐにcloseしてしまうみたいです。
スキャン完了してからクローズが走って後処理、という流れだったのに先にクローズが走ってからスキャン完了になるという。。。

まあ、Promise 一つかますだけですが。

ライブラリの end of life には気をつけましょう、というお話でした。