UNPKG

2.82 kBJavaScriptView Raw
1import { __assign } from './_virtual/_tslib.js';
2import { symbolObservable, toInvokeSource, mapContext, isMachine } from './utils.js';
3import { provide } from './serviceScope.js';
4
5function createNullActor(id) {
6 var _a;
7
8 return _a = {
9 id: id,
10 send: function () {
11 return void 0;
12 },
13 subscribe: function () {
14 return {
15 unsubscribe: function () {
16 return void 0;
17 }
18 };
19 },
20 getSnapshot: function () {
21 return undefined;
22 },
23 toJSON: function () {
24 return {
25 id: id
26 };
27 }
28 }, _a[symbolObservable] = function () {
29 return this;
30 }, _a;
31}
32/**
33 * Creates a deferred actor that is able to be invoked given the provided
34 * invocation information in its `.meta` value.
35 *
36 * @param invokeDefinition The meta information needed to invoke the actor.
37 */
38
39function createInvocableActor(invokeDefinition, machine, context, _event) {
40 var _a;
41
42 var invokeSrc = toInvokeSource(invokeDefinition.src);
43 var serviceCreator = (_a = machine === null || machine === void 0 ? void 0 : machine.options.services) === null || _a === void 0 ? void 0 : _a[invokeSrc.type];
44 var resolvedData = invokeDefinition.data ? mapContext(invokeDefinition.data, context, _event) : undefined;
45 var tempActor = serviceCreator ? createDeferredActor(serviceCreator, invokeDefinition.id, resolvedData) : createNullActor(invokeDefinition.id); // @ts-ignore
46
47 tempActor.meta = invokeDefinition;
48 return tempActor;
49}
50function createDeferredActor(entity, id, data) {
51 var tempActor = createNullActor(id); // @ts-ignore
52
53 tempActor.deferred = true;
54
55 if (isMachine(entity)) {
56 // "mute" the existing service scope so potential spawned actors within the `.initialState` stay deferred here
57 var initialState_1 = tempActor.state = provide(undefined, function () {
58 return (data ? entity.withContext(data) : entity).initialState;
59 });
60
61 tempActor.getSnapshot = function () {
62 return initialState_1;
63 };
64 }
65
66 return tempActor;
67}
68function isActor(item) {
69 try {
70 return typeof item.send === 'function';
71 } catch (e) {
72 return false;
73 }
74}
75function isSpawnedActor(item) {
76 return isActor(item) && 'id' in item;
77} // TODO: refactor the return type, this could be written in a better way but it's best to avoid unneccessary breaking changes now
78
79function toActorRef(actorRefLike) {
80 var _a;
81
82 return __assign((_a = {
83 subscribe: function () {
84 return {
85 unsubscribe: function () {
86 return void 0;
87 }
88 };
89 },
90 id: 'anonymous',
91 getSnapshot: function () {
92 return undefined;
93 }
94 }, _a[symbolObservable] = function () {
95 return this;
96 }, _a), actorRefLike);
97}
98
99export { createDeferredActor, createInvocableActor, createNullActor, isActor, isSpawnedActor, toActorRef };