xstate 5.0.0-beta.37 → 5.0.0-beta.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/actions/dist/xstate-actions.cjs.js +4 -3
  2. package/actions/dist/xstate-actions.cjs.mjs +1 -0
  3. package/actions/dist/xstate-actions.development.cjs.js +4 -3
  4. package/actions/dist/xstate-actions.development.cjs.mjs +1 -0
  5. package/actions/dist/xstate-actions.development.esm.js +3 -3
  6. package/actions/dist/xstate-actions.esm.js +3 -3
  7. package/actions/dist/xstate-actions.umd.min.js +1 -1
  8. package/actions/dist/xstate-actions.umd.min.js.map +1 -1
  9. package/actors/dist/xstate-actors.cjs.js +60 -3
  10. package/actors/dist/xstate-actors.development.cjs.js +60 -3
  11. package/actors/dist/xstate-actors.development.esm.js +60 -3
  12. package/actors/dist/xstate-actors.esm.js +60 -3
  13. package/actors/dist/xstate-actors.umd.min.js +1 -1
  14. package/actors/dist/xstate-actors.umd.min.js.map +1 -1
  15. package/dist/declarations/src/State.d.ts +2 -2
  16. package/dist/declarations/src/StateMachine.d.ts +7 -7
  17. package/dist/declarations/src/actions/assign.d.ts +4 -4
  18. package/dist/declarations/src/actions/cancel.d.ts +4 -4
  19. package/dist/declarations/src/actions/choose.d.ts +3 -3
  20. package/dist/declarations/src/actions/log.d.ts +4 -4
  21. package/dist/declarations/src/actions/pure.d.ts +4 -4
  22. package/dist/declarations/src/actions/raise.d.ts +3 -3
  23. package/dist/declarations/src/actions/send.d.ts +7 -7
  24. package/dist/declarations/src/actions/spawn.d.ts +34 -0
  25. package/dist/declarations/src/actions/stop.d.ts +4 -4
  26. package/dist/declarations/src/actions.d.ts +1 -0
  27. package/dist/declarations/src/actors/callback.d.ts +76 -2
  28. package/dist/declarations/src/actors/observable.d.ts +2 -3
  29. package/dist/declarations/src/actors/promise.d.ts +0 -1
  30. package/dist/declarations/src/actors/transition.d.ts +3 -3
  31. package/dist/declarations/src/guards.d.ts +9 -10
  32. package/dist/declarations/src/interpreter.d.ts +71 -10
  33. package/dist/declarations/src/spawn.d.ts +3 -4
  34. package/dist/declarations/src/stateUtils.d.ts +4 -9
  35. package/dist/declarations/src/types.d.ts +51 -62
  36. package/dist/{interpreter-e58ca48d.development.cjs.js → interpreter-03a5c3f5.development.cjs.js} +91 -12
  37. package/dist/{interpreter-8def682e.esm.js → interpreter-1e8c1c0c.esm.js} +91 -12
  38. package/dist/{interpreter-97aff8d2.cjs.js → interpreter-5dfcd203.cjs.js} +91 -12
  39. package/dist/{interpreter-1c52b23c.development.esm.js → interpreter-70cd9217.development.esm.js} +91 -12
  40. package/dist/{raise-1fd59c65.development.cjs.js → raise-17cb3d9d.development.cjs.js} +145 -152
  41. package/dist/{raise-800296d7.cjs.js → raise-291d2181.cjs.js} +145 -152
  42. package/dist/{raise-21c417c1.esm.js → raise-62de3670.esm.js} +145 -153
  43. package/dist/{raise-e342a840.development.esm.js → raise-e044f460.development.esm.js} +145 -153
  44. package/dist/{send-92854675.esm.js → send-1249d4ac.esm.js} +45 -44
  45. package/dist/{send-b309ef4e.development.cjs.js → send-33433787.development.cjs.js} +45 -44
  46. package/dist/{send-4cc29786.cjs.js → send-af152aca.cjs.js} +45 -44
  47. package/dist/{send-83ccc98b.development.esm.js → send-f1a2a827.development.esm.js} +45 -44
  48. package/dist/xstate.cjs.js +23 -20
  49. package/dist/xstate.cjs.mjs +1 -0
  50. package/dist/xstate.development.cjs.js +23 -20
  51. package/dist/xstate.development.cjs.mjs +1 -0
  52. package/dist/xstate.development.esm.js +25 -23
  53. package/dist/xstate.esm.js +25 -23
  54. package/dist/xstate.umd.min.js +1 -1
  55. package/dist/xstate.umd.min.js.map +1 -1
  56. package/guards/dist/xstate-guards.cjs.js +2 -2
  57. package/guards/dist/xstate-guards.development.cjs.js +2 -2
  58. package/guards/dist/xstate-guards.development.esm.js +2 -2
  59. package/guards/dist/xstate-guards.esm.js +2 -2
  60. package/guards/dist/xstate-guards.umd.min.js +1 -1
  61. package/guards/dist/xstate-guards.umd.min.js.map +1 -1
  62. package/package.json +1 -1
@@ -14,7 +14,11 @@ export type HomomorphicPick<T, K extends keyof any> = {
14
14
  export type HomomorphicOmit<T, K extends keyof any> = {
15
15
  [P in keyof T as Exclude<P, K>]: T[P];
16
16
  };
17
+ export type GetParameterizedParams<T extends ParameterizedObject | undefined> = T extends any ? ('params' extends keyof T ? T['params'] : undefined) : never;
17
18
  /**
19
+ *
20
+ * @remarks
21
+ *
18
22
  * `T | unknown` reduces to `unknown` and that can be problematic when it comes to contextual typing.
19
23
  * It especially is a problem when the union has a function member, like here:
20
24
  *
@@ -72,15 +76,14 @@ export interface UnifiedArg<TContext extends MachineContext, TExpressionEvent ex
72
76
  system: ActorSystem<any>;
73
77
  }
74
78
  export type MachineContext = Record<string, any>;
75
- export interface ActionArgs<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject> extends UnifiedArg<TContext, TExpressionEvent, TEvent> {
76
- action: TExpressionAction;
79
+ export interface ActionArgs<TContext extends MachineContext, TExpressionEvent extends EventObject, TEvent extends EventObject> extends UnifiedArg<TContext, TExpressionEvent, TEvent> {
77
80
  }
78
- export type InputFrom<T extends AnyActorLogic> = T extends StateMachine<infer _TContext, infer _TEvent, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TInput : T extends ActorLogic<infer _TSnapshot, infer _TEvent, infer TInput, infer _TPersisted, infer _TSystem> ? TInput : never;
79
- export type OutputFrom<T extends AnyActorLogic> = T extends ActorLogic<infer TSnapshot, infer _TEvent, infer _TInput, infer _TPersisted, infer _TSystem> ? (TSnapshot & {
81
+ export type InputFrom<T extends AnyActorLogic> = T extends StateMachine<infer _TContext, infer _TEvent, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TInput : T extends ActorLogic<infer _TSnapshot, infer _TEvent, infer TInput, infer _TSystem> ? TInput : never;
82
+ export type OutputFrom<T extends AnyActorLogic> = T extends ActorLogic<infer TSnapshot, infer _TEvent, infer _TInput, infer _TSystem> ? (TSnapshot & {
80
83
  status: 'done';
81
84
  })['output'] : never;
82
- export type ActionFunction<TContext extends MachineContext, TExpressionEvent extends EventObject, TEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string> = {
83
- (args: ActionArgs<TContext, TExpressionEvent, TExpressionAction, TEvent>): void;
85
+ export type ActionFunction<TContext extends MachineContext, TExpressionEvent extends EventObject, TEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string> = {
86
+ (args: ActionArgs<TContext, TExpressionEvent, TEvent>, params: TParams): void;
84
87
  _out_TEvent?: TEvent;
85
88
  _out_TActor?: TActor;
86
89
  _out_TAction?: TAction;
@@ -102,9 +105,9 @@ export type WithDynamicParams<TContext extends MachineContext, TExpressionEvent
102
105
  event: TExpressionEvent;
103
106
  }) => T['params']);
104
107
  }, undefined extends T['params'] ? false : true> : never;
105
- export type Action<TContext extends MachineContext, TExpressionEvent extends EventObject, TEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string> = NoRequiredParams<TAction> | WithDynamicParams<TContext, TExpressionEvent, TAction> | ActionFunction<TContext, TExpressionEvent, TEvent, TExpressionAction, TActor, TAction, TGuard, TDelay>;
106
- export type UnknownAction = Action<MachineContext, EventObject, EventObject, ParameterizedObject | undefined, ProvidedActor, ParameterizedObject, ParameterizedObject, string>;
107
- export type Actions<TContext extends MachineContext, TExpressionEvent extends EventObject, TEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string> = SingleOrArray<Action<TContext, TExpressionEvent, TEvent, TExpressionAction, TActor, TAction, TGuard, TDelay>>;
108
+ export type Action<TContext extends MachineContext, TExpressionEvent extends EventObject, TEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string> = NoRequiredParams<TAction> | WithDynamicParams<TContext, TExpressionEvent, TAction> | ActionFunction<TContext, TExpressionEvent, TEvent, TParams, TActor, TAction, TGuard, TDelay>;
109
+ export type UnknownAction = Action<MachineContext, EventObject, EventObject, ParameterizedObject['params'] | undefined, ProvidedActor, ParameterizedObject, ParameterizedObject, string>;
110
+ export type Actions<TContext extends MachineContext, TExpressionEvent extends EventObject, TEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string> = SingleOrArray<Action<TContext, TExpressionEvent, TEvent, TParams, TActor, TAction, TGuard, TDelay>>;
108
111
  export type StateKey = string | AnyState;
109
112
  export interface StateValueMap {
110
113
  [key: string]: StateValue;
@@ -112,7 +115,10 @@ export interface StateValueMap {
112
115
  /**
113
116
  * The string or object representing the state value relative to the parent state node.
114
117
  *
118
+ * @remarks
119
+ *
115
120
  * - For a child atomic state node, this is a string, e.g., `"pending"`.
121
+ *
116
122
  * - For complex state nodes, this is an object, e.g., `{ success: "someChildState" }`.
117
123
  */
118
124
  export type StateValue = string | StateValueMap;
@@ -283,9 +289,6 @@ export interface StateNodeConfig<TContext extends MachineContext, TEvent extends
283
289
  * An eventless transition that is always taken when this state node is active.
284
290
  */
285
291
  always?: TransitionConfigOrTarget<TContext, TEvent, TEvent, TActor, TAction, TGuard, TDelay>;
286
- /**
287
- * @private
288
- */
289
292
  parent?: StateNode<TContext, TEvent>;
290
293
  /**
291
294
  * The meta data associated with this state node, which will be returned in State instances.
@@ -364,17 +367,17 @@ export interface HistoryStateNodeConfig<TContext extends MachineContext, TEvent
364
367
  }
365
368
  export type SimpleOrStateNodeConfig<TContext extends MachineContext, TEvent extends EventObject> = AtomicStateNodeConfig<TContext, TEvent> | StateNodeConfig<TContext, TEvent, TODO, TODO, TODO, TODO, TODO, TODO>;
366
369
  export type ActionFunctionMap<TContext extends MachineContext, TEvent extends EventObject, TActor extends ProvidedActor, TAction extends ParameterizedObject = ParameterizedObject, TGuard extends ParameterizedObject = ParameterizedObject, TDelay extends string = string> = {
367
- [K in TAction['type']]?: ActionFunction<TContext, TEvent, TEvent, TAction extends {
370
+ [K in TAction['type']]?: ActionFunction<TContext, TEvent, TEvent, GetParameterizedParams<TAction extends {
368
371
  type: K;
369
- } ? TAction : never, TActor, TAction, TGuard, TDelay>;
372
+ } ? TAction : never>, TActor, TAction, TGuard, TDelay>;
370
373
  };
371
374
  type GuardMap<TContext extends MachineContext, TEvent extends EventObject, TGuard extends ParameterizedObject> = {
372
- [K in TGuard['type']]?: GuardPredicate<TContext, TEvent, TGuard extends {
375
+ [K in TGuard['type']]?: GuardPredicate<TContext, TEvent, GetParameterizedParams<TGuard extends {
373
376
  type: K;
374
- } ? TGuard : never, TGuard>;
377
+ } ? TGuard : never>, TGuard>;
375
378
  };
376
- export type DelayFunctionMap<TContext extends MachineContext, TEvent extends EventObject, TAction extends ParameterizedObject> = Record<string, DelayConfig<TContext, TEvent, TAction, TEvent>>;
377
- export type DelayConfig<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject> = number | DelayExpr<TContext, TExpressionEvent, TExpressionAction, TEvent>;
379
+ export type DelayFunctionMap<TContext extends MachineContext, TEvent extends EventObject, TAction extends ParameterizedObject> = Record<string, DelayConfig<TContext, TEvent, TAction['params'], TEvent>>;
380
+ export type DelayConfig<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TEvent extends EventObject> = number | DelayExpr<TContext, TExpressionEvent, TParams, TEvent>;
378
381
  export interface MachineImplementationsSimplified<TContext extends MachineContext, TEvent extends EventObject, TActor extends ProvidedActor = ProvidedActor, TAction extends ParameterizedObject = ParameterizedObject, TGuard extends ParameterizedObject = ParameterizedObject> {
379
382
  guards: GuardMap<TContext, TEvent, TGuard>;
380
383
  actions: ActionFunctionMap<TContext, TEvent, TActor, TAction>;
@@ -386,7 +389,7 @@ export interface MachineImplementationsSimplified<TContext extends MachineContex
386
389
  }
387
390
  type MaybeNarrowedEvent<TIndexedEvents, TCausingLookup, K> = Cast<Prop<TIndexedEvents, K extends keyof TCausingLookup ? TCausingLookup[K] : TIndexedEvents[keyof TIndexedEvents]>, EventObject>;
388
391
  type MachineImplementationsActions<TContext extends MachineContext, TResolvedTypesMeta, TEventsCausingActions = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingActions'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>, TIndexedActors = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedActors'>, TIndexedActions = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedActions'>, TIndexedGuards = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedGuards'>, TIndexedDelays = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedDelays'>> = {
389
- [K in keyof TIndexedActions]?: ActionFunction<TContext, MaybeNarrowedEvent<TIndexedEvents, TEventsCausingActions, K>, Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>, Cast<TIndexedActions[K], ParameterizedObject>, Cast<Prop<TIndexedActors, keyof TIndexedActors>, ProvidedActor>, Cast<Prop<TIndexedActions, keyof TIndexedActions>, ParameterizedObject>, Cast<Prop<TIndexedGuards, keyof TIndexedGuards>, ParameterizedObject>, Cast<Prop<TIndexedDelays, keyof TIndexedDelays>, ParameterizedObject>['type']>;
392
+ [K in keyof TIndexedActions]?: ActionFunction<TContext, MaybeNarrowedEvent<TIndexedEvents, TEventsCausingActions, K>, Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>, GetParameterizedParams<Cast<TIndexedActions[K], ParameterizedObject>>, Cast<Prop<TIndexedActors, keyof TIndexedActors>, ProvidedActor>, Cast<Prop<TIndexedActions, keyof TIndexedActions>, ParameterizedObject>, Cast<Prop<TIndexedGuards, keyof TIndexedGuards>, ParameterizedObject>, Cast<Prop<TIndexedDelays, keyof TIndexedDelays>, ParameterizedObject>['type']>;
390
393
  };
391
394
  type MachineImplementationsActors<TContext extends MachineContext, TResolvedTypesMeta, TEventsCausingActors = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingActors'>, TIndexedActors = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedActors'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>, _TInvokeSrcNameMap = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'invokeSrcNameMap'>> = {
392
395
  [K in keyof TIndexedActors]?: Cast<Prop<TIndexedActors[K], 'logic'>, AnyActorLogic> | {
@@ -395,10 +398,10 @@ type MachineImplementationsActors<TContext extends MachineContext, TResolvedType
395
398
  };
396
399
  };
397
400
  type MachineImplementationsDelays<TContext extends MachineContext, TResolvedTypesMeta, TEventsCausingDelays = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingDelays'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>, TIndexedActions = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedActions'>, TIndexedDelays = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedDelays'>> = {
398
- [K in keyof TIndexedDelays]?: DelayConfig<TContext, MaybeNarrowedEvent<TIndexedEvents, TEventsCausingDelays, K>, Cast<Prop<TIndexedActions, keyof TIndexedActions>, ParameterizedObject> | undefined, Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>>;
401
+ [K in keyof TIndexedDelays]?: DelayConfig<TContext, MaybeNarrowedEvent<TIndexedEvents, TEventsCausingDelays, K>, Cast<Prop<Prop<TIndexedActions, keyof TIndexedActions>, 'params'>, ParameterizedObject['params'] | undefined> | undefined, Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>>;
399
402
  };
400
403
  type MachineImplementationsGuards<TContext extends MachineContext, TResolvedTypesMeta, TEventsCausingGuards = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingGuards'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>, TIndexedGuards = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedGuards'>> = {
401
- [K in keyof TIndexedGuards]?: Guard<TContext, MaybeNarrowedEvent<TIndexedEvents, TEventsCausingGuards, K>, Cast<TIndexedGuards[K], ParameterizedObject>, Cast<Prop<TIndexedGuards, keyof TIndexedGuards>, ParameterizedObject>>;
404
+ [K in keyof TIndexedGuards]?: Guard<TContext, MaybeNarrowedEvent<TIndexedEvents, TEventsCausingGuards, K>, GetParameterizedParams<Cast<TIndexedGuards[K], ParameterizedObject | undefined>>, Cast<Prop<TIndexedGuards, keyof TIndexedGuards>, ParameterizedObject>>;
402
405
  };
403
406
  type MakeKeysRequired<T extends string> = {
404
407
  [K in T]: unknown;
@@ -481,29 +484,29 @@ export interface DoneStateEvent<TOutput = unknown> extends EventObject {
481
484
  type: `xstate.done.state.${string}`;
482
485
  output: TOutput;
483
486
  }
484
- export type DelayExpr<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject> = (args: ActionArgs<TContext, TExpressionEvent, TExpressionAction, TEvent>) => number;
485
- export type LogExpr<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject> = (args: ActionArgs<TContext, TExpressionEvent, TExpressionAction, TEvent>) => unknown;
486
- export type SendExpr<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TSentEvent extends EventObject, TEvent extends EventObject> = (args: ActionArgs<TContext, TExpressionEvent, TExpressionAction, TEvent>) => TSentEvent;
487
+ export type DelayExpr<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TEvent extends EventObject> = (args: ActionArgs<TContext, TExpressionEvent, TEvent>, params: TParams) => number;
488
+ export type LogExpr<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TEvent extends EventObject> = (args: ActionArgs<TContext, TExpressionEvent, TEvent>, params: TParams) => unknown;
489
+ export type SendExpr<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TSentEvent extends EventObject, TEvent extends EventObject> = (args: ActionArgs<TContext, TExpressionEvent, TEvent>, params: TParams) => TSentEvent;
487
490
  export declare enum SpecialTargets {
488
491
  Parent = "#_parent",
489
492
  Internal = "#_internal"
490
493
  }
491
- export interface SendToActionOptions<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject, TDelay extends string> extends RaiseActionOptions<TContext, TExpressionEvent, TExpressionAction, TEvent, TDelay> {
494
+ export interface SendToActionOptions<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TEvent extends EventObject, TDelay extends string> extends RaiseActionOptions<TContext, TExpressionEvent, TParams, TEvent, TDelay> {
492
495
  }
493
- export interface RaiseActionOptions<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject, TDelay extends string> {
496
+ export interface RaiseActionOptions<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TEvent extends EventObject, TDelay extends string> {
494
497
  id?: string;
495
- delay?: Delay<TDelay> | DelayExpr<TContext, TExpressionEvent, TExpressionAction, TEvent>;
498
+ delay?: Delay<TDelay> | DelayExpr<TContext, TExpressionEvent, TParams, TEvent>;
496
499
  }
497
- export interface RaiseActionParams<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject, TDelay extends string> extends RaiseActionOptions<TContext, TExpressionEvent, TExpressionAction, TEvent, TDelay> {
498
- event: TEvent | SendExpr<TContext, TExpressionEvent, TExpressionAction, TEvent, TEvent>;
500
+ export interface RaiseActionParams<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TEvent extends EventObject, TDelay extends string> extends RaiseActionOptions<TContext, TExpressionEvent, TParams, TEvent, TDelay> {
501
+ event: TEvent | SendExpr<TContext, TExpressionEvent, TParams, TEvent, TEvent>;
499
502
  }
500
- export interface SendToActionParams<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TSentEvent extends EventObject, TEvent extends EventObject, TDelay extends string> extends SendToActionOptions<TContext, TExpressionEvent, TExpressionAction, TEvent, TDelay> {
501
- event: TSentEvent | SendExpr<TContext, TExpressionEvent, TExpressionAction, TSentEvent, TEvent>;
503
+ export interface SendToActionParams<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TSentEvent extends EventObject, TEvent extends EventObject, TDelay extends string> extends SendToActionOptions<TContext, TExpressionEvent, TParams, TEvent, TDelay> {
504
+ event: TSentEvent | SendExpr<TContext, TExpressionEvent, TParams, TSentEvent, TEvent>;
502
505
  }
503
- export type Assigner<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject, TActor extends ProvidedActor> = (args: AssignArgs<TContext, TExpressionEvent, TExpressionAction, TEvent, TActor>) => Partial<TContext>;
504
- export type PartialAssigner<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject, TActor extends ProvidedActor, TKey extends keyof TContext> = (args: AssignArgs<TContext, TExpressionEvent, TExpressionAction, TEvent, TActor>) => TContext[TKey];
505
- export type PropertyAssigner<TContext extends MachineContext, TExpressionEvent extends EventObject, TExpressionAction extends ParameterizedObject | undefined, TEvent extends EventObject, TActor extends ProvidedActor> = {
506
- [K in keyof TContext]?: PartialAssigner<TContext, TExpressionEvent, TExpressionAction, TEvent, TActor, K> | TContext[K];
506
+ export type Assigner<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TEvent extends EventObject, TActor extends ProvidedActor> = (args: AssignArgs<TContext, TExpressionEvent, TEvent, TActor>, params: TParams) => Partial<TContext>;
507
+ export type PartialAssigner<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TEvent extends EventObject, TActor extends ProvidedActor, TKey extends keyof TContext> = (args: AssignArgs<TContext, TExpressionEvent, TEvent, TActor>, params: TParams) => TContext[TKey];
508
+ export type PropertyAssigner<TContext extends MachineContext, TExpressionEvent extends EventObject, TParams extends ParameterizedObject['params'] | undefined, TEvent extends EventObject, TActor extends ProvidedActor> = {
509
+ [K in keyof TContext]?: PartialAssigner<TContext, TExpressionEvent, TParams, TEvent, TActor, K> | TContext[K];
507
510
  };
508
511
  export type Mapper<TContext extends MachineContext, TExpressionEvent extends EventObject, TResult, TEvent extends EventObject> = (args: {
509
512
  context: TContext;
@@ -628,7 +631,7 @@ export interface ActorRef<TEvent extends EventObject, TSnapshot extends Snapshot
628
631
  send: (event: TEvent) => void;
629
632
  start?: () => void;
630
633
  getSnapshot: () => TSnapshot;
631
- getPersistedState?: () => any;
634
+ getPersistedState: () => Snapshot<unknown>;
632
635
  stop: () => void;
633
636
  toJSON?: () => any;
634
637
  _parent?: ActorRef<any, any>;
@@ -638,12 +641,12 @@ export interface ActorRef<TEvent extends EventObject, TSnapshot extends Snapshot
638
641
  }
639
642
  export type AnyActorRef = ActorRef<any, any>;
640
643
  export type ActorLogicFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<any, any, any, any, any, any, any, any, any> ? R : R extends Promise<infer U> ? PromiseActorLogic<U> : never : never;
641
- export type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer TEvent, infer TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TTag, infer _TInput, infer TOutput, infer TResolvedTypesMeta> ? ActorRef<TEvent, MachineSnapshot<TContext, TEvent, TActor, TTag, TOutput, AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false ? MarkAllImplementationsAsProvided<TResolvedTypesMeta> : TResolvedTypesMeta>> : R extends Promise<infer U> ? ActorRefFrom<PromiseActorLogic<U>> : R extends ActorLogic<infer TSnapshot, infer TEvent, infer _TInput, infer _TPersisted, infer _TSystem> ? ActorRef<TEvent, TSnapshot> : never : never;
644
+ export type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer TEvent, infer TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TTag, infer _TInput, infer TOutput, infer TResolvedTypesMeta> ? ActorRef<TEvent, MachineSnapshot<TContext, TEvent, TActor, TTag, TOutput, AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false ? MarkAllImplementationsAsProvided<TResolvedTypesMeta> : TResolvedTypesMeta>> : R extends Promise<infer U> ? ActorRefFrom<PromiseActorLogic<U>> : R extends ActorLogic<infer TSnapshot, infer TEvent, infer _TInput, infer _TSystem> ? ActorRef<TEvent, TSnapshot> : never : never;
642
645
  export type DevToolsAdapter = (service: AnyActor) => void;
643
646
  /**
644
647
  * @deprecated Use `Actor<T>` instead.
645
648
  */
646
- export type InterpreterFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer TEvent, infer TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TTag, infer TInput, infer TOutput, infer TResolvedTypesMeta> ? Actor<ActorLogic<MachineSnapshot<TContext, TEvent, TActor, TTag, TOutput, TResolvedTypesMeta>, TEvent, TInput, PersistedMachineState<TContext, TEvent, TActor, TTag, TOutput, TResolvedTypesMeta>, ActorSystem<any>>> : never;
649
+ export type InterpreterFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer TEvent, infer TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TTag, infer TInput, infer TOutput, infer TResolvedTypesMeta> ? Actor<ActorLogic<MachineSnapshot<TContext, TEvent, TActor, TTag, TOutput, TResolvedTypesMeta>, TEvent, TInput, ActorSystem<any>>> : never;
647
650
  export type MachineImplementationsFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine), TRequireMissingImplementations extends boolean = false> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer TEvent, infer TActor, infer TAction, infer _TGuard, infer TDelay, infer _TTag, infer _TInput, infer _TOutput, infer TResolvedTypesMeta> ? InternalMachineImplementations<TContext, TEvent, TActor, TAction, TDelay, TResolvedTypesMeta, TRequireMissingImplementations> : never;
648
651
  export type __ResolvedTypesMetaFrom<T> = T extends StateMachine<any, // context
649
652
  any, // event
@@ -655,7 +658,7 @@ any, // tag
655
658
  any, // input
656
659
  any, // output
657
660
  infer TResolvedTypesMeta> ? TResolvedTypesMeta : never;
658
- export interface ActorContext<TSnapshot extends Snapshot<unknown>, TEvent extends EventObject, TSystem extends ActorSystem<any> = ActorSystem<any>> {
661
+ export interface ActorScope<TSnapshot extends Snapshot<unknown>, TEvent extends EventObject, TSystem extends ActorSystem<any> = ActorSystem<any>> {
659
662
  self: ActorRef<TEvent, TSnapshot>;
660
663
  id: string;
661
664
  sessionId: string;
@@ -664,7 +667,7 @@ export interface ActorContext<TSnapshot extends Snapshot<unknown>, TEvent extend
664
667
  system: TSystem;
665
668
  stopChild: (child: AnyActorRef) => void;
666
669
  }
667
- export type AnyActorContext = ActorContext<any, any, AnyActorSystem>;
670
+ export type AnyActorScope = ActorScope<any, any, AnyActorSystem>;
668
671
  export type Snapshot<TOutput> = {
669
672
  status: 'active';
670
673
  output: undefined;
@@ -682,29 +685,23 @@ export type Snapshot<TOutput> = {
682
685
  output: undefined;
683
686
  error: undefined;
684
687
  };
685
- export interface ActorLogic<TSnapshot extends Snapshot<unknown>, TEvent extends EventObject, TInput = unknown,
686
- /**
687
- * Serialized internal state used for persistence & restoration
688
- */
689
- TPersisted = TSnapshot, TSystem extends ActorSystem<any> = ActorSystem<any>> {
688
+ export interface ActorLogic<TSnapshot extends Snapshot<unknown>, TEvent extends EventObject, TInput = unknown, TSystem extends ActorSystem<any> = ActorSystem<any>> {
690
689
  config?: unknown;
691
- transition: (state: TSnapshot, message: TEvent, ctx: ActorContext<TSnapshot, TEvent, TSystem>) => TSnapshot;
692
- getInitialState: (actorCtx: ActorContext<TSnapshot, TEvent, TSystem>, input: TInput) => TSnapshot;
693
- restoreState?: (persistedState: TPersisted, actorCtx: ActorContext<TSnapshot, TEvent>) => TSnapshot;
694
- start?: (state: TSnapshot, actorCtx: ActorContext<TSnapshot, TEvent>) => void;
690
+ transition: (state: TSnapshot, message: TEvent, ctx: ActorScope<TSnapshot, TEvent, TSystem>) => TSnapshot;
691
+ getInitialState: (actorScope: ActorScope<TSnapshot, TEvent, TSystem>, input: TInput) => TSnapshot;
692
+ restoreState?: (persistedState: Snapshot<unknown>, actorScope: ActorScope<TSnapshot, TEvent>) => TSnapshot;
693
+ start?: (state: TSnapshot, actorScope: ActorScope<TSnapshot, TEvent>) => void;
695
694
  /**
696
695
  * @returns Persisted state
697
696
  */
698
- getPersistedState?: (state: TSnapshot) => TPersisted;
697
+ getPersistedState: (state: TSnapshot) => Snapshot<unknown>;
699
698
  }
700
699
  export type AnyActorLogic = ActorLogic<any, // snapshot
701
700
  any, // event
702
701
  any, // input
703
- any, // persisted state
704
702
  any>;
705
- export type SnapshotFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends ActorRef<infer _, infer TSnapshot> ? TSnapshot : R extends Actor<infer TLogic> ? SnapshotFrom<TLogic> : R extends StateMachine<infer _TContext, infer _TEvent, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TResolvedTypesMeta> ? StateFrom<R> : R extends ActorLogic<any, any, any, any, any> ? ReturnType<R['transition']> : R extends ActorContext<infer TSnapshot, infer _, infer __> ? TSnapshot : never : never;
706
- export type EventFromLogic<TLogic extends ActorLogic<any, any, any, any, any>> = TLogic extends ActorLogic<infer _, infer TEvent, infer __, infer _____, infer ______> ? TEvent : never;
707
- export type PersistedStateFrom<TLogic extends ActorLogic<any, any, any, any, any>> = TLogic extends ActorLogic<infer _TSnapshot, infer _TEvent, infer _TInput, infer TPersisted, infer _TSystem> ? TPersisted : never;
703
+ export type SnapshotFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends ActorRef<infer _, infer TSnapshot> ? TSnapshot : R extends Actor<infer TLogic> ? SnapshotFrom<TLogic> : R extends StateMachine<infer _TContext, infer _TEvent, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TResolvedTypesMeta> ? StateFrom<R> : R extends ActorLogic<any, any, any, any> ? ReturnType<R['transition']> : R extends ActorScope<infer TSnapshot, infer _, infer __> ? TSnapshot : never : never;
704
+ export type EventFromLogic<TLogic extends ActorLogic<any, any, any, any>> = TLogic extends ActorLogic<infer _, infer TEvent, infer __, infer _____> ? TEvent : never;
708
705
  type ResolveEventType<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer _TContext, infer TEvent, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends State<infer _TContext, infer TEvent, infer _TActor, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends ActorRef<infer TEvent, infer _> ? TEvent : never : never;
709
706
  export type EventFrom<T, K extends Prop<TEvent, 'type'> = never, TEvent extends EventObject = ResolveEventType<T>> = IsNever<K> extends true ? TEvent : ExtractEvent<TEvent, K>;
710
707
  export type ContextFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer _TEvent, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : R extends State<infer TContext, infer _TEvent, infer _TActor, infer _TOutput, infer _TResolvedTypesMeta> ? TContext : R extends Actor<infer TActorLogic> ? TActorLogic extends StateMachine<infer TContext, infer _TEvent, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : never : never : never;
@@ -726,12 +723,4 @@ export interface ActorSystem<T extends ActorSystemInfo> {
726
723
  inspect: (observer: Observer<InspectionEvent>) => void;
727
724
  }
728
725
  export type AnyActorSystem = ActorSystem<any>;
729
- export type PersistedMachineState<TContext extends MachineContext, TEvent extends EventObject, TActor extends ProvidedActor, TTag extends string, TOutput, TResolvedTypesMeta = TypegenDisabled> = HomomorphicPick<MachineSnapshot<TContext, TEvent, TActor, TTag, TOutput, TResolvedTypesMeta>, 'value' | 'output' | 'error' | 'context' | 'status' | 'historyValue'> & {
730
- children: {
731
- [K in keyof MachineSnapshot<TContext, TEvent, TActor, TTag, TOutput, TResolvedTypesMeta>['children']]: {
732
- state: any;
733
- src?: string;
734
- };
735
- };
736
- };
737
726
  export {};
@@ -359,6 +359,10 @@ const defaultOptions = {
359
359
  logger: console.log.bind(console),
360
360
  devTools: false
361
361
  };
362
+
363
+ /**
364
+ * An Actor is a running process that can receive events, send events and change its behavior based on the events it receives, which can cause effects outside of the actor. When you run a state machine, it becomes an actor.
365
+ */
362
366
  class Actor {
363
367
  /**
364
368
  * The current internal state of the actor.
@@ -384,6 +388,10 @@ class Actor {
384
388
  * The globally unique process ID for this invocation.
385
389
  */
386
390
 
391
+ /**
392
+ * The system to which this actor belongs.
393
+ */
394
+
387
395
  /**
388
396
  * Creates a new actor instance for the given logic with the provided options, if any.
389
397
  *
@@ -403,7 +411,7 @@ class Actor {
403
411
  this.status = ActorStatus.NotStarted;
404
412
  this._parent = void 0;
405
413
  this.ref = void 0;
406
- this._actorContext = void 0;
414
+ this._actorScope = void 0;
407
415
  this._systemId = void 0;
408
416
  this.sessionId = void 0;
409
417
  this.system = void 0;
@@ -427,10 +435,6 @@ class Actor {
427
435
  // Always inspect at the system-level
428
436
  this.system.inspect(toObserver(inspect));
429
437
  }
430
- if (systemId) {
431
- this._systemId = systemId;
432
- this.system._set(systemId, this);
433
- }
434
438
  this.sessionId = this.system._bookId();
435
439
  this.id = id ?? this.sessionId;
436
440
  this.logger = logger;
@@ -439,7 +443,7 @@ class Actor {
439
443
  this.options = resolvedOptions;
440
444
  this.src = resolvedOptions.src;
441
445
  this.ref = this;
442
- this._actorContext = {
446
+ this._actorScope = {
443
447
  self: this,
444
448
  id: this.id,
445
449
  sessionId: this.sessionId,
@@ -464,9 +468,13 @@ class Actor {
464
468
  actorRef: this
465
469
  });
466
470
  this._initState();
471
+ if (systemId && this._state.status === 'active') {
472
+ this._systemId = systemId;
473
+ this.system._set(systemId, this);
474
+ }
467
475
  }
468
476
  _initState() {
469
- this._state = this.options.state ? this.logic.restoreState ? this.logic.restoreState(this.options.state, this._actorContext) : this.options.state : this.logic.getInitialState(this._actorContext, this.options?.input);
477
+ this._state = this.options.state ? this.logic.restoreState ? this.logic.restoreState(this.options.state, this._actorScope) : this.options.state : this.logic.getInitialState(this._actorScope, this.options?.input);
470
478
  }
471
479
 
472
480
  // array of functions to defer
@@ -512,6 +520,56 @@ class Actor {
512
520
  snapshot
513
521
  });
514
522
  }
523
+
524
+ /**
525
+ * Subscribe an observer to an actor’s snapshot values.
526
+ *
527
+ * @remarks
528
+ * The observer will receive the actor’s snapshot value when it is emitted. The observer can be:
529
+ * - A plain function that receives the latest snapshot, or
530
+ * - An observer object whose `.next(snapshot)` method receives the latest snapshot
531
+ *
532
+ * @example
533
+ * ```ts
534
+ * // Observer as a plain function
535
+ * const subscription = actor.subscribe((snapshot) => {
536
+ * console.log(snapshot);
537
+ * });
538
+ * ```
539
+ *
540
+ * @example
541
+ * ```ts
542
+ * // Observer as an object
543
+ * const subscription = actor.subscribe({
544
+ * next(snapshot) {
545
+ * console.log(snapshot);
546
+ * },
547
+ * error(err) {
548
+ * // ...
549
+ * },
550
+ * complete() {
551
+ * // ...
552
+ * },
553
+ * });
554
+ * ```
555
+ *
556
+ * The return value of `actor.subscribe(observer)` is a subscription object that has an `.unsubscribe()` method. You can call `subscription.unsubscribe()` to unsubscribe the observer:
557
+ *
558
+ * @example
559
+ * ```ts
560
+ * const subscription = actor.subscribe((snapshot) => {
561
+ * // ...
562
+ * });
563
+ *
564
+ * // Unsubscribe the observer
565
+ * subscription.unsubscribe();
566
+ * ```
567
+ *
568
+ * When the actor is stopped, all of its observers will automatically be unsubscribed.
569
+ *
570
+ * @param observer - Either a plain function that receives the latest snapshot, or an observer object whose `.next(snapshot)` method receives the latest snapshot
571
+ */
572
+
515
573
  subscribe(nextListenerOrObserver, errorListener, completeListener) {
516
574
  const observer = toObserver(nextListenerOrObserver, errorListener, completeListener);
517
575
  if (this.status !== ActorStatus.Stopped) {
@@ -563,7 +621,7 @@ class Actor {
563
621
  }
564
622
  if (this.logic.start) {
565
623
  try {
566
- this.logic.start(this._state, this._actorContext);
624
+ this.logic.start(this._state, this._actorScope);
567
625
  } catch (err) {
568
626
  this._stopProcedure();
569
627
  this._error(err);
@@ -587,7 +645,7 @@ class Actor {
587
645
  let nextState;
588
646
  let caughtError;
589
647
  try {
590
- nextState = this.logic.transition(this._state, event, this._actorContext);
648
+ nextState = this.logic.transition(this._state, event, this._actorScope);
591
649
  } catch (err) {
592
650
  // we wrap it in a box so we can rethrow it later even if falsy value gets caught here
593
651
  caughtError = {
@@ -715,7 +773,10 @@ class Actor {
715
773
  this.system._relay(undefined, this, event);
716
774
  }
717
775
 
718
- // TODO: make private (and figure out a way to do this within the machine)
776
+ /**
777
+ * TODO: figure out a way to do this within the machine
778
+ * @internal
779
+ */
719
780
  delaySend(params) {
720
781
  const {
721
782
  event,
@@ -732,7 +793,10 @@ class Actor {
732
793
  }
733
794
  }
734
795
 
735
- // TODO: make private (and figure out a way to do this within the machine)
796
+ /**
797
+ * TODO: figure out a way to do this within the machine
798
+ * @internal
799
+ */
736
800
  cancel(sendId) {
737
801
  this.clock.clearTimeout(this.delayedEventsMap[sendId]);
738
802
  delete this.delayedEventsMap[sendId];
@@ -753,11 +817,26 @@ class Actor {
753
817
  };
754
818
  }
755
819
  getPersistedState() {
756
- return this.logic.getPersistedState?.(this._state);
820
+ return this.logic.getPersistedState(this._state);
757
821
  }
758
822
  [symbolObservable]() {
759
823
  return this;
760
824
  }
825
+
826
+ /**
827
+ * Read an actor’s snapshot synchronously.
828
+ *
829
+ * @remarks
830
+ * The snapshot represent an actor's last emitted value.
831
+ *
832
+ * When an actor receives an event, its internal state may change.
833
+ * An actor may emit a snapshot when a state transition occurs.
834
+ *
835
+ * Note that some actors, such as callback actors generated with `fromCallback`, will not emit snapshots.
836
+ *
837
+ * @see {@link Actor.subscribe} to subscribe to an actor’s snapshot values.
838
+ * @see {@link Actor.getPersistedState} to persist the internal state of an actor (which is more than just a snapshot).
839
+ */
761
840
  getSnapshot() {
762
841
  return this._state;
763
842
  }
@@ -354,6 +354,10 @@ const defaultOptions = {
354
354
  logger: console.log.bind(console),
355
355
  devTools: false
356
356
  };
357
+
358
+ /**
359
+ * An Actor is a running process that can receive events, send events and change its behavior based on the events it receives, which can cause effects outside of the actor. When you run a state machine, it becomes an actor.
360
+ */
357
361
  class Actor {
358
362
  /**
359
363
  * The current internal state of the actor.
@@ -379,6 +383,10 @@ class Actor {
379
383
  * The globally unique process ID for this invocation.
380
384
  */
381
385
 
386
+ /**
387
+ * The system to which this actor belongs.
388
+ */
389
+
382
390
  /**
383
391
  * Creates a new actor instance for the given logic with the provided options, if any.
384
392
  *
@@ -398,7 +406,7 @@ class Actor {
398
406
  this.status = ActorStatus.NotStarted;
399
407
  this._parent = void 0;
400
408
  this.ref = void 0;
401
- this._actorContext = void 0;
409
+ this._actorScope = void 0;
402
410
  this._systemId = void 0;
403
411
  this.sessionId = void 0;
404
412
  this.system = void 0;
@@ -422,10 +430,6 @@ class Actor {
422
430
  // Always inspect at the system-level
423
431
  this.system.inspect(toObserver(inspect));
424
432
  }
425
- if (systemId) {
426
- this._systemId = systemId;
427
- this.system._set(systemId, this);
428
- }
429
433
  this.sessionId = this.system._bookId();
430
434
  this.id = id ?? this.sessionId;
431
435
  this.logger = logger;
@@ -434,7 +438,7 @@ class Actor {
434
438
  this.options = resolvedOptions;
435
439
  this.src = resolvedOptions.src;
436
440
  this.ref = this;
437
- this._actorContext = {
441
+ this._actorScope = {
438
442
  self: this,
439
443
  id: this.id,
440
444
  sessionId: this.sessionId,
@@ -459,9 +463,13 @@ class Actor {
459
463
  actorRef: this
460
464
  });
461
465
  this._initState();
466
+ if (systemId && this._state.status === 'active') {
467
+ this._systemId = systemId;
468
+ this.system._set(systemId, this);
469
+ }
462
470
  }
463
471
  _initState() {
464
- this._state = this.options.state ? this.logic.restoreState ? this.logic.restoreState(this.options.state, this._actorContext) : this.options.state : this.logic.getInitialState(this._actorContext, this.options?.input);
472
+ this._state = this.options.state ? this.logic.restoreState ? this.logic.restoreState(this.options.state, this._actorScope) : this.options.state : this.logic.getInitialState(this._actorScope, this.options?.input);
465
473
  }
466
474
 
467
475
  // array of functions to defer
@@ -507,6 +515,56 @@ class Actor {
507
515
  snapshot
508
516
  });
509
517
  }
518
+
519
+ /**
520
+ * Subscribe an observer to an actor’s snapshot values.
521
+ *
522
+ * @remarks
523
+ * The observer will receive the actor’s snapshot value when it is emitted. The observer can be:
524
+ * - A plain function that receives the latest snapshot, or
525
+ * - An observer object whose `.next(snapshot)` method receives the latest snapshot
526
+ *
527
+ * @example
528
+ * ```ts
529
+ * // Observer as a plain function
530
+ * const subscription = actor.subscribe((snapshot) => {
531
+ * console.log(snapshot);
532
+ * });
533
+ * ```
534
+ *
535
+ * @example
536
+ * ```ts
537
+ * // Observer as an object
538
+ * const subscription = actor.subscribe({
539
+ * next(snapshot) {
540
+ * console.log(snapshot);
541
+ * },
542
+ * error(err) {
543
+ * // ...
544
+ * },
545
+ * complete() {
546
+ * // ...
547
+ * },
548
+ * });
549
+ * ```
550
+ *
551
+ * The return value of `actor.subscribe(observer)` is a subscription object that has an `.unsubscribe()` method. You can call `subscription.unsubscribe()` to unsubscribe the observer:
552
+ *
553
+ * @example
554
+ * ```ts
555
+ * const subscription = actor.subscribe((snapshot) => {
556
+ * // ...
557
+ * });
558
+ *
559
+ * // Unsubscribe the observer
560
+ * subscription.unsubscribe();
561
+ * ```
562
+ *
563
+ * When the actor is stopped, all of its observers will automatically be unsubscribed.
564
+ *
565
+ * @param observer - Either a plain function that receives the latest snapshot, or an observer object whose `.next(snapshot)` method receives the latest snapshot
566
+ */
567
+
510
568
  subscribe(nextListenerOrObserver, errorListener, completeListener) {
511
569
  const observer = toObserver(nextListenerOrObserver, errorListener, completeListener);
512
570
  if (this.status !== ActorStatus.Stopped) {
@@ -558,7 +616,7 @@ class Actor {
558
616
  }
559
617
  if (this.logic.start) {
560
618
  try {
561
- this.logic.start(this._state, this._actorContext);
619
+ this.logic.start(this._state, this._actorScope);
562
620
  } catch (err) {
563
621
  this._stopProcedure();
564
622
  this._error(err);
@@ -582,7 +640,7 @@ class Actor {
582
640
  let nextState;
583
641
  let caughtError;
584
642
  try {
585
- nextState = this.logic.transition(this._state, event, this._actorContext);
643
+ nextState = this.logic.transition(this._state, event, this._actorScope);
586
644
  } catch (err) {
587
645
  // we wrap it in a box so we can rethrow it later even if falsy value gets caught here
588
646
  caughtError = {
@@ -702,7 +760,10 @@ class Actor {
702
760
  this.system._relay(undefined, this, event);
703
761
  }
704
762
 
705
- // TODO: make private (and figure out a way to do this within the machine)
763
+ /**
764
+ * TODO: figure out a way to do this within the machine
765
+ * @internal
766
+ */
706
767
  delaySend(params) {
707
768
  const {
708
769
  event,
@@ -719,7 +780,10 @@ class Actor {
719
780
  }
720
781
  }
721
782
 
722
- // TODO: make private (and figure out a way to do this within the machine)
783
+ /**
784
+ * TODO: figure out a way to do this within the machine
785
+ * @internal
786
+ */
723
787
  cancel(sendId) {
724
788
  this.clock.clearTimeout(this.delayedEventsMap[sendId]);
725
789
  delete this.delayedEventsMap[sendId];
@@ -740,11 +804,26 @@ class Actor {
740
804
  };
741
805
  }
742
806
  getPersistedState() {
743
- return this.logic.getPersistedState?.(this._state);
807
+ return this.logic.getPersistedState(this._state);
744
808
  }
745
809
  [symbolObservable]() {
746
810
  return this;
747
811
  }
812
+
813
+ /**
814
+ * Read an actor’s snapshot synchronously.
815
+ *
816
+ * @remarks
817
+ * The snapshot represent an actor's last emitted value.
818
+ *
819
+ * When an actor receives an event, its internal state may change.
820
+ * An actor may emit a snapshot when a state transition occurs.
821
+ *
822
+ * Note that some actors, such as callback actors generated with `fromCallback`, will not emit snapshots.
823
+ *
824
+ * @see {@link Actor.subscribe} to subscribe to an actor’s snapshot values.
825
+ * @see {@link Actor.getPersistedState} to persist the internal state of an actor (which is more than just a snapshot).
826
+ */
748
827
  getSnapshot() {
749
828
  return this._state;
750
829
  }