WASM-плагины

WASM-плагины

0.4 NEW — Песочница для пользовательских плагинов на любом языке, который компилируется в WebAssembly (TinyGo, Rust, AssemblyScript, Zig). Один общий ABI для серверных балансеров и клиентских расширений Lampa.

WASM-плагины — следующий шаг после JS-модулей: автор пишет балансер на любимом языке, lampac-go компилирует и запускает его в wazero (без CGO), плагин получает только те права, которые ему явно выдали.

Зачем

Хочется JS-модули WASM-плагины
Писать на Go / Rust
Песочница (нельзя ходить куда попало) через timeout capability permissions
Хот-релоад без рестарта сервера
Один плагин работает и на сервере, и в Lampa ✓ (target: both)
Композиция (фильтр поверх балансеров) ✓ (target: middleware)
Маркетплейс с in-browser сборкой в планах WASM Studio ниже

Поддерживаемые языки

ABI язык-агностичный — любой язык с поддержкой wasi-snapshot-preview1 и wasm32-wasi target будет работать. Готовые SDK + sample-плагины:

Язык Тулчейн Размер echo-плагина sample
Go (TinyGo) tinygo 0.41+ 416 КБ wasm_modules/echo
Rust cargo + wasm32-wasip1 ~150 КБ release (порт echo на Rust готов; sample wasm-modules скоро)
C wasi-sdk 25+ (clang) 123 КБ wasm_modules/echo_c
AssemblyScript npx asc (Node 18+) 15 КБ wasm_modules/echo_as
Zig zig 0.13+ 12 КБ wasm_modules/echo_zig

Все 5 sample-плагинов проходят один и тот же round-trip тест (internal/wasmmodules/multilang_test.go) — это доказательство, что ABI работает идентично везде.

Quick start (1 минута)

  1. Установи tinygo (brew install tinygo через tinygo-org/tools).
  2. Открой http://<lampac-host>/wasm_studio.html.
  3. Жми ШаблонBuildInstallRun.

Готово — у тебя свой балансер на /lite/my_plugin.

Quick start (CLI)

cd lampac-go/wasm_modules/echo
make build              # tinygo build -o plugin.wasm -target wasi -no-debug ./
# fsnotify в lampac-go подхватит plugin.wasm автоматически — рестарт не нужен
curl 'http://localhost:9118/lite/echo?id=1'

Что встроено

  • wazero runtime (pure-Go, без CGO) — серверные плагины загружаются в reactor-mode, между вызовами держится одна инстанция.
  • Hot-reload через fsnotify — изменил plugin.wasm → lampac-go дёргает Scan через 300 мс debounce.
  • Telemetry — invocations, errors, p50/p95/p99 latency, cache hit rate, http traffic. Видны через Manager.Stats() или прометеевский endpoint.
  • Crash dumps — каждая ошибка handle() сохраняется в wasm_dumps/{id}/{ts}.json с последними 50 строк лога плагина.
  • Capability permissionspermissions: ["http:example.com", "cache"] в манифесте; всё остальное запрещено.
  • Middleware-цепочкиtarget: middleware + upstreams: ["collaps", "filmix"] → плагин получает уже собранные ответы и фильтрует их.
  • Client targettarget: client/both.wasm подгружается прямо в Lampa через wasm_loader.js.

Sample-плагины в репозитории

Плагин Target Что делает
echo server Демонстрирует все host-импорты (http_get, proxy_url, cache, log, config)
quality_filter middleware Дропает результаты ниже минимального качества (minQuality в config)
welcome_toast client Показывает Lampa.Noty.show один раз, ставит флаг в Lampa.Storage

Исходники — в wasm_modules/.