Size / Priority
Rationale
Frontend state-machines (Redux, XState, Zustand) all reinvent actor patterns. actor-ts in the browser:
- Off-thread compute (Web Workers).
- Type-safe message passing.
- Backpressure via Worker IPC.
- Bridge to server cluster via WebSocket → use the same actor protocol.
Real win: one actor model for frontend + backend, with messages crossing the wire transparently.
Design sketch
// actor-ts/browser subpackage
// Spawn an actor in a Web Worker:
const system = createBrowserActorSystem();
const worker = system.actorOfWorker(import.meta.url, props);
// Bridge to server cluster:
const bridge = system.connectToCluster('wss://api.example.com/cluster');
const serverActor = await bridge.actorAt('/user/services/orders');
await serverActor.ask(new GetOrder('42'));
Implementation:
- Web Worker per dispatcher.
MessageChannel for IPC between Workers + main thread.
WebSocket for server-cluster bridge.
- Shared types via TypeScript project references.
Integration
Actor: same core; Worker is just a different mailbox-dispatcher.
RemoteActorRef: WebSocket-based remote.
- Cluster bridge: same WireMessage format.
Out of scope / non-goals
- Multi-Worker clustering — too much complexity.
- SharedArrayBuffer — out of scope.
Open design questions
- Worker per actor vs Worker per dispatcher: dispatcher (lower overhead).
- Serialisation: structuredClone for IPC; JSON/CBOR for WS.
- Bundle size: minimal core only.
Test plan
- Spawn actor in Web Worker; message exchange works.
- Cross-Worker tell.
- Bridge to server → ask server actor.
- Browser app reactive to server events.
- Bundle size ≤ 50KB.
Acceptance criteria
Pre-implementation checklist
Size / Priority
Rationale
Frontend state-machines (Redux, XState, Zustand) all reinvent actor patterns. actor-ts in the browser:
Real win: one actor model for frontend + backend, with messages crossing the wire transparently.
Design sketch
Implementation:
MessageChannelfor IPC between Workers + main thread.WebSocketfor server-cluster bridge.Integration
Actor: same core; Worker is just a different mailbox-dispatcher.RemoteActorRef: WebSocket-based remote.Out of scope / non-goals
Open design questions
Test plan
Acceptance criteria
actor-ts/browsersubpackage.Pre-implementation checklist