flinker 1.0.6 → 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.
@@ -202,9 +202,7 @@ exports.RXDelayedError = RXDelayedError;
202
202
  var RXEmitter = /** @class */ (function (_super) {
203
203
  __extends(RXEmitter, _super);
204
204
  function RXEmitter() {
205
- var _this = this;
206
- console.log('new RXEmitter');
207
- _this = _super.call(this) || this;
205
+ var _this = _super.call(this) || this;
208
206
  _this._hasValue = false;
209
207
  _this.hasError = false;
210
208
  _this._err = undefined;
@@ -407,9 +405,7 @@ exports.RXOperation = RXOperation;
407
405
  var RXCombine = /** @class */ (function (_super) {
408
406
  __extends(RXCombine, _super);
409
407
  function RXCombine(list) {
410
- var _this = this;
411
- console.log('new RXCombine');
412
- _this = _super.call(this) || this;
408
+ var _this = _super.call(this) || this;
413
409
  _this._values = [];
414
410
  _this._hasError = false;
415
411
  _this._err = undefined;
@@ -464,9 +460,7 @@ exports.RXCombine = RXCombine;
464
460
  var RXFrom = /** @class */ (function (_super) {
465
461
  __extends(RXFrom, _super);
466
462
  function RXFrom(list) {
467
- var _this = this;
468
- console.log('new RXFrom');
469
- _this = _super.call(this) || this;
463
+ var _this = _super.call(this) || this;
470
464
  _this.values = list;
471
465
  _this.sendComplete();
472
466
  return _this;
@@ -487,9 +481,7 @@ exports.RXFrom = RXFrom;
487
481
  var RXWaitUntilComplete = /** @class */ (function (_super) {
488
482
  __extends(RXWaitUntilComplete, _super);
489
483
  function RXWaitUntilComplete(list, resultPublisher) {
490
- var _this = this;
491
- console.log('new RXSequence');
492
- _this = _super.call(this) || this;
484
+ var _this = _super.call(this) || this;
493
485
  _this._value = undefined;
494
486
  _this._hasError = false;
495
487
  _this._err = undefined;
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; } });
@@ -199,9 +199,7 @@ export { RXDelayedError };
199
199
  var RXEmitter = /** @class */ (function (_super) {
200
200
  __extends(RXEmitter, _super);
201
201
  function RXEmitter() {
202
- var _this = this;
203
- console.log('new RXEmitter');
204
- _this = _super.call(this) || this;
202
+ var _this = _super.call(this) || this;
205
203
  _this._hasValue = false;
206
204
  _this.hasError = false;
207
205
  _this._err = undefined;
@@ -404,9 +402,7 @@ export { RXOperation };
404
402
  var RXCombine = /** @class */ (function (_super) {
405
403
  __extends(RXCombine, _super);
406
404
  function RXCombine(list) {
407
- var _this = this;
408
- console.log('new RXCombine');
409
- _this = _super.call(this) || this;
405
+ var _this = _super.call(this) || this;
410
406
  _this._values = [];
411
407
  _this._hasError = false;
412
408
  _this._err = undefined;
@@ -461,9 +457,7 @@ export { RXCombine };
461
457
  var RXFrom = /** @class */ (function (_super) {
462
458
  __extends(RXFrom, _super);
463
459
  function RXFrom(list) {
464
- var _this = this;
465
- console.log('new RXFrom');
466
- _this = _super.call(this) || this;
460
+ var _this = _super.call(this) || this;
467
461
  _this.values = list;
468
462
  _this.sendComplete();
469
463
  return _this;
@@ -484,9 +478,7 @@ export { RXFrom };
484
478
  var RXWaitUntilComplete = /** @class */ (function (_super) {
485
479
  __extends(RXWaitUntilComplete, _super);
486
480
  function RXWaitUntilComplete(list, resultPublisher) {
487
- var _this = this;
488
- console.log('new RXSequence');
489
- _this = _super.call(this) || this;
481
+ var _this = _super.call(this) || this;
490
482
  _this._value = undefined;
491
483
  _this._hasError = false;
492
484
  _this._err = undefined;
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.6",
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
- };