Messaging
js/realm/realm-messaging.md
Every Realm exposes a stable parent-side realm.port. Scheduler reactors use a
transit-backed ThreadPort; process-isolated realms use ProcessPort. Both
provide addEventListener, postMessage, start, close, and onmessage.
const realm = new Realm({ entry: './worker.ts' });
realm.port.onmessage = (event) => console.log(event.data);
realm.port.postMessage({ type: 'ping' });
Inside a scheduled or process-isolated realm, the runtime exposes the matching
endpoint as globalThis.realmPort:
globalThis.realmPort.onmessage = (event) => {
globalThis.realmPort.postMessage({ echo: event.data });
};
The public port identity remains stable when an idle realm is rehydrated or a watch reload replaces its isolate.
ArrayBuffer transfer is supported by reactor ports. Process transport copies
buffers and does not support live MessagePort transfer. Unsupported values
such as functions, symbols, and weak collections throw DataCloneError.
BroadcastChannel provides named one-to-many delivery across local realms and
process realms. It does not accept transfer lists. Close channels when they are
no longer needed.