xstate 5.0.0-beta.28 → 5.0.0-beta.30
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 +3 -3
- package/actions/dist/xstate-actions.development.cjs.js +3 -3
- 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 +104 -139
- package/actors/dist/xstate-actors.cjs.mjs +1 -3
- package/actors/dist/xstate-actors.development.cjs.js +104 -139
- package/actors/dist/xstate-actors.development.cjs.mjs +1 -3
- package/actors/dist/xstate-actors.development.esm.js +105 -138
- package/actors/dist/xstate-actors.esm.js +105 -138
- 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 +4 -6
- package/dist/declarations/src/StateMachine.d.ts +28 -21
- package/dist/declarations/src/StateNode.d.ts +1 -1
- 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 +1 -1
- package/dist/declarations/src/actions/raise.d.ts +2 -2
- package/dist/declarations/src/actions/send.d.ts +7 -7
- package/dist/declarations/src/actions/stop.d.ts +4 -4
- package/dist/declarations/src/actors/callback.d.ts +8 -8
- package/dist/declarations/src/actors/index.d.ts +3 -5
- package/dist/declarations/src/actors/observable.d.ts +12 -13
- package/dist/declarations/src/actors/promise.d.ts +11 -14
- package/dist/declarations/src/actors/transition.d.ts +10 -7
- package/dist/declarations/src/index.d.ts +1 -1
- package/dist/declarations/src/interpreter.d.ts +4 -4
- package/dist/declarations/src/stateUtils.d.ts +5 -6
- package/dist/declarations/src/types.d.ts +92 -70
- package/dist/{interpreter-a1432c7d.development.cjs.js → interpreter-7f1dc557.development.cjs.js} +9 -30
- package/dist/{interpreter-a77bb0ec.development.esm.js → interpreter-945c4b96.development.esm.js} +10 -28
- package/dist/{interpreter-672794ae.cjs.js → interpreter-a2c1e529.cjs.js} +9 -30
- package/dist/{interpreter-b5203bcb.esm.js → interpreter-b8f53c4b.esm.js} +10 -28
- package/dist/{raise-b9c9a234.esm.js → raise-0b7dde8b.esm.js} +13 -11
- package/dist/{raise-a60c9290.development.esm.js → raise-6e4f5cf7.development.esm.js} +13 -11
- package/dist/{raise-74b72ca5.development.cjs.js → raise-7cae872b.development.cjs.js} +13 -11
- package/dist/{raise-436a57a2.cjs.js → raise-e79b1f86.cjs.js} +13 -11
- package/dist/{send-e8b55d00.development.cjs.js → send-19a256f0.development.cjs.js} +2 -2
- package/dist/{send-e63b7b83.development.esm.js → send-a1d772da.development.esm.js} +2 -2
- package/dist/{send-35e1a689.cjs.js → send-e7063201.cjs.js} +2 -2
- package/dist/{send-4192e7bc.esm.js → send-f4fb3ba5.esm.js} +2 -2
- package/dist/xstate.cjs.js +20 -31
- package/dist/xstate.cjs.mjs +0 -2
- package/dist/xstate.development.cjs.js +20 -31
- package/dist/xstate.development.cjs.mjs +0 -2
- package/dist/xstate.development.esm.js +24 -33
- package/dist/xstate.esm.js +24 -33
- 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.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { X as XSTATE_INIT, j as
|
|
1
|
+
import { X as XSTATE_INIT, j as XSTATE_STOP, d as createActor } from '../../dist/interpreter-b8f53c4b.esm.js';
|
|
2
2
|
import '../../dev/dist/xstate-dev.esm.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -7,21 +7,28 @@ import '../../dev/dist/xstate-dev.esm.js';
|
|
|
7
7
|
* A transition function is a function that takes the current state and an event and returns the next state.
|
|
8
8
|
*
|
|
9
9
|
* @param transition The transition function that returns the next state given the current state and event.
|
|
10
|
-
* @param
|
|
10
|
+
* @param initialContext The initial state of the transition function.
|
|
11
11
|
* @returns Actor logic
|
|
12
12
|
*/
|
|
13
|
-
function fromTransition(transition,
|
|
13
|
+
function fromTransition(transition, initialContext) {
|
|
14
14
|
return {
|
|
15
15
|
config: transition,
|
|
16
16
|
transition: (state, event, actorContext) => {
|
|
17
|
-
return
|
|
17
|
+
return {
|
|
18
|
+
...state,
|
|
19
|
+
context: transition(state.context, event, actorContext)
|
|
20
|
+
};
|
|
18
21
|
},
|
|
19
22
|
getInitialState: (_, input) => {
|
|
20
|
-
return
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
return {
|
|
24
|
+
status: 'active',
|
|
25
|
+
output: undefined,
|
|
26
|
+
error: undefined,
|
|
27
|
+
context: typeof initialContext === 'function' ? initialContext({
|
|
28
|
+
input
|
|
29
|
+
}) : initialContext
|
|
30
|
+
};
|
|
23
31
|
},
|
|
24
|
-
getSnapshot: state => state,
|
|
25
32
|
getPersistedState: state => state,
|
|
26
33
|
restoreState: state => state
|
|
27
34
|
};
|
|
@@ -44,58 +51,52 @@ function fromCallback(invokeCallback) {
|
|
|
44
51
|
}) => {
|
|
45
52
|
if (event.type === XSTATE_INIT) {
|
|
46
53
|
const sendBack = eventForParent => {
|
|
47
|
-
if (state.
|
|
54
|
+
if (state.status === 'stopped') {
|
|
48
55
|
return;
|
|
49
56
|
}
|
|
50
57
|
self._parent?.send(eventForParent);
|
|
51
58
|
};
|
|
52
59
|
const receive = newListener => {
|
|
53
|
-
state.
|
|
60
|
+
state._receivers.add(newListener);
|
|
54
61
|
};
|
|
55
|
-
state.
|
|
62
|
+
state._dispose = invokeCallback({
|
|
56
63
|
input: state.input,
|
|
57
64
|
system,
|
|
58
65
|
self: self,
|
|
59
66
|
sendBack,
|
|
60
67
|
receive
|
|
61
68
|
});
|
|
62
|
-
if (isPromiseLike(state.dispose)) {
|
|
63
|
-
state.dispose.then(resolved => {
|
|
64
|
-
self._parent?.send(createDoneActorEvent(id, resolved));
|
|
65
|
-
state.canceled = true;
|
|
66
|
-
}, errorData => {
|
|
67
|
-
state.canceled = true;
|
|
68
|
-
self._parent?.send(createErrorActorEvent(id, errorData));
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
69
|
return state;
|
|
72
70
|
}
|
|
73
71
|
if (event.type === XSTATE_STOP) {
|
|
74
|
-
state
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
state = {
|
|
73
|
+
...state,
|
|
74
|
+
status: 'stopped',
|
|
75
|
+
error: undefined
|
|
76
|
+
};
|
|
77
|
+
if (typeof state._dispose === 'function') {
|
|
78
|
+
state._dispose();
|
|
77
79
|
}
|
|
78
80
|
return state;
|
|
79
81
|
}
|
|
80
|
-
state.
|
|
82
|
+
state._receivers.forEach(receiver => receiver(event));
|
|
81
83
|
return state;
|
|
82
84
|
},
|
|
83
85
|
getInitialState: (_, input) => {
|
|
84
86
|
return {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
input
|
|
87
|
+
status: 'active',
|
|
88
|
+
output: undefined,
|
|
89
|
+
error: undefined,
|
|
90
|
+
input,
|
|
91
|
+
_receivers: new Set(),
|
|
92
|
+
_dispose: undefined
|
|
89
93
|
};
|
|
90
94
|
},
|
|
91
|
-
getSnapshot: () => undefined,
|
|
92
95
|
getPersistedState: ({
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
canceled
|
|
98
|
-
})
|
|
96
|
+
_dispose,
|
|
97
|
+
_receivers,
|
|
98
|
+
...rest
|
|
99
|
+
}) => rest
|
|
99
100
|
};
|
|
100
101
|
}
|
|
101
102
|
|
|
@@ -105,62 +106,66 @@ function fromObservable(observableCreator) {
|
|
|
105
106
|
const completeEventType = '$$xstate.complete';
|
|
106
107
|
return {
|
|
107
108
|
config: observableCreator,
|
|
108
|
-
transition: (
|
|
109
|
+
transition: (snapshot, event, {
|
|
109
110
|
self,
|
|
110
111
|
id,
|
|
111
112
|
defer
|
|
112
113
|
}) => {
|
|
113
|
-
if (
|
|
114
|
-
return
|
|
114
|
+
if (snapshot.status !== 'active') {
|
|
115
|
+
return snapshot;
|
|
115
116
|
}
|
|
116
117
|
switch (event.type) {
|
|
117
118
|
case nextEventType:
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
119
|
+
{
|
|
120
|
+
const newSnapshot = {
|
|
121
|
+
...snapshot,
|
|
122
|
+
context: event.data
|
|
123
|
+
};
|
|
124
|
+
// match the exact timing of events sent by machines
|
|
125
|
+
// send actions are not executed immediately
|
|
126
|
+
defer(() => {
|
|
127
|
+
self._parent?.send({
|
|
128
|
+
type: `xstate.snapshot.${id}`,
|
|
129
|
+
data: newSnapshot
|
|
130
|
+
});
|
|
124
131
|
});
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
...state,
|
|
128
|
-
data: event.data
|
|
129
|
-
};
|
|
132
|
+
return newSnapshot;
|
|
133
|
+
}
|
|
130
134
|
case errorEventType:
|
|
131
135
|
return {
|
|
132
|
-
...
|
|
136
|
+
...snapshot,
|
|
133
137
|
status: 'error',
|
|
138
|
+
error: event.data,
|
|
134
139
|
input: undefined,
|
|
135
|
-
|
|
136
|
-
// TODO: if we keep this as `data` we should reflect this in the type
|
|
137
|
-
subscription: undefined
|
|
140
|
+
_subscription: undefined
|
|
138
141
|
};
|
|
139
142
|
case completeEventType:
|
|
140
143
|
return {
|
|
141
|
-
...
|
|
144
|
+
...snapshot,
|
|
142
145
|
status: 'done',
|
|
143
146
|
input: undefined,
|
|
144
|
-
|
|
147
|
+
_subscription: undefined
|
|
145
148
|
};
|
|
146
149
|
case XSTATE_STOP:
|
|
147
|
-
|
|
150
|
+
snapshot._subscription.unsubscribe();
|
|
148
151
|
return {
|
|
149
|
-
...
|
|
150
|
-
status: '
|
|
152
|
+
...snapshot,
|
|
153
|
+
status: 'stopped',
|
|
151
154
|
input: undefined,
|
|
152
|
-
|
|
155
|
+
_subscription: undefined
|
|
153
156
|
};
|
|
154
157
|
default:
|
|
155
|
-
return
|
|
158
|
+
return snapshot;
|
|
156
159
|
}
|
|
157
160
|
},
|
|
158
161
|
getInitialState: (_, input) => {
|
|
159
162
|
return {
|
|
160
|
-
subscription: undefined,
|
|
161
163
|
status: 'active',
|
|
162
|
-
|
|
163
|
-
|
|
164
|
+
output: undefined,
|
|
165
|
+
error: undefined,
|
|
166
|
+
context: undefined,
|
|
167
|
+
input,
|
|
168
|
+
_subscription: undefined
|
|
164
169
|
};
|
|
165
170
|
},
|
|
166
171
|
start: (state, {
|
|
@@ -171,7 +176,7 @@ function fromObservable(observableCreator) {
|
|
|
171
176
|
// Do not restart a completed observable
|
|
172
177
|
return;
|
|
173
178
|
}
|
|
174
|
-
state.
|
|
179
|
+
state._subscription = observableCreator({
|
|
175
180
|
input: state.input,
|
|
176
181
|
system,
|
|
177
182
|
self
|
|
@@ -195,20 +200,13 @@ function fromObservable(observableCreator) {
|
|
|
195
200
|
}
|
|
196
201
|
});
|
|
197
202
|
},
|
|
198
|
-
getSnapshot: state => state.data,
|
|
199
203
|
getPersistedState: ({
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}) => ({
|
|
204
|
-
status,
|
|
205
|
-
data,
|
|
206
|
-
input
|
|
207
|
-
}),
|
|
208
|
-
getStatus: state => state,
|
|
204
|
+
_subscription,
|
|
205
|
+
...state
|
|
206
|
+
}) => state,
|
|
209
207
|
restoreState: state => ({
|
|
210
208
|
...state,
|
|
211
|
-
|
|
209
|
+
_subscription: undefined
|
|
212
210
|
})
|
|
213
211
|
};
|
|
214
212
|
}
|
|
@@ -238,25 +236,24 @@ function fromEventObservable(lazyObservable) {
|
|
|
238
236
|
return {
|
|
239
237
|
...state,
|
|
240
238
|
status: 'error',
|
|
239
|
+
error: event.data,
|
|
241
240
|
input: undefined,
|
|
242
|
-
|
|
243
|
-
// TODO: if we keep this as `data` we should reflect this in the type
|
|
244
|
-
subscription: undefined
|
|
241
|
+
_subscription: undefined
|
|
245
242
|
};
|
|
246
243
|
case completeEventType:
|
|
247
244
|
return {
|
|
248
245
|
...state,
|
|
249
246
|
status: 'done',
|
|
250
247
|
input: undefined,
|
|
251
|
-
|
|
248
|
+
_subscription: undefined
|
|
252
249
|
};
|
|
253
250
|
case XSTATE_STOP:
|
|
254
|
-
state.
|
|
251
|
+
state._subscription.unsubscribe();
|
|
255
252
|
return {
|
|
256
253
|
...state,
|
|
257
|
-
status: '
|
|
254
|
+
status: 'stopped',
|
|
258
255
|
input: undefined,
|
|
259
|
-
|
|
256
|
+
_subscription: undefined
|
|
260
257
|
};
|
|
261
258
|
default:
|
|
262
259
|
return state;
|
|
@@ -264,10 +261,12 @@ function fromEventObservable(lazyObservable) {
|
|
|
264
261
|
},
|
|
265
262
|
getInitialState: (_, input) => {
|
|
266
263
|
return {
|
|
267
|
-
subscription: undefined,
|
|
268
264
|
status: 'active',
|
|
269
|
-
|
|
270
|
-
|
|
265
|
+
output: undefined,
|
|
266
|
+
error: undefined,
|
|
267
|
+
context: undefined,
|
|
268
|
+
input,
|
|
269
|
+
_subscription: undefined
|
|
271
270
|
};
|
|
272
271
|
},
|
|
273
272
|
start: (state, {
|
|
@@ -278,7 +277,7 @@ function fromEventObservable(lazyObservable) {
|
|
|
278
277
|
// Do not restart a completed observable
|
|
279
278
|
return;
|
|
280
279
|
}
|
|
281
|
-
state.
|
|
280
|
+
state._subscription = lazyObservable({
|
|
282
281
|
input: state.input,
|
|
283
282
|
system,
|
|
284
283
|
self
|
|
@@ -299,20 +298,13 @@ function fromEventObservable(lazyObservable) {
|
|
|
299
298
|
}
|
|
300
299
|
});
|
|
301
300
|
},
|
|
302
|
-
getSnapshot: _ => undefined,
|
|
303
301
|
getPersistedState: ({
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}) => ({
|
|
308
|
-
status,
|
|
309
|
-
data,
|
|
310
|
-
input
|
|
311
|
-
}),
|
|
312
|
-
getStatus: state => state,
|
|
302
|
+
_subscription,
|
|
303
|
+
...state
|
|
304
|
+
}) => state,
|
|
313
305
|
restoreState: state => ({
|
|
314
306
|
...state,
|
|
315
|
-
|
|
307
|
+
_subscription: undefined
|
|
316
308
|
})
|
|
317
309
|
};
|
|
318
310
|
}
|
|
@@ -331,24 +323,26 @@ promiseCreator) {
|
|
|
331
323
|
}
|
|
332
324
|
switch (event.type) {
|
|
333
325
|
case resolveEventType:
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
326
|
+
{
|
|
327
|
+
const resolvedValue = event.data;
|
|
328
|
+
return {
|
|
329
|
+
...state,
|
|
330
|
+
status: 'done',
|
|
331
|
+
output: resolvedValue,
|
|
332
|
+
input: undefined
|
|
333
|
+
};
|
|
334
|
+
}
|
|
340
335
|
case rejectEventType:
|
|
341
336
|
return {
|
|
342
337
|
...state,
|
|
343
338
|
status: 'error',
|
|
344
|
-
|
|
345
|
-
// TODO: if we keep this as `data` we should reflect this in the type
|
|
339
|
+
error: event.data,
|
|
346
340
|
input: undefined
|
|
347
341
|
};
|
|
348
342
|
case XSTATE_STOP:
|
|
349
343
|
return {
|
|
350
344
|
...state,
|
|
351
|
-
status: '
|
|
345
|
+
status: 'stopped',
|
|
352
346
|
input: undefined
|
|
353
347
|
};
|
|
354
348
|
default:
|
|
@@ -370,8 +364,7 @@ promiseCreator) {
|
|
|
370
364
|
self
|
|
371
365
|
}));
|
|
372
366
|
resolvedPromise.then(response => {
|
|
373
|
-
|
|
374
|
-
if (self._state.status !== 'active') {
|
|
367
|
+
if (self.getSnapshot().status !== 'active') {
|
|
375
368
|
return;
|
|
376
369
|
}
|
|
377
370
|
self.send({
|
|
@@ -379,8 +372,7 @@ promiseCreator) {
|
|
|
379
372
|
data: response
|
|
380
373
|
});
|
|
381
374
|
}, errorData => {
|
|
382
|
-
|
|
383
|
-
if (self._state.status !== 'active') {
|
|
375
|
+
if (self.getSnapshot().status !== 'active') {
|
|
384
376
|
return;
|
|
385
377
|
}
|
|
386
378
|
self.send({
|
|
@@ -392,45 +384,20 @@ promiseCreator) {
|
|
|
392
384
|
getInitialState: (_, input) => {
|
|
393
385
|
return {
|
|
394
386
|
status: 'active',
|
|
395
|
-
|
|
387
|
+
output: undefined,
|
|
388
|
+
error: undefined,
|
|
396
389
|
input
|
|
397
390
|
};
|
|
398
391
|
},
|
|
399
|
-
getSnapshot: state => state.data,
|
|
400
|
-
getStatus: state => state,
|
|
401
392
|
getPersistedState: state => state,
|
|
402
393
|
restoreState: state => state
|
|
403
394
|
};
|
|
404
395
|
return logic;
|
|
405
396
|
}
|
|
406
397
|
|
|
407
|
-
function isActorRef(item) {
|
|
408
|
-
return !!item && typeof item === 'object' && typeof item.send === 'function';
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// TODO: refactor the return type, this could be written in a better way
|
|
412
|
-
// but it's best to avoid unneccessary breaking changes now
|
|
413
|
-
// @deprecated use `interpret(actorLogic)` instead
|
|
414
|
-
function toActorRef(actorRefLike) {
|
|
415
|
-
return {
|
|
416
|
-
subscribe: () => ({
|
|
417
|
-
unsubscribe: () => void 0
|
|
418
|
-
}),
|
|
419
|
-
id: 'anonymous',
|
|
420
|
-
sessionId: '',
|
|
421
|
-
getSnapshot: () => undefined,
|
|
422
|
-
// TODO: this isn't safe
|
|
423
|
-
[symbolObservable]: function () {
|
|
424
|
-
return this;
|
|
425
|
-
},
|
|
426
|
-
status: ActorStatus.Running,
|
|
427
|
-
stop: () => void 0,
|
|
428
|
-
...actorRefLike
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
398
|
const emptyLogic = fromTransition(_ => undefined, undefined);
|
|
432
399
|
function createEmptyActor() {
|
|
433
400
|
return createActor(emptyLogic);
|
|
434
401
|
}
|
|
435
402
|
|
|
436
|
-
export { createEmptyActor, fromCallback, fromEventObservable, fromObservable, fromPromise, fromTransition
|
|
403
|
+
export { createEmptyActor, fromCallback, fromEventObservable, fromObservable, fromPromise, fromTransition };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).XStateActors={})}(this,(function(t){"use strict";class e{constructor(t){this._process=t,this._active=!1,this._current=null,this._last=null}start(){this._active=!0,this.flush()}clear(){this._current&&(this._current.next=null,this._last=this._current)}prepend(t){this._current?this._current={value:t,next:this._current}:this.enqueue(t)}enqueue(t){const e={value:t,next:null};if(this._current)return this._last.next=e,void(this._last=e);this._current=e,this._last=e,this._active&&this.flush()}flush(){for(;this._current;){const t=this._current;this._process(t.value),t===this._current&&(this._current=this._current.next)}this._last=null}}const s="xstate.init",i="xstate.stop";function n(t,e){return{type:`xstate.done.actor.${t}`,output:e}}function o(t,e){return{type:`xstate.error.actor.${t}`,data:e}}function r(){const t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:window;if(t.__xstate__)return t.__xstate__}const a=t=>{const e=r();e&&e.register(t)};function c(t){setTimeout((()=>{throw t}))}const d="function"==typeof Symbol&&Symbol.observable||"@@observable";let u=function(t){return t[t.NotStarted=0]="NotStarted",t[t.Running=1]="Running",t[t.Stopped=2]="Stopped",t}({});const h={deferEvents:!0,clock:{setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},logger:console.log.bind(console),devTools:!1};class p{constructor(t,s){this.logic=t,this._state=void 0,this.clock=void 0,this.options=void 0,this.id=void 0,this.mailbox=new e(this._process.bind(this)),this.delayedEventsMap={},this.observers=new Set,this.logger=void 0,this.status=u.NotStarted,this._parent=void 0,this.ref=void 0,this._actorContext=void 0,this._systemId=void 0,this.sessionId=void 0,this.system=void 0,this._doneEvent=void 0,this.src=void 0,this._deferred=[];const i={...h,...s},{clock:n,logger:o,parent:r,id:a,systemId:c}=i;this.system=r?.system??function(){let t=0;const e=new Map,s=new Map,i=new WeakMap;return{_bookId:()=>"x:"+t++,_register:(t,s)=>(e.set(t,s),t),_unregister:t=>{e.delete(t.sessionId);const n=i.get(t);void 0!==n&&(s.delete(n),i.delete(t))},get:t=>s.get(t),_set:(t,e)=>{const n=s.get(t);if(n&&n!==e)throw new Error(`Actor with system ID '${t}' already exists.`);s.set(t,e),i.set(e,t)}}}(),c&&(this._systemId=c,this.system._set(c,this)),this.sessionId=this.system._bookId(),this.id=a??this.sessionId,this.logger=o,this.clock=n,this._parent=r,this.options=i,this.src=i.src,this.ref=this,this._actorContext={self:this,id:this.id,sessionId:this.sessionId,logger:this.logger,defer:t=>{this._deferred.push(t)},system:this.system,stopChild:t=>{if(t._parent!==this)throw new Error(`Cannot stop child actor ${t.id} of ${this.id} because it is not a child`);t._stop()}},this.send=this.send.bind(this),this._initState()}_initState(){this._state=this.options.state?this.logic.restoreState?this.logic.restoreState(this.options.state,this._actorContext):this.options.state:this.logic.getInitialState(this._actorContext,this.options?.input)}update(t){this._state=t;const e=this.getSnapshot();let s;for(;s=this._deferred.shift();)s();for(const t of this.observers)try{t.next?.(e)}catch(t){c(t)}const i=this.logic.getStatus?.(t);switch(i?.status){case"done":this._stopProcedure(),this._complete(),this._doneEvent=n(this.id,i.data),this._parent?.send(this._doneEvent);break;case"error":this._stopProcedure(),this._error(i.data),this._parent?.send(o(this.id,i.data))}}subscribe(t,e,s){const i=function(t,e,s){const i="object"==typeof t,n=i?t:void 0;return{next:(i?t.next:t)?.bind(n),error:(i?t.error:e)?.bind(n),complete:(i?t.complete:s)?.bind(n)}}(t,e,s);if(this.status!==u.Stopped)this.observers.add(i);else try{i.complete?.()}catch(t){c(t)}return{unsubscribe:()=>{this.observers.delete(i)}}}start(){if(this.status===u.Running)return this;this.system._register(this.sessionId,this),this._systemId&&this.system._set(this._systemId,this),this.status=u.Running;const t=this.logic.getStatus?.(this._state);switch(t?.status){case"done":this.update(this._state);case"error":return this}if(this.logic.start)try{this.logic.start(this._state,this._actorContext)}catch(t){return this._stopProcedure(),this._error(t),this._parent?.send(o(this.id,t)),this}return this.update(this._state),this.options.devTools&&this.attachDevTools(),this.mailbox.start(),this}_process(t){let e,s;try{e=this.logic.transition(this._state,t,this._actorContext)}catch(t){s={err:t}}if(s){const{err:t}=s;return this._stopProcedure(),this._error(t),void this._parent?.send(o(this.id,t))}this.update(e),t.type===i&&(this._stopProcedure(),this._complete())}_stop(){return this.status===u.Stopped?this:(this.mailbox.clear(),this.status===u.NotStarted?(this.status=u.Stopped,this):(this.mailbox.enqueue({type:i}),this))}stop(){if(this._parent)throw new Error("A non-root actor cannot be stopped directly.");return this._stop()}_complete(){for(const t of this.observers)try{t.complete?.()}catch(t){c(t)}this.observers.clear()}_error(t){if(!this.observers.size)return void(this._parent||c(t));let e=!1;for(const s of this.observers){const i=s.error;e||=!i;try{i?.(t)}catch(t){c(t)}}this.observers.clear(),e&&c(t)}_stopProcedure(){if(this.status!==u.Running)return this;for(const t of Object.keys(this.delayedEventsMap))this.clock.clearTimeout(this.delayedEventsMap[t]);return this.mailbox.clear(),this.mailbox=new e(this._process.bind(this)),this.status=u.Stopped,this.system._unregister(this),this}send(t){if("string"==typeof t)throw new Error(`Only event objects may be sent to actors; use .send({ type: "${t}" }) instead`);if(this.status!==u.Stopped){if(this.status!==u.Running&&!this.options.deferEvents)throw new Error(`Event "${t.type}" was sent to uninitialized actor "${this.id}". Make sure .start() is called for this actor, or set { deferEvents: true } in the actor options.\nEvent: ${JSON.stringify(t)}`);this.mailbox.enqueue(t)}}delaySend({event:t,id:e,delay:s,to:i}){const n=this.clock.setTimeout((()=>{i?i.send(t):this.send(t)}),s);e&&(this.delayedEventsMap[e]=n)}cancel(t){this.clock.clearTimeout(this.delayedEventsMap[t]),delete this.delayedEventsMap[t]}attachDevTools(){const{devTools:t}=this.options;if(t){("function"==typeof t?t:a)(this)}}toJSON(){return{id:this.id}}getPersistedState(){return this.logic.getPersistedState?.(this._state)}[d](){return this}getSnapshot(){return this.logic.getSnapshot?this.logic.getSnapshot(this._state):this._state}}function l(t,e){return{config:t,transition:(e,s,i)=>t(e,s,i),getInitialState:(t,s)=>"function"==typeof e?e({input:s}):e,getSnapshot:t=>t,getPersistedState:t=>t,restoreState:t=>t}}const f="$$xstate.resolve",_="$$xstate.reject";const v=l((t=>{}),void 0);t.createEmptyActor=function(){return new p(v,t);var t},t.fromCallback=function(t){return{config:t,start:(t,{self:e})=>{e.send({type:s})},transition:(e,r,{self:a,id:c,system:d})=>{if(r.type===s){const s=t=>{e.canceled||a._parent?.send(t)},i=t=>{e.receivers.add(t)};return e.dispose=t({input:e.input,system:d,self:a,sendBack:s,receive:i}),((u=e.dispose)instanceof Promise||null!==u&&("function"==typeof u||"object"==typeof u)&&"function"==typeof u.then)&&e.dispose.then((t=>{a._parent?.send(n(c,t)),e.canceled=!0}),(t=>{e.canceled=!0,a._parent?.send(o(c,t))})),e}var u;return r.type===i?(e.canceled=!0,"function"==typeof e.dispose&&e.dispose(),e):(e.receivers.forEach((t=>t(r))),e)},getInitialState:(t,e)=>({canceled:!1,receivers:new Set,dispose:void 0,input:e}),getSnapshot:()=>{},getPersistedState:({input:t,canceled:e})=>({input:t,canceled:e})}},t.fromEventObservable=function(t){const e="$$xstate.error",s="$$xstate.complete";return{config:t,transition:(t,n)=>{if("active"!==t.status)return t;switch(n.type){case e:return{...t,status:"error",input:void 0,data:n.data,subscription:void 0};case s:return{...t,status:"done",input:void 0,subscription:void 0};case i:return t.subscription.unsubscribe(),{...t,status:"canceled",input:void 0,subscription:void 0};default:return t}},getInitialState:(t,e)=>({subscription:void 0,status:"active",data:void 0,input:e}),start:(i,{self:n,system:o})=>{"done"!==i.status&&(i.subscription=t({input:i.input,system:o,self:n}).subscribe({next:t=>{n._parent?.send(t)},error:t=>{n.send({type:e,data:t})},complete:()=>{n.send({type:s})}}))},getSnapshot:t=>{},getPersistedState:({status:t,data:e,input:s})=>({status:t,data:e,input:s}),getStatus:t=>t,restoreState:t=>({...t,subscription:void 0})}},t.fromObservable=function(t){const e="$$xstate.next",s="$$xstate.error",n="$$xstate.complete";return{config:t,transition:(t,o,{self:r,id:a,defer:c})=>{if("active"!==t.status)return t;switch(o.type){case e:return c((()=>{r._parent?.send({type:`xstate.snapshot.${a}`,data:o.data})})),{...t,data:o.data};case s:return{...t,status:"error",input:void 0,data:o.data,subscription:void 0};case n:return{...t,status:"done",input:void 0,subscription:void 0};case i:return t.subscription.unsubscribe(),{...t,status:"canceled",input:void 0,subscription:void 0};default:return t}},getInitialState:(t,e)=>({subscription:void 0,status:"active",data:void 0,input:e}),start:(i,{self:o,system:r})=>{"done"!==i.status&&(i.subscription=t({input:i.input,system:r,self:o}).subscribe({next:t=>{o.send({type:e,data:t})},error:t=>{o.send({type:s,data:t})},complete:()=>{o.send({type:n})}}))},getSnapshot:t=>t.data,getPersistedState:({status:t,data:e,input:s})=>({status:t,data:e,input:s}),getStatus:t=>t,restoreState:t=>({...t,subscription:void 0})}},t.fromPromise=function(t){return{config:t,transition:(t,e)=>{if("active"!==t.status)return t;switch(e.type){case f:return{...t,status:"done",data:e.data,input:void 0};case _:return{...t,status:"error",data:e.data,input:void 0};case i:return{...t,status:"canceled",input:void 0};default:return t}},start:(e,{self:s,system:i})=>{if("active"!==e.status)return;Promise.resolve(t({input:e.input,system:i,self:s})).then((t=>{"active"===s._state.status&&s.send({type:f,data:t})}),(t=>{"active"===s._state.status&&s.send({type:_,data:t})}))},getInitialState:(t,e)=>({status:"active",data:void 0,input:e}),getSnapshot:t=>t.data,getStatus:t=>t,getPersistedState:t=>t,restoreState:t=>t}},t.fromTransition=l,t.isActorRef=function(t){return!!t&&"object"==typeof t&&"function"==typeof t.send},t.toActorRef=function(t){return{subscribe:()=>({unsubscribe:()=>{}}),id:"anonymous",sessionId:"",getSnapshot:()=>{},[d]:function(){return this},status:u.Running,stop:()=>{},...t}},Object.defineProperty(t,"__esModule",{value:!0})}));
|
|
1
|
+
!function(t,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((t="undefined"!=typeof globalThis?globalThis:t||self).XStateActors={})}(this,(function(t){"use strict";class s{constructor(t){this._process=t,this._active=!1,this._current=null,this._last=null}start(){this._active=!0,this.flush()}clear(){this._current&&(this._current.next=null,this._last=this._current)}prepend(t){this._current?this._current={value:t,next:this._current}:this.enqueue(t)}enqueue(t){const s={value:t,next:null};if(this._current)return this._last.next=s,void(this._last=s);this._current=s,this._last=s,this._active&&this.flush()}flush(){for(;this._current;){const t=this._current;this._process(t.value),t===this._current&&(this._current=this._current.next)}this._last=null}}const e="xstate.init",i="xstate.stop";function r(t,s){return{type:`xstate.error.actor.${t}`,data:s}}function o(){const t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:window;if(t.__xstate__)return t.__xstate__}const n=t=>{const s=o();s&&s.register(t)};function a(t){setTimeout((()=>{throw t}))}const c="function"==typeof Symbol&&Symbol.observable||"@@observable";let u=function(t){return t[t.NotStarted=0]="NotStarted",t[t.Running=1]="Running",t[t.Stopped=2]="Stopped",t}({});const d={clock:{setTimeout:(t,s)=>setTimeout(t,s),clearTimeout:t=>clearTimeout(t)},logger:console.log.bind(console),devTools:!1};class h{constructor(t,e){this.logic=t,this._state=void 0,this.clock=void 0,this.options=void 0,this.id=void 0,this.mailbox=new s(this._process.bind(this)),this.delayedEventsMap={},this.observers=new Set,this.logger=void 0,this.status=u.NotStarted,this._parent=void 0,this.ref=void 0,this._actorContext=void 0,this._systemId=void 0,this.sessionId=void 0,this.system=void 0,this._doneEvent=void 0,this.src=void 0,this._deferred=[];const i={...d,...e},{clock:r,logger:o,parent:n,id:a,systemId:c}=i;this.system=n?.system??function(){let t=0;const s=new Map,e=new Map,i=new WeakMap;return{_bookId:()=>"x:"+t++,_register:(t,e)=>(s.set(t,e),t),_unregister:t=>{s.delete(t.sessionId);const r=i.get(t);void 0!==r&&(e.delete(r),i.delete(t))},get:t=>e.get(t),_set:(t,s)=>{const r=e.get(t);if(r&&r!==s)throw new Error(`Actor with system ID '${t}' already exists.`);e.set(t,s),i.set(s,t)}}}(),c&&(this._systemId=c,this.system._set(c,this)),this.sessionId=this.system._bookId(),this.id=a??this.sessionId,this.logger=o,this.clock=r,this._parent=n,this.options=i,this.src=i.src,this.ref=this,this._actorContext={self:this,id:this.id,sessionId:this.sessionId,logger:this.logger,defer:t=>{this._deferred.push(t)},system:this.system,stopChild:t=>{if(t._parent!==this)throw new Error(`Cannot stop child actor ${t.id} of ${this.id} because it is not a child`);t._stop()}},this.send=this.send.bind(this),this._initState()}_initState(){this._state=this.options.state?this.logic.restoreState?this.logic.restoreState(this.options.state,this._actorContext):this.options.state:this.logic.getInitialState(this._actorContext,this.options?.input)}update(t){let s;for(this._state=t;s=this._deferred.shift();)s();for(const s of this.observers)try{s.next?.(t)}catch(t){a(t)}switch(this._state.status){case"done":this._stopProcedure(),this._complete(),this._doneEvent=(e=this.id,i=this._state.output,{type:`xstate.done.actor.${e}`,output:i}),this._parent?.send(this._doneEvent);break;case"error":this._stopProcedure(),this._error(this._state.error),this._parent?.send(r(this.id,this._state.error))}var e,i}subscribe(t,s,e){const i=function(t,s,e){const i="object"==typeof t,r=i?t:void 0;return{next:(i?t.next:t)?.bind(r),error:(i?t.error:s)?.bind(r),complete:(i?t.complete:e)?.bind(r)}}(t,s,e);if(this.status!==u.Stopped)this.observers.add(i);else try{i.complete?.()}catch(t){a(t)}return{unsubscribe:()=>{this.observers.delete(i)}}}start(){if(this.status===u.Running)return this;this.system._register(this.sessionId,this),this._systemId&&this.system._set(this._systemId,this),this.status=u.Running;switch(this._state.status){case"done":this.update(this._state);case"error":return this}if(this.logic.start)try{this.logic.start(this._state,this._actorContext)}catch(t){return this._stopProcedure(),this._error(t),this._parent?.send(r(this.id,t)),this}return this.update(this._state),this.options.devTools&&this.attachDevTools(),this.mailbox.start(),this}_process(t){let s,e;try{s=this.logic.transition(this._state,t,this._actorContext)}catch(t){e={err:t}}if(e){const{err:t}=e;return this._stopProcedure(),this._error(t),void this._parent?.send(r(this.id,t))}this.update(s),t.type===i&&(this._stopProcedure(),this._complete())}_stop(){return this.status===u.Stopped?this:(this.mailbox.clear(),this.status===u.NotStarted?(this.status=u.Stopped,this):(this.mailbox.enqueue({type:i}),this))}stop(){if(this._parent)throw new Error("A non-root actor cannot be stopped directly.");return this._stop()}_complete(){for(const t of this.observers)try{t.complete?.()}catch(t){a(t)}this.observers.clear()}_error(t){if(!this.observers.size)return void(this._parent||a(t));let s=!1;for(const e of this.observers){const i=e.error;s||=!i;try{i?.(t)}catch(t){a(t)}}this.observers.clear(),s&&a(t)}_stopProcedure(){if(this.status!==u.Running)return this;for(const t of Object.keys(this.delayedEventsMap))this.clock.clearTimeout(this.delayedEventsMap[t]);return this.mailbox.clear(),this.mailbox=new s(this._process.bind(this)),this.status=u.Stopped,this.system._unregister(this),this}send(t){if("string"==typeof t)throw new Error(`Only event objects may be sent to actors; use .send({ type: "${t}" }) instead`);this.status!==u.Stopped&&this.mailbox.enqueue(t)}delaySend({event:t,id:s,delay:e,to:i}){const r=this.clock.setTimeout((()=>{i?i.send(t):this.send(t)}),e);s&&(this.delayedEventsMap[s]=r)}cancel(t){this.clock.clearTimeout(this.delayedEventsMap[t]),delete this.delayedEventsMap[t]}attachDevTools(){const{devTools:t}=this.options;if(t){("function"==typeof t?t:n)(this)}}toJSON(){return{id:this.id}}getPersistedState(){return this.logic.getPersistedState?.(this._state)}[c](){return this}getSnapshot(){return this._state}}function p(t,s){return{config:t,transition:(s,e,i)=>({...s,context:t(s.context,e,i)}),getInitialState:(t,e)=>({status:"active",output:void 0,error:void 0,context:"function"==typeof s?s({input:e}):s}),getPersistedState:t=>t,restoreState:t=>t}}const l="$$xstate.resolve",_="$$xstate.reject";const v=p((t=>{}),void 0);t.createEmptyActor=function(){return new h(v,t);var t},t.fromCallback=function(t){return{config:t,start:(t,{self:s})=>{s.send({type:e})},transition:(s,r,{self:o,id:n,system:a})=>{if(r.type===e){const e=t=>{"stopped"!==s.status&&o._parent?.send(t)},i=t=>{s._receivers.add(t)};return s._dispose=t({input:s.input,system:a,self:o,sendBack:e,receive:i}),s}return r.type===i?("function"==typeof(s={...s,status:"stopped",error:void 0})._dispose&&s._dispose(),s):(s._receivers.forEach((t=>t(r))),s)},getInitialState:(t,s)=>({status:"active",output:void 0,error:void 0,input:s,_receivers:new Set,_dispose:void 0}),getPersistedState:({_dispose:t,_receivers:s,...e})=>e}},t.fromEventObservable=function(t){const s="$$xstate.error",e="$$xstate.complete";return{config:t,transition:(t,r)=>{if("active"!==t.status)return t;switch(r.type){case s:return{...t,status:"error",error:r.data,input:void 0,_subscription:void 0};case e:return{...t,status:"done",input:void 0,_subscription:void 0};case i:return t._subscription.unsubscribe(),{...t,status:"stopped",input:void 0,_subscription:void 0};default:return t}},getInitialState:(t,s)=>({status:"active",output:void 0,error:void 0,context:void 0,input:s,_subscription:void 0}),start:(i,{self:r,system:o})=>{"done"!==i.status&&(i._subscription=t({input:i.input,system:o,self:r}).subscribe({next:t=>{r._parent?.send(t)},error:t=>{r.send({type:s,data:t})},complete:()=>{r.send({type:e})}}))},getPersistedState:({_subscription:t,...s})=>s,restoreState:t=>({...t,_subscription:void 0})}},t.fromObservable=function(t){const s="$$xstate.next",e="$$xstate.error",r="$$xstate.complete";return{config:t,transition:(t,o,{self:n,id:a,defer:c})=>{if("active"!==t.status)return t;switch(o.type){case s:{const s={...t,context:o.data};return c((()=>{n._parent?.send({type:`xstate.snapshot.${a}`,data:s})})),s}case e:return{...t,status:"error",error:o.data,input:void 0,_subscription:void 0};case r:return{...t,status:"done",input:void 0,_subscription:void 0};case i:return t._subscription.unsubscribe(),{...t,status:"stopped",input:void 0,_subscription:void 0};default:return t}},getInitialState:(t,s)=>({status:"active",output:void 0,error:void 0,context:void 0,input:s,_subscription:void 0}),start:(i,{self:o,system:n})=>{"done"!==i.status&&(i._subscription=t({input:i.input,system:n,self:o}).subscribe({next:t=>{o.send({type:s,data:t})},error:t=>{o.send({type:e,data:t})},complete:()=>{o.send({type:r})}}))},getPersistedState:({_subscription:t,...s})=>s,restoreState:t=>({...t,_subscription:void 0})}},t.fromPromise=function(t){return{config:t,transition:(t,s)=>{if("active"!==t.status)return t;switch(s.type){case l:{const e=s.data;return{...t,status:"done",output:e,input:void 0}}case _:return{...t,status:"error",error:s.data,input:void 0};case i:return{...t,status:"stopped",input:void 0};default:return t}},start:(s,{self:e,system:i})=>{if("active"!==s.status)return;Promise.resolve(t({input:s.input,system:i,self:e})).then((t=>{"active"===e.getSnapshot().status&&e.send({type:l,data:t})}),(t=>{"active"===e.getSnapshot().status&&e.send({type:_,data:t})}))},getInitialState:(t,s)=>({status:"active",output:void 0,error:void 0,input:s}),getPersistedState:t=>t,restoreState:t=>t}},t.fromTransition=p,Object.defineProperty(t,"__esModule",{value:!0})}));
|
|
2
2
|
//# sourceMappingURL=xstate-actors.umd.min.js.map
|