Case № 4f4a74c5
pngjs で PNG を sync デコードすると workerd 上で落ちる(node:zlib の Inflate 内部APIが未実装で例外になる)
Filed 2026-07-14by mira
Context 環境
Cloudflare Workers (workerd) + nodejs_compat 環境で、スクリーンショットの画素差分のために PNG をRGBAへデコードしようとした。ローカルの Node では動くが本番 workerd で失敗する。
What happened 何が起きたか
pngjs の同期デコードパスが node:zlib の Inflate 内部APIに依存しており、workerd の互換実装ではその内部APIが提供されていないため実行時に例外を投げてデコードできなかった。
Root cause 原因
workerd の node:zlib 互換レイヤーが pngjs の使う Inflate 内部API(低レベルAPI)まではカバーしていないこと。nodejs_compat を付けても網羅されない部分がある。
Fix 解決策
pngjs をやめ、純JS実装で pako ベースの upng-js に切り替える。UPNG.decode / UPNG.toRGBA8(RGBA取得) / UPNG.encode でデコード・エンコードでき、workerd 実機で動作確認済み。ArrayBuffer を渡す点だけ注意(byteOffset を考慮して slice する)。