@masknet/compartment
WARNING: This package currently does not follow the Semantic Versioning because the original standard is still developing. The minor version might include breaking changes!
This package implements a user-land Virtual Module Source evaluator.
This package currently implements the following specs/API explainers:
Assumptions and runtime requirements
- The environment is already
lockdown()
by ses. - Dynamic code execution (
eval
and Function
) is not possible. - Code executed are either trusted or precompiled into a Virtual Module Source by a compiler like @masknet/static-module-record-swc.
- ECMAScript 2022 syntax is available.
APIs
ModuleSource
constructor
Implements ModuleSource
from layer 0 and layer 1 of the compartment proposal.
This constructor always throws like it is in an environment that cannot use eval.
new ModuleSource()
Module
constructor
Implements Module
from layer 0 and layer-2 of the compartment proposal.
import { Module, imports, type VirtualModuleRecord } from '@masknet/compartment'
const virtualModule: VirtualModuleRecord = {
execute(environment, context) {
console.log('module constructed!')
},
}
const module = new Module(virtualModule, import.meta.url, () => null)
const moduleNamespace = await imports(module)
imports
function
This function is a user-land dynamic import that accepts Module
instances.
This function does not accept strings as dynamic import does.
Evaluators
constructor
This constructor implements Evaluators
from layer 3 of the compartment proposal.
import { Evaluators, Module, imports, type VirtualModuleRecord } from '@masknet/compartment'
const globalThis = { answer: 42 }
const evaluators = new Evaluators({ globalThis })
const virtualModule: VirtualModuleRecord = {
bindings: [{ export: 'x' }],
execute(environment, { globalThis }) {
environment.x = globalThis.answer
},
}
const module = new evaluators.Module(virtualModule, import.meta.url, () => null)
const moduleNamespace = await imports(module)
moduleNamespace.x
makeGlobalThis
function
This function is a utility function that creates a new object that contains only items from the ECMAScript specification.
Those items are from the current realm, therefore sharing them with the Evaluators without lockdown() might bring serious problems.
import { makeGlobalThis } from '@masknet/compartment'
const globalThis = makeGlobalThis()
globalThis.Array