Actor.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var _tslib = require('./_virtual/_tslib.js');
  4. var utils = require('./utils.js');
  5. var serviceScope = require('./serviceScope.js');
  6. function createNullActor(id) {
  7. var _a;
  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[utils.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. function createInvocableActor(invokeDefinition, machine, context, _event) {
  39. var _a;
  40. var invokeSrc = utils.toInvokeSource(invokeDefinition.src);
  41. var serviceCreator = (_a = machine === null || machine === void 0 ? void 0 : machine.options.services) === null || _a === void 0 ? void 0 : _a[invokeSrc.type];
  42. var resolvedData = invokeDefinition.data ? utils.mapContext(invokeDefinition.data, context, _event) : undefined;
  43. var tempActor = serviceCreator ? createDeferredActor(serviceCreator, invokeDefinition.id, resolvedData) : createNullActor(invokeDefinition.id); // @ts-ignore
  44. tempActor.meta = invokeDefinition;
  45. return tempActor;
  46. }
  47. function createDeferredActor(entity, id, data) {
  48. var tempActor = createNullActor(id); // @ts-ignore
  49. tempActor.deferred = true;
  50. if (utils.isMachine(entity)) {
  51. // "mute" the existing service scope so potential spawned actors within the `.initialState` stay deferred here
  52. var initialState_1 = tempActor.state = serviceScope.provide(undefined, function () {
  53. return (data ? entity.withContext(data) : entity).initialState;
  54. });
  55. tempActor.getSnapshot = function () {
  56. return initialState_1;
  57. };
  58. }
  59. return tempActor;
  60. }
  61. function isActor(item) {
  62. try {
  63. return typeof item.send === 'function';
  64. } catch (e) {
  65. return false;
  66. }
  67. }
  68. function isSpawnedActor(item) {
  69. return isActor(item) && 'id' in item;
  70. } // TODO: refactor the return type, this could be written in a better way but it's best to avoid unneccessary breaking changes now
  71. function toActorRef(actorRefLike) {
  72. var _a;
  73. return _tslib.__assign((_a = {
  74. subscribe: function () {
  75. return {
  76. unsubscribe: function () {
  77. return void 0;
  78. }
  79. };
  80. },
  81. id: 'anonymous',
  82. getSnapshot: function () {
  83. return undefined;
  84. }
  85. }, _a[utils.symbolObservable] = function () {
  86. return this;
  87. }, _a), actorRefLike);
  88. }
  89. exports.createDeferredActor = createDeferredActor;
  90. exports.createInvocableActor = createInvocableActor;
  91. exports.createNullActor = createNullActor;
  92. exports.isActor = isActor;
  93. exports.isSpawnedActor = isSpawnedActor;
  94. exports.toActorRef = toActorRef;