WebAssembly Runtime
WebAssembly Runtime
Заголовок раздела «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 из Lua»Функции WASM вызываются так же, как любая другая функция в реестре:
local funcs = require("funcs")
-- No argumentslocal result, err = funcs.call("myns:answer_wat")
-- With argumentslocal result, err = funcs.call("myns:compute", 6, 7)
-- With complex datalocal 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 как долгоживущих процессов