behaviors.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var actions = require('./actions.js');
  4. var Actor = require('./Actor.js');
  5. var utils = require('./utils.js');
  6. /**
  7. * Returns an actor behavior from a reducer and its initial state.
  8. *
  9. * @param transition The pure reducer that returns the next state given the current state and event.
  10. * @param initialState The initial state of the reducer.
  11. * @returns An actor behavior
  12. */
  13. function fromReducer(transition, initialState) {
  14. return {
  15. transition: transition,
  16. initialState: initialState
  17. };
  18. }
  19. function fromPromise(promiseFn) {
  20. var initialState = {
  21. error: undefined,
  22. data: undefined,
  23. status: 'pending'
  24. };
  25. return {
  26. transition: function (state, event, _a) {
  27. var parent = _a.parent,
  28. id = _a.id,
  29. observers = _a.observers;
  30. switch (event.type) {
  31. case 'fulfill':
  32. parent === null || parent === void 0 ? void 0 : parent.send(actions.doneInvoke(id, event.data));
  33. return {
  34. error: undefined,
  35. data: event.data,
  36. status: 'fulfilled'
  37. };
  38. case 'reject':
  39. parent === null || parent === void 0 ? void 0 : parent.send(actions.error(id, event.error));
  40. observers.forEach(function (observer) {
  41. observer.error(event.error);
  42. });
  43. return {
  44. error: event.error,
  45. data: undefined,
  46. status: 'rejected'
  47. };
  48. default:
  49. return state;
  50. }
  51. },
  52. initialState: initialState,
  53. start: function (_a) {
  54. var self = _a.self;
  55. promiseFn().then(function (data) {
  56. self.send({
  57. type: 'fulfill',
  58. data: data
  59. });
  60. }, function (reason) {
  61. self.send({
  62. type: 'reject',
  63. error: reason
  64. });
  65. });
  66. return initialState;
  67. }
  68. };
  69. }
  70. function spawnBehavior(behavior, options) {
  71. if (options === void 0) {
  72. options = {};
  73. }
  74. var state = behavior.initialState;
  75. var observers = new Set();
  76. var mailbox = [];
  77. var flushing = false;
  78. var flush = function () {
  79. if (flushing) {
  80. return;
  81. }
  82. flushing = true;
  83. while (mailbox.length > 0) {
  84. var event_1 = mailbox.shift();
  85. state = behavior.transition(state, event_1, actorCtx);
  86. observers.forEach(function (observer) {
  87. return observer.next(state);
  88. });
  89. }
  90. flushing = false;
  91. };
  92. var actor = Actor.toActorRef({
  93. id: options.id,
  94. send: function (event) {
  95. mailbox.push(event);
  96. flush();
  97. },
  98. getSnapshot: function () {
  99. return state;
  100. },
  101. subscribe: function (next, handleError, complete) {
  102. var observer = utils.toObserver(next, handleError, complete);
  103. observers.add(observer);
  104. observer.next(state);
  105. return {
  106. unsubscribe: function () {
  107. observers.delete(observer);
  108. }
  109. };
  110. }
  111. });
  112. var actorCtx = {
  113. parent: options.parent,
  114. self: actor,
  115. id: options.id || 'anonymous',
  116. observers: observers
  117. };
  118. state = behavior.start ? behavior.start(actorCtx) : state;
  119. return actor;
  120. }
  121. exports.fromPromise = fromPromise;
  122. exports.fromReducer = fromReducer;
  123. exports.spawnBehavior = spawnBehavior;