oci_wasm

WebAssembly package registry client

wasm
oci
registry
moon add mizchi/oci_wasm@0.5.0
Download zip
Author
Version
0.5.0
License
Apache-2.0
Last updated
6 months ago
Downloads
64K

Dependencies

README

#warg

WebAssembly パッケージレジストリの OCI Distribution クライアント。MoonBit で実装。

wasi.dev / wa.dev 等の wasm-pkg レジストリから Wasm コンポーネントを取得できる。

#Features

  • Registry Discovery: /.well-known/wasm-pkg/registry.json による自動レジストリ検出 (OCI / Warg)
  • OCI Distribution Client: ghcr.io 等の OCI レジストリから Wasm バイナリを pull
    • Bearer トークン認証 (WWW-Authenticate パース)
    • タグ一覧 / マニフェスト取得 / blob ダウンロード
    • Wasm Config (コンポーネントメタデータ) 取得
  • Security: SHA-256 ダイジェスト検証、SSRF 防止、入力バリデーション、サイズ制限

#Quick Start

just run # wasi.dev 経由で wasi:http@0.2.0 を ghcr.io から取得するデモ

just # check + test just check # 型チェック just test # テスト実行 (27 tests)

#Architecture

src/ ├── types/ # 共通型定義・JSON パーサー・バリデーション ├── discovery/ # Well-Known レジストリ発見 ├── oci/ # OCI Distribution クライアント │ ├── auth # トークン認証 │ └── client # API クライアント本体 └── main/ # CLI デモ

#types

パッケージ名 (wasi:http)、OCI マニフェスト、ディスクリプタ、Wasm Config 等の型定義と JSON パーサー。入力バリデーション関数を含む。

説明
PackageNamenamespace:name 形式のパッケージ名
RegistryConfigレジストリ発見結果 (OCI or Warg)
OciManifestOCI Image Manifest v2
OciDescriptorContent descriptor (mediaType, size, digest)
WasmConfigWasm コンポーネントのメタデータ

#discovery

ホスト名から https://{host}/.well-known/wasm-pkg/registry.json を取得し、OCI / Warg どちらのプロトコルを使うかを判定する。

let config = @discovery.fetch_registry_config("wasi.dev")
// => OCI { registry: "ghcr.io", namespace_prefix: "webassembly/" }

#oci

OCI Distribution Spec 準拠の読み取り専用クライアント。

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 バイナリ

パッケージ名 → OCI リファレンス変換: wasi:http@0.2.0ghcr.io/webassembly/wasi/http:0.2.0

#Security

対策説明
SHA-256 ダイジェスト検証blob ダウンロード後に gmlewis/sha256 でハッシュ検証
SSRF 防止リダイレクト先・realm URL を https + 非プライベート IP に制限
入力バリデーションパッケージ名、ホスト名、ダイジェスト形式、OCI リファレンスを検証
サイズ制限blob は 256MB 上限、ディスクリプタの宣言サイズとの一致を検証
マニフェスト検証schemaVersion=2、mediaType の妥当性チェック
URL エンコードトークン取得時のクエリパラメータをパーセントエンコード

#Dependencies

#Target

native のみ (moonbitlang/async/http が native target 専用のため)

#License

Apache-2.0