Skip to content

Actors

An Actor is one running state machine. It owns the current state, mutable context, registered transitions and effects, clock, and child actors.

States, events, and effects are declarations until an Actor runs them.

import { checkout } from "../checkout.ts";
// `checkout` is the canonical multi-step checkout machine (see ./checkout.ts):
//
// basicInfo -> shippingAddress -> payment -> submitting -> success (final)
// ^ (back) v v (back)
// error
basicInfo -> shippingAddress -> payment -> submitting -> success
^ (back) v v (back)
error
checkout.send(submitBasicInfo.create({ email: "a@b.com", name: "A" }));
checkout.snapshot().path[0]; // "payment"
matches(checkout, "payment"); // from @mantaq/sugar
const unsub = checkout.on("change", (snap) => {
/* ... */
});
// unsub() to stop

Fires immediately with current snapshot, then on every state or context change.

await checkout.settled();

Waits for internal events to drain and pending effects to finish.

checkout.snapshot();
// { path: ["payment"], context: {...}, regions: {} }
OptionTypeWhat
inputsEventRef[]External events accepted
outputsEventRef[]Events to parent
internalEventRef[]Events from effects/transitions
statesStateRef[]All states
initialStateRef or { state, payload? }Start state
contextActorContextInitial context
clockClockDefault: RealClock
setup(m: ActorBuilder) => voidRegister transitions and effects
regionsRecord<string, AnyActor>Static children
internalBudgetnumberMax internal events (default: 10000)
MethodWhat
m.on(state, event, fn)Transition handler for one state/event pair
m.onAny(event, fn)Handler for an event in every state
m.effect(state, { name, fn })Run fn on state entry; name is required

Handlers return { state } (with optional payload or emit) to transition, or {} to stay put.