WebAssembly Runtime
WASM-среда выполнения является экспериментальным расширением. Конфигурация стабильна, но внутренние компоненты среды могут меняться между релизами.
Wippy запускает модули WebAssembly как полноценные записи реестра наравне с Lua-кодом. Функции и процессы WASM выполняются в том же планировщике, используют ту же модель безопасности и взаимодействуют с Lua через реестр функций.
Виды записей
| Kind | Описание |
|---|---|
function.wat |
Встроенная функция в формате WebAssembly Text, определенная в YAML |
function.wasm |
Предкомпилированный WASM-бинарник, загружаемый из записи файловой системы |
process.wasm |
WASM-бинарник, выполняемый как процесс (CLI-команды или долгоживущие процессы) |
Как это работает
- WASM-модули объявляются как записи реестра в
_index.yaml - При загрузке модули компилируются и помещаются в пулы воркеров
- Lua (или другой WASM) код вызывает их через
funcs.call() - Аргументы и возвращаемые значения автоматически преобразуются между Lua-таблицами и WIT-типами
- Асинхронные операции (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 и т.д.), ограничивая поверхность доступа модуля.
См. также
- Функции - Конфигурация записей функций WASM
- Хост-функции - Доступные хост-интерфейсы WASI и Wippy
- Процессы - Запуск WASM как долгоживущих процессов