Skip to content

ActionManager

Defined in: packages/client/src/lib/command-processor/action-manager.ts:55

ActionManager handles action execution for vessel instances.

Components register typed action runners per instance to handle actions. Actions are executed:

  • In parallel across different instances
  • Sequentially within the same instance (respects executionPlan order)

The manager includes a waitForReady mechanism to handle race conditions where the server sends actions before components have registered their runners.

const store = new Store(createInitialState());
const actionManager = new ActionManager();
// Register typed action handlers for a specific instance
actionManager.registerRunner('instance-1', {
selectOrder: async (params) => {
// params is fully typed based on vessel definition
setSelectedOrderId(params.orderId);
return ok(undefined);
},
closeOrderDetails: async () => {
setSelectedOrderId(null);
return ok(undefined);
},
});
// Execute actions from a server response
const result = await actionManager.executeActions(response.executionPlan);
console.log(`Executed ${result.actions.length} actions`);

new ActionManager(options?): ActionManager

Defined in: packages/client/src/lib/command-processor/action-manager.ts:63

number

Logger

number

ActionManager

dispose(): void

Defined in: packages/client/src/lib/command-processor/action-manager.ts:302

Release the manager: cancel every pending readiness wait so no timer outlives disposal, and settle its waiters as not-ready.

Waiters resolve false rather than rejecting so an in-flight executeActions still returns its actions as skipped instead of surfacing a rejection its callers do not expect. A disposed manager stays silent and never schedules another readiness timer.

void


executeActions(executionPlan): Promise<BatchExecutionResult>

Defined in: packages/client/src/lib/command-processor/action-manager.ts:215

Execute all actions in the execution plan.

Actions are grouped by instance and executed:

  • In parallel across different instances
  • Sequentially within the same instance (respects executionPlan order)

Waits for runners to be ready before executing. Actions are skipped if no runner is registered within the timeout.

readonly ActionExecution[]

Array of actions to execute

Promise<BatchExecutionResult>

Result of the batch execution


getRegisteredInstances(): InstanceId[]

Defined in: packages/client/src/lib/command-processor/action-manager.ts:134

Get all registered instance IDs.

InstanceId[]

Array of instance IDs with registered runners


hasRunner(instanceId): boolean

Defined in: packages/client/src/lib/command-processor/action-manager.ts:125

Check if a runner is registered for an instance.

InstanceId

The branded instance ID to check

boolean

true if a runner is registered


registerRunner<V>(instanceId, runner): Unsubscribe

Defined in: packages/client/src/lib/command-processor/action-manager.ts:89

Register an action runner for a specific instance. The runner is an object with typed action handlers.

V extends VesselDefinition

InstanceId

The branded instance ID this runner handles

ActionRunner<V>

Object with action name -> handler function mapping

Unsubscribe

actionManager.registerRunner(InstanceId('instance-1'), {
selectOrder: async (params) => {
setSelectedOrderId(params.orderId);
return ok(undefined);
},
});

waitForReady(instanceId, timeoutMs?): Promise<boolean>

Defined in: packages/client/src/lib/command-processor/action-manager.ts:156

Wait for a runner to be registered for an instance. This handles the race condition where the server sends actions before React components have mounted and registered their runners.

InstanceId

The branded instance ID to wait for

number = 5000

Maximum time to wait (default: 5000ms)

Promise<boolean>

Promise that resolves to true if runner registered, false if the wait timed out or the manager was disposed

const isReady = await actionManager.waitForReady(InstanceId('instance-1'), 3000);
if (isReady) {
// Runner is available, actions can execute
}