Deno で使う .wasm 入りパッケージをアップデートした

年初の記事として、メンテが滞っているモジュールのメンテをするというのがあった。
記事では1モジュールだけ挙げたが、そういったモジュールを2つ持っていた。

そのうち1つをメンテし、約4年ぶりでアップデートしてJSRで公開したので記録がてら書いておく。

参考

更新の結果

リポジトリはこちら。
https://github.com/Octo8080/deno-csrf

更新前は、deno.land/x で公開していた。

https://deno.land/x/deno_csrf@0.0.5

更新後は、JSRで公開している。

https://jsr.io/@octo/wasm-csrf

(Score が低いのは追々対応する。)

4年ぶりの更新でやったこと

以下実施したことを纏める。
端的に書くと、丸っと変わっている。

差分

大きな要素としては以下要素。

  • Rust をletest -> 1.84.0 に固定して変更
  • Deno をコンテナから使うのを辞める
  • wasm-bindgen を 0.2.74 -> 0.2.100 に変更
  • csrf ライブラリを 0.4.0 -> 0.4.2 に変更
    • その他上げられるモジュールをまとめて更新
  • wasmをjsに文字列化して埋め込むのをやめる

以下感じたことなどをまとめる。

4年も経ったら、お作法が結構変わっていた

4年前の作成時は、wasm-bindgen を入り口にしてwasmを作っていた記憶がある。
現在ではwasm-pack のテンプレートとして、wasm-pack-template があり、それが wasm-bindgen を使っている。
という状況であるようだった。
(Rustとwasmに詳しい人からは誤りとされる可能性有り。)

テンプレートにテストコードのボイラープレートも有り、これは4年前には無かった記憶。

また、以前はwasmを含んだJSを埋め込むことをするのに js_with_embedded_wasmを使っていた。
wasm ファイルをimportできるようになったことや、JSRがwasmを配信してくれることで、不要になった。

現在生成されるコードは次のようになる。

1
2
3
4
5
import * as wasm from "./csrf_wasm_bg.wasm";
export * from "./csrf_wasm_bg.js";
import { __wbg_set_wasm } from "./csrf_wasm_bg.js";
__wbg_set_wasm(wasm);
wasm.__wbindgen_start();

以前は、以下のように生成されていた。

1
2
3
4
5
const file = new URL(import.meta.url).pathname;
const wasmFile = file.substring(0, file.lastIndexOf(Deno.build.os === 'windows' ? '\\' : '/') + 1) + 'csrf_wasm_bg.wasm';
const wasmModule = new WebAssembly.Module(Deno.readFileSync(wasmFile));
const wasmInstance = new WebAssembly.Instance(wasmModule, imports);
const wasm = wasmInstance.exports;

この形は配信基盤とは使い勝手が悪いので、変換して以下のようにしていた。

1
2
3
4
5
6
7
const wasmCode = new Uint8Array([
0,97,115,109,1,0,0,0,1,186,
03,101,110,6,48,46,50,46,55,52 // すごく長い
]);// wasm を文字列化したもの
const wasmModule = new WebAssembly.Module(wasmCode);
const wasmInstance = new WebAssembly.Instance(wasmModule, imports);
const wasm = wasmInstance.exports

この変化が大きくて、以前は有ったローカルファイルへのアクセス権を求めることもせずに、一般的なimportで処理できる。

4年も経ったら、Deno側も変わってた

以前は、テスト対象のそばにテストを書くような風潮/潮流が有ったと記憶しているが、今はそうでもない。
hoge.test.tsに分割する形態を取る。
また、READMEには使い方を記述するが、以前なら実行するのに別途検証を要した。
今なら deno test --doc でREADME.md に書かれたコードブロックを実行してくれる。
便利すぎる。

もちろんランタイム側が wasm のimport に対応したのも大きい。


というわけで、Rustで作ったwasmを含むモジュールを更新した。

機能周り実装状況をまとめてきたが、加えて名前も今回変えている。
以前は deno-wasm という名称で公開していたが、wasm-csrf に変更した。
4年の中で、deno-で公開することに、「自分がDenoの何かを代表するわけでもないしな」と居心地が悪くなったためである。
風呂敷広すぎな名前だったので反省している。
安易なことをするものではない。
実装もパッケージも、名前は大事である。
最近公開したモジュールは頭悩ませ何か名前つけてきたが、wasm-csrf位しか考え付かず、今回ばかりは仕方がなかった。

では。