flinker 1.0.7 → 2.0.0

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/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.asyncDelay = exports.MD5 = exports.RXSubscriber = exports.RXPipeline = exports.RXReplaceError = exports.RXDebounce = exports.RXRemoveDuplicates = exports.RXSkipNullable = exports.RXSkipFirst = exports.RXSpread = exports.RXFilter = exports.RXParallel = exports.RXSequent = exports.RXForEach = exports.RXFlatMap = exports.RXMap = exports.RXOperator = exports.RenderQueueStatus = exports.ObservableGlobalState = exports.JSXSubscriber = exports.observer = exports.observeFrom = exports.observe = exports.RXQueue = exports.RXQueueOperator = exports.RXObservableValue = exports.RXObservableEntity = exports.RXWaitUntilComplete = exports.RXFrom = exports.RXCombine = exports.RXOperation = exports.RXBuffer = exports.RXSubject = exports.RXEmitter = exports.RXDelayedError = exports.RXDelayedComplete = exports.RXJustError = exports.RXJustComplete = exports.RXPublisher = exports.RX = void 0;
3
+ exports.asyncDelay = exports.MD5 = exports.RXSubscriber = exports.RXPipeline = exports.RXReplaceError = exports.RXDebounce = exports.RXRemoveDuplicates = exports.RXSkipNullable = exports.RXSkipFirst = exports.RXSpread = exports.RXFilter = exports.RXParallel = exports.RXSequent = exports.RXForEach = exports.RXFlatMap = exports.RXMap = exports.RXOperator = exports.RXQueue = exports.RXQueueOperator = exports.RXObservableValue = exports.RXObservableEntity = exports.RXWaitUntilComplete = exports.RXFrom = exports.RXCombine = exports.RXOperation = exports.RXBuffer = exports.RXSubject = exports.RXEmitter = exports.RXDelayedError = exports.RXDelayedComplete = exports.RXJustError = exports.RXJustComplete = exports.RXPublisher = exports.RX = void 0;
4
4
  var RX_js_1 = require("./RX.js");
5
5
  Object.defineProperty(exports, "RX", { enumerable: true, get: function () { return RX_js_1.RX; } });
6
6
  var RXPublisher_js_1 = require("./RXPublisher.js");
@@ -20,13 +20,6 @@ Object.defineProperty(exports, "RXObservableEntity", { enumerable: true, get: fu
20
20
  Object.defineProperty(exports, "RXObservableValue", { enumerable: true, get: function () { return RXPublisher_js_1.RXObservableValue; } });
21
21
  Object.defineProperty(exports, "RXQueueOperator", { enumerable: true, get: function () { return RXPublisher_js_1.RXQueueOperator; } });
22
22
  Object.defineProperty(exports, "RXQueue", { enumerable: true, get: function () { return RXPublisher_js_1.RXQueue; } });
23
- var RXObserver_js_1 = require("./RXObserver.js");
24
- Object.defineProperty(exports, "observe", { enumerable: true, get: function () { return RXObserver_js_1.observe; } });
25
- Object.defineProperty(exports, "observeFrom", { enumerable: true, get: function () { return RXObserver_js_1.observeFrom; } });
26
- Object.defineProperty(exports, "observer", { enumerable: true, get: function () { return RXObserver_js_1.observer; } });
27
- Object.defineProperty(exports, "JSXSubscriber", { enumerable: true, get: function () { return RXObserver_js_1.JSXSubscriber; } });
28
- Object.defineProperty(exports, "ObservableGlobalState", { enumerable: true, get: function () { return RXObserver_js_1.ObservableGlobalState; } });
29
- Object.defineProperty(exports, "RenderQueueStatus", { enumerable: true, get: function () { return RXObserver_js_1.RenderQueueStatus; } });
30
23
  var RXOperator_js_1 = require("./RXOperator.js");
31
24
  Object.defineProperty(exports, "RXOperator", { enumerable: true, get: function () { return RXOperator_js_1.RXOperator; } });
32
25
  Object.defineProperty(exports, "RXMap", { enumerable: true, get: function () { return RXOperator_js_1.RXMap; } });
package/dist/esm/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  export { RX, } from "./RX.js";
2
2
  export { RXPublisher, RXJustComplete, RXJustError, RXDelayedComplete, RXDelayedError, RXEmitter, RXSubject, RXBuffer, RXOperation, RXCombine, RXFrom, RXWaitUntilComplete, RXObservableEntity, RXObservableValue, RXQueueOperator, RXQueue, } from "./RXPublisher.js";
3
- export { observe, observeFrom, observer, JSXSubscriber, ObservableGlobalState, RenderQueueStatus, } from "./RXObserver.js";
4
3
  export { RXOperator, RXMap, RXFlatMap, RXForEach, RXSequent, RXParallel, RXFilter, RXSpread, RXSkipFirst, RXSkipNullable, RXRemoveDuplicates, RXDebounce, RXReplaceError, } from "./RXOperator.js";
5
4
  export { RXPipeline } from "./RXPipeline.js";
6
5
  export { RXSubscriber } from "./RXSubscriber.js";
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export { RXAnySender, RXSender, RX, } from "./RX.js";
2
2
  export { AnyRXObservable, RXObservable, RXPublisherUID, RXPublisher, RXJustComplete, RXJustError, RXDelayedComplete, RXDelayedError, RXEmitter, RXSubject, RXBuffer, RXOperation, RXCombine, RXFrom, RXWaitUntilComplete, RXObservableEntity, RXObservableValue, RXAnyQueueOperator, RXQueueOperator, RXQueue, } from "./RXPublisher.js";
3
- export { observe, observeFrom, observer, JSXSubscriber, ObservableGlobalState, RenderQueueStatus, } from "./RXObserver.js";
4
3
  export { RXOperatorProtocol, RXAnyOperator, RXOperator, RXMap, RXFlatMap, RXForEach, RXSequent, RXParallel, RXFilter, RXSpread, RXSkipFirst, RXSkipNullable, RXRemoveDuplicates, RXDebounce, RXReplaceError, } from "./RXOperator.js";
5
4
  export { RXAnyPipeline, RXPipeline } from "./RXPipeline.js";
6
5
  export { ErrorMethod, CompleteMethod, SubscribeMethod, RXAnySubscriber, RXSubscriber } from "./RXSubscriber.js";
package/package.json CHANGED
@@ -1,15 +1,13 @@
1
1
  {
2
2
  "name": "flinker",
3
3
  "description": "RX.ts lib for building frontend apps",
4
- "version": "1.0.7",
4
+ "version": "2.0.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/Dittner/Flinker.git"
8
8
  },
9
9
  "keywords": [
10
- "RX.ts",
11
- "React",
12
- "App state manager"
10
+ "RX.ts"
13
11
  ],
14
12
  "author": "Alexander Dittner",
15
13
  "license": "MIT",
@@ -64,9 +62,7 @@
64
62
  "ts-jest": "^29.3.0",
65
63
  "typescript": "^5.8.2",
66
64
  "@types/react": "^19.0.12",
67
- "@types/react-dom": "^19.0.4",
68
- "react": "^19.0.0",
69
- "react-dom": "^19.0.0"
65
+ "@types/react-dom": "^19.0.4"
70
66
  },
71
67
  "directories": {
72
68
  "test": "test"
@@ -1,33 +0,0 @@
1
- import { type AnyRXObservable, type RXObservable } from './RXPublisher.js';
2
- export declare function observe<RXElement extends AnyRXObservable | undefined>(rx: RXElement): RXElement;
3
- export declare function observeFrom(rx: () => AnyRXObservable): void;
4
- export declare function observer<T>(component: (props: T) => React.JSX.Element): (props: T) => React.JSX.Element;
5
- type JSXSubscriberUID = number;
6
- export declare class JSXSubscriber {
7
- static readonly empty: JSXSubscriber;
8
- readonly uid: JSXSubscriberUID;
9
- private readonly buildersSet;
10
- private readonly unsubscribeColl;
11
- renderCycle: number;
12
- initialized: boolean;
13
- readonly forceRenderFunc: (renderCycle: number) => void;
14
- constructor(forceRenderFunc: (renderCycle: number) => void);
15
- private _isDisposed;
16
- get isDisposed(): boolean;
17
- observe<V, E>(b: RXObservable<V, E>): void;
18
- observeFrom(f: () => AnyRXObservable): void;
19
- dispose(): void;
20
- resurrect(): void;
21
- render(renderCycle: number): boolean;
22
- }
23
- export declare class ObservableGlobalState {
24
- static renderCycle: number;
25
- static initializingJSXComponent: JSXSubscriber;
26
- static debug: boolean;
27
- }
28
- export declare enum RenderQueueStatus {
29
- IDLE = "IDLE",
30
- PENDING = "PENDING",
31
- RUNNING = "LOADING"
32
- }
33
- export {};
@@ -1,255 +0,0 @@
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
- };
@@ -1,249 +0,0 @@
1
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
- if (ar || !(i in from)) {
4
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
- ar[i] = from[i];
6
- }
7
- }
8
- return to.concat(ar || Array.prototype.slice.call(from));
9
- };
10
- import { useLayoutEffect, useRef, useState } from 'react';
11
- var __DEV__ = false;
12
- /*
13
- *
14
- *
15
- * GLOBAL OBSERVE METHODS
16
- *
17
- *
18
- * */
19
- export function observe(rx) {
20
- if (rx) {
21
- var jsxSubscriber = ObservableGlobalState.initializingJSXComponent;
22
- if (jsxSubscriber !== JSXSubscriber.empty) {
23
- logInfo('observe(' + rx.constructor.name + '), subscriber uid =', jsxSubscriber.uid);
24
- jsxSubscriber.observe(rx);
25
- }
26
- else {
27
- logWarn('observe(' + rx.constructor.name + ') is failed: JSX Function Component has not "observer" wrapper!');
28
- }
29
- }
30
- return rx;
31
- }
32
- export function observeFrom(rx) {
33
- if (rx) {
34
- var jsxSubscriber = ObservableGlobalState.initializingJSXComponent;
35
- if (jsxSubscriber !== JSXSubscriber.empty) {
36
- logInfo('observeFunc(' + rx.constructor.name + '), subscriber uid =', jsxSubscriber.uid);
37
- jsxSubscriber.observeFrom(rx);
38
- }
39
- else {
40
- logWarn('observeFunc(' + rx.constructor.name + ') is failed: JSX Function Component has not "observer" wrapper!');
41
- }
42
- }
43
- }
44
- export function observer(component) {
45
- return function (props) {
46
- var subscriberRef = useRef(JSXSubscriber.empty);
47
- var _a = useState(ObservableGlobalState.renderCycle), forceRender = _a[1];
48
- if (subscriberRef.current === JSXSubscriber.empty) {
49
- subscriberRef.current = new JSXSubscriber(function (renderCycle) {
50
- forceRender(renderCycle);
51
- });
52
- }
53
- if (__DEV__) {
54
- useLayoutEffect(function () {
55
- if (ObservableGlobalState.debug)
56
- logInfo('Registering of unmounting [' + subscriberRef.current.uid + ']');
57
- if (subscriberRef.current.isDisposed) {
58
- if (ObservableGlobalState.debug)
59
- logInfo('Disposed Subscriber [' + subscriberRef.current.uid + '] is resurrected');
60
- subscriberRef.current.resurrect();
61
- }
62
- return function () {
63
- if (ObservableGlobalState.debug)
64
- logInfo('Subscriber [' + subscriberRef.current.uid + '] is unmounted and disposed');
65
- subscriberRef.current.dispose();
66
- };
67
- }, []);
68
- }
69
- else {
70
- useLayoutEffect(function () { return function () { subscriberRef.current.dispose(); }; }, []);
71
- }
72
- var parentGlobalComponent = ObservableGlobalState.initializingJSXComponent;
73
- ObservableGlobalState.initializingJSXComponent = subscriberRef.current;
74
- //initializing begin
75
- subscriberRef.current.renderCycle = ObservableGlobalState.renderCycle;
76
- var renderedComponent = component(props);
77
- subscriberRef.current.initialized = true;
78
- //initializing end
79
- ObservableGlobalState.initializingJSXComponent = parentGlobalComponent;
80
- return renderedComponent;
81
- };
82
- }
83
- var suid = (function () { var value = 0; return function () { return value++; }; })();
84
- var JSXSubscriber = /** @class */ (function () {
85
- function JSXSubscriber(forceRenderFunc) {
86
- this.buildersSet = new Set();
87
- this.unsubscribeColl = Array();
88
- this.renderCycle = -1;
89
- this.initialized = false;
90
- this._isDisposed = false;
91
- this.uid = suid();
92
- this.forceRenderFunc = forceRenderFunc;
93
- }
94
- Object.defineProperty(JSXSubscriber.prototype, "isDisposed", {
95
- get: function () {
96
- return this._isDisposed;
97
- },
98
- enumerable: false,
99
- configurable: true
100
- });
101
- JSXSubscriber.prototype.observe = function (b) {
102
- var _this = this;
103
- if (b.isComplete || this.buildersSet.has(b.suid))
104
- return;
105
- this.buildersSet.add(b.suid);
106
- this.unsubscribeColl.push(b.pipe()
107
- .onReceive(function () {
108
- RenderQueue.self.add(_this);
109
- })
110
- .subscribe());
111
- };
112
- JSXSubscriber.prototype.observeFrom = function (f) {
113
- var _this = this;
114
- if (this.initialized)
115
- return;
116
- this.unsubscribeColl.push(f().pipe()
117
- .skipFirst()
118
- .onReceive(function () {
119
- RenderQueue.self.add(_this);
120
- })
121
- .subscribe());
122
- };
123
- JSXSubscriber.prototype.dispose = function () {
124
- this._isDisposed = true;
125
- if (!__DEV__)
126
- this.unsubscribeColl.forEach(function (f) { f(); });
127
- };
128
- JSXSubscriber.prototype.resurrect = function () {
129
- this._isDisposed = false;
130
- };
131
- JSXSubscriber.prototype.render = function (renderCycle) {
132
- if (this.isDisposed || this.renderCycle === renderCycle) {
133
- return false;
134
- }
135
- else {
136
- this.renderCycle = renderCycle;
137
- logInfo('----::forceRenderFunc');
138
- this.forceRenderFunc(this.renderCycle);
139
- return true;
140
- }
141
- };
142
- JSXSubscriber.empty = new JSXSubscriber(function () { });
143
- return JSXSubscriber;
144
- }());
145
- export { JSXSubscriber };
146
- //--------------------------------------
147
- // GlobalState
148
- //--------------------------------------
149
- var ObservableGlobalState = /** @class */ (function () {
150
- function ObservableGlobalState() {
151
- }
152
- ObservableGlobalState.renderCycle = 0;
153
- ObservableGlobalState.initializingJSXComponent = JSXSubscriber.empty;
154
- ObservableGlobalState.debug = false;
155
- return ObservableGlobalState;
156
- }());
157
- export { ObservableGlobalState };
158
- //--------------------------------------
159
- // RenderQueue
160
- //--------------------------------------
161
- export var RenderQueueStatus;
162
- (function (RenderQueueStatus) {
163
- RenderQueueStatus["IDLE"] = "IDLE";
164
- RenderQueueStatus["PENDING"] = "PENDING";
165
- RenderQueueStatus["RUNNING"] = "LOADING";
166
- })(RenderQueueStatus || (RenderQueueStatus = {}));
167
- var RenderQueue = /** @class */ (function () {
168
- function RenderQueue() {
169
- this.temp = Array();
170
- this.queue = new Set();
171
- this.status = RenderQueueStatus.IDLE;
172
- this.INFINITE_LOOP_LIMIT = 20;
173
- this.infiniteLoopDetected = false;
174
- this.loopRenderings = 0;
175
- }
176
- RenderQueue.prototype.add = function (s) {
177
- var _this = this;
178
- if (this.infiniteLoopDetected)
179
- return;
180
- if (this.status === RenderQueueStatus.RUNNING) {
181
- this.temp.push(s);
182
- }
183
- else {
184
- this.queue.add(s);
185
- if (this.status === RenderQueueStatus.IDLE) {
186
- this.status = RenderQueueStatus.PENDING;
187
- setTimeout(function () {
188
- _this.render();
189
- }, 0);
190
- }
191
- }
192
- };
193
- RenderQueue.prototype.render = function () {
194
- var _this = this;
195
- logInfo('RenderQueue:render: begin, cycle:', ObservableGlobalState.renderCycle);
196
- this.status = RenderQueueStatus.RUNNING;
197
- ObservableGlobalState.renderCycle++;
198
- var renderedComponentsCount = 0;
199
- Array.from(this.queue)
200
- .sort(function (s1, s2) { return s1.uid - s2.uid; })
201
- .forEach(function (subscriber) {
202
- subscriber.render(ObservableGlobalState.renderCycle) && renderedComponentsCount++;
203
- });
204
- this.queue.clear();
205
- this.status = RenderQueueStatus.IDLE;
206
- if (this.temp.length > 0) {
207
- this.loopRenderings++;
208
- if (this.loopRenderings > 2) {
209
- logWarn.apply(void 0, __spreadArray(__spreadArray(['Sending value from publisher while jsx-component is rendering may cause an infinite loop. Loop renderings:', this.loopRenderings,
210
- '. Most active publishers: ['], this.temp.map(function (ob) { return ob.constructor.name; }), false), [']'], false));
211
- }
212
- if (this.loopRenderings < this.INFINITE_LOOP_LIMIT) {
213
- this.temp.forEach(function (publisherUID) {
214
- _this.add(publisherUID);
215
- });
216
- this.temp.length = 0;
217
- }
218
- else {
219
- this.infiniteLoopDetected = true;
220
- logWarn('--Infinite Loop! The possible reason: An executed jsx-component X invoked new rendering of a jsx-component, ' +
221
- 'that caused mutation in publisher, that trigger again force render of X');
222
- }
223
- }
224
- else {
225
- this.loopRenderings = 0;
226
- }
227
- logInfo('RenderQueue:render: end, renderedComponentsCount:', renderedComponentsCount);
228
- };
229
- RenderQueue.self = new RenderQueue();
230
- return RenderQueue;
231
- }());
232
- //--------------------------------------
233
- // logging
234
- //--------------------------------------
235
- var logInfo = function () {
236
- var msg = [];
237
- for (var _i = 0; _i < arguments.length; _i++) {
238
- msg[_i] = arguments[_i];
239
- }
240
- if (ObservableGlobalState.debug)
241
- console.log.apply(console, msg);
242
- };
243
- var logWarn = function () {
244
- var msg = [];
245
- for (var _i = 0; _i < arguments.length; _i++) {
246
- msg[_i] = arguments[_i];
247
- }
248
- console.warn.apply(console, msg);
249
- };