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 ниже |
Как устроен runtime, манифест, hot-reload, crash-dumps
Контракт между плагином и хостом — http, proxy, cache, log, storage
Балансер на Go (~410 КБ)
Тот же ABI на Rust (~150 КБ release)
TS-подобный синтаксис (~15 КБ)
Самые компактные .wasm (~12 КБ)
Single-header через wasi-sdk (~120 КБ)
Фильтры поверх существующих балансеров
WASM в Lampa: Storage, Activity, Listener, Noty
Monaco-редактор: пиши, собирай, ставь — всё из админки
Capability-based allowlist для http / cache / proxy
Поддерживаемые языки
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 минута)
- Установи
tinygo(brew install tinygoчерезtinygo-org/tools). - Открой
http://<lampac-host>/wasm_studio.html. - Жми Шаблон → Build → Install → Run.
Готово — у тебя свой балансер на /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 permissions —
permissions: ["http:example.com", "cache"]в манифесте; всё остальное запрещено. - Middleware-цепочки —
target: middleware+upstreams: ["collaps", "filmix"]→ плагин получает уже собранные ответы и фильтрует их. - Client target —
target: 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/.