xstate 5.0.0-beta.48 → 5.0.0-beta.50
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 +2 -2
- package/actions/dist/xstate-actions.development.cjs.js +2 -2
- package/actions/dist/xstate-actions.development.esm.js +2 -2
- package/actions/dist/xstate-actions.esm.js +2 -2
- 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 +53 -74
- package/actors/dist/xstate-actors.development.cjs.js +53 -74
- package/actors/dist/xstate-actors.development.esm.js +53 -74
- package/actors/dist/xstate-actors.esm.js +53 -74
- 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 +20 -17
- package/dist/declarations/src/StateMachine.d.ts +13 -14
- package/dist/declarations/src/actors/callback.d.ts +6 -9
- package/dist/declarations/src/actors/index.d.ts +3 -3
- package/dist/declarations/src/actors/observable.d.ts +5 -5
- package/dist/declarations/src/actors/promise.d.ts +6 -6
- package/dist/declarations/src/actors/transition.d.ts +3 -3
- package/dist/declarations/src/createMachine.d.ts +17 -2
- package/dist/declarations/src/interpreter.d.ts +2 -2
- package/dist/declarations/src/setup.d.ts +19 -3
- package/dist/declarations/src/stateUtils.d.ts +1 -1
- package/dist/declarations/src/types.d.ts +19 -13
- package/dist/declarations/src/utils.d.ts +0 -1
- package/dist/{raise-84fd7a92.esm.js → raise-32ec7226.esm.js} +94 -33
- package/dist/{raise-286581d5.development.esm.js → raise-6c05c91b.development.esm.js} +94 -33
- package/dist/{raise-cd0dde81.cjs.js → raise-8176cd35.cjs.js} +93 -33
- package/dist/{raise-0eafc1df.development.cjs.js → raise-dc9c2c58.development.cjs.js} +93 -33
- package/dist/{send-f0a3179c.development.esm.js → send-2b001f05.development.esm.js} +2 -7
- package/dist/{send-355ba004.cjs.js → send-7f3db830.cjs.js} +2 -7
- package/dist/{send-ae491737.esm.js → send-88351a33.esm.js} +2 -7
- package/dist/{send-32a63473.development.cjs.js → send-df1c8ef2.development.cjs.js} +2 -7
- package/dist/xstate.cjs.js +11 -20
- package/dist/xstate.development.cjs.js +11 -20
- package/dist/xstate.development.esm.js +13 -22
- package/dist/xstate.esm.js +13 -22
- package/dist/xstate.umd.min.js +1 -1
- package/dist/xstate.umd.min.js.map +1 -1
- package/guards/dist/xstate-guards.cjs.js +1 -1
- package/guards/dist/xstate-guards.development.cjs.js +1 -1
- package/guards/dist/xstate-guards.development.esm.js +1 -1
- package/guards/dist/xstate-guards.esm.js +1 -1
- package/guards/dist/xstate-guards.umd.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import { ActorLogic, EventObject, AnyActorSystem, AnyEventObject, ActorSystem, ActorRefFrom, Snapshot } from "../types.js";
|
|
2
|
-
type CallbackSnapshot<TInput
|
|
1
|
+
import { ActorLogic, EventObject, AnyActorSystem, AnyEventObject, ActorSystem, ActorRefFrom, Snapshot, NonReducibleUnknown } from "../types.js";
|
|
2
|
+
export type CallbackSnapshot<TInput> = Snapshot<undefined> & {
|
|
3
3
|
input: TInput;
|
|
4
|
-
_receivers: Set<(e: TEvent) => void>;
|
|
5
|
-
_dispose: (() => void) | void;
|
|
6
4
|
};
|
|
7
|
-
export type CallbackActorLogic<TEvent extends EventObject, TInput =
|
|
8
|
-
export type CallbackActorRef<TEvent extends EventObject, TInput =
|
|
5
|
+
export type CallbackActorLogic<TEvent extends EventObject, TInput = NonReducibleUnknown> = ActorLogic<CallbackSnapshot<TInput>, TEvent, TInput, ActorSystem<any>>;
|
|
6
|
+
export type CallbackActorRef<TEvent extends EventObject, TInput = NonReducibleUnknown> = ActorRefFrom<CallbackActorLogic<TEvent, TInput>>;
|
|
9
7
|
export type Receiver<TEvent extends EventObject> = (listener: {
|
|
10
8
|
bivarianceHack(event: TEvent): void;
|
|
11
9
|
}['bivarianceHack']) => void;
|
|
12
|
-
export type InvokeCallback<TEvent extends EventObject = AnyEventObject, TSentEvent extends EventObject = AnyEventObject, TInput =
|
|
10
|
+
export type InvokeCallback<TEvent extends EventObject = AnyEventObject, TSentEvent extends EventObject = AnyEventObject, TInput = NonReducibleUnknown> = ({ input, system, self, sendBack, receive }: {
|
|
13
11
|
/**
|
|
14
12
|
* Data that was provided to the callback actor
|
|
15
13
|
* @see {@link https://stately.ai/docs/input | Input docs}
|
|
@@ -90,5 +88,4 @@ export type InvokeCallback<TEvent extends EventObject = AnyEventObject, TSentEve
|
|
|
90
88
|
* });
|
|
91
89
|
* ```
|
|
92
90
|
*/
|
|
93
|
-
export declare function fromCallback<TEvent extends EventObject, TInput =
|
|
94
|
-
export {};
|
|
91
|
+
export declare function fromCallback<TEvent extends EventObject, TInput = NonReducibleUnknown>(invokeCallback: InvokeCallback<TEvent, AnyEventObject, TInput>): CallbackActorLogic<TEvent, TInput>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ActorRef, AnyEventObject, Snapshot } from "../types.js";
|
|
2
|
-
export { fromCallback, type CallbackActorLogic } from "./callback.js";
|
|
3
|
-
export { fromEventObservable, fromObservable, type ObservableActorLogic } from "./observable.js";
|
|
4
|
-
export { fromPromise, type PromiseActorLogic } from "./promise.js";
|
|
2
|
+
export { fromCallback, type CallbackActorLogic, type CallbackSnapshot } from "./callback.js";
|
|
3
|
+
export { fromEventObservable, fromObservable, type ObservableActorLogic, type ObservableSnapshot } from "./observable.js";
|
|
4
|
+
export { fromPromise, type PromiseActorLogic, type PromiseSnapshot } from "./promise.js";
|
|
5
5
|
export { fromTransition, type TransitionActorLogic, type TransitionSnapshot } from "./transition.js";
|
|
6
6
|
export declare function createEmptyActor(): ActorRef<AnyEventObject, Snapshot<undefined>>;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Subscribable, ActorLogic, EventObject, Subscription, AnyActorSystem, ActorRefFrom, Snapshot } from "../types.js";
|
|
2
|
-
export type ObservableSnapshot<TContext, TInput> = Snapshot<undefined> & {
|
|
1
|
+
import { Subscribable, ActorLogic, EventObject, Subscription, AnyActorSystem, ActorRefFrom, Snapshot, NonReducibleUnknown } from "../types.js";
|
|
2
|
+
export type ObservableSnapshot<TContext, TInput extends NonReducibleUnknown> = Snapshot<undefined> & {
|
|
3
3
|
context: TContext | undefined;
|
|
4
4
|
input: TInput | undefined;
|
|
5
5
|
_subscription: Subscription | undefined;
|
|
6
6
|
};
|
|
7
|
-
export type ObservableActorLogic<TContext, TInput> = ActorLogic<ObservableSnapshot<TContext, TInput>, {
|
|
7
|
+
export type ObservableActorLogic<TContext, TInput extends NonReducibleUnknown> = ActorLogic<ObservableSnapshot<TContext, TInput>, {
|
|
8
8
|
type: string;
|
|
9
9
|
[k: string]: unknown;
|
|
10
10
|
}, TInput, AnyActorSystem>;
|
|
@@ -49,7 +49,7 @@ export type ObservableActorRef<TContext> = ActorRefFrom<ObservableActorLogic<TCo
|
|
|
49
49
|
* @see {@link https://rxjs.dev} for documentation on RxJS Observable and observable creators.
|
|
50
50
|
* @see {@link Subscribable} interface in XState, which is based on and compatible with RxJS Observable.
|
|
51
51
|
*/
|
|
52
|
-
export declare function fromObservable<TContext, TInput>(observableCreator: ({ input, system }: {
|
|
52
|
+
export declare function fromObservable<TContext, TInput extends NonReducibleUnknown>(observableCreator: ({ input, system }: {
|
|
53
53
|
input: TInput;
|
|
54
54
|
system: AnyActorSystem;
|
|
55
55
|
self: ObservableActorRef<TContext>;
|
|
@@ -98,7 +98,7 @@ export declare function fromObservable<TContext, TInput>(observableCreator: ({ i
|
|
|
98
98
|
* canvasActor.start();
|
|
99
99
|
* ```
|
|
100
100
|
*/
|
|
101
|
-
export declare function fromEventObservable<T extends EventObject, TInput>(lazyObservable: ({ input, system }: {
|
|
101
|
+
export declare function fromEventObservable<T extends EventObject, TInput extends NonReducibleUnknown>(lazyObservable: ({ input, system }: {
|
|
102
102
|
input: TInput;
|
|
103
103
|
system: AnyActorSystem;
|
|
104
104
|
self: ObservableActorRef<T>;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { ActorLogic, ActorRefFrom, ActorSystem, AnyActorSystem, Snapshot } from "../types.js";
|
|
2
1
|
import { XSTATE_STOP } from "../constants.js";
|
|
2
|
+
import { ActorLogic, ActorRefFrom, ActorSystem, AnyActorSystem, NonReducibleUnknown, Snapshot } from "../types.js";
|
|
3
3
|
export type PromiseSnapshot<TOutput, TInput> = Snapshot<TOutput> & {
|
|
4
4
|
input: TInput | undefined;
|
|
5
5
|
};
|
|
6
|
-
declare const
|
|
7
|
-
declare const
|
|
6
|
+
declare const XSTATE_PROMISE_RESOLVE = "xstate.promise.resolve";
|
|
7
|
+
declare const XSTATE_PROMISE_REJECT = "xstate.promise.reject";
|
|
8
8
|
export type PromiseActorEvents<T> = {
|
|
9
|
-
type: typeof
|
|
9
|
+
type: typeof XSTATE_PROMISE_RESOLVE;
|
|
10
10
|
data: T;
|
|
11
11
|
} | {
|
|
12
|
-
type: typeof
|
|
12
|
+
type: typeof XSTATE_PROMISE_REJECT;
|
|
13
13
|
data: any;
|
|
14
14
|
} | {
|
|
15
15
|
type: typeof XSTATE_STOP;
|
|
@@ -64,7 +64,7 @@ export type PromiseActorRef<TOutput> = ActorRefFrom<PromiseActorLogic<TOutput, u
|
|
|
64
64
|
* // }
|
|
65
65
|
* ```
|
|
66
66
|
*/
|
|
67
|
-
export declare function fromPromise<TOutput, TInput =
|
|
67
|
+
export declare function fromPromise<TOutput, TInput = NonReducibleUnknown>(promiseCreator: ({ input, system }: {
|
|
68
68
|
/**
|
|
69
69
|
* Data that was provided to the promise actor
|
|
70
70
|
*/
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ActorLogic, ActorScope, ActorSystem, EventObject, ActorRefFrom, AnyActorSystem, Snapshot } from "../types.js";
|
|
1
|
+
import { ActorLogic, ActorScope, ActorSystem, EventObject, ActorRefFrom, AnyActorSystem, Snapshot, NonReducibleUnknown } from "../types.js";
|
|
2
2
|
export type TransitionSnapshot<TContext> = Snapshot<undefined> & {
|
|
3
3
|
context: TContext;
|
|
4
4
|
};
|
|
5
|
-
export type TransitionActorLogic<TContext, TEvent extends EventObject, TInput> = ActorLogic<TransitionSnapshot<TContext>, TEvent, TInput, AnyActorSystem>;
|
|
5
|
+
export type TransitionActorLogic<TContext, TEvent extends EventObject, TInput extends NonReducibleUnknown> = ActorLogic<TransitionSnapshot<TContext>, TEvent, TInput, AnyActorSystem>;
|
|
6
6
|
export type TransitionActorRef<TContext, TEvent extends EventObject> = ActorRefFrom<TransitionActorLogic<TransitionSnapshot<TContext>, TEvent, unknown>>;
|
|
7
7
|
/**
|
|
8
8
|
* Returns actor logic given a transition function and its initial state.
|
|
@@ -62,7 +62,7 @@ export type TransitionActorRef<TContext, TEvent extends EventObject> = ActorRefF
|
|
|
62
62
|
* // }
|
|
63
63
|
* ```
|
|
64
64
|
*/
|
|
65
|
-
export declare function fromTransition<TContext, TEvent extends EventObject, TSystem extends ActorSystem<any>, TInput>(transition: (state: TContext, event: TEvent, actorScope: ActorScope<TransitionSnapshot<TContext>, TEvent, TSystem>) => TContext, initialContext: TContext | (({ input, self }: {
|
|
65
|
+
export declare function fromTransition<TContext, TEvent extends EventObject, TSystem extends ActorSystem<any>, TInput extends NonReducibleUnknown>(transition: (state: TContext, event: TEvent, actorScope: ActorScope<TransitionSnapshot<TContext>, TEvent, TSystem>) => TContext, initialContext: TContext | (({ input, self }: {
|
|
66
66
|
input: TInput;
|
|
67
67
|
self: TransitionActorRef<TContext, TEvent>;
|
|
68
68
|
}) => TContext)): TransitionActorLogic<TContext, TEvent, TInput>;
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import { StateMachine } from "./StateMachine.js";
|
|
2
2
|
import { ResolveTypegenMeta, TypegenConstraint, TypegenDisabled } from "./typegenTypes.js";
|
|
3
|
-
import { AnyActorRef, AnyEventObject, Cast, InternalMachineImplementations, MachineConfig, MachineContext, NonReducibleUnknown, ParameterizedObject, Prop, ProvidedActor, ToChildren } from "./types.js";
|
|
3
|
+
import { AnyActorRef, AnyEventObject, Cast, InternalMachineImplementations, IsNever, MachineConfig, MachineContext, NonReducibleUnknown, ParameterizedObject, Prop, ProvidedActor, StateValue, ToChildren } from "./types.js";
|
|
4
|
+
type TestValue = string | {
|
|
5
|
+
[k: string]: TestValue | undefined;
|
|
6
|
+
};
|
|
7
|
+
type _GroupTestValues<TTestValue extends string | TestValue> = TTestValue extends string ? TTestValue extends `${string}.${string}` ? [never, never] : [TTestValue, never] : [never, TTestValue];
|
|
8
|
+
type GroupTestValues<TTestValue extends string | TestValue> = {
|
|
9
|
+
leafCandidates: _GroupTestValues<TTestValue>[0];
|
|
10
|
+
nonLeaf: _GroupTestValues<TTestValue>[1];
|
|
11
|
+
};
|
|
12
|
+
type FilterLeafValues<TLeafCandidate extends string, TNonLeaf extends {
|
|
13
|
+
[k: string]: TestValue | undefined;
|
|
14
|
+
}> = IsNever<TNonLeaf> extends true ? TLeafCandidate : TLeafCandidate extends string ? TLeafCandidate extends keyof TNonLeaf ? never : TLeafCandidate : never;
|
|
15
|
+
type ToStateValue<TTestValue extends string | TestValue> = FilterLeafValues<GroupTestValues<TTestValue>['leafCandidates'], GroupTestValues<TTestValue>['nonLeaf']> | (IsNever<GroupTestValues<TTestValue>['nonLeaf']> extends false ? {
|
|
16
|
+
[K in keyof GroupTestValues<TTestValue>['nonLeaf']]: ToStateValue<NonNullable<GroupTestValues<TTestValue>['nonLeaf'][K]>>;
|
|
17
|
+
} : never);
|
|
4
18
|
export declare function createMachine<TContext extends MachineContext, TEvent extends AnyEventObject, // TODO: consider using a stricter `EventObject` here
|
|
5
|
-
TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string, TTag extends string, TInput, TOutput extends NonReducibleUnknown, TTypesMeta extends TypegenConstraint = TypegenDisabled>(config: MachineConfig<TContext, TEvent, TActor, TAction, TGuard, TDelay, TTag, TInput, TOutput, TTypesMeta>, implementations?: InternalMachineImplementations<TContext, ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>>): StateMachine<TContext, TEvent, Cast<ToChildren<TActor>, Record<string, AnyActorRef | undefined>>, TActor, TAction, TGuard, TDelay, Prop<ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>['resolved'], 'tags'> & string, TInput, TOutput, ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>>;
|
|
19
|
+
TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string, TTag extends string, TInput, TOutput extends NonReducibleUnknown, TTypesMeta extends TypegenConstraint = TypegenDisabled>(config: MachineConfig<TContext, TEvent, TActor, TAction, TGuard, TDelay, TTag, TInput, TOutput, TTypesMeta>, implementations?: InternalMachineImplementations<TContext, ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>>): StateMachine<TContext, TEvent, Cast<ToChildren<TActor>, Record<string, AnyActorRef | undefined>>, TActor, TAction, TGuard, TDelay, 'matchesStates' extends keyof TTypesMeta ? ToStateValue<Cast<TTypesMeta['matchesStates'], TestValue>> : StateValue, Prop<ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>['resolved'], 'tags'> & string, TInput, TOutput, ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>>;
|
|
20
|
+
export {};
|
|
@@ -124,6 +124,7 @@ export declare class Actor<TLogic extends AnyActorLogic> implements ActorRef<Eve
|
|
|
124
124
|
*/
|
|
125
125
|
stop(): this;
|
|
126
126
|
private _complete;
|
|
127
|
+
private _reportError;
|
|
127
128
|
private _error;
|
|
128
129
|
private _stopProcedure;
|
|
129
130
|
/**
|
|
@@ -199,8 +200,7 @@ export declare class Actor<TLogic extends AnyActorLogic> implements ActorRef<Eve
|
|
|
199
200
|
* @param logic - The actor logic to create an actor from. For a state machine actor logic creator, see {@link createMachine}. Other actor logic creators include {@link fromCallback}, {@link fromEventObservable}, {@link fromObservable}, {@link fromPromise}, and {@link fromTransition}.
|
|
200
201
|
* @param options - Actor options
|
|
201
202
|
*/
|
|
202
|
-
export declare function createActor<TLogic extends AnyActorLogic>(logic: TLogic, options?: ActorOptions<TLogic>): Actor<TLogic>;
|
|
203
|
-
export declare function createActor<TMachine extends AnyStateMachine>(machine: AreAllImplementationsAssumedToBeProvided<TMachine['__TResolvedTypesMeta']> extends true ? TMachine : MissingImplementationsError<TMachine['__TResolvedTypesMeta']>, options?: ActorOptions<TMachine>): Actor<TMachine>;
|
|
203
|
+
export declare function createActor<TLogic extends AnyActorLogic>(logic: TLogic extends AnyStateMachine ? AreAllImplementationsAssumedToBeProvided<TLogic['__TResolvedTypesMeta']> extends true ? TLogic : MissingImplementationsError<TLogic['__TResolvedTypesMeta']> : TLogic, options?: ActorOptions<TLogic>): Actor<TLogic>;
|
|
204
204
|
/**
|
|
205
205
|
* Creates a new Interpreter instance for the given machine with the provided options, if any.
|
|
206
206
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { StateMachine } from "./StateMachine.js";
|
|
2
2
|
import { GuardPredicate } from "./guards.js";
|
|
3
3
|
import { ResolveTypegenMeta, TypegenDisabled } from "./typegenTypes.js";
|
|
4
|
-
import { ActionFunction, AnyActorLogic, AnyActorRef, AnyEventObject, Cast, DelayConfig, Invert, IsNever, MachineConfig, MachineContext, NonReducibleUnknown, ParameterizedObject, SetupTypes, ToChildren, Values } from "./types.js";
|
|
4
|
+
import { ActionFunction, AnyActorLogic, AnyActorRef, AnyEventObject, Cast, ConditionalRequired, DelayConfig, Invert, IsNever, MachineConfig, MachineContext, NonReducibleUnknown, ParameterizedObject, SetupTypes, StateSchema, ToChildren, UnknownActorLogic, Values } from "./types.js";
|
|
5
5
|
type ToParameterizedObject<TParameterizedMap extends Record<string, ParameterizedObject['params'] | undefined>> = Values<{
|
|
6
6
|
[K in keyof TParameterizedMap & string]: {
|
|
7
7
|
type: K;
|
|
@@ -16,8 +16,24 @@ type ToProvidedActor<TChildrenMap extends Record<string, string>, TActors extend
|
|
|
16
16
|
id: IsNever<TChildrenMap> extends true ? string | undefined : K extends keyof Invert<TChildrenMap> ? Invert<TChildrenMap>[K] : string | undefined;
|
|
17
17
|
};
|
|
18
18
|
}>;
|
|
19
|
+
type _GroupStateKeys<T extends StateSchema, S extends keyof T['states']> = S extends any ? T['states'][S] extends {
|
|
20
|
+
type: 'history';
|
|
21
|
+
} ? [never, never] : T extends {
|
|
22
|
+
type: 'parallel';
|
|
23
|
+
} ? [S, never] : 'states' extends keyof T['states'][S] ? [S, never] : [never, S] : never;
|
|
24
|
+
type GroupStateKeys<T extends StateSchema, S extends keyof T['states']> = {
|
|
25
|
+
nonLeaf: _GroupStateKeys<T, S & string>[0];
|
|
26
|
+
leaf: _GroupStateKeys<T, S & string>[1];
|
|
27
|
+
};
|
|
28
|
+
type ToStateValue<T extends StateSchema> = T extends {
|
|
29
|
+
states: Record<infer S, any>;
|
|
30
|
+
} ? IsNever<S> extends true ? {} : GroupStateKeys<T, S>['leaf'] | (IsNever<GroupStateKeys<T, S>['nonLeaf']> extends false ? ConditionalRequired<{
|
|
31
|
+
[K in GroupStateKeys<T, S>['nonLeaf']]?: ToStateValue<T['states'][K]>;
|
|
32
|
+
}, T extends {
|
|
33
|
+
type: 'parallel';
|
|
34
|
+
} ? true : false> : never) : {};
|
|
19
35
|
export declare function setup<TContext extends MachineContext, TEvent extends AnyEventObject, // TODO: consider using a stricter `EventObject` here
|
|
20
|
-
TActors extends Record<Values<TChildrenMap>,
|
|
36
|
+
TActors extends Record<Values<TChildrenMap>, UnknownActorLogic>, TActions extends Record<string, ParameterizedObject['params'] | undefined>, TGuards extends Record<string, ParameterizedObject['params'] | undefined>, TDelay extends string, TTag extends string, TInput, TOutput extends NonReducibleUnknown, TChildrenMap extends Record<string, string> = never>({ actors, actions, guards, delays }: {
|
|
21
37
|
types?: SetupTypes<TContext, TEvent, TChildrenMap, TTag, TInput, TOutput>;
|
|
22
38
|
actors?: TActors;
|
|
23
39
|
actions?: {
|
|
@@ -30,6 +46,6 @@ TActors extends Record<Values<TChildrenMap>, AnyActorLogic>, TActions extends Re
|
|
|
30
46
|
[K in TDelay]: DelayConfig<TContext, TEvent, ToParameterizedObject<TActions>['params'], TEvent>;
|
|
31
47
|
};
|
|
32
48
|
}): {
|
|
33
|
-
createMachine: <const TConfig extends MachineConfig<TContext, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag, TInput, TOutput, ResolveTypegenMeta<TypegenDisabled, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag>>>(config: TConfig) => StateMachine<TContext, TEvent, Cast<ToChildren<ToProvidedActor<TChildrenMap, TActors>>, Record<string, AnyActorRef | undefined>>, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag, TInput, TOutput, ResolveTypegenMeta<TypegenDisabled, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag>>;
|
|
49
|
+
createMachine: <const TConfig extends MachineConfig<TContext, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag, TInput, TOutput, ResolveTypegenMeta<TypegenDisabled, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag>>>(config: TConfig) => StateMachine<TContext, TEvent, Cast<ToChildren<ToProvidedActor<TChildrenMap, TActors>>, Record<string, AnyActorRef | undefined>>, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, ToStateValue<TConfig>, TTag, TInput, TOutput, ResolveTypegenMeta<TypegenDisabled, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag>>;
|
|
34
50
|
};
|
|
35
51
|
export {};
|
|
@@ -40,7 +40,7 @@ export declare function getStateNodes<TContext extends MachineContext, TEvent ex
|
|
|
40
40
|
export declare function transitionAtomicNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: string, state: MachineSnapshot<TContext, TEvent, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
|
|
41
41
|
export declare function transitionCompoundNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: StateValueMap, state: MachineSnapshot<TContext, TEvent, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
|
|
42
42
|
export declare function transitionParallelNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: StateValueMap, state: MachineSnapshot<TContext, TEvent, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
|
|
43
|
-
export declare function transitionNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: StateValue, state: MachineSnapshot<TContext, TEvent, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
|
|
43
|
+
export declare function transitionNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: StateValue, state: MachineSnapshot<TContext, TEvent, any, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
|
|
44
44
|
export declare function removeConflictingTransitions(enabledTransitions: Array<AnyTransitionDefinition>, stateNodeSet: Set<AnyStateNode>, historyValue: AnyHistoryValue): Array<AnyTransitionDefinition>;
|
|
45
45
|
/**
|
|
46
46
|
* https://www.w3.org/TR/scxml/#microstepProcedure
|
|
@@ -81,13 +81,13 @@ export interface UnifiedArg<TContext extends MachineContext, TExpressionEvent ex
|
|
|
81
81
|
context: TContext;
|
|
82
82
|
event: TExpressionEvent;
|
|
83
83
|
self: ActorRef<TEvent, MachineSnapshot<TContext, TEvent, Record<string, AnyActorRef | undefined>, // TODO: this should be replaced with `TChildren`
|
|
84
|
-
string, unknown>>;
|
|
84
|
+
StateValue, string, unknown>>;
|
|
85
85
|
system: ActorSystem<any>;
|
|
86
86
|
}
|
|
87
87
|
export type MachineContext = Record<string, any>;
|
|
88
88
|
export interface ActionArgs<TContext extends MachineContext, TExpressionEvent extends EventObject, TEvent extends EventObject> extends UnifiedArg<TContext, TExpressionEvent, TEvent> {
|
|
89
89
|
}
|
|
90
|
-
export type InputFrom<T extends AnyActorLogic> = T extends StateMachine<infer _TContext, infer _TEvent, infer _TChildren, 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;
|
|
90
|
+
export type InputFrom<T extends AnyActorLogic> = T extends StateMachine<infer _TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TStateValue, infer _TTag, infer TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TInput : T extends ActorLogic<infer _TSnapshot, infer _TEvent, infer TInput, infer _TSystem> ? TInput : never;
|
|
91
91
|
export type OutputFrom<T extends AnyActorLogic> = T extends ActorLogic<infer TSnapshot, infer _TEvent, infer _TInput, infer _TSystem> ? (TSnapshot & {
|
|
92
92
|
status: 'done';
|
|
93
93
|
})['output'] : never;
|
|
@@ -349,7 +349,7 @@ export interface StateMachineDefinition<TContext extends MachineContext, TEvent
|
|
|
349
349
|
}
|
|
350
350
|
export type AnyStateNode = StateNode<any, any>;
|
|
351
351
|
export type AnyStateNodeDefinition = StateNodeDefinition<any, any>;
|
|
352
|
-
export type AnyMachineSnapshot = MachineSnapshot<any, any, any, any, any, any>;
|
|
352
|
+
export type AnyMachineSnapshot = MachineSnapshot<any, any, any, any, any, any, any>;
|
|
353
353
|
/** @deprecated use `AnyMachineSnapshot` instead */
|
|
354
354
|
export type AnyState = AnyMachineSnapshot;
|
|
355
355
|
export type AnyStateMachine = StateMachine<any, // context
|
|
@@ -359,6 +359,7 @@ any, // actor
|
|
|
359
359
|
any, // action
|
|
360
360
|
any, // guard
|
|
361
361
|
any, // delay
|
|
362
|
+
any, // state value
|
|
362
363
|
any, // tag
|
|
363
364
|
any, // input
|
|
364
365
|
any, // output
|
|
@@ -521,7 +522,7 @@ export type Mapper<TContext extends MachineContext, TExpressionEvent extends Eve
|
|
|
521
522
|
context: TContext;
|
|
522
523
|
event: TExpressionEvent;
|
|
523
524
|
self: ActorRef<TEvent, MachineSnapshot<TContext, TEvent, Record<string, AnyActorRef>, // TODO: this should be replaced with `TChildren`
|
|
524
|
-
string, unknown>>;
|
|
525
|
+
StateValue, string, unknown>>;
|
|
525
526
|
}) => TResult;
|
|
526
527
|
export interface TransitionDefinition<TContext extends MachineContext, TEvent extends EventObject> extends Omit<TransitionConfig<TContext, TEvent, TEvent, TODO, TODO, TODO, TODO>, 'target' | 'guard'> {
|
|
527
528
|
target: ReadonlyArray<StateNode<TContext, TEvent>> | undefined;
|
|
@@ -735,7 +736,7 @@ export interface ActorRef<TEvent extends EventObject, TSnapshot extends Snapshot
|
|
|
735
736
|
id: string;
|
|
736
737
|
sessionId: string;
|
|
737
738
|
send: (event: TEvent) => void;
|
|
738
|
-
start
|
|
739
|
+
start: () => void;
|
|
739
740
|
getSnapshot: () => TSnapshot;
|
|
740
741
|
getPersistedState: () => Snapshot<unknown>;
|
|
741
742
|
stop: () => void;
|
|
@@ -746,13 +747,13 @@ export interface ActorRef<TEvent extends EventObject, TSnapshot extends Snapshot
|
|
|
746
747
|
}
|
|
747
748
|
export type AnyActorRef = ActorRef<any, any>;
|
|
748
749
|
export type ActorLogicFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<any, any, any, any, any, any, any, any, any, any, any> ? R : R extends Promise<infer U> ? PromiseActorLogic<U> : never : never;
|
|
749
|
-
export type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer TEvent, infer TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TTag, infer _TInput, infer TOutput, infer TResolvedTypesMeta> ? ActorRef<TEvent, MachineSnapshot<TContext, TEvent, TChildren, 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;
|
|
750
|
+
export type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer TEvent, infer TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TStateValue, infer TTag, infer _TInput, infer TOutput, infer TResolvedTypesMeta> ? ActorRef<TEvent, MachineSnapshot<TContext, TEvent, TChildren, TStateValue, 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;
|
|
750
751
|
export type DevToolsAdapter = (service: AnyActor) => void;
|
|
751
752
|
/**
|
|
752
753
|
* @deprecated Use `Actor<T>` instead.
|
|
753
754
|
*/
|
|
754
|
-
export type InterpreterFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer TEvent, infer TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TTag, infer TInput, infer TOutput, infer TResolvedTypesMeta> ? Actor<ActorLogic<MachineSnapshot<TContext, TEvent, TChildren, TTag, TOutput, TResolvedTypesMeta>, TEvent, TInput, ActorSystem<any>>> : never;
|
|
755
|
-
export type MachineImplementationsFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine), TRequireMissingImplementations extends boolean = false> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer TResolvedTypesMeta> ? InternalMachineImplementations<TContext, TResolvedTypesMeta, TRequireMissingImplementations> : never;
|
|
755
|
+
export type InterpreterFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer TEvent, infer TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TStateValue, infer TTag, infer TInput, infer TOutput, infer TResolvedTypesMeta> ? Actor<ActorLogic<MachineSnapshot<TContext, TEvent, TChildren, TStateValue, TTag, TOutput, TResolvedTypesMeta>, TEvent, TInput, ActorSystem<any>>> : never;
|
|
756
|
+
export type MachineImplementationsFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine), TRequireMissingImplementations extends boolean = false> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TStateValue, infer _TTag, infer _TInput, infer _TOutput, infer TResolvedTypesMeta> ? InternalMachineImplementations<TContext, TResolvedTypesMeta, TRequireMissingImplementations> : never;
|
|
756
757
|
export type __ResolvedTypesMetaFrom<T> = T extends StateMachine<any, // context
|
|
757
758
|
any, // event
|
|
758
759
|
any, // children
|
|
@@ -799,7 +800,7 @@ export type Snapshot<TOutput> = {
|
|
|
799
800
|
* @template TInput - The type of the input.
|
|
800
801
|
* @template TSystem - The type of the actor system.
|
|
801
802
|
*/
|
|
802
|
-
export interface ActorLogic<TSnapshot extends Snapshot<unknown>, TEvent extends EventObject, TInput =
|
|
803
|
+
export interface ActorLogic<TSnapshot extends Snapshot<unknown>, TEvent extends EventObject, TInput = NonReducibleUnknown, TSystem extends ActorSystem<any> = ActorSystem<any>> {
|
|
803
804
|
/** The initial setup/configuration used to create the actor logic. */
|
|
804
805
|
config?: unknown;
|
|
805
806
|
/**
|
|
@@ -810,7 +811,7 @@ export interface ActorLogic<TSnapshot extends Snapshot<unknown>, TEvent extends
|
|
|
810
811
|
* @param ctx - The actor scope.
|
|
811
812
|
* @returns The new state.
|
|
812
813
|
*/
|
|
813
|
-
transition: (
|
|
814
|
+
transition: (snapshot: TSnapshot, message: TEvent, ctx: ActorScope<TSnapshot, TEvent, TSystem>) => TSnapshot;
|
|
814
815
|
/**
|
|
815
816
|
* Called to provide the initial state of the actor.
|
|
816
817
|
* @param actorScope - The actor scope.
|
|
@@ -844,11 +845,13 @@ export type AnyActorLogic = ActorLogic<any, // snapshot
|
|
|
844
845
|
any, // event
|
|
845
846
|
any, // input
|
|
846
847
|
any>;
|
|
847
|
-
export type
|
|
848
|
+
export type UnknownActorLogic = ActorLogic<any, // this is invariant and it's hard to figure out a better default than `any`
|
|
849
|
+
EventObject, NonReducibleUnknown, ActorSystem<any>>;
|
|
850
|
+
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 ActorLogic<infer _, infer __, infer ___, infer ____> ? ReturnType<R['transition']> : R extends ActorScope<infer TSnapshot, infer _, infer __> ? TSnapshot : never : never;
|
|
848
851
|
export type EventFromLogic<TLogic extends ActorLogic<any, any, any, any>> = TLogic extends ActorLogic<infer _, infer TEvent, infer __, infer _____> ? TEvent : never;
|
|
849
|
-
type ResolveEventType<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer _TContext, infer TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends MachineSnapshot<infer _TContext, infer TEvent, infer _TChildren, infer _TTag, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends ActorRef<infer TEvent, infer _> ? TEvent : never : never;
|
|
852
|
+
type ResolveEventType<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer _TContext, infer TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TStateValue, infer _TTag, infer _TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends MachineSnapshot<infer _TContext, infer TEvent, infer _TChildren, infer _TTag, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends ActorRef<infer TEvent, infer _> ? TEvent : never : never;
|
|
850
853
|
export type EventFrom<T, K extends Prop<TEvent, 'type'> = never, TEvent extends EventObject = ResolveEventType<T>> = IsNever<K> extends true ? TEvent : ExtractEvent<TEvent, K>;
|
|
851
|
-
export type ContextFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : R extends MachineSnapshot<infer TContext, infer _TEvent, infer _TChildren, infer _TTag, infer _TOutput, infer _TResolvedTypesMeta> ? TContext : R extends Actor<infer TActorLogic> ? TActorLogic extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : never : never : never;
|
|
854
|
+
export type ContextFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TStateValue, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : R extends MachineSnapshot<infer TContext, infer _TEvent, infer _TChildren, infer _TTag, infer _TOutput, infer _TResolvedTypesMeta> ? TContext : R extends Actor<infer TActorLogic> ? TActorLogic extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : never : never : never;
|
|
852
855
|
export type InferEvent<E extends EventObject> = {
|
|
853
856
|
[T in E['type']]: {
|
|
854
857
|
type: T;
|
|
@@ -878,4 +881,7 @@ export type ToChildren<TActor extends ProvidedActor> = string extends TActor['sr
|
|
|
878
881
|
};
|
|
879
882
|
exclude: {};
|
|
880
883
|
}[undefined extends TActor['id'] ? 'include' : string extends TActor['id'] ? 'include' : 'exclude']>;
|
|
884
|
+
export type StateSchema = {
|
|
885
|
+
states?: Record<string, StateSchema>;
|
|
886
|
+
};
|
|
881
887
|
export {};
|
|
@@ -21,7 +21,6 @@ export declare function mapFilterValues<T, P>(collection: {
|
|
|
21
21
|
*/
|
|
22
22
|
export declare function path<T extends Record<string, any>>(props: string[]): any;
|
|
23
23
|
export declare function toStatePaths(stateValue: StateValue | undefined): string[][];
|
|
24
|
-
export declare function flatten<T>(array: Array<T | T[]>): T[];
|
|
25
24
|
export declare function toArrayStrict<T>(value: readonly T[] | T): readonly T[];
|
|
26
25
|
export declare function toArray<T>(value: readonly T[] | T | undefined): readonly T[];
|
|
27
26
|
export declare function resolveOutput<TContext extends MachineContext, TExpressionEvent extends EventObject>(mapper: Mapper<TContext, TExpressionEvent, unknown, EventObject> | NonReducibleUnknown, context: TContext, event: TExpressionEvent, self: AnyActorRef): unknown;
|
|
@@ -248,9 +248,6 @@ function mapValues(collection, iteratee) {
|
|
|
248
248
|
}
|
|
249
249
|
return result;
|
|
250
250
|
}
|
|
251
|
-
function flatten(array) {
|
|
252
|
-
return [].concat(...array);
|
|
253
|
-
}
|
|
254
251
|
function toArrayStrict(value) {
|
|
255
252
|
if (isArray(value)) {
|
|
256
253
|
return value;
|
|
@@ -317,7 +314,7 @@ function resolveReferencedActor(machine, src) {
|
|
|
317
314
|
return machine.implementations.actors[src];
|
|
318
315
|
}
|
|
319
316
|
function getAllOwnEventDescriptors(snapshot) {
|
|
320
|
-
return [...new Set(
|
|
317
|
+
return [...new Set([...snapshot._nodes.flatMap(sn => sn.ownEvents)])];
|
|
321
318
|
}
|
|
322
319
|
|
|
323
320
|
const $$ACTOR_TYPE = 1;
|
|
@@ -452,7 +449,18 @@ class Actor {
|
|
|
452
449
|
}
|
|
453
450
|
}
|
|
454
451
|
_initState(persistedState) {
|
|
455
|
-
|
|
452
|
+
try {
|
|
453
|
+
this._state = persistedState ? this.logic.restoreState ? this.logic.restoreState(persistedState, this._actorScope) : persistedState : this.logic.getInitialState(this._actorScope, this.options?.input);
|
|
454
|
+
} catch (err) {
|
|
455
|
+
// if we get here then it means that we assign a value to this._state that is not of the correct type
|
|
456
|
+
// we can't get the true `TSnapshot & { status: 'error'; }`, it's impossible
|
|
457
|
+
// so right now this is a lie of sorts
|
|
458
|
+
this._state = {
|
|
459
|
+
status: 'error',
|
|
460
|
+
output: undefined,
|
|
461
|
+
error: err
|
|
462
|
+
};
|
|
463
|
+
}
|
|
456
464
|
}
|
|
457
465
|
update(snapshot, event) {
|
|
458
466
|
// Update state
|
|
@@ -461,17 +469,46 @@ class Actor {
|
|
|
461
469
|
// Execute deferred effects
|
|
462
470
|
let deferredFn;
|
|
463
471
|
while (deferredFn = this._deferred.shift()) {
|
|
464
|
-
deferredFn();
|
|
465
|
-
}
|
|
466
|
-
for (const observer of this.observers) {
|
|
467
472
|
try {
|
|
468
|
-
|
|
473
|
+
deferredFn();
|
|
469
474
|
} catch (err) {
|
|
470
|
-
|
|
475
|
+
// this error can only be caught when executing *initial* actions
|
|
476
|
+
// it's the only time when we call actions provided by the user through those deferreds
|
|
477
|
+
// when the actor is already running we always execute them synchronously while transitioning
|
|
478
|
+
// no "builtin deferred" should actually throw an error since they are either safe
|
|
479
|
+
// or the control flow is passed through the mailbox and errors should be caught by the `_process` used by the mailbox
|
|
480
|
+
this._deferred.length = 0;
|
|
481
|
+
this._state = {
|
|
482
|
+
...snapshot,
|
|
483
|
+
status: 'error',
|
|
484
|
+
error: err
|
|
485
|
+
};
|
|
471
486
|
}
|
|
472
487
|
}
|
|
473
488
|
switch (this._state.status) {
|
|
489
|
+
case 'active':
|
|
490
|
+
for (const observer of this.observers) {
|
|
491
|
+
try {
|
|
492
|
+
observer.next?.(snapshot);
|
|
493
|
+
} catch (err) {
|
|
494
|
+
reportUnhandledError(err);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
break;
|
|
474
498
|
case 'done':
|
|
499
|
+
// next observers are meant to be notified about done snapshots
|
|
500
|
+
// this can be seen as something that is different from how observable work
|
|
501
|
+
// but with observables `complete` callback is called without any arguments
|
|
502
|
+
// it's more ergonomic for XState to treat a done snapshot as a "next" value
|
|
503
|
+
// and the completion event as something that is separate,
|
|
504
|
+
// something that merely follows emitting that done snapshot
|
|
505
|
+
for (const observer of this.observers) {
|
|
506
|
+
try {
|
|
507
|
+
observer.next?.(snapshot);
|
|
508
|
+
} catch (err) {
|
|
509
|
+
reportUnhandledError(err);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
475
512
|
this._stopProcedure();
|
|
476
513
|
this._complete();
|
|
477
514
|
this._doneEvent = createDoneActorEvent(this.id, this._state.output);
|
|
@@ -480,11 +517,7 @@ class Actor {
|
|
|
480
517
|
}
|
|
481
518
|
break;
|
|
482
519
|
case 'error':
|
|
483
|
-
this._stopProcedure();
|
|
484
520
|
this._error(this._state.error);
|
|
485
|
-
if (this._parent) {
|
|
486
|
-
this.system._relay(this, this._parent, createErrorActorEvent(this.id, this._state.error));
|
|
487
|
-
}
|
|
488
521
|
break;
|
|
489
522
|
}
|
|
490
523
|
this.system._sendInspectionEvent({
|
|
@@ -574,7 +607,7 @@ class Actor {
|
|
|
574
607
|
this.subscribe({
|
|
575
608
|
next: snapshot => {
|
|
576
609
|
if (snapshot.status === 'active') {
|
|
577
|
-
this.
|
|
610
|
+
this.system._relay(this, this._parent, {
|
|
578
611
|
type: `xstate.snapshot.${this.id}`,
|
|
579
612
|
snapshot
|
|
580
613
|
});
|
|
@@ -603,18 +636,22 @@ class Actor {
|
|
|
603
636
|
// a state machine can be "done" upon initialization (it could reach a final state using initial microsteps)
|
|
604
637
|
// we still need to complete observers, flush deferreds etc
|
|
605
638
|
this.update(this._state, initEvent);
|
|
606
|
-
// fallthrough
|
|
607
|
-
case 'error':
|
|
608
639
|
// TODO: rethink cleanup of observers, mailbox, etc
|
|
609
640
|
return this;
|
|
641
|
+
case 'error':
|
|
642
|
+
this._error(this._state.error);
|
|
643
|
+
return this;
|
|
610
644
|
}
|
|
611
645
|
if (this.logic.start) {
|
|
612
646
|
try {
|
|
613
647
|
this.logic.start(this._state, this._actorScope);
|
|
614
648
|
} catch (err) {
|
|
615
|
-
this.
|
|
649
|
+
this._state = {
|
|
650
|
+
...this._state,
|
|
651
|
+
status: 'error',
|
|
652
|
+
error: err
|
|
653
|
+
};
|
|
616
654
|
this._error(err);
|
|
617
|
-
this._parent?.send(createErrorActorEvent(this.id, err));
|
|
618
655
|
return this;
|
|
619
656
|
}
|
|
620
657
|
}
|
|
@@ -630,7 +667,6 @@ class Actor {
|
|
|
630
667
|
return this;
|
|
631
668
|
}
|
|
632
669
|
_process(event) {
|
|
633
|
-
// TODO: reexamine what happens when an action (or a guard or smth) throws
|
|
634
670
|
let nextState;
|
|
635
671
|
let caughtError;
|
|
636
672
|
try {
|
|
@@ -645,9 +681,12 @@ class Actor {
|
|
|
645
681
|
const {
|
|
646
682
|
err
|
|
647
683
|
} = caughtError;
|
|
648
|
-
this.
|
|
684
|
+
this._state = {
|
|
685
|
+
...this._state,
|
|
686
|
+
status: 'error',
|
|
687
|
+
error: err
|
|
688
|
+
};
|
|
649
689
|
this._error(err);
|
|
650
|
-
this._parent?.send(createErrorActorEvent(this.id, err));
|
|
651
690
|
return;
|
|
652
691
|
}
|
|
653
692
|
this.update(nextState, event);
|
|
@@ -690,7 +729,7 @@ class Actor {
|
|
|
690
729
|
}
|
|
691
730
|
this.observers.clear();
|
|
692
731
|
}
|
|
693
|
-
|
|
732
|
+
_reportError(err) {
|
|
694
733
|
if (!this.observers.size) {
|
|
695
734
|
if (!this._parent) {
|
|
696
735
|
reportUnhandledError(err);
|
|
@@ -712,6 +751,18 @@ class Actor {
|
|
|
712
751
|
reportUnhandledError(err);
|
|
713
752
|
}
|
|
714
753
|
}
|
|
754
|
+
_error(err) {
|
|
755
|
+
this._stopProcedure();
|
|
756
|
+
this._reportError(err);
|
|
757
|
+
if (this._parent) {
|
|
758
|
+
this.system._relay(this, this._parent, createErrorActorEvent(this.id, err));
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
// TODO: atm children don't belong entirely to the actor so
|
|
762
|
+
// in a way - it's not even super aware of them
|
|
763
|
+
// so we can't stop them from here but we really should!
|
|
764
|
+
// right now, they are being stopped within the machine's transition
|
|
765
|
+
// but that could throw and leave us with "orphaned" active actors
|
|
715
766
|
_stopProcedure() {
|
|
716
767
|
if (this._processingStatus !== ProcessingStatus.Running) {
|
|
717
768
|
// Actor already stopped; do nothing
|
|
@@ -957,12 +1008,7 @@ function executeSpawn(actorScope, {
|
|
|
957
1008
|
if (actorRef._processingStatus === ProcessingStatus.Stopped) {
|
|
958
1009
|
return;
|
|
959
1010
|
}
|
|
960
|
-
|
|
961
|
-
actorRef.start?.();
|
|
962
|
-
} catch (err) {
|
|
963
|
-
actorScope.self.send(createErrorActorEvent(id, err));
|
|
964
|
-
return;
|
|
965
|
-
}
|
|
1011
|
+
actorRef.start();
|
|
966
1012
|
});
|
|
967
1013
|
}
|
|
968
1014
|
function spawnChild(...[src, {
|
|
@@ -2017,7 +2063,23 @@ function macrostep(state, event, actorScope, internalQueue = []) {
|
|
|
2017
2063
|
// Assume the state is at rest (no raised events)
|
|
2018
2064
|
// Determine the next state based on the next microstep
|
|
2019
2065
|
if (nextEvent.type !== XSTATE_INIT) {
|
|
2020
|
-
const
|
|
2066
|
+
const currentEvent = nextEvent;
|
|
2067
|
+
const isErr = isErrorActorEvent(currentEvent);
|
|
2068
|
+
const transitions = selectTransitions(currentEvent, nextState);
|
|
2069
|
+
if (isErr && !transitions.length) {
|
|
2070
|
+
// TODO: we should likely only allow transitions selected by very explicit descriptors
|
|
2071
|
+
// `*` shouldn't be matched, likely `xstate.error.*` shouldnt be either
|
|
2072
|
+
// similarly `xstate.error.actor.*` and `xstate.error.actor.todo.*` have to be considered too
|
|
2073
|
+
nextState = cloneMachineSnapshot(state, {
|
|
2074
|
+
status: 'error',
|
|
2075
|
+
error: currentEvent.data
|
|
2076
|
+
});
|
|
2077
|
+
states.push(nextState);
|
|
2078
|
+
return {
|
|
2079
|
+
state: nextState,
|
|
2080
|
+
microstates: states
|
|
2081
|
+
};
|
|
2082
|
+
}
|
|
2021
2083
|
nextState = microstep(transitions, state, actorScope, nextEvent, false, internalQueue);
|
|
2022
2084
|
states.push(nextState);
|
|
2023
2085
|
}
|
|
@@ -2131,10 +2193,9 @@ function createMachineSnapshot(config, machine) {
|
|
|
2131
2193
|
context: config.context,
|
|
2132
2194
|
_nodes: config._nodes,
|
|
2133
2195
|
value: getStateValue(machine.root, config._nodes),
|
|
2134
|
-
tags: new Set(
|
|
2196
|
+
tags: new Set(config._nodes.flatMap(sn => sn.tags)),
|
|
2135
2197
|
children: config.children,
|
|
2136
2198
|
historyValue: config.historyValue || {},
|
|
2137
|
-
// this one is generic in the target and it's hard to create a matching non-generic source signature
|
|
2138
2199
|
matches: machineSnapshotMatches,
|
|
2139
2200
|
hasTag: machineSnapshotHasTag,
|
|
2140
2201
|
can: machineSnapshotCan,
|
|
@@ -2258,4 +2319,4 @@ function raise(eventOrExpr, options) {
|
|
|
2258
2319
|
return raise;
|
|
2259
2320
|
}
|
|
2260
2321
|
|
|
2261
|
-
export { $$ACTOR_TYPE as $,
|
|
2322
|
+
export { $$ACTOR_TYPE as $, Actor as A, interpret as B, isMachineSnapshot as C, matchesState as D, pathToStateValue as E, toObserver as F, getAllOwnEventDescriptors as G, and as H, not as I, or as J, stateIn as K, cancel as L, raise as M, NULL_EVENT as N, stop as O, stopChild as P, spawnChild as Q, ProcessingStatus as R, STATE_DELIMITER as S, cloneMachineSnapshot as T, XSTATE_ERROR as U, createErrorActorEvent as V, XSTATE_STOP as X, toTransitionConfigArray as a, formatTransition as b, createInvokeId as c, formatInitialTransition as d, evaluateGuard as e, formatTransitions as f, getDelayedTransitions as g, getCandidates as h, getAllStateNodes as i, getStateNodes as j, createMachineSnapshot as k, isInFinalState as l, mapValues as m, macrostep as n, transitionNode as o, resolveActionsAndContext as p, createInitEvent as q, resolveStateValue as r, microstep as s, toArray as t, getInitialStateNodes as u, isStateId as v, getStateNodeByPath as w, getPersistedState as x, resolveReferencedActor as y, createActor as z };
|