Metavm — песочницы V8
Обёртка над Node.js модулем
vmдля создания изолированных V8-контекстов. Базис sandbox-изоляции в Impress.
Что делает
Загружает JS-файл в отдельный V8-контекст (vm.createContext), не загрязняя глобальный неймспейс процесса.
const metavm = require('metavm');
const script = await metavm.readScript('./userCode.js', {
context: { console, lib, db },
sandbox: { /* whitelist глобалок */ },
});
const result = script.exports; // что код экспортировал
Зачем sandbox
- Изоляция — код одного приложения не видит другие.
- Безопасность — пользовательский код (low-code) не лезет в файловую систему.
- Hot reload — заменили sandbox → загрузили новую версию кода.
- Утечки — пересоздать sandbox без рестарта процесса.
Что в context
В sandbox можно прокинуть только то, что разрешено:
- Стандартные модули Node.js (
fs,crypto) — выборочно. - Библиотеки приложения.
- Утилиты Metarhia.
Всё остальное — недоступно из sandbox.
Metavm для браузера
В планах был metavm-портабельный — чтобы тот же подход работал в браузере (через ShadowRealm или Worker isolation). Обсуждалось в летней школе 2022.
Кейс: Impress
Impress на старте читает все файлы приложения, для каждой папки (api/, domain/, lib/) создаёт sandbox с настроенным context. Это и есть «контейнеризация приложений в одном процессе».
🎓 Источники
- 🎓 Архив 2018 — Песочницы V8 sandbox в Node.js · 2020-01-17
- 🎓 Летняя школа 2022 #19 — metavm для браузера · 2022-08-24