WebAssembly Runtime

WASM-среда выполнения является экспериментальным расширением. Конфигурация стабильна, но внутренние компоненты среды могут меняться между релизами.

Wippy запускает модули WebAssembly как полноценные записи реестра наравне с Lua-кодом. Функции и процессы WASM выполняются в том же планировщике, используют ту же модель безопасности и взаимодействуют с Lua через реестр функций.

Виды записей

Kind Описание
function.wat Встроенная функция в формате WebAssembly Text, определенная в YAML
function.wasm Предкомпилированный WASM-бинарник, загружаемый из записи файловой системы
process.wasm WASM-бинарник, выполняемый как процесс (CLI-команды или долгоживущие процессы)

Как это работает

  1. WASM-модули объявляются как записи реестра в _index.yaml
  2. При загрузке модули компилируются и помещаются в пулы воркеров
  3. Lua (или другой WASM) код вызывает их через funcs.call()
  4. Аргументы и возвращаемые значения автоматически преобразуются между Lua-таблицами и WIT-типами
  5. Асинхронные операции (I/O, sleep, HTTP) передают управление через диспетчер, так же как Lua

Компонентная модель

Wippy поддерживает компонентную модель WebAssembly с WIT (WebAssembly Interface Types). Компонентные модули получают полное преобразование типов между хостом и гостем:

  • Records преобразуются в Lua-таблицы с именованными полями
  • Lists преобразуются в Lua-массивы
  • Results преобразуются в кортежи возврата (value, error)
  • Примитивы (s32, f64, string и т.д.) преобразуются напрямую

Также поддерживаются raw/core WASM-модули с явными WIT-сигнатурами.

Вызов WASM из Lua

Функции WASM вызываются так же, как любая другая функция в реестре:

local funcs = require("funcs")

-- No arguments
local result, err = funcs.call("myns:answer_wat")

-- With arguments
local result, err = funcs.call("myns:compute", 6, 7)

-- With complex data
local users = {
    {id = 1, name = "Alice", tags = {"admin"}, active = true},
    {id = 2, name = "Bob", tags = {"user"}, active = false},
}
local transformed, err = funcs.call("myns:transform_users", users)

Безопасность

Выполнение WASM по умолчанию наследует контекст безопасности вызывающего:

  • Идентичность актора наследуется
  • Область видимости наследуется
  • Контекст запроса наследуется

Хост-возможности подключаются явно через импорты. Каждая запись объявляет, какие именно WASI-интерфейсы ей нужны (wasi:cli, wasi:filesystem и т.д.), ограничивая поверхность доступа модуля.

См. также