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

  1. Изоляция — код одного приложения не видит другие.
  2. Безопасность — пользовательский код (low-code) не лезет в файловую систему.
  3. Hot reload — заменили sandbox → загрузили новую версию кода.
  4. Утечки — пересоздать sandbox без рестарта процесса.

Что в context

В sandbox можно прокинуть только то, что разрешено:

  • Стандартные модули Node.js (fs, crypto) — выборочно.
  • Библиотеки приложения.
  • Утилиты Metarhia.

Всё остальное — недоступно из sandbox.

Metavm для браузера

В планах был metavm-портабельный — чтобы тот же подход работал в браузере (через ShadowRealm или Worker isolation). Обсуждалось в летней школе 2022.

Кейс: Impress

Impress на старте читает все файлы приложения, для каждой папки (api/, domain/, lib/) создаёт sandbox с настроенным context. Это и есть «контейнеризация приложений в одном процессе».

🎓 Источники

См. также