flinker 1.0.0 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/RX.d.ts +22 -0
- package/dist/RXObserver.d.ts +33 -0
- package/dist/RXOperator.d.ts +133 -0
- package/dist/RXPipeline.d.ts +14 -0
- package/dist/RXPublisher.d.ts +153 -0
- package/dist/RXSubscriber.d.ts +30 -0
- package/dist/Utils.d.ts +2 -0
- package/dist/cjs/RX.js +41 -0
- package/dist/cjs/RXObserver.js +255 -0
- package/dist/cjs/RXOperator.js +484 -0
- package/dist/cjs/RXPipeline.js +27 -0
- package/dist/cjs/RXPublisher.js +733 -0
- package/dist/cjs/RXSubscriber.js +77 -0
- package/dist/cjs/Utils.js +257 -0
- package/dist/cjs/index.js +50 -0
- package/dist/esm/RX.js +38 -0
- package/dist/esm/RXObserver.js +249 -0
- package/dist/esm/RXOperator.js +481 -0
- package/dist/esm/RXPipeline.js +24 -0
- package/dist/esm/RXPublisher.js +730 -0
- package/dist/esm/RXSubscriber.js +74 -0
- package/dist/esm/Utils.js +252 -0
- package/dist/esm/index.js +7 -0
- package/dist/index.d.ts +7 -0
- package/package.json +2 -2
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
+
if (ar || !(i in from)) {
|
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
+
ar[i] = from[i];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RenderQueueStatus = exports.ObservableGlobalState = exports.JSXSubscriber = void 0;
|
|
13
|
+
exports.observe = observe;
|
|
14
|
+
exports.observeFrom = observeFrom;
|
|
15
|
+
exports.observer = observer;
|
|
16
|
+
var react_1 = require("react");
|
|
17
|
+
var __DEV__ = false;
|
|
18
|
+
/*
|
|
19
|
+
*
|
|
20
|
+
*
|
|
21
|
+
* GLOBAL OBSERVE METHODS
|
|
22
|
+
*
|
|
23
|
+
*
|
|
24
|
+
* */
|
|
25
|
+
function observe(rx) {
|
|
26
|
+
if (rx) {
|
|
27
|
+
var jsxSubscriber = ObservableGlobalState.initializingJSXComponent;
|
|
28
|
+
if (jsxSubscriber !== JSXSubscriber.empty) {
|
|
29
|
+
logInfo('observe(' + rx.constructor.name + '), subscriber uid =', jsxSubscriber.uid);
|
|
30
|
+
jsxSubscriber.observe(rx);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
logWarn('observe(' + rx.constructor.name + ') is failed: JSX Function Component has not "observer" wrapper!');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return rx;
|
|
37
|
+
}
|
|
38
|
+
function observeFrom(rx) {
|
|
39
|
+
if (rx) {
|
|
40
|
+
var jsxSubscriber = ObservableGlobalState.initializingJSXComponent;
|
|
41
|
+
if (jsxSubscriber !== JSXSubscriber.empty) {
|
|
42
|
+
logInfo('observeFunc(' + rx.constructor.name + '), subscriber uid =', jsxSubscriber.uid);
|
|
43
|
+
jsxSubscriber.observeFrom(rx);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
logWarn('observeFunc(' + rx.constructor.name + ') is failed: JSX Function Component has not "observer" wrapper!');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function observer(component) {
|
|
51
|
+
return function (props) {
|
|
52
|
+
var subscriberRef = (0, react_1.useRef)(JSXSubscriber.empty);
|
|
53
|
+
var _a = (0, react_1.useState)(ObservableGlobalState.renderCycle), forceRender = _a[1];
|
|
54
|
+
if (subscriberRef.current === JSXSubscriber.empty) {
|
|
55
|
+
subscriberRef.current = new JSXSubscriber(function (renderCycle) {
|
|
56
|
+
forceRender(renderCycle);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (__DEV__) {
|
|
60
|
+
(0, react_1.useLayoutEffect)(function () {
|
|
61
|
+
if (ObservableGlobalState.debug)
|
|
62
|
+
logInfo('Registering of unmounting [' + subscriberRef.current.uid + ']');
|
|
63
|
+
if (subscriberRef.current.isDisposed) {
|
|
64
|
+
if (ObservableGlobalState.debug)
|
|
65
|
+
logInfo('Disposed Subscriber [' + subscriberRef.current.uid + '] is resurrected');
|
|
66
|
+
subscriberRef.current.resurrect();
|
|
67
|
+
}
|
|
68
|
+
return function () {
|
|
69
|
+
if (ObservableGlobalState.debug)
|
|
70
|
+
logInfo('Subscriber [' + subscriberRef.current.uid + '] is unmounted and disposed');
|
|
71
|
+
subscriberRef.current.dispose();
|
|
72
|
+
};
|
|
73
|
+
}, []);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
(0, react_1.useLayoutEffect)(function () { return function () { subscriberRef.current.dispose(); }; }, []);
|
|
77
|
+
}
|
|
78
|
+
var parentGlobalComponent = ObservableGlobalState.initializingJSXComponent;
|
|
79
|
+
ObservableGlobalState.initializingJSXComponent = subscriberRef.current;
|
|
80
|
+
//initializing begin
|
|
81
|
+
subscriberRef.current.renderCycle = ObservableGlobalState.renderCycle;
|
|
82
|
+
var renderedComponent = component(props);
|
|
83
|
+
subscriberRef.current.initialized = true;
|
|
84
|
+
//initializing end
|
|
85
|
+
ObservableGlobalState.initializingJSXComponent = parentGlobalComponent;
|
|
86
|
+
return renderedComponent;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
var suid = (function () { var value = 0; return function () { return value++; }; })();
|
|
90
|
+
var JSXSubscriber = /** @class */ (function () {
|
|
91
|
+
function JSXSubscriber(forceRenderFunc) {
|
|
92
|
+
this.buildersSet = new Set();
|
|
93
|
+
this.unsubscribeColl = Array();
|
|
94
|
+
this.renderCycle = -1;
|
|
95
|
+
this.initialized = false;
|
|
96
|
+
this._isDisposed = false;
|
|
97
|
+
this.uid = suid();
|
|
98
|
+
this.forceRenderFunc = forceRenderFunc;
|
|
99
|
+
}
|
|
100
|
+
Object.defineProperty(JSXSubscriber.prototype, "isDisposed", {
|
|
101
|
+
get: function () {
|
|
102
|
+
return this._isDisposed;
|
|
103
|
+
},
|
|
104
|
+
enumerable: false,
|
|
105
|
+
configurable: true
|
|
106
|
+
});
|
|
107
|
+
JSXSubscriber.prototype.observe = function (b) {
|
|
108
|
+
var _this = this;
|
|
109
|
+
if (b.isComplete || this.buildersSet.has(b.suid))
|
|
110
|
+
return;
|
|
111
|
+
this.buildersSet.add(b.suid);
|
|
112
|
+
this.unsubscribeColl.push(b.pipe()
|
|
113
|
+
.onReceive(function () {
|
|
114
|
+
RenderQueue.self.add(_this);
|
|
115
|
+
})
|
|
116
|
+
.subscribe());
|
|
117
|
+
};
|
|
118
|
+
JSXSubscriber.prototype.observeFrom = function (f) {
|
|
119
|
+
var _this = this;
|
|
120
|
+
if (this.initialized)
|
|
121
|
+
return;
|
|
122
|
+
this.unsubscribeColl.push(f().pipe()
|
|
123
|
+
.skipFirst()
|
|
124
|
+
.onReceive(function () {
|
|
125
|
+
RenderQueue.self.add(_this);
|
|
126
|
+
})
|
|
127
|
+
.subscribe());
|
|
128
|
+
};
|
|
129
|
+
JSXSubscriber.prototype.dispose = function () {
|
|
130
|
+
this._isDisposed = true;
|
|
131
|
+
if (!__DEV__)
|
|
132
|
+
this.unsubscribeColl.forEach(function (f) { f(); });
|
|
133
|
+
};
|
|
134
|
+
JSXSubscriber.prototype.resurrect = function () {
|
|
135
|
+
this._isDisposed = false;
|
|
136
|
+
};
|
|
137
|
+
JSXSubscriber.prototype.render = function (renderCycle) {
|
|
138
|
+
if (this.isDisposed || this.renderCycle === renderCycle) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
this.renderCycle = renderCycle;
|
|
143
|
+
logInfo('----::forceRenderFunc');
|
|
144
|
+
this.forceRenderFunc(this.renderCycle);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
JSXSubscriber.empty = new JSXSubscriber(function () { });
|
|
149
|
+
return JSXSubscriber;
|
|
150
|
+
}());
|
|
151
|
+
exports.JSXSubscriber = JSXSubscriber;
|
|
152
|
+
//--------------------------------------
|
|
153
|
+
// GlobalState
|
|
154
|
+
//--------------------------------------
|
|
155
|
+
var ObservableGlobalState = /** @class */ (function () {
|
|
156
|
+
function ObservableGlobalState() {
|
|
157
|
+
}
|
|
158
|
+
ObservableGlobalState.renderCycle = 0;
|
|
159
|
+
ObservableGlobalState.initializingJSXComponent = JSXSubscriber.empty;
|
|
160
|
+
ObservableGlobalState.debug = false;
|
|
161
|
+
return ObservableGlobalState;
|
|
162
|
+
}());
|
|
163
|
+
exports.ObservableGlobalState = ObservableGlobalState;
|
|
164
|
+
//--------------------------------------
|
|
165
|
+
// RenderQueue
|
|
166
|
+
//--------------------------------------
|
|
167
|
+
var RenderQueueStatus;
|
|
168
|
+
(function (RenderQueueStatus) {
|
|
169
|
+
RenderQueueStatus["IDLE"] = "IDLE";
|
|
170
|
+
RenderQueueStatus["PENDING"] = "PENDING";
|
|
171
|
+
RenderQueueStatus["RUNNING"] = "LOADING";
|
|
172
|
+
})(RenderQueueStatus || (exports.RenderQueueStatus = RenderQueueStatus = {}));
|
|
173
|
+
var RenderQueue = /** @class */ (function () {
|
|
174
|
+
function RenderQueue() {
|
|
175
|
+
this.temp = Array();
|
|
176
|
+
this.queue = new Set();
|
|
177
|
+
this.status = RenderQueueStatus.IDLE;
|
|
178
|
+
this.INFINITE_LOOP_LIMIT = 20;
|
|
179
|
+
this.infiniteLoopDetected = false;
|
|
180
|
+
this.loopRenderings = 0;
|
|
181
|
+
}
|
|
182
|
+
RenderQueue.prototype.add = function (s) {
|
|
183
|
+
var _this = this;
|
|
184
|
+
if (this.infiniteLoopDetected)
|
|
185
|
+
return;
|
|
186
|
+
if (this.status === RenderQueueStatus.RUNNING) {
|
|
187
|
+
this.temp.push(s);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
this.queue.add(s);
|
|
191
|
+
if (this.status === RenderQueueStatus.IDLE) {
|
|
192
|
+
this.status = RenderQueueStatus.PENDING;
|
|
193
|
+
setTimeout(function () {
|
|
194
|
+
_this.render();
|
|
195
|
+
}, 0);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
RenderQueue.prototype.render = function () {
|
|
200
|
+
var _this = this;
|
|
201
|
+
logInfo('RenderQueue:render: begin, cycle:', ObservableGlobalState.renderCycle);
|
|
202
|
+
this.status = RenderQueueStatus.RUNNING;
|
|
203
|
+
ObservableGlobalState.renderCycle++;
|
|
204
|
+
var renderedComponentsCount = 0;
|
|
205
|
+
Array.from(this.queue)
|
|
206
|
+
.sort(function (s1, s2) { return s1.uid - s2.uid; })
|
|
207
|
+
.forEach(function (subscriber) {
|
|
208
|
+
subscriber.render(ObservableGlobalState.renderCycle) && renderedComponentsCount++;
|
|
209
|
+
});
|
|
210
|
+
this.queue.clear();
|
|
211
|
+
this.status = RenderQueueStatus.IDLE;
|
|
212
|
+
if (this.temp.length > 0) {
|
|
213
|
+
this.loopRenderings++;
|
|
214
|
+
if (this.loopRenderings > 2) {
|
|
215
|
+
logWarn.apply(void 0, __spreadArray(__spreadArray(['Sending value from publisher while jsx-component is rendering may cause an infinite loop. Loop renderings:', this.loopRenderings,
|
|
216
|
+
'. Most active publishers: ['], this.temp.map(function (ob) { return ob.constructor.name; }), false), [']'], false));
|
|
217
|
+
}
|
|
218
|
+
if (this.loopRenderings < this.INFINITE_LOOP_LIMIT) {
|
|
219
|
+
this.temp.forEach(function (publisherUID) {
|
|
220
|
+
_this.add(publisherUID);
|
|
221
|
+
});
|
|
222
|
+
this.temp.length = 0;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
this.infiniteLoopDetected = true;
|
|
226
|
+
logWarn('--Infinite Loop! The possible reason: An executed jsx-component X invoked new rendering of a jsx-component, ' +
|
|
227
|
+
'that caused mutation in publisher, that trigger again force render of X');
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
this.loopRenderings = 0;
|
|
232
|
+
}
|
|
233
|
+
logInfo('RenderQueue:render: end, renderedComponentsCount:', renderedComponentsCount);
|
|
234
|
+
};
|
|
235
|
+
RenderQueue.self = new RenderQueue();
|
|
236
|
+
return RenderQueue;
|
|
237
|
+
}());
|
|
238
|
+
//--------------------------------------
|
|
239
|
+
// logging
|
|
240
|
+
//--------------------------------------
|
|
241
|
+
var logInfo = function () {
|
|
242
|
+
var msg = [];
|
|
243
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
244
|
+
msg[_i] = arguments[_i];
|
|
245
|
+
}
|
|
246
|
+
if (ObservableGlobalState.debug)
|
|
247
|
+
console.log.apply(console, msg);
|
|
248
|
+
};
|
|
249
|
+
var logWarn = function () {
|
|
250
|
+
var msg = [];
|
|
251
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
252
|
+
msg[_i] = arguments[_i];
|
|
253
|
+
}
|
|
254
|
+
console.warn.apply(console, msg);
|
|
255
|
+
};
|