xstate
Version:
Finite State Machines and Statecharts for the Modern Web.
100 lines (87 loc) • 2.82 kB
JavaScript
import { __assign } from './_virtual/_tslib.js';
import { symbolObservable, toInvokeSource, mapContext, isMachine } from './utils.js';
import { provide } from './serviceScope.js';
function createNullActor(id) {
var _a;
return _a = {
id: id,
send: function () {
return void 0;
},
subscribe: function () {
return {
unsubscribe: function () {
return void 0;
}
};
},
getSnapshot: function () {
return undefined;
},
toJSON: function () {
return {
id: id
};
}
}, _a[symbolObservable] = function () {
return this;
}, _a;
}
/**
* Creates a deferred actor that is able to be invoked given the provided
* invocation information in its `.meta` value.
*
* @param invokeDefinition The meta information needed to invoke the actor.
*/
function createInvocableActor(invokeDefinition, machine, context, _event) {
var _a;
var invokeSrc = toInvokeSource(invokeDefinition.src);
var serviceCreator = (_a = machine === null || machine === void 0 ? void 0 : machine.options.services) === null || _a === void 0 ? void 0 : _a[invokeSrc.type];
var resolvedData = invokeDefinition.data ? mapContext(invokeDefinition.data, context, _event) : undefined;
var tempActor = serviceCreator ? createDeferredActor(serviceCreator, invokeDefinition.id, resolvedData) : createNullActor(invokeDefinition.id); // @ts-ignore
tempActor.meta = invokeDefinition;
return tempActor;
}
function createDeferredActor(entity, id, data) {
var tempActor = createNullActor(id); // @ts-ignore
tempActor.deferred = true;
if (isMachine(entity)) {
// "mute" the existing service scope so potential spawned actors within the `.initialState` stay deferred here
var initialState_1 = tempActor.state = provide(undefined, function () {
return (data ? entity.withContext(data) : entity).initialState;
});
tempActor.getSnapshot = function () {
return initialState_1;
};
}
return tempActor;
}
function isActor(item) {
try {
return typeof item.send === 'function';
} catch (e) {
return false;
}
}
function isSpawnedActor(item) {
return isActor(item) && 'id' in item;
} // TODO: refactor the return type, this could be written in a better way but it's best to avoid unneccessary breaking changes now
function toActorRef(actorRefLike) {
var _a;
return __assign((_a = {
subscribe: function () {
return {
unsubscribe: function () {
return void 0;
}
};
},
id: 'anonymous',
getSnapshot: function () {
return undefined;
}
}, _a[symbolObservable] = function () {
return this;
}, _a), actorRefLike);
}
export { createDeferredActor, createInvocableActor, createNullActor, isActor, isSpawnedActor, toActorRef };