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.
Files changed (60) hide show
  1. package/actions/dist/xstate-actions.cjs.js +3 -3
  2. package/actions/dist/xstate-actions.development.cjs.js +3 -3
  3. package/actions/dist/xstate-actions.development.esm.js +3 -3
  4. package/actions/dist/xstate-actions.esm.js +3 -3
  5. package/actions/dist/xstate-actions.umd.min.js +1 -1
  6. package/actions/dist/xstate-actions.umd.min.js.map +1 -1
  7. package/actors/dist/xstate-actors.cjs.js +104 -139
  8. package/actors/dist/xstate-actors.cjs.mjs +1 -3
  9. package/actors/dist/xstate-actors.development.cjs.js +104 -139
  10. package/actors/dist/xstate-actors.development.cjs.mjs +1 -3
  11. package/actors/dist/xstate-actors.development.esm.js +105 -138
  12. package/actors/dist/xstate-actors.esm.js +105 -138
  13. package/actors/dist/xstate-actors.umd.min.js +1 -1
  14. package/actors/dist/xstate-actors.umd.min.js.map +1 -1
  15. package/dist/declarations/src/State.d.ts +4 -6
  16. package/dist/declarations/src/StateMachine.d.ts +28 -21
  17. package/dist/declarations/src/StateNode.d.ts +1 -1
  18. package/dist/declarations/src/actions/assign.d.ts +4 -4
  19. package/dist/declarations/src/actions/cancel.d.ts +4 -4
  20. package/dist/declarations/src/actions/choose.d.ts +3 -3
  21. package/dist/declarations/src/actions/log.d.ts +4 -4
  22. package/dist/declarations/src/actions/pure.d.ts +1 -1
  23. package/dist/declarations/src/actions/raise.d.ts +2 -2
  24. package/dist/declarations/src/actions/send.d.ts +7 -7
  25. package/dist/declarations/src/actions/stop.d.ts +4 -4
  26. package/dist/declarations/src/actors/callback.d.ts +8 -8
  27. package/dist/declarations/src/actors/index.d.ts +3 -5
  28. package/dist/declarations/src/actors/observable.d.ts +12 -13
  29. package/dist/declarations/src/actors/promise.d.ts +11 -14
  30. package/dist/declarations/src/actors/transition.d.ts +10 -7
  31. package/dist/declarations/src/index.d.ts +1 -1
  32. package/dist/declarations/src/interpreter.d.ts +4 -4
  33. package/dist/declarations/src/stateUtils.d.ts +5 -6
  34. package/dist/declarations/src/types.d.ts +92 -70
  35. package/dist/{interpreter-a1432c7d.development.cjs.js → interpreter-7f1dc557.development.cjs.js} +9 -30
  36. package/dist/{interpreter-a77bb0ec.development.esm.js → interpreter-945c4b96.development.esm.js} +10 -28
  37. package/dist/{interpreter-672794ae.cjs.js → interpreter-a2c1e529.cjs.js} +9 -30
  38. package/dist/{interpreter-b5203bcb.esm.js → interpreter-b8f53c4b.esm.js} +10 -28
  39. package/dist/{raise-b9c9a234.esm.js → raise-0b7dde8b.esm.js} +13 -11
  40. package/dist/{raise-a60c9290.development.esm.js → raise-6e4f5cf7.development.esm.js} +13 -11
  41. package/dist/{raise-74b72ca5.development.cjs.js → raise-7cae872b.development.cjs.js} +13 -11
  42. package/dist/{raise-436a57a2.cjs.js → raise-e79b1f86.cjs.js} +13 -11
  43. package/dist/{send-e8b55d00.development.cjs.js → send-19a256f0.development.cjs.js} +2 -2
  44. package/dist/{send-e63b7b83.development.esm.js → send-a1d772da.development.esm.js} +2 -2
  45. package/dist/{send-35e1a689.cjs.js → send-e7063201.cjs.js} +2 -2
  46. package/dist/{send-4192e7bc.esm.js → send-f4fb3ba5.esm.js} +2 -2
  47. package/dist/xstate.cjs.js +20 -31
  48. package/dist/xstate.cjs.mjs +0 -2
  49. package/dist/xstate.development.cjs.js +20 -31
  50. package/dist/xstate.development.cjs.mjs +0 -2
  51. package/dist/xstate.development.esm.js +24 -33
  52. package/dist/xstate.esm.js +24 -33
  53. package/dist/xstate.umd.min.js +1 -1
  54. package/dist/xstate.umd.min.js.map +1 -1
  55. package/guards/dist/xstate-guards.cjs.js +2 -2
  56. package/guards/dist/xstate-guards.development.cjs.js +2 -2
  57. package/guards/dist/xstate-guards.development.esm.js +2 -2
  58. package/guards/dist/xstate-guards.esm.js +2 -2
  59. package/guards/dist/xstate-guards.umd.min.js.map +1 -1
  60. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { X as XSTATE_INIT, j as isPromiseLike, k as createDoneActorEvent, l as createErrorActorEvent, n as XSTATE_STOP, s as symbolObservable, f as ActorStatus, d as createActor } from '../../dist/interpreter-b5203bcb.esm.js';
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 initialState The initial state of the transition function.
10
+ * @param initialContext The initial state of the transition function.
11
11
  * @returns Actor logic
12
12
  */
13
- function fromTransition(transition, initialState) {
13
+ function fromTransition(transition, initialContext) {
14
14
  return {
15
15
  config: transition,
16
16
  transition: (state, event, actorContext) => {
17
- return transition(state, event, actorContext);
17
+ return {
18
+ ...state,
19
+ context: transition(state.context, event, actorContext)
20
+ };
18
21
  },
19
22
  getInitialState: (_, input) => {
20
- return typeof initialState === 'function' ? initialState({
21
- input
22
- }) : initialState;
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.canceled) {
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.receivers.add(newListener);
60
+ state._receivers.add(newListener);
54
61
  };
55
- state.dispose = invokeCallback({
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.canceled = true;
75
- if (typeof state.dispose === 'function') {
76
- state.dispose();
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.receivers.forEach(receiver => receiver(event));
82
+ state._receivers.forEach(receiver => receiver(event));
81
83
  return state;
82
84
  },
83
85
  getInitialState: (_, input) => {
84
86
  return {
85
- canceled: false,
86
- receivers: new Set(),
87
- dispose: undefined,
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
- input,
94
- canceled
95
- }) => ({
96
- input,
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: (state, event, {
109
+ transition: (snapshot, event, {
109
110
  self,
110
111
  id,
111
112
  defer
112
113
  }) => {
113
- if (state.status !== 'active') {
114
- return state;
114
+ if (snapshot.status !== 'active') {
115
+ return snapshot;
115
116
  }
116
117
  switch (event.type) {
117
118
  case nextEventType:
118
- // match the exact timing of events sent by machines
119
- // send actions are not executed immediately
120
- defer(() => {
121
- self._parent?.send({
122
- type: `xstate.snapshot.${id}`,
123
- data: event.data
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
- return {
127
- ...state,
128
- data: event.data
129
- };
132
+ return newSnapshot;
133
+ }
130
134
  case errorEventType:
131
135
  return {
132
- ...state,
136
+ ...snapshot,
133
137
  status: 'error',
138
+ error: event.data,
134
139
  input: undefined,
135
- data: event.data,
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
- ...state,
144
+ ...snapshot,
142
145
  status: 'done',
143
146
  input: undefined,
144
- subscription: undefined
147
+ _subscription: undefined
145
148
  };
146
149
  case XSTATE_STOP:
147
- state.subscription.unsubscribe();
150
+ snapshot._subscription.unsubscribe();
148
151
  return {
149
- ...state,
150
- status: 'canceled',
152
+ ...snapshot,
153
+ status: 'stopped',
151
154
  input: undefined,
152
- subscription: undefined
155
+ _subscription: undefined
153
156
  };
154
157
  default:
155
- return state;
158
+ return snapshot;
156
159
  }
157
160
  },
158
161
  getInitialState: (_, input) => {
159
162
  return {
160
- subscription: undefined,
161
163
  status: 'active',
162
- data: undefined,
163
- input
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.subscription = observableCreator({
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
- status,
201
- data,
202
- input
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
- subscription: undefined
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
- data: event.data,
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
- subscription: undefined
248
+ _subscription: undefined
252
249
  };
253
250
  case XSTATE_STOP:
254
- state.subscription.unsubscribe();
251
+ state._subscription.unsubscribe();
255
252
  return {
256
253
  ...state,
257
- status: 'canceled',
254
+ status: 'stopped',
258
255
  input: undefined,
259
- subscription: undefined
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
- data: undefined,
270
- input
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.subscription = lazyObservable({
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
- status,
305
- data,
306
- input
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
- subscription: undefined
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
- return {
335
- ...state,
336
- status: 'done',
337
- data: event.data,
338
- input: undefined
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
- data: event.data,
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: 'canceled',
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
- // TODO: remove this condition once dead letter queue lands
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
- // TODO: remove this condition once dead letter queue lands
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
- data: undefined,
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, isActorRef, toActorRef };
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