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 +1 -8
- package/dist/esm/index.js +0 -1
- package/dist/index.d.ts +0 -1
- package/package.json +3 -7
- package/dist/RXObserver.d.ts +0 -33
- package/dist/cjs/RXObserver.js +0 -255
- package/dist/esm/RXObserver.js +0 -249
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.
|
|
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": "
|
|
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"
|
package/dist/RXObserver.d.ts
DELETED
|
@@ -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 {};
|
package/dist/cjs/RXObserver.js
DELETED
|
@@ -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
|
-
};
|
package/dist/esm/RXObserver.js
DELETED
|
@@ -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
|
-
};
|