proposal-realms

ECMAScript Proposal, specs, and reference implementation for Realms

Github stars Tracking Chart

ECMAScript spec proposal for Realms API

Status

Current Stage

This proposal is at stage 2 of the TC39 Process.

Champions

  • @dherman
  • @caridy
  • @erights

Spec Text

You can view the spec rendered as HTML.

Shim/Polyfill

A shim implementation of the Realm API can be found at https://github.com/Agoric/realms-shim, notice that this library is now deprecated.

Realms

History

  • worked on this during ES2015 time frame, so never went through stages process
  • got punted to later (rightly so!)
  • goal of this proposal: resume work on this, reassert committee interest via advancing to stage 2
  • original idea from @dherman: What are Realms?

Intuitions

  • sandbox
  • iframe without DOM
  • principled version of Node's 'vm' module
  • sync Worker

Use cases

  • security isolation (with synchronous but coarse-grained communication channel)
  • plugins (e.g., spreadsheet functions)
  • in-browser code editors
  • server-side rendering
  • testing/mocking (e.g., jsdom)
  • in-browser transpilation

Examples

Example: simple realm

let g = window; // outer global
let r = new Realm(); // root realm

let f = r.evaluate("(function() { return 17 })");

f() === 17 // true

Reflect.getPrototypeOf(f) === g.Function.prototype // false
Reflect.getPrototypeOf(f) === r.global.Function.prototype // true

Example: simple subclass

class EmptyRealm extends Realm {
  constructor(...args) {
    super(...args);
    let global = this.global;

    // delete global descriptors:
    delete global.Math;
    ...
  }
}

Example: DOM mocking

class FakeWindow extends Realm {
  constructor(...args) {
    super(...args);
    let global = this.global;

    global.document = new FakeDocument(...);
    global.alert = new Proxy(fakeAlert, { ... });
    ...
  }
}

API (TypeScript Format)

interface RealmInit {
    thisValue?: object;
}

interface Realm {
    readonly global: typeof globalThis;
    readonly thisValue: typeof globalThis, object;
    evaluate(sourceText: string): any;
    intrinsics(): Record<string, any>;
}

declare var Realm: {
    prototype: Realm;
    new(options?: RealmInit): Realm;
};

Presentations

Contributing

Updating the spec text for this proposal

The source for the spec text is located in spec/index.emu and it is written in
ecmarkup language.

When modifying the spec text, you should be able to build the HTML version in
index.html by using the following command:

npm install
npm run build
open index.html

Alternative, you can use npm run watch.

Main metrics

Overview
Name With Ownertc39/proposal-shadowrealm
Primary LanguageHTML
Program languageHTML (Language Count: 1)
Platform
License:
所有者活动
Created At2016-04-14 15:26:14
Pushed At2025-02-10 20:52:02
Last Commit At
Release Count0
用户参与
Stargazers Count1.5k
Watchers Count92
Fork Count67
Commits Count451
Has Issues Enabled
Issues Count220
Issue Open Count18
Pull Requests Count170
Pull Requests Open Count2
Pull Requests Close Count20
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private