xstate 5.6.1 → 5.7.0
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 +1 -1
- package/actors/dist/xstate-actors.development.cjs.js +1 -1
- package/actors/dist/xstate-actors.development.esm.js +1 -1
- package/actors/dist/xstate-actors.esm.js +1 -1
- 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/index.d.ts +3 -2
- package/dist/declarations/src/inspection.d.ts +38 -0
- package/dist/declarations/src/system.d.ts +2 -25
- package/dist/declarations/src/types.d.ts +2 -1
- package/dist/{log-75c83841.development.cjs.js → log-9b34dd45.development.cjs.js} +1 -1
- package/dist/{log-c5c46d15.cjs.js → log-c2d7ade7.cjs.js} +1 -1
- package/dist/{log-edca19d9.development.esm.js → log-dc9ca1e2.development.esm.js} +1 -1
- package/dist/{log-b6ecfc82.esm.js → log-f78f0918.esm.js} +1 -1
- package/dist/{raise-d7d9caaa.development.cjs.js → raise-0ce4ccae.development.cjs.js} +55 -26
- package/dist/{raise-2fdbadc6.development.esm.js → raise-4593d184.development.esm.js} +55 -26
- package/dist/{raise-309d511a.esm.js → raise-6420fe44.esm.js} +55 -26
- package/dist/{raise-540fdaf2.cjs.js → raise-932934e8.cjs.js} +55 -26
- package/dist/xstate.cjs.js +7 -2
- package/dist/xstate.cjs.mjs +1 -0
- package/dist/xstate.development.cjs.js +7 -2
- package/dist/xstate.development.cjs.mjs +1 -0
- package/dist/xstate.development.esm.js +9 -5
- package/dist/xstate.esm.js +9 -5
- 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,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { InspectionEvent } from "./inspection.js";
|
|
2
|
+
import { ActorSystemInfo, AnyActorRef, Observer, EventObject } from "./types.js";
|
|
2
3
|
export interface ScheduledEvent {
|
|
3
4
|
id: string;
|
|
4
5
|
event: EventObject;
|
|
@@ -30,27 +31,3 @@ export declare function createSystem<T extends ActorSystemInfo>(rootActor: AnyAc
|
|
|
30
31
|
clock: Clock;
|
|
31
32
|
snapshot?: unknown;
|
|
32
33
|
}): ActorSystem<T>;
|
|
33
|
-
export interface BaseInspectionEventProperties {
|
|
34
|
-
rootId: string;
|
|
35
|
-
/**
|
|
36
|
-
* The relevant actorRef for the inspection event.
|
|
37
|
-
* - For snapshot events, this is the `actorRef` of the snapshot.
|
|
38
|
-
* - For event events, this is the target `actorRef` (recipient of event).
|
|
39
|
-
* - For actor events, this is the `actorRef` of the registered actor.
|
|
40
|
-
*/
|
|
41
|
-
actorRef: AnyActorRef;
|
|
42
|
-
}
|
|
43
|
-
export interface InspectedSnapshotEvent extends BaseInspectionEventProperties {
|
|
44
|
-
type: '@xstate.snapshot';
|
|
45
|
-
event: AnyEventObject;
|
|
46
|
-
snapshot: Snapshot<unknown>;
|
|
47
|
-
}
|
|
48
|
-
export interface InspectedEventEvent extends BaseInspectionEventProperties {
|
|
49
|
-
type: '@xstate.event';
|
|
50
|
-
sourceRef: AnyActorRef | undefined;
|
|
51
|
-
event: AnyEventObject;
|
|
52
|
-
}
|
|
53
|
-
export interface InspectedActorEvent extends BaseInspectionEventProperties {
|
|
54
|
-
type: '@xstate.actor';
|
|
55
|
-
}
|
|
56
|
-
export type InspectionEvent = InspectedSnapshotEvent | InspectedEventEvent | InspectedActorEvent;
|
|
@@ -6,7 +6,8 @@ import { PromiseActorLogic } from "./actors/promise.js";
|
|
|
6
6
|
import { Guard, GuardPredicate, UnknownGuard } from "./guards.js";
|
|
7
7
|
import type { Actor } from "./createActor.js";
|
|
8
8
|
import { Spawner } from "./spawn.js";
|
|
9
|
-
import { AnyActorSystem,
|
|
9
|
+
import { AnyActorSystem, Clock } from './system.js';
|
|
10
|
+
import { InspectionEvent } from "./inspection.js";
|
|
10
11
|
import { ResolveTypegenMeta, TypegenConstraint, TypegenDisabled } from "./typegenTypes.js";
|
|
11
12
|
export type Identity<T> = {
|
|
12
13
|
[K in keyof T]: T[K];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var guards_dist_xstateGuards = require('./raise-
|
|
3
|
+
var guards_dist_xstateGuards = require('./raise-0ce4ccae.development.cjs.js');
|
|
4
4
|
|
|
5
5
|
// it's likely-ish that `(TActor & { src: TSrc })['logic']` would be faster
|
|
6
6
|
// but it's only possible to do it since https://github.com/microsoft/TypeScript/pull/53098 (TS 5.1)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var guards_dist_xstateGuards = require('./raise-
|
|
3
|
+
var guards_dist_xstateGuards = require('./raise-932934e8.cjs.js');
|
|
4
4
|
|
|
5
5
|
// it's likely-ish that `(TActor & { src: TSrc })['logic']` would be faster
|
|
6
6
|
// but it's only possible to do it since https://github.com/microsoft/TypeScript/pull/53098 (TS 5.1)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { T as ProcessingStatus, z as resolveReferencedActor, A as createActor, U as cloneMachineSnapshot, V as XSTATE_ERROR, W as createErrorActorEvent, e as evaluateGuard, M as cancel, O as raise, P as spawnChild, R as stopChild } from './raise-
|
|
1
|
+
import { T as ProcessingStatus, z as resolveReferencedActor, A as createActor, U as cloneMachineSnapshot, V as XSTATE_ERROR, W as createErrorActorEvent, e as evaluateGuard, M as cancel, O as raise, P as spawnChild, R as stopChild } from './raise-4593d184.development.esm.js';
|
|
2
2
|
|
|
3
3
|
// it's likely-ish that `(TActor & { src: TSrc })['logic']` would be faster
|
|
4
4
|
// but it's only possible to do it since https://github.com/microsoft/TypeScript/pull/53098 (TS 5.1)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { T as ProcessingStatus, z as resolveReferencedActor, A as createActor, U as cloneMachineSnapshot, V as XSTATE_ERROR, W as createErrorActorEvent, e as evaluateGuard, M as cancel, O as raise, P as spawnChild, R as stopChild } from './raise-
|
|
1
|
+
import { T as ProcessingStatus, z as resolveReferencedActor, A as createActor, U as cloneMachineSnapshot, V as XSTATE_ERROR, W as createErrorActorEvent, e as evaluateGuard, M as cancel, O as raise, P as spawnChild, R as stopChild } from './raise-6420fe44.esm.js';
|
|
2
2
|
|
|
3
3
|
// it's likely-ish that `(TActor & { src: TSrc })['logic']` would be faster
|
|
4
4
|
// but it's only possible to do it since https://github.com/microsoft/TypeScript/pull/53098 (TS 5.1)
|
|
@@ -136,7 +136,7 @@ function createSystem(rootActor, options) {
|
|
|
136
136
|
const children = new Map();
|
|
137
137
|
const keyedActors = new Map();
|
|
138
138
|
const reverseKeyedActors = new WeakMap();
|
|
139
|
-
const
|
|
139
|
+
const inspectionObservers = new Set();
|
|
140
140
|
const timerMap = {};
|
|
141
141
|
const clock = options.clock;
|
|
142
142
|
const scheduler = {
|
|
@@ -174,6 +174,16 @@ function createSystem(rootActor, options) {
|
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
};
|
|
177
|
+
const sendInspectionEvent = event => {
|
|
178
|
+
if (!inspectionObservers.size) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const resolvedInspectionEvent = {
|
|
182
|
+
...event,
|
|
183
|
+
rootId: rootActor.sessionId
|
|
184
|
+
};
|
|
185
|
+
inspectionObservers.forEach(observer => observer.next?.(resolvedInspectionEvent));
|
|
186
|
+
};
|
|
177
187
|
const system = {
|
|
178
188
|
_snapshot: {
|
|
179
189
|
_scheduledEvents: (options?.snapshot && options.snapshot.scheduler) ?? {}
|
|
@@ -203,15 +213,9 @@ function createSystem(rootActor, options) {
|
|
|
203
213
|
reverseKeyedActors.set(actorRef, systemId);
|
|
204
214
|
},
|
|
205
215
|
inspect: observer => {
|
|
206
|
-
|
|
207
|
-
},
|
|
208
|
-
_sendInspectionEvent: event => {
|
|
209
|
-
const resolvedInspectionEvent = {
|
|
210
|
-
...event,
|
|
211
|
-
rootId: rootActor.sessionId
|
|
212
|
-
};
|
|
213
|
-
observers.forEach(observer => observer.next?.(resolvedInspectionEvent));
|
|
216
|
+
inspectionObservers.add(observer);
|
|
214
217
|
},
|
|
218
|
+
_sendInspectionEvent: sendInspectionEvent,
|
|
215
219
|
_relay: (source, target, event) => {
|
|
216
220
|
system._sendInspectionEvent({
|
|
217
221
|
type: '@xstate.event',
|
|
@@ -230,16 +234,16 @@ function createSystem(rootActor, options) {
|
|
|
230
234
|
};
|
|
231
235
|
},
|
|
232
236
|
start: () => {
|
|
233
|
-
const
|
|
237
|
+
const scheduledEvents = system._snapshot._scheduledEvents;
|
|
234
238
|
system._snapshot._scheduledEvents = {};
|
|
235
|
-
for (const scheduledId in
|
|
239
|
+
for (const scheduledId in scheduledEvents) {
|
|
236
240
|
const {
|
|
237
241
|
source,
|
|
238
242
|
target,
|
|
239
243
|
event,
|
|
240
244
|
delay,
|
|
241
245
|
id
|
|
242
|
-
} =
|
|
246
|
+
} = scheduledEvents[scheduledId];
|
|
243
247
|
scheduler.schedule(source, target, event, delay, id);
|
|
244
248
|
}
|
|
245
249
|
}
|
|
@@ -1790,7 +1794,11 @@ function getStateNodeByPath(stateNode, statePath) {
|
|
|
1790
1794
|
*/
|
|
1791
1795
|
function getStateNodes(stateNode, stateValue) {
|
|
1792
1796
|
if (typeof stateValue === 'string') {
|
|
1793
|
-
|
|
1797
|
+
const childStateNode = stateNode.states[stateValue];
|
|
1798
|
+
if (!childStateNode) {
|
|
1799
|
+
throw new Error(`State '${stateValue}' does not exist on '${stateNode.id}'`);
|
|
1800
|
+
}
|
|
1801
|
+
return [stateNode, childStateNode];
|
|
1794
1802
|
}
|
|
1795
1803
|
const childStateKeys = Object.keys(stateValue);
|
|
1796
1804
|
const childStateNodes = childStateKeys.map(subStateKey => getStateNode(stateNode, subStateKey)).filter(Boolean);
|
|
@@ -2203,7 +2211,7 @@ function exitStates(currentSnapshot, event, actorScope, transitions, mutStateNod
|
|
|
2203
2211
|
}
|
|
2204
2212
|
return [nextSnapshot, changedHistory || historyValue];
|
|
2205
2213
|
}
|
|
2206
|
-
function
|
|
2214
|
+
function resolveAndExecuteActionsWithContext(currentSnapshot, event, actorScope, actions, extra, retries) {
|
|
2207
2215
|
const {
|
|
2208
2216
|
machine
|
|
2209
2217
|
} = currentSnapshot;
|
|
@@ -2228,12 +2236,23 @@ function resolveActionsAndContextWorker(currentSnapshot, event, actorScope, acti
|
|
|
2228
2236
|
context: intermediateSnapshot.context,
|
|
2229
2237
|
event
|
|
2230
2238
|
}) : action.params : undefined;
|
|
2239
|
+
function executeAction() {
|
|
2240
|
+
actorScope.system._sendInspectionEvent({
|
|
2241
|
+
type: '@xstate.action',
|
|
2242
|
+
actorRef: actorScope.self,
|
|
2243
|
+
action: {
|
|
2244
|
+
type: typeof action === 'string' ? action : typeof action === 'object' ? action.type : action.name || '(anonymous)',
|
|
2245
|
+
params: actionParams
|
|
2246
|
+
}
|
|
2247
|
+
});
|
|
2248
|
+
resolvedAction(actionArgs, actionParams);
|
|
2249
|
+
}
|
|
2231
2250
|
if (!('resolve' in resolvedAction)) {
|
|
2232
2251
|
if (actorScope.self._processingStatus === ProcessingStatus.Running) {
|
|
2233
|
-
|
|
2252
|
+
executeAction();
|
|
2234
2253
|
} else {
|
|
2235
2254
|
actorScope.defer(() => {
|
|
2236
|
-
|
|
2255
|
+
executeAction();
|
|
2237
2256
|
});
|
|
2238
2257
|
}
|
|
2239
2258
|
continue;
|
|
@@ -2254,14 +2273,14 @@ function resolveActionsAndContextWorker(currentSnapshot, event, actorScope, acti
|
|
|
2254
2273
|
}
|
|
2255
2274
|
}
|
|
2256
2275
|
if (actions) {
|
|
2257
|
-
intermediateSnapshot =
|
|
2276
|
+
intermediateSnapshot = resolveAndExecuteActionsWithContext(intermediateSnapshot, event, actorScope, actions, extra, retries);
|
|
2258
2277
|
}
|
|
2259
2278
|
}
|
|
2260
2279
|
return intermediateSnapshot;
|
|
2261
2280
|
}
|
|
2262
2281
|
function resolveActionsAndContext(currentSnapshot, event, actorScope, actions, internalQueue, deferredActorIds) {
|
|
2263
2282
|
const retries = deferredActorIds ? [] : undefined;
|
|
2264
|
-
const nextState =
|
|
2283
|
+
const nextState = resolveAndExecuteActionsWithContext(currentSnapshot, event, actorScope, actions, {
|
|
2265
2284
|
internalQueue,
|
|
2266
2285
|
deferredActorIds
|
|
2267
2286
|
}, retries);
|
|
@@ -2275,17 +2294,27 @@ function macrostep(snapshot, event, actorScope, internalQueue = []) {
|
|
|
2275
2294
|
throw new Error(`An event cannot have the wildcard type ('${WILDCARD}')`);
|
|
2276
2295
|
}
|
|
2277
2296
|
let nextSnapshot = snapshot;
|
|
2278
|
-
const
|
|
2297
|
+
const microstates = [];
|
|
2298
|
+
function addMicrostate(microstate, event, transitions) {
|
|
2299
|
+
actorScope.system._sendInspectionEvent({
|
|
2300
|
+
type: '@xstate.microstep',
|
|
2301
|
+
actorRef: actorScope.self,
|
|
2302
|
+
event,
|
|
2303
|
+
snapshot: microstate,
|
|
2304
|
+
_transitions: transitions
|
|
2305
|
+
});
|
|
2306
|
+
microstates.push(microstate);
|
|
2307
|
+
}
|
|
2279
2308
|
|
|
2280
2309
|
// Handle stop event
|
|
2281
2310
|
if (event.type === XSTATE_STOP) {
|
|
2282
2311
|
nextSnapshot = cloneMachineSnapshot(stopChildren(nextSnapshot, event, actorScope), {
|
|
2283
2312
|
status: 'stopped'
|
|
2284
2313
|
});
|
|
2285
|
-
|
|
2314
|
+
addMicrostate(nextSnapshot, event, []);
|
|
2286
2315
|
return {
|
|
2287
2316
|
snapshot: nextSnapshot,
|
|
2288
|
-
microstates
|
|
2317
|
+
microstates
|
|
2289
2318
|
};
|
|
2290
2319
|
}
|
|
2291
2320
|
let nextEvent = event;
|
|
@@ -2304,16 +2333,16 @@ function macrostep(snapshot, event, actorScope, internalQueue = []) {
|
|
|
2304
2333
|
status: 'error',
|
|
2305
2334
|
error: currentEvent.error
|
|
2306
2335
|
});
|
|
2307
|
-
|
|
2336
|
+
addMicrostate(nextSnapshot, currentEvent, []);
|
|
2308
2337
|
return {
|
|
2309
2338
|
snapshot: nextSnapshot,
|
|
2310
|
-
microstates
|
|
2339
|
+
microstates
|
|
2311
2340
|
};
|
|
2312
2341
|
}
|
|
2313
2342
|
nextSnapshot = microstep(transitions, snapshot, actorScope, nextEvent, false,
|
|
2314
2343
|
// isInitial
|
|
2315
2344
|
internalQueue);
|
|
2316
|
-
|
|
2345
|
+
addMicrostate(nextSnapshot, currentEvent, transitions);
|
|
2317
2346
|
}
|
|
2318
2347
|
let shouldSelectEventlessTransitions = true;
|
|
2319
2348
|
while (nextSnapshot.status === 'active') {
|
|
@@ -2331,14 +2360,14 @@ function macrostep(snapshot, event, actorScope, internalQueue = []) {
|
|
|
2331
2360
|
}
|
|
2332
2361
|
nextSnapshot = microstep(enabledTransitions, nextSnapshot, actorScope, nextEvent, false, internalQueue);
|
|
2333
2362
|
shouldSelectEventlessTransitions = nextSnapshot !== previousState;
|
|
2334
|
-
|
|
2363
|
+
addMicrostate(nextSnapshot, nextEvent, enabledTransitions);
|
|
2335
2364
|
}
|
|
2336
2365
|
if (nextSnapshot.status !== 'active') {
|
|
2337
2366
|
stopChildren(nextSnapshot, nextEvent, actorScope);
|
|
2338
2367
|
}
|
|
2339
2368
|
return {
|
|
2340
2369
|
snapshot: nextSnapshot,
|
|
2341
|
-
microstates
|
|
2370
|
+
microstates
|
|
2342
2371
|
};
|
|
2343
2372
|
}
|
|
2344
2373
|
function stopChildren(nextState, event, actorScope) {
|
|
@@ -134,7 +134,7 @@ function createSystem(rootActor, options) {
|
|
|
134
134
|
const children = new Map();
|
|
135
135
|
const keyedActors = new Map();
|
|
136
136
|
const reverseKeyedActors = new WeakMap();
|
|
137
|
-
const
|
|
137
|
+
const inspectionObservers = new Set();
|
|
138
138
|
const timerMap = {};
|
|
139
139
|
const clock = options.clock;
|
|
140
140
|
const scheduler = {
|
|
@@ -172,6 +172,16 @@ function createSystem(rootActor, options) {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
};
|
|
175
|
+
const sendInspectionEvent = event => {
|
|
176
|
+
if (!inspectionObservers.size) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const resolvedInspectionEvent = {
|
|
180
|
+
...event,
|
|
181
|
+
rootId: rootActor.sessionId
|
|
182
|
+
};
|
|
183
|
+
inspectionObservers.forEach(observer => observer.next?.(resolvedInspectionEvent));
|
|
184
|
+
};
|
|
175
185
|
const system = {
|
|
176
186
|
_snapshot: {
|
|
177
187
|
_scheduledEvents: (options?.snapshot && options.snapshot.scheduler) ?? {}
|
|
@@ -201,15 +211,9 @@ function createSystem(rootActor, options) {
|
|
|
201
211
|
reverseKeyedActors.set(actorRef, systemId);
|
|
202
212
|
},
|
|
203
213
|
inspect: observer => {
|
|
204
|
-
|
|
205
|
-
},
|
|
206
|
-
_sendInspectionEvent: event => {
|
|
207
|
-
const resolvedInspectionEvent = {
|
|
208
|
-
...event,
|
|
209
|
-
rootId: rootActor.sessionId
|
|
210
|
-
};
|
|
211
|
-
observers.forEach(observer => observer.next?.(resolvedInspectionEvent));
|
|
214
|
+
inspectionObservers.add(observer);
|
|
212
215
|
},
|
|
216
|
+
_sendInspectionEvent: sendInspectionEvent,
|
|
213
217
|
_relay: (source, target, event) => {
|
|
214
218
|
system._sendInspectionEvent({
|
|
215
219
|
type: '@xstate.event',
|
|
@@ -228,16 +232,16 @@ function createSystem(rootActor, options) {
|
|
|
228
232
|
};
|
|
229
233
|
},
|
|
230
234
|
start: () => {
|
|
231
|
-
const
|
|
235
|
+
const scheduledEvents = system._snapshot._scheduledEvents;
|
|
232
236
|
system._snapshot._scheduledEvents = {};
|
|
233
|
-
for (const scheduledId in
|
|
237
|
+
for (const scheduledId in scheduledEvents) {
|
|
234
238
|
const {
|
|
235
239
|
source,
|
|
236
240
|
target,
|
|
237
241
|
event,
|
|
238
242
|
delay,
|
|
239
243
|
id
|
|
240
|
-
} =
|
|
244
|
+
} = scheduledEvents[scheduledId];
|
|
241
245
|
scheduler.schedule(source, target, event, delay, id);
|
|
242
246
|
}
|
|
243
247
|
}
|
|
@@ -1788,7 +1792,11 @@ function getStateNodeByPath(stateNode, statePath) {
|
|
|
1788
1792
|
*/
|
|
1789
1793
|
function getStateNodes(stateNode, stateValue) {
|
|
1790
1794
|
if (typeof stateValue === 'string') {
|
|
1791
|
-
|
|
1795
|
+
const childStateNode = stateNode.states[stateValue];
|
|
1796
|
+
if (!childStateNode) {
|
|
1797
|
+
throw new Error(`State '${stateValue}' does not exist on '${stateNode.id}'`);
|
|
1798
|
+
}
|
|
1799
|
+
return [stateNode, childStateNode];
|
|
1792
1800
|
}
|
|
1793
1801
|
const childStateKeys = Object.keys(stateValue);
|
|
1794
1802
|
const childStateNodes = childStateKeys.map(subStateKey => getStateNode(stateNode, subStateKey)).filter(Boolean);
|
|
@@ -2201,7 +2209,7 @@ function exitStates(currentSnapshot, event, actorScope, transitions, mutStateNod
|
|
|
2201
2209
|
}
|
|
2202
2210
|
return [nextSnapshot, changedHistory || historyValue];
|
|
2203
2211
|
}
|
|
2204
|
-
function
|
|
2212
|
+
function resolveAndExecuteActionsWithContext(currentSnapshot, event, actorScope, actions, extra, retries) {
|
|
2205
2213
|
const {
|
|
2206
2214
|
machine
|
|
2207
2215
|
} = currentSnapshot;
|
|
@@ -2226,12 +2234,23 @@ function resolveActionsAndContextWorker(currentSnapshot, event, actorScope, acti
|
|
|
2226
2234
|
context: intermediateSnapshot.context,
|
|
2227
2235
|
event
|
|
2228
2236
|
}) : action.params : undefined;
|
|
2237
|
+
function executeAction() {
|
|
2238
|
+
actorScope.system._sendInspectionEvent({
|
|
2239
|
+
type: '@xstate.action',
|
|
2240
|
+
actorRef: actorScope.self,
|
|
2241
|
+
action: {
|
|
2242
|
+
type: typeof action === 'string' ? action : typeof action === 'object' ? action.type : action.name || '(anonymous)',
|
|
2243
|
+
params: actionParams
|
|
2244
|
+
}
|
|
2245
|
+
});
|
|
2246
|
+
resolvedAction(actionArgs, actionParams);
|
|
2247
|
+
}
|
|
2229
2248
|
if (!('resolve' in resolvedAction)) {
|
|
2230
2249
|
if (actorScope.self._processingStatus === ProcessingStatus.Running) {
|
|
2231
|
-
|
|
2250
|
+
executeAction();
|
|
2232
2251
|
} else {
|
|
2233
2252
|
actorScope.defer(() => {
|
|
2234
|
-
|
|
2253
|
+
executeAction();
|
|
2235
2254
|
});
|
|
2236
2255
|
}
|
|
2237
2256
|
continue;
|
|
@@ -2252,14 +2271,14 @@ function resolveActionsAndContextWorker(currentSnapshot, event, actorScope, acti
|
|
|
2252
2271
|
}
|
|
2253
2272
|
}
|
|
2254
2273
|
if (actions) {
|
|
2255
|
-
intermediateSnapshot =
|
|
2274
|
+
intermediateSnapshot = resolveAndExecuteActionsWithContext(intermediateSnapshot, event, actorScope, actions, extra, retries);
|
|
2256
2275
|
}
|
|
2257
2276
|
}
|
|
2258
2277
|
return intermediateSnapshot;
|
|
2259
2278
|
}
|
|
2260
2279
|
function resolveActionsAndContext(currentSnapshot, event, actorScope, actions, internalQueue, deferredActorIds) {
|
|
2261
2280
|
const retries = deferredActorIds ? [] : undefined;
|
|
2262
|
-
const nextState =
|
|
2281
|
+
const nextState = resolveAndExecuteActionsWithContext(currentSnapshot, event, actorScope, actions, {
|
|
2263
2282
|
internalQueue,
|
|
2264
2283
|
deferredActorIds
|
|
2265
2284
|
}, retries);
|
|
@@ -2273,17 +2292,27 @@ function macrostep(snapshot, event, actorScope, internalQueue = []) {
|
|
|
2273
2292
|
throw new Error(`An event cannot have the wildcard type ('${WILDCARD}')`);
|
|
2274
2293
|
}
|
|
2275
2294
|
let nextSnapshot = snapshot;
|
|
2276
|
-
const
|
|
2295
|
+
const microstates = [];
|
|
2296
|
+
function addMicrostate(microstate, event, transitions) {
|
|
2297
|
+
actorScope.system._sendInspectionEvent({
|
|
2298
|
+
type: '@xstate.microstep',
|
|
2299
|
+
actorRef: actorScope.self,
|
|
2300
|
+
event,
|
|
2301
|
+
snapshot: microstate,
|
|
2302
|
+
_transitions: transitions
|
|
2303
|
+
});
|
|
2304
|
+
microstates.push(microstate);
|
|
2305
|
+
}
|
|
2277
2306
|
|
|
2278
2307
|
// Handle stop event
|
|
2279
2308
|
if (event.type === XSTATE_STOP) {
|
|
2280
2309
|
nextSnapshot = cloneMachineSnapshot(stopChildren(nextSnapshot, event, actorScope), {
|
|
2281
2310
|
status: 'stopped'
|
|
2282
2311
|
});
|
|
2283
|
-
|
|
2312
|
+
addMicrostate(nextSnapshot, event, []);
|
|
2284
2313
|
return {
|
|
2285
2314
|
snapshot: nextSnapshot,
|
|
2286
|
-
microstates
|
|
2315
|
+
microstates
|
|
2287
2316
|
};
|
|
2288
2317
|
}
|
|
2289
2318
|
let nextEvent = event;
|
|
@@ -2302,16 +2331,16 @@ function macrostep(snapshot, event, actorScope, internalQueue = []) {
|
|
|
2302
2331
|
status: 'error',
|
|
2303
2332
|
error: currentEvent.error
|
|
2304
2333
|
});
|
|
2305
|
-
|
|
2334
|
+
addMicrostate(nextSnapshot, currentEvent, []);
|
|
2306
2335
|
return {
|
|
2307
2336
|
snapshot: nextSnapshot,
|
|
2308
|
-
microstates
|
|
2337
|
+
microstates
|
|
2309
2338
|
};
|
|
2310
2339
|
}
|
|
2311
2340
|
nextSnapshot = microstep(transitions, snapshot, actorScope, nextEvent, false,
|
|
2312
2341
|
// isInitial
|
|
2313
2342
|
internalQueue);
|
|
2314
|
-
|
|
2343
|
+
addMicrostate(nextSnapshot, currentEvent, transitions);
|
|
2315
2344
|
}
|
|
2316
2345
|
let shouldSelectEventlessTransitions = true;
|
|
2317
2346
|
while (nextSnapshot.status === 'active') {
|
|
@@ -2329,14 +2358,14 @@ function macrostep(snapshot, event, actorScope, internalQueue = []) {
|
|
|
2329
2358
|
}
|
|
2330
2359
|
nextSnapshot = microstep(enabledTransitions, nextSnapshot, actorScope, nextEvent, false, internalQueue);
|
|
2331
2360
|
shouldSelectEventlessTransitions = nextSnapshot !== previousState;
|
|
2332
|
-
|
|
2361
|
+
addMicrostate(nextSnapshot, nextEvent, enabledTransitions);
|
|
2333
2362
|
}
|
|
2334
2363
|
if (nextSnapshot.status !== 'active') {
|
|
2335
2364
|
stopChildren(nextSnapshot, nextEvent, actorScope);
|
|
2336
2365
|
}
|
|
2337
2366
|
return {
|
|
2338
2367
|
snapshot: nextSnapshot,
|
|
2339
|
-
microstates
|
|
2368
|
+
microstates
|
|
2340
2369
|
};
|
|
2341
2370
|
}
|
|
2342
2371
|
function stopChildren(nextState, event, actorScope) {
|
|
@@ -134,7 +134,7 @@ function createSystem(rootActor, options) {
|
|
|
134
134
|
const children = new Map();
|
|
135
135
|
const keyedActors = new Map();
|
|
136
136
|
const reverseKeyedActors = new WeakMap();
|
|
137
|
-
const
|
|
137
|
+
const inspectionObservers = new Set();
|
|
138
138
|
const timerMap = {};
|
|
139
139
|
const clock = options.clock;
|
|
140
140
|
const scheduler = {
|
|
@@ -172,6 +172,16 @@ function createSystem(rootActor, options) {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
};
|
|
175
|
+
const sendInspectionEvent = event => {
|
|
176
|
+
if (!inspectionObservers.size) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const resolvedInspectionEvent = {
|
|
180
|
+
...event,
|
|
181
|
+
rootId: rootActor.sessionId
|
|
182
|
+
};
|
|
183
|
+
inspectionObservers.forEach(observer => observer.next?.(resolvedInspectionEvent));
|
|
184
|
+
};
|
|
175
185
|
const system = {
|
|
176
186
|
_snapshot: {
|
|
177
187
|
_scheduledEvents: (options?.snapshot && options.snapshot.scheduler) ?? {}
|
|
@@ -201,15 +211,9 @@ function createSystem(rootActor, options) {
|
|
|
201
211
|
reverseKeyedActors.set(actorRef, systemId);
|
|
202
212
|
},
|
|
203
213
|
inspect: observer => {
|
|
204
|
-
|
|
205
|
-
},
|
|
206
|
-
_sendInspectionEvent: event => {
|
|
207
|
-
const resolvedInspectionEvent = {
|
|
208
|
-
...event,
|
|
209
|
-
rootId: rootActor.sessionId
|
|
210
|
-
};
|
|
211
|
-
observers.forEach(observer => observer.next?.(resolvedInspectionEvent));
|
|
214
|
+
inspectionObservers.add(observer);
|
|
212
215
|
},
|
|
216
|
+
_sendInspectionEvent: sendInspectionEvent,
|
|
213
217
|
_relay: (source, target, event) => {
|
|
214
218
|
system._sendInspectionEvent({
|
|
215
219
|
type: '@xstate.event',
|
|
@@ -228,16 +232,16 @@ function createSystem(rootActor, options) {
|
|
|
228
232
|
};
|
|
229
233
|
},
|
|
230
234
|
start: () => {
|
|
231
|
-
const
|
|
235
|
+
const scheduledEvents = system._snapshot._scheduledEvents;
|
|
232
236
|
system._snapshot._scheduledEvents = {};
|
|
233
|
-
for (const scheduledId in
|
|
237
|
+
for (const scheduledId in scheduledEvents) {
|
|
234
238
|
const {
|
|
235
239
|
source,
|
|
236
240
|
target,
|
|
237
241
|
event,
|
|
238
242
|
delay,
|
|
239
243
|
id
|
|
240
|
-
} =
|
|
244
|
+
} = scheduledEvents[scheduledId];
|
|
241
245
|
scheduler.schedule(source, target, event, delay, id);
|
|
242
246
|
}
|
|
243
247
|
}
|
|
@@ -1743,7 +1747,11 @@ function getStateNodeByPath(stateNode, statePath) {
|
|
|
1743
1747
|
*/
|
|
1744
1748
|
function getStateNodes(stateNode, stateValue) {
|
|
1745
1749
|
if (typeof stateValue === 'string') {
|
|
1746
|
-
|
|
1750
|
+
const childStateNode = stateNode.states[stateValue];
|
|
1751
|
+
if (!childStateNode) {
|
|
1752
|
+
throw new Error(`State '${stateValue}' does not exist on '${stateNode.id}'`);
|
|
1753
|
+
}
|
|
1754
|
+
return [stateNode, childStateNode];
|
|
1747
1755
|
}
|
|
1748
1756
|
const childStateKeys = Object.keys(stateValue);
|
|
1749
1757
|
const childStateNodes = childStateKeys.map(subStateKey => getStateNode(stateNode, subStateKey)).filter(Boolean);
|
|
@@ -2156,7 +2164,7 @@ function exitStates(currentSnapshot, event, actorScope, transitions, mutStateNod
|
|
|
2156
2164
|
}
|
|
2157
2165
|
return [nextSnapshot, changedHistory || historyValue];
|
|
2158
2166
|
}
|
|
2159
|
-
function
|
|
2167
|
+
function resolveAndExecuteActionsWithContext(currentSnapshot, event, actorScope, actions, extra, retries) {
|
|
2160
2168
|
const {
|
|
2161
2169
|
machine
|
|
2162
2170
|
} = currentSnapshot;
|
|
@@ -2181,12 +2189,23 @@ function resolveActionsAndContextWorker(currentSnapshot, event, actorScope, acti
|
|
|
2181
2189
|
context: intermediateSnapshot.context,
|
|
2182
2190
|
event
|
|
2183
2191
|
}) : action.params : undefined;
|
|
2192
|
+
function executeAction() {
|
|
2193
|
+
actorScope.system._sendInspectionEvent({
|
|
2194
|
+
type: '@xstate.action',
|
|
2195
|
+
actorRef: actorScope.self,
|
|
2196
|
+
action: {
|
|
2197
|
+
type: typeof action === 'string' ? action : typeof action === 'object' ? action.type : action.name || '(anonymous)',
|
|
2198
|
+
params: actionParams
|
|
2199
|
+
}
|
|
2200
|
+
});
|
|
2201
|
+
resolvedAction(actionArgs, actionParams);
|
|
2202
|
+
}
|
|
2184
2203
|
if (!('resolve' in resolvedAction)) {
|
|
2185
2204
|
if (actorScope.self._processingStatus === ProcessingStatus.Running) {
|
|
2186
|
-
|
|
2205
|
+
executeAction();
|
|
2187
2206
|
} else {
|
|
2188
2207
|
actorScope.defer(() => {
|
|
2189
|
-
|
|
2208
|
+
executeAction();
|
|
2190
2209
|
});
|
|
2191
2210
|
}
|
|
2192
2211
|
continue;
|
|
@@ -2207,14 +2226,14 @@ function resolveActionsAndContextWorker(currentSnapshot, event, actorScope, acti
|
|
|
2207
2226
|
}
|
|
2208
2227
|
}
|
|
2209
2228
|
if (actions) {
|
|
2210
|
-
intermediateSnapshot =
|
|
2229
|
+
intermediateSnapshot = resolveAndExecuteActionsWithContext(intermediateSnapshot, event, actorScope, actions, extra, retries);
|
|
2211
2230
|
}
|
|
2212
2231
|
}
|
|
2213
2232
|
return intermediateSnapshot;
|
|
2214
2233
|
}
|
|
2215
2234
|
function resolveActionsAndContext(currentSnapshot, event, actorScope, actions, internalQueue, deferredActorIds) {
|
|
2216
2235
|
const retries = deferredActorIds ? [] : undefined;
|
|
2217
|
-
const nextState =
|
|
2236
|
+
const nextState = resolveAndExecuteActionsWithContext(currentSnapshot, event, actorScope, actions, {
|
|
2218
2237
|
internalQueue,
|
|
2219
2238
|
deferredActorIds
|
|
2220
2239
|
}, retries);
|
|
@@ -2225,17 +2244,27 @@ function resolveActionsAndContext(currentSnapshot, event, actorScope, actions, i
|
|
|
2225
2244
|
}
|
|
2226
2245
|
function macrostep(snapshot, event, actorScope, internalQueue = []) {
|
|
2227
2246
|
let nextSnapshot = snapshot;
|
|
2228
|
-
const
|
|
2247
|
+
const microstates = [];
|
|
2248
|
+
function addMicrostate(microstate, event, transitions) {
|
|
2249
|
+
actorScope.system._sendInspectionEvent({
|
|
2250
|
+
type: '@xstate.microstep',
|
|
2251
|
+
actorRef: actorScope.self,
|
|
2252
|
+
event,
|
|
2253
|
+
snapshot: microstate,
|
|
2254
|
+
_transitions: transitions
|
|
2255
|
+
});
|
|
2256
|
+
microstates.push(microstate);
|
|
2257
|
+
}
|
|
2229
2258
|
|
|
2230
2259
|
// Handle stop event
|
|
2231
2260
|
if (event.type === XSTATE_STOP) {
|
|
2232
2261
|
nextSnapshot = cloneMachineSnapshot(stopChildren(nextSnapshot, event, actorScope), {
|
|
2233
2262
|
status: 'stopped'
|
|
2234
2263
|
});
|
|
2235
|
-
|
|
2264
|
+
addMicrostate(nextSnapshot, event, []);
|
|
2236
2265
|
return {
|
|
2237
2266
|
snapshot: nextSnapshot,
|
|
2238
|
-
microstates
|
|
2267
|
+
microstates
|
|
2239
2268
|
};
|
|
2240
2269
|
}
|
|
2241
2270
|
let nextEvent = event;
|
|
@@ -2254,16 +2283,16 @@ function macrostep(snapshot, event, actorScope, internalQueue = []) {
|
|
|
2254
2283
|
status: 'error',
|
|
2255
2284
|
error: currentEvent.error
|
|
2256
2285
|
});
|
|
2257
|
-
|
|
2286
|
+
addMicrostate(nextSnapshot, currentEvent, []);
|
|
2258
2287
|
return {
|
|
2259
2288
|
snapshot: nextSnapshot,
|
|
2260
|
-
microstates
|
|
2289
|
+
microstates
|
|
2261
2290
|
};
|
|
2262
2291
|
}
|
|
2263
2292
|
nextSnapshot = microstep(transitions, snapshot, actorScope, nextEvent, false,
|
|
2264
2293
|
// isInitial
|
|
2265
2294
|
internalQueue);
|
|
2266
|
-
|
|
2295
|
+
addMicrostate(nextSnapshot, currentEvent, transitions);
|
|
2267
2296
|
}
|
|
2268
2297
|
let shouldSelectEventlessTransitions = true;
|
|
2269
2298
|
while (nextSnapshot.status === 'active') {
|
|
@@ -2281,14 +2310,14 @@ function macrostep(snapshot, event, actorScope, internalQueue = []) {
|
|
|
2281
2310
|
}
|
|
2282
2311
|
nextSnapshot = microstep(enabledTransitions, nextSnapshot, actorScope, nextEvent, false, internalQueue);
|
|
2283
2312
|
shouldSelectEventlessTransitions = nextSnapshot !== previousState;
|
|
2284
|
-
|
|
2313
|
+
addMicrostate(nextSnapshot, nextEvent, enabledTransitions);
|
|
2285
2314
|
}
|
|
2286
2315
|
if (nextSnapshot.status !== 'active') {
|
|
2287
2316
|
stopChildren(nextSnapshot, nextEvent, actorScope);
|
|
2288
2317
|
}
|
|
2289
2318
|
return {
|
|
2290
2319
|
snapshot: nextSnapshot,
|
|
2291
|
-
microstates
|
|
2320
|
+
microstates
|
|
2292
2321
|
};
|
|
2293
2322
|
}
|
|
2294
2323
|
function stopChildren(nextState, event, actorScope) {
|