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.
- package/actions/dist/xstate-actions.cjs.js +4 -3
- package/actions/dist/xstate-actions.cjs.mjs +1 -0
- package/actions/dist/xstate-actions.development.cjs.js +4 -3
- package/actions/dist/xstate-actions.development.cjs.mjs +1 -0
- package/actions/dist/xstate-actions.development.esm.js +3 -3
- package/actions/dist/xstate-actions.esm.js +3 -3
- package/actions/dist/xstate-actions.umd.min.js +1 -1
- package/actions/dist/xstate-actions.umd.min.js.map +1 -1
- package/actors/dist/xstate-actors.cjs.js +60 -3
- package/actors/dist/xstate-actors.development.cjs.js +60 -3
- package/actors/dist/xstate-actors.development.esm.js +60 -3
- package/actors/dist/xstate-actors.esm.js +60 -3
- package/actors/dist/xstate-actors.umd.min.js +1 -1
- package/actors/dist/xstate-actors.umd.min.js.map +1 -1
- package/dist/declarations/src/State.d.ts +2 -2
- package/dist/declarations/src/StateMachine.d.ts +7 -7
- package/dist/declarations/src/actions/assign.d.ts +4 -4
- package/dist/declarations/src/actions/cancel.d.ts +4 -4
- package/dist/declarations/src/actions/choose.d.ts +3 -3
- package/dist/declarations/src/actions/log.d.ts +4 -4
- package/dist/declarations/src/actions/pure.d.ts +4 -4
- package/dist/declarations/src/actions/raise.d.ts +3 -3
- package/dist/declarations/src/actions/send.d.ts +7 -7
- package/dist/declarations/src/actions/spawn.d.ts +34 -0
- package/dist/declarations/src/actions/stop.d.ts +4 -4
- package/dist/declarations/src/actions.d.ts +1 -0
- package/dist/declarations/src/actors/callback.d.ts +76 -2
- package/dist/declarations/src/actors/observable.d.ts +2 -3
- package/dist/declarations/src/actors/promise.d.ts +0 -1
- package/dist/declarations/src/actors/transition.d.ts +3 -3
- package/dist/declarations/src/guards.d.ts +9 -10
- package/dist/declarations/src/interpreter.d.ts +71 -10
- package/dist/declarations/src/spawn.d.ts +3 -4
- package/dist/declarations/src/stateUtils.d.ts +4 -9
- package/dist/declarations/src/types.d.ts +51 -62
- package/dist/{interpreter-e58ca48d.development.cjs.js → interpreter-03a5c3f5.development.cjs.js} +91 -12
- package/dist/{interpreter-8def682e.esm.js → interpreter-1e8c1c0c.esm.js} +91 -12
- package/dist/{interpreter-97aff8d2.cjs.js → interpreter-5dfcd203.cjs.js} +91 -12
- package/dist/{interpreter-1c52b23c.development.esm.js → interpreter-70cd9217.development.esm.js} +91 -12
- package/dist/{raise-1fd59c65.development.cjs.js → raise-17cb3d9d.development.cjs.js} +145 -152
- package/dist/{raise-800296d7.cjs.js → raise-291d2181.cjs.js} +145 -152
- package/dist/{raise-21c417c1.esm.js → raise-62de3670.esm.js} +145 -153
- package/dist/{raise-e342a840.development.esm.js → raise-e044f460.development.esm.js} +145 -153
- package/dist/{send-92854675.esm.js → send-1249d4ac.esm.js} +45 -44
- package/dist/{send-b309ef4e.development.cjs.js → send-33433787.development.cjs.js} +45 -44
- package/dist/{send-4cc29786.cjs.js → send-af152aca.cjs.js} +45 -44
- package/dist/{send-83ccc98b.development.esm.js → send-f1a2a827.development.esm.js} +45 -44
- package/dist/xstate.cjs.js +23 -20
- package/dist/xstate.cjs.mjs +1 -0
- package/dist/xstate.development.cjs.js +23 -20
- package/dist/xstate.development.cjs.mjs +1 -0
- package/dist/xstate.development.esm.js +25 -23
- package/dist/xstate.esm.js +25 -23
- package/dist/xstate.umd.min.js +1 -1
- package/dist/xstate.umd.min.js.map +1 -1
- package/guards/dist/xstate-guards.cjs.js +2 -2
- package/guards/dist/xstate-guards.development.cjs.js +2 -2
- package/guards/dist/xstate-guards.development.esm.js +2 -2
- package/guards/dist/xstate-guards.esm.js +2 -2
- package/guards/dist/xstate-guards.umd.min.js +1 -1
- package/guards/dist/xstate-guards.umd.min.js.map +1 -1
- 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,
|
|
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
|
|
79
|
-
export type OutputFrom<T extends AnyActorLogic> = T extends ActorLogic<infer TSnapshot, infer _TEvent, infer _TInput, infer
|
|
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,
|
|
83
|
-
(args: ActionArgs<TContext, TExpressionEvent,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
485
|
-
export type LogExpr<TContext extends MachineContext, TExpressionEvent extends EventObject,
|
|
486
|
-
export type SendExpr<TContext extends MachineContext, TExpressionEvent extends EventObject,
|
|
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,
|
|
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,
|
|
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,
|
|
498
|
+
delay?: Delay<TDelay> | DelayExpr<TContext, TExpressionEvent, TParams, TEvent>;
|
|
496
499
|
}
|
|
497
|
-
export interface RaiseActionParams<TContext extends MachineContext, TExpressionEvent extends EventObject,
|
|
498
|
-
event: TEvent | SendExpr<TContext, TExpressionEvent,
|
|
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,
|
|
501
|
-
event: TSentEvent | SendExpr<TContext, TExpressionEvent,
|
|
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,
|
|
504
|
-
export type PartialAssigner<TContext extends MachineContext, TExpressionEvent extends EventObject,
|
|
505
|
-
export type PropertyAssigner<TContext extends MachineContext, TExpressionEvent extends EventObject,
|
|
506
|
-
[K in keyof TContext]?: PartialAssigner<TContext, TExpressionEvent,
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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:
|
|
692
|
-
getInitialState: (
|
|
693
|
-
restoreState?: (persistedState:
|
|
694
|
-
start?: (state: TSnapshot,
|
|
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
|
|
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
|
|
706
|
-
export type EventFromLogic<TLogic extends ActorLogic<any, any, any, any
|
|
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 {};
|
package/dist/{interpreter-e58ca48d.development.cjs.js → interpreter-03a5c3f5.development.cjs.js}
RENAMED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
}
|