WebAssembly package registry client
Dependencies
just run # wasi.dev 経由で wasi:http@0.2.0 を ghcr.io から取得するデモjust # check + test
just check # 型チェック
just test # テスト実行 (27 tests)src/
├── types/ # 共通型定義・JSON パーサー・バリデーション
├── discovery/ # Well-Known レジストリ発見
├── oci/ # OCI Distribution クライアント
│ ├── auth # トークン認証
│ └── client # API クライアント本体
└── main/ # CLI デモ| 型 | 説明 |
|---|---|
| PackageName | namespace:name 形式のパッケージ名 |
| RegistryConfig | レジストリ発見結果 (OCI or Warg) |
| OciManifest | OCI Image Manifest v2 |
| OciDescriptor | Content descriptor (mediaType, size, digest) |
| WasmConfig | Wasm コンポーネントのメタデータ |
let config = @discovery.fetch_registry_config("wasi.dev")
// => OCI { registry: "ghcr.io", namespace_prefix: "webassembly/" }let pkg = @types.PackageName::parse("wasi:http").unwrap()
let client = @oci.OciClient::new("ghcr.io", "webassembly/", pkg)
let tags = client.list_tags(pkg) // タグ一覧
let manifest = client.get_manifest(pkg, "0.2.0") // マニフェスト
let config = client.get_wasm_config(pkg, "0.2.0") // Wasm メタデータ
let wasm = client.pull_wasm(pkg, "0.2.0") // Wasm バイナリ| 対策 | 説明 |
|---|---|
| SHA-256 ダイジェスト検証 | blob ダウンロード後に gmlewis/sha256 でハッシュ検証 |
| SSRF 防止 | リダイレクト先・realm URL を https + 非プライベート IP に制限 |
| 入力バリデーション | パッケージ名、ホスト名、ダイジェスト形式、OCI リファレンスを検証 |
| サイズ制限 | blob は 256MB 上限、ディスクリプタの宣言サイズとの一致を検証 |
| マニフェスト検証 | schemaVersion=2、mediaType の妥当性チェック |
| URL エンコード | トークン取得時のクエリパラメータをパーセントエンコード |
WebAssembly package registry client
Dependencies