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