proxy-facades 1.0.0 → 1.0.2
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/DEVELOPMENT.md +77 -1
- package/RecordedReadOnProxiedObjectExt.d.ts +2 -1
- package/RecordedReadOnProxiedObjectExt.d.ts.map +1 -1
- package/RecordedReadOnProxiedObjectExt.js +1 -2
- package/RecordedReadOnProxiedObjectExt.js.map +1 -1
- package/RecordedReadOnProxiedObjectExt.ts +2 -2
- package/class-trackers/Array.d.ts +2 -1
- package/class-trackers/Array.d.ts.map +1 -1
- package/class-trackers/Array.js +4 -3
- package/class-trackers/Array.js.map +1 -1
- package/class-trackers/Array.ts +9 -3
- package/class-trackers/Iterator.d.ts +2 -1
- package/class-trackers/Iterator.d.ts.map +1 -1
- package/class-trackers/Iterator.js.map +1 -1
- package/class-trackers/Iterator.ts +2 -1
- package/class-trackers/Map.d.ts +2 -1
- package/class-trackers/Map.d.ts.map +1 -1
- package/class-trackers/Map.js +8 -7
- package/class-trackers/Map.js.map +1 -1
- package/class-trackers/Map.ts +8 -4
- package/class-trackers/Set.d.ts +2 -1
- package/class-trackers/Set.d.ts.map +1 -1
- package/class-trackers/Set.js +8 -7
- package/class-trackers/Set.js.map +1 -1
- package/class-trackers/Set.ts +9 -5
- package/common.d.ts +0 -54
- package/common.d.ts.map +1 -1
- package/common.js +1 -81
- package/common.js.map +1 -1
- package/common.ts +1 -131
- package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts +2 -1
- package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts.map +1 -1
- package/dist/mjs/RecordedReadOnProxiedObjectExt.js +1 -2
- package/dist/mjs/RecordedReadOnProxiedObjectExt.js.map +1 -1
- package/dist/mjs/class-trackers/Array.d.ts +2 -1
- package/dist/mjs/class-trackers/Array.d.ts.map +1 -1
- package/dist/mjs/class-trackers/Array.js +2 -1
- package/dist/mjs/class-trackers/Array.js.map +1 -1
- package/dist/mjs/class-trackers/Iterator.d.ts +2 -1
- package/dist/mjs/class-trackers/Iterator.d.ts.map +1 -1
- package/dist/mjs/class-trackers/Iterator.js.map +1 -1
- package/dist/mjs/class-trackers/Map.d.ts +2 -1
- package/dist/mjs/class-trackers/Map.d.ts.map +1 -1
- package/dist/mjs/class-trackers/Map.js +2 -1
- package/dist/mjs/class-trackers/Map.js.map +1 -1
- package/dist/mjs/class-trackers/Set.d.ts +2 -1
- package/dist/mjs/class-trackers/Set.d.ts.map +1 -1
- package/dist/mjs/class-trackers/Set.js +2 -1
- package/dist/mjs/class-trackers/Set.js.map +1 -1
- package/dist/mjs/common.d.ts +0 -54
- package/dist/mjs/common.d.ts.map +1 -1
- package/dist/mjs/common.js +1 -78
- package/dist/mjs/common.js.map +1 -1
- package/dist/mjs/index.d.ts +7 -3
- package/dist/mjs/index.d.ts.map +1 -1
- package/dist/mjs/index.js +5 -3
- package/dist/mjs/index.js.map +1 -1
- package/dist/mjs/objectChangeTracking.d.ts.map +1 -1
- package/dist/mjs/objectChangeTracking.js +2 -1
- package/dist/mjs/objectChangeTracking.js.map +1 -1
- package/dist/mjs/origChangeTracking.d.ts +0 -8
- package/dist/mjs/origChangeTracking.d.ts.map +1 -1
- package/dist/mjs/origChangeTracking.js +2 -23
- package/dist/mjs/origChangeTracking.js.map +1 -1
- package/dist/mjs/proxyFacade.d.ts +60 -1
- package/dist/mjs/proxyFacade.d.ts.map +1 -1
- package/dist/mjs/proxyFacade.js +98 -2
- package/dist/mjs/proxyFacade.js.map +1 -1
- package/dist/mjs/watchedProxyFacade.d.ts +2 -2
- package/dist/mjs/watchedProxyFacade.d.ts.map +1 -1
- package/dist/mjs/watchedProxyFacade.js +2 -2
- package/dist/mjs/watchedProxyFacade.js.map +1 -1
- package/index.d.ts +7 -3
- package/index.d.ts.map +1 -1
- package/index.js +7 -5
- package/index.js.map +1 -1
- package/index.ts +8 -4
- package/index_esm.mjs +8 -8
- package/objectChangeTracking.d.ts.map +1 -1
- package/objectChangeTracking.js +7 -6
- package/objectChangeTracking.js.map +1 -1
- package/objectChangeTracking.ts +1 -1
- package/origChangeTracking.d.ts +0 -8
- package/origChangeTracking.d.ts.map +1 -1
- package/origChangeTracking.js +2 -25
- package/origChangeTracking.js.map +1 -1
- package/origChangeTracking.ts +2 -30
- package/package.json +1 -1
- package/proxyFacade.d.ts +60 -1
- package/proxyFacade.d.ts.map +1 -1
- package/proxyFacade.js +103 -3
- package/proxyFacade.js.map +1 -1
- package/proxyFacade.ts +158 -3
- package/watchedProxyFacade.d.ts +2 -2
- package/watchedProxyFacade.d.ts.map +1 -1
- package/watchedProxyFacade.js +4 -4
- package/watchedProxyFacade.js.map +1 -1
- package/watchedProxyFacade.ts +10 -7
package/origChangeTracking.js
CHANGED
|
@@ -2,22 +2,18 @@
|
|
|
2
2
|
// This file has functions / classes that allow to watch writes to the original unproxied objects (or arrays/sets/maps)
|
|
3
3
|
// unproxied=not part of a proxy facade. Technically this can install Proxys as the prototype, to catch writes.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.changeTrackedOrigObjects = void 0;
|
|
6
5
|
exports.installChangeTracker = installChangeTracker;
|
|
7
|
-
exports.deleteProperty = deleteProperty;
|
|
8
|
-
const common_1 = require("./common");
|
|
9
6
|
const objectChangeTracking_1 = require("./objectChangeTracking");
|
|
10
7
|
const index_1 = require("./class-trackers/index");
|
|
11
8
|
const proxyFacade_1 = require("./proxyFacade");
|
|
12
9
|
const Util_1 = require("./Util");
|
|
13
|
-
exports.changeTrackedOrigObjects = new common_1.PartialGraph();
|
|
14
10
|
/**
|
|
15
11
|
*
|
|
16
12
|
* @param obj
|
|
17
13
|
*/
|
|
18
14
|
function installChangeTracker(obj) {
|
|
19
15
|
!(0, proxyFacade_1.isProxyForAFacade)(obj) || (0, Util_1.throwError)("Cannot install change tracker on a proxy. The proxy should already support change tracking.");
|
|
20
|
-
if (
|
|
16
|
+
if (proxyFacade_1.changeTrackedOrigObjects.hasObj(obj)) {
|
|
21
17
|
return;
|
|
22
18
|
}
|
|
23
19
|
function inner() {
|
|
@@ -39,25 +35,6 @@ function installChangeTracker(obj) {
|
|
|
39
35
|
}
|
|
40
36
|
}
|
|
41
37
|
inner();
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Use this to delete properties on objects that have a write tracker installed. Otherwise they are not deletable and the write tracker cannot track the object's keys modification and inform listeners
|
|
46
|
-
* @param obj
|
|
47
|
-
* @param key
|
|
48
|
-
*/
|
|
49
|
-
function deleteProperty(obj, key) {
|
|
50
|
-
if (!exports.changeTrackedOrigObjects.hasObj(obj)) {
|
|
51
|
-
return delete obj[key];
|
|
52
|
-
}
|
|
53
|
-
const doesExist = Object.getOwnPropertyDescriptor(obj, key) !== undefined;
|
|
54
|
-
if (!doesExist) {
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
return (0, common_1.runChangeOperation)(obj, new common_1.UnspecificObjectChange(obj), [(0, objectChangeTracking_1.getChangeHooksForObject)(obj).changeOwnKeys], () => {
|
|
58
|
-
//@ts-ignore
|
|
59
|
-
obj[key] = undefined; // Set to undefined first, so property change listeners will get informed
|
|
60
|
-
return delete obj[key];
|
|
61
|
-
});
|
|
38
|
+
proxyFacade_1.changeTrackedOrigObjects._register(obj);
|
|
62
39
|
}
|
|
63
40
|
//# sourceMappingURL=origChangeTracking.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"origChangeTracking.js","sourceRoot":"","sources":["origChangeTracking.ts"],"names":[],"mappings":";AAAA,uHAAuH;AACvH,+GAA+G
|
|
1
|
+
{"version":3,"file":"origChangeTracking.js","sourceRoot":"","sources":["origChangeTracking.ts"],"names":[],"mappings":";AAAA,uHAAuH;AACvH,+GAA+G;;AAa/G,oDA2BC;AArCD,iEAA0D;AAC1D,kDAA4D;AAC5D,+CAA0E;AAC1E,iCAAkC;AAGlC;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,GAAW;IAC5C,CAAC,IAAA,+BAAiB,EAAC,GAAG,CAAC,IAAI,IAAA,iBAAU,EAAC,6FAA6F,CAAC,CAAC;IACrI,IAAG,sCAAwB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO;IACX,CAAC;IAED,SAAS,KAAK;QACV,MAAM,cAAc,GAAG,IAAA,4BAAoB,EAAC,GAAG,CAAC,CAAC;QACjD,IAAI,cAAc,EAAE,CAAC;YACjB,IAAI,cAAc,CAAC,4BAA4B,EAAE,CAAC;gBAC9C,8GAA8G;gBAC9G,MAAM,KAAK,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC;gBAChE,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClC,OAAO;YACX,CAAC;YAED,IAAI,cAAc,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBAC7C,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACvE,CAAC;QACL,CAAC;aAAM,CAAC,CAAC,uBAAuB;YAC5B,MAAM,KAAK,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC;YAChE,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;IACL,CAAC;IACD,KAAK,EAAE,CAAC;IAER,sCAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC"}
|
package/origChangeTracking.ts
CHANGED
|
@@ -2,19 +2,11 @@
|
|
|
2
2
|
// unproxied=not part of a proxy facade. Technically this can install Proxys as the prototype, to catch writes.
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
ObjectProxyHandler,
|
|
8
|
-
changeHooksForObject,
|
|
9
|
-
getChangeHooksForObject
|
|
10
|
-
} from "./objectChangeTracking";
|
|
5
|
+
import {ObjectProxyHandler} from "./objectChangeTracking";
|
|
11
6
|
import {getTrackingConfigFor} from "./class-trackers/index";
|
|
12
|
-
import {isProxyForAFacade} from "./proxyFacade";
|
|
7
|
+
import {changeTrackedOrigObjects, isProxyForAFacade} from "./proxyFacade";
|
|
13
8
|
import {throwError} from "./Util";
|
|
14
9
|
|
|
15
|
-
export const changeTrackedOrigObjects = new PartialGraph();
|
|
16
|
-
|
|
17
|
-
|
|
18
10
|
|
|
19
11
|
/**
|
|
20
12
|
*
|
|
@@ -49,24 +41,4 @@ export function installChangeTracker(obj: object) {
|
|
|
49
41
|
changeTrackedOrigObjects._register(obj);
|
|
50
42
|
}
|
|
51
43
|
|
|
52
|
-
/**
|
|
53
|
-
* Use this to delete properties on objects that have a write tracker installed. Otherwise they are not deletable and the write tracker cannot track the object's keys modification and inform listeners
|
|
54
|
-
* @param obj
|
|
55
|
-
* @param key
|
|
56
|
-
*/
|
|
57
|
-
export function deleteProperty<O extends object>(obj: O, key: keyof O) {
|
|
58
|
-
if(!changeTrackedOrigObjects.hasObj(obj)) {
|
|
59
|
-
return delete obj[key];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const doesExist = Object.getOwnPropertyDescriptor(obj, key) !== undefined;
|
|
63
|
-
if (!doesExist) {
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
44
|
|
|
67
|
-
return runChangeOperation(obj, new UnspecificObjectChange(obj), [getChangeHooksForObject(obj).changeOwnKeys], () => {
|
|
68
|
-
//@ts-ignore
|
|
69
|
-
obj[key] = undefined; // Set to undefined first, so property change listeners will get informed
|
|
70
|
-
return delete obj[key];
|
|
71
|
-
});
|
|
72
|
-
}
|
package/package.json
CHANGED
package/proxyFacade.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
*
|
|
3
3
|
*/
|
|
4
|
-
import { ObjKey, PartialGraph } from "./common";
|
|
4
|
+
import { ChangeOperation, EventHook, ObjKey, PartialGraph, RecordedRead } from "./common";
|
|
5
|
+
import { WatchedProxyHandler } from "./watchedProxyFacade";
|
|
5
6
|
export declare abstract class ProxyFacade<HANDLER extends FacadeProxyHandler<any>> extends PartialGraph {
|
|
6
7
|
/**
|
|
7
8
|
* Treats them like functions, meaning, they get a proxied 'this'. WatchProxies will see the access to the real properties
|
|
@@ -42,4 +43,62 @@ export declare function invalidateObject(obj: object, message: string, cause?: E
|
|
|
42
43
|
* @returns the real real origial object from the real world
|
|
43
44
|
*/
|
|
44
45
|
export declare function getGlobalOrig<T extends object>(obj: T): T;
|
|
46
|
+
export declare abstract class RecordedReadOnProxiedObject extends RecordedRead {
|
|
47
|
+
proxyHandler: WatchedProxyHandler;
|
|
48
|
+
/**
|
|
49
|
+
* A bit redundant with proxyhandler. But for performance reasons, we leave it
|
|
50
|
+
*/
|
|
51
|
+
obj: object;
|
|
52
|
+
}
|
|
53
|
+
export interface IWatchedProxyHandler_common {
|
|
54
|
+
/**
|
|
55
|
+
* Registers the Read to this WatchedProxyHandler and fires it on the WatchedFacade (informs WatchedFacade's listeners)
|
|
56
|
+
* @param read
|
|
57
|
+
*/
|
|
58
|
+
fireAfterRead(read: RecordedReadOnProxiedObject): void;
|
|
59
|
+
getFacade(): ProxyFacade<any>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* For use in proxy and direct
|
|
63
|
+
*/
|
|
64
|
+
export interface DualUseTracker<T> {
|
|
65
|
+
/**
|
|
66
|
+
* Will return the handler when called through the handler
|
|
67
|
+
*/
|
|
68
|
+
get _watchedProxyHandler(): IWatchedProxyHandler_common | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* The original (unproxied) object
|
|
71
|
+
*/
|
|
72
|
+
get _target(): T;
|
|
73
|
+
}
|
|
74
|
+
export declare function dualUseTracker_callOrigMethodOnTarget<O extends object, M extends keyof O>(tracker: DualUseTracker<O>, methodName: M, args: unknown[]): ReturnType<O[M]>;
|
|
75
|
+
/**
|
|
76
|
+
* Informs hooksToServe's beforeListeners + executes changeOperation + informs hooksToServe's afterListeners.
|
|
77
|
+
* All this while preventing listeners from beeing called twice (this is the main purpose of this function!). Even during the same operation (call) that spans a call stack (the stack can go through multiple proxy layers)
|
|
78
|
+
* <p>
|
|
79
|
+
* This function is needed, because there's some overlapping of concerns in listener types, especially for Arrays. Also internal methods may again call the set method which itsself wants to call the propertychange_listeners.
|
|
80
|
+
* </p>
|
|
81
|
+
* @param forTarget object to sync on. All hooks passed to nested runChangeOperation calls will only be fired once.
|
|
82
|
+
* @param paramForListeners the parameter for the change listeners. It won't be run by this function / it's just the parameter. When setting to undefined, it indicates that this runChangeOperation call is only to wrap multiple nested calls / sync them on targetObject. The default anyChange hook won't be called at this level either.
|
|
83
|
+
* @param hooksToServe these hooks will be called (not twice, as mentioned).
|
|
84
|
+
* @param changeOperationFn
|
|
85
|
+
*/
|
|
86
|
+
export declare function runChangeOperation<R>(forTarget: object, paramForListeners: ChangeOperation | undefined, hooksToServe: EventHook[], changeOperationFn: () => R): R;
|
|
87
|
+
export interface ForWatchedProxyHandler<T> extends DualUseTracker<T> {
|
|
88
|
+
/**
|
|
89
|
+
* Will return the handler when called through the handler
|
|
90
|
+
*/
|
|
91
|
+
get _watchedProxyHandler(): IWatchedProxyHandler_common;
|
|
92
|
+
/**
|
|
93
|
+
* The original (unproxied) object
|
|
94
|
+
*/
|
|
95
|
+
get _target(): T;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Use this to delete properties on objects that have a write tracker installed. Otherwise they are not deletable and the write tracker cannot track the object's keys modification and inform listeners
|
|
99
|
+
* @param obj
|
|
100
|
+
* @param key
|
|
101
|
+
*/
|
|
102
|
+
export declare function deleteProperty<O extends object>(obj: O, key: keyof O): boolean;
|
|
103
|
+
export declare const changeTrackedOrigObjects: PartialGraph;
|
|
45
104
|
//# sourceMappingURL=proxyFacade.d.ts.map
|
package/proxyFacade.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxyFacade.d.ts","sourceRoot":"","sources":["proxyFacade.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"proxyFacade.d.ts","sourceRoot":"","sources":["proxyFacade.ts"],"names":[],"mappings":"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"}
|
package/proxyFacade.js
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FacadeProxyHandler = exports.ProxyFacade = void 0;
|
|
3
|
+
exports.changeTrackedOrigObjects = exports.RecordedReadOnProxiedObject = exports.FacadeProxyHandler = exports.ProxyFacade = void 0;
|
|
4
4
|
exports.isProxyForAFacade = isProxyForAFacade;
|
|
5
5
|
exports.invalidateObject = invalidateObject;
|
|
6
6
|
exports.getGlobalOrig = getGlobalOrig;
|
|
7
|
+
exports.dualUseTracker_callOrigMethodOnTarget = dualUseTracker_callOrigMethodOnTarget;
|
|
8
|
+
exports.runChangeOperation = runChangeOperation;
|
|
9
|
+
exports.deleteProperty = deleteProperty;
|
|
7
10
|
/**
|
|
8
11
|
*
|
|
9
12
|
*/
|
|
10
13
|
const common_1 = require("./common");
|
|
11
|
-
const
|
|
14
|
+
const objectChangeTracking_1 = require("./objectChangeTracking");
|
|
15
|
+
const Util_1 = require("./Util");
|
|
12
16
|
class ProxyFacade extends common_1.PartialGraph {
|
|
13
17
|
constructor() {
|
|
14
18
|
super(...arguments);
|
|
@@ -66,7 +70,7 @@ class FacadeProxyHandler {
|
|
|
66
70
|
}
|
|
67
71
|
deleteProperty(target, key) {
|
|
68
72
|
//@ts-ignore
|
|
69
|
-
return
|
|
73
|
+
return deleteProperty(this.target, key);
|
|
70
74
|
}
|
|
71
75
|
defineProperty(target, property, attributes) {
|
|
72
76
|
throw new Error("Must not use defineProperty on a proxied object. Handling of change tracking etc. for this may not be implemented");
|
|
@@ -184,4 +188,100 @@ function getGlobalOrig(obj) {
|
|
|
184
188
|
}
|
|
185
189
|
return obj;
|
|
186
190
|
}
|
|
191
|
+
class RecordedReadOnProxiedObject extends common_1.RecordedRead {
|
|
192
|
+
}
|
|
193
|
+
exports.RecordedReadOnProxiedObject = RecordedReadOnProxiedObject;
|
|
194
|
+
//@ts-ignore
|
|
195
|
+
function dualUseTracker_callOrigMethodOnTarget(tracker, methodName, args) {
|
|
196
|
+
const target = tracker._target;
|
|
197
|
+
const method = tracker._watchedProxyHandler !== undefined ? target[methodName] : Object.getPrototypeOf(Object.getPrototypeOf(tracker))[methodName];
|
|
198
|
+
return method.apply(target, args);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Used by runChangeOperation
|
|
202
|
+
*/
|
|
203
|
+
class ChangeCall {
|
|
204
|
+
constructor() {
|
|
205
|
+
this.fired_beforeListeners = new Set();
|
|
206
|
+
this.afterListeners = new Set();
|
|
207
|
+
/**
|
|
208
|
+
* "binds" the ChangeOperation parameter to the afterListeners
|
|
209
|
+
*/
|
|
210
|
+
this.paramsForAfterListeners = new Map();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const runChangeOperation_Calls = (0, Util_1.newDefaultMap)(() => new ChangeCall());
|
|
214
|
+
/**
|
|
215
|
+
* Informs hooksToServe's beforeListeners + executes changeOperation + informs hooksToServe's afterListeners.
|
|
216
|
+
* All this while preventing listeners from beeing called twice (this is the main purpose of this function!). Even during the same operation (call) that spans a call stack (the stack can go through multiple proxy layers)
|
|
217
|
+
* <p>
|
|
218
|
+
* This function is needed, because there's some overlapping of concerns in listener types, especially for Arrays. Also internal methods may again call the set method which itsself wants to call the propertychange_listeners.
|
|
219
|
+
* </p>
|
|
220
|
+
* @param forTarget object to sync on. All hooks passed to nested runChangeOperation calls will only be fired once.
|
|
221
|
+
* @param paramForListeners the parameter for the change listeners. It won't be run by this function / it's just the parameter. When setting to undefined, it indicates that this runChangeOperation call is only to wrap multiple nested calls / sync them on targetObject. The default anyChange hook won't be called at this level either.
|
|
222
|
+
* @param hooksToServe these hooks will be called (not twice, as mentioned).
|
|
223
|
+
* @param changeOperationFn
|
|
224
|
+
*/
|
|
225
|
+
function runChangeOperation(forTarget, paramForListeners, hooksToServe, changeOperationFn) {
|
|
226
|
+
var _a;
|
|
227
|
+
const synchronizeOn = getGlobalOrig(forTarget);
|
|
228
|
+
let isRootCall = !runChangeOperation_Calls.has(synchronizeOn); // is it not nested / the outermost call ?
|
|
229
|
+
const changeCall = runChangeOperation_Calls.get(synchronizeOn);
|
|
230
|
+
try {
|
|
231
|
+
if (paramForListeners) {
|
|
232
|
+
hooksToServe.push((0, objectChangeTracking_1.getChangeHooksForObject)(forTarget).anyChange); // Always serve this one as well
|
|
233
|
+
(_a = common_1.objectMembershipInGraphs.get(forTarget)) === null || _a === void 0 ? void 0 : _a.forEach(graph => {
|
|
234
|
+
hooksToServe.push(graph._changeHook);
|
|
235
|
+
});
|
|
236
|
+
// Fire and register before-hooks:
|
|
237
|
+
hooksToServe.forEach(hook => {
|
|
238
|
+
hook.beforeListeners.forEach(listener => {
|
|
239
|
+
if (!changeCall.fired_beforeListeners.has(listener)) {
|
|
240
|
+
listener(paramForListeners); // fire
|
|
241
|
+
changeCall.fired_beforeListeners.add(listener);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
hook.afterListeners.forEach(afterListener => {
|
|
245
|
+
if (!changeCall.afterListeners.has(afterListener)) {
|
|
246
|
+
changeCall.afterListeners.add(afterListener);
|
|
247
|
+
changeCall.paramsForAfterListeners.set(afterListener, paramForListeners); // Ensure, it is called with the proper changeOperation parameter afterwards. Otherwise stuff from a higher level facade would leak to a change listeners, registered in a lower facade
|
|
248
|
+
}
|
|
249
|
+
}); // schedule afterListeners
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
const result = changeOperationFn();
|
|
253
|
+
if (isRootCall) {
|
|
254
|
+
// call afterListeners:
|
|
255
|
+
for (const listener of changeCall.afterListeners) {
|
|
256
|
+
listener(changeCall.paramsForAfterListeners.get(listener)); // fire
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
262
|
+
if (isRootCall) {
|
|
263
|
+
runChangeOperation_Calls.delete(synchronizeOn);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Use this to delete properties on objects that have a write tracker installed. Otherwise they are not deletable and the write tracker cannot track the object's keys modification and inform listeners
|
|
269
|
+
* @param obj
|
|
270
|
+
* @param key
|
|
271
|
+
*/
|
|
272
|
+
function deleteProperty(obj, key) {
|
|
273
|
+
if (!exports.changeTrackedOrigObjects.hasObj(obj)) {
|
|
274
|
+
return delete obj[key];
|
|
275
|
+
}
|
|
276
|
+
const doesExist = Object.getOwnPropertyDescriptor(obj, key) !== undefined;
|
|
277
|
+
if (!doesExist) {
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
return runChangeOperation(obj, new common_1.UnspecificObjectChange(obj), [(0, objectChangeTracking_1.getChangeHooksForObject)(obj).changeOwnKeys], () => {
|
|
281
|
+
//@ts-ignore
|
|
282
|
+
obj[key] = undefined; // Set to undefined first, so property change listeners will get informed
|
|
283
|
+
return delete obj[key];
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
exports.changeTrackedOrigObjects = new common_1.PartialGraph();
|
|
187
287
|
//# sourceMappingURL=proxyFacade.js.map
|
package/proxyFacade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxyFacade.js","sourceRoot":"","sources":["proxyFacade.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"proxyFacade.js","sourceRoot":"","sources":["proxyFacade.ts"],"names":[],"mappings":"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"}
|
package/proxyFacade.ts
CHANGED
|
@@ -2,14 +2,20 @@
|
|
|
2
2
|
*
|
|
3
3
|
*/
|
|
4
4
|
import {
|
|
5
|
+
ChangeListener,
|
|
6
|
+
ChangeOperation,
|
|
7
|
+
EventHook,
|
|
5
8
|
getPropertyDescriptor,
|
|
6
9
|
GetterFlags,
|
|
7
10
|
objectMembershipInGraphs,
|
|
8
11
|
ObjKey,
|
|
9
12
|
PartialGraph,
|
|
10
|
-
|
|
13
|
+
RecordedRead,
|
|
14
|
+
SetterFlags, UnspecificObjectChange
|
|
11
15
|
} from "./common";
|
|
12
|
-
import {
|
|
16
|
+
import {getChangeHooksForObject} from "./objectChangeTracking";
|
|
17
|
+
import {newDefaultMap} from "./Util";
|
|
18
|
+
import {WatchedProxyHandler} from "./watchedProxyFacade";
|
|
13
19
|
|
|
14
20
|
|
|
15
21
|
export abstract class ProxyFacade<HANDLER extends FacadeProxyHandler<any>> extends PartialGraph {
|
|
@@ -219,4 +225,153 @@ export function getGlobalOrig<T extends object>(obj: T): T {
|
|
|
219
225
|
obj = handler.target as T;
|
|
220
226
|
}
|
|
221
227
|
return obj;
|
|
222
|
-
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export abstract class RecordedReadOnProxiedObject extends RecordedRead {
|
|
231
|
+
proxyHandler!: WatchedProxyHandler
|
|
232
|
+
/**
|
|
233
|
+
* A bit redundant with proxyhandler. But for performance reasons, we leave it
|
|
234
|
+
*/
|
|
235
|
+
obj!: object;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export interface IWatchedProxyHandler_common {
|
|
239
|
+
/**
|
|
240
|
+
* Registers the Read to this WatchedProxyHandler and fires it on the WatchedFacade (informs WatchedFacade's listeners)
|
|
241
|
+
* @param read
|
|
242
|
+
*/
|
|
243
|
+
fireAfterRead(read: RecordedReadOnProxiedObject): void;
|
|
244
|
+
|
|
245
|
+
getFacade(): ProxyFacade<any>
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* For use in proxy and direct
|
|
250
|
+
*/
|
|
251
|
+
export interface DualUseTracker<T> {
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Will return the handler when called through the handler
|
|
255
|
+
*/
|
|
256
|
+
get _watchedProxyHandler(): IWatchedProxyHandler_common | undefined;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* The original (unproxied) object
|
|
260
|
+
*/
|
|
261
|
+
get _target(): T
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
//@ts-ignore
|
|
265
|
+
export function dualUseTracker_callOrigMethodOnTarget<O extends object, M extends keyof O>(tracker: DualUseTracker<O>, methodName: M, args: unknown[]): ReturnType<O[M]> {
|
|
266
|
+
const target = tracker._target;
|
|
267
|
+
const method = tracker._watchedProxyHandler !== undefined ? target[methodName] : Object.getPrototypeOf(Object.getPrototypeOf(tracker))[methodName];
|
|
268
|
+
return method.apply(target, args);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Used by runChangeOperation
|
|
273
|
+
*/
|
|
274
|
+
class ChangeCall {
|
|
275
|
+
fired_beforeListeners = new Set<ChangeListener>();
|
|
276
|
+
afterListeners = new Set<ChangeListener>();
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* "binds" the ChangeOperation parameter to the afterListeners
|
|
280
|
+
*/
|
|
281
|
+
paramsForAfterListeners = new Map<ChangeListener, ChangeOperation>();
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const runChangeOperation_Calls = newDefaultMap<object, ChangeCall>(() => new ChangeCall());
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Informs hooksToServe's beforeListeners + executes changeOperation + informs hooksToServe's afterListeners.
|
|
288
|
+
* All this while preventing listeners from beeing called twice (this is the main purpose of this function!). Even during the same operation (call) that spans a call stack (the stack can go through multiple proxy layers)
|
|
289
|
+
* <p>
|
|
290
|
+
* This function is needed, because there's some overlapping of concerns in listener types, especially for Arrays. Also internal methods may again call the set method which itsself wants to call the propertychange_listeners.
|
|
291
|
+
* </p>
|
|
292
|
+
* @param forTarget object to sync on. All hooks passed to nested runChangeOperation calls will only be fired once.
|
|
293
|
+
* @param paramForListeners the parameter for the change listeners. It won't be run by this function / it's just the parameter. When setting to undefined, it indicates that this runChangeOperation call is only to wrap multiple nested calls / sync them on targetObject. The default anyChange hook won't be called at this level either.
|
|
294
|
+
* @param hooksToServe these hooks will be called (not twice, as mentioned).
|
|
295
|
+
* @param changeOperationFn
|
|
296
|
+
*/
|
|
297
|
+
export function runChangeOperation<R>(forTarget: object, paramForListeners: ChangeOperation | undefined, hooksToServe: EventHook[], changeOperationFn: () => R): R {
|
|
298
|
+
const synchronizeOn = getGlobalOrig(forTarget);
|
|
299
|
+
let isRootCall = !runChangeOperation_Calls.has(synchronizeOn); // is it not nested / the outermost call ?
|
|
300
|
+
const changeCall = runChangeOperation_Calls.get(synchronizeOn);
|
|
301
|
+
try {
|
|
302
|
+
if (paramForListeners) {
|
|
303
|
+
hooksToServe.push(getChangeHooksForObject(forTarget).anyChange); // Always serve this one as well
|
|
304
|
+
objectMembershipInGraphs.get(forTarget)?.forEach(graph => {
|
|
305
|
+
hooksToServe.push(graph._changeHook);
|
|
306
|
+
})
|
|
307
|
+
|
|
308
|
+
// Fire and register before-hooks:
|
|
309
|
+
hooksToServe.forEach(hook => {
|
|
310
|
+
hook.beforeListeners.forEach(listener => {
|
|
311
|
+
if (!changeCall.fired_beforeListeners.has(listener)) {
|
|
312
|
+
listener(paramForListeners); // fire
|
|
313
|
+
changeCall.fired_beforeListeners.add(listener);
|
|
314
|
+
}
|
|
315
|
+
})
|
|
316
|
+
|
|
317
|
+
hook.afterListeners.forEach(afterListener => {
|
|
318
|
+
if (!changeCall.afterListeners.has(afterListener)) {
|
|
319
|
+
changeCall.afterListeners.add(afterListener);
|
|
320
|
+
changeCall.paramsForAfterListeners.set(afterListener, paramForListeners); // Ensure, it is called with the proper changeOperation parameter afterwards. Otherwise stuff from a higher level facade would leak to a change listeners, registered in a lower facade
|
|
321
|
+
}
|
|
322
|
+
}); // schedule afterListeners
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const result = changeOperationFn();
|
|
327
|
+
|
|
328
|
+
if (isRootCall) {
|
|
329
|
+
// call afterListeners:
|
|
330
|
+
for (const listener of changeCall.afterListeners) {
|
|
331
|
+
listener(changeCall.paramsForAfterListeners.get(listener)!); // fire
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return result;
|
|
336
|
+
} finally {
|
|
337
|
+
if (isRootCall) {
|
|
338
|
+
runChangeOperation_Calls.delete(synchronizeOn);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
export interface ForWatchedProxyHandler<T> extends DualUseTracker<T> {
|
|
344
|
+
/**
|
|
345
|
+
* Will return the handler when called through the handler
|
|
346
|
+
*/
|
|
347
|
+
get _watchedProxyHandler(): IWatchedProxyHandler_common;
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* The original (unproxied) object
|
|
351
|
+
*/
|
|
352
|
+
get _target(): T
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Use this to delete properties on objects that have a write tracker installed. Otherwise they are not deletable and the write tracker cannot track the object's keys modification and inform listeners
|
|
357
|
+
* @param obj
|
|
358
|
+
* @param key
|
|
359
|
+
*/
|
|
360
|
+
export function deleteProperty<O extends object>(obj: O, key: keyof O) {
|
|
361
|
+
if(!changeTrackedOrigObjects.hasObj(obj)) {
|
|
362
|
+
return delete obj[key];
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
const doesExist = Object.getOwnPropertyDescriptor(obj, key) !== undefined;
|
|
366
|
+
if (!doesExist) {
|
|
367
|
+
return true;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return runChangeOperation(obj, new UnspecificObjectChange(obj), [getChangeHooksForObject(obj).changeOwnKeys], () => {
|
|
371
|
+
//@ts-ignore
|
|
372
|
+
obj[key] = undefined; // Set to undefined first, so property change listeners will get informed
|
|
373
|
+
return delete obj[key];
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
export const changeTrackedOrigObjects = new PartialGraph();
|
package/watchedProxyFacade.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { FacadeProxyHandler, ProxyFacade } from "./proxyFacade";
|
|
2
|
-
import { AfterReadListener, ChangeListener, EventHook,
|
|
1
|
+
import { FacadeProxyHandler, IWatchedProxyHandler_common, ProxyFacade, RecordedReadOnProxiedObject } from "./proxyFacade";
|
|
2
|
+
import { AfterReadListener, ChangeListener, EventHook, ObjKey, RecordedRead } from "./common";
|
|
3
3
|
import { RecordedReadOnProxiedObjectExt } from "./RecordedReadOnProxiedObjectExt";
|
|
4
4
|
/**
|
|
5
5
|
* Access a single value (=variable or return value from a function)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchedProxyFacade.d.ts","sourceRoot":"","sources":["watchedProxyFacade.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"watchedProxyFacade.d.ts","sourceRoot":"","sources":["watchedProxyFacade.ts"],"names":[],"mappings":"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"}
|
package/watchedProxyFacade.js
CHANGED
|
@@ -232,7 +232,7 @@ class WatchedProxyHandler extends proxyFacade_1.FacadeProxyHandler {
|
|
|
232
232
|
* @param args
|
|
233
233
|
*/
|
|
234
234
|
function trapForGenericReaderWriterMethod(...args) {
|
|
235
|
-
return (0,
|
|
235
|
+
return (0, proxyFacade_1.runChangeOperation)(proxy, new common_1.UnspecificObjectChange(proxy), [(0, objectChangeTracking_1.getChangeHooksForObject)(proxy).unspecificChange], () => {
|
|
236
236
|
var _a, _b;
|
|
237
237
|
const callResult = origMethod.apply(receiverMustBeNonProxied ? target : this, args); // call original method:
|
|
238
238
|
if (((_a = thisHandler.trackingConfig) === null || _a === void 0 ? void 0 : _a.trackTreads) !== false) { // not explicitly disabled ?
|
|
@@ -246,7 +246,7 @@ class WatchedProxyHandler extends proxyFacade_1.FacadeProxyHandler {
|
|
|
246
246
|
* @param args
|
|
247
247
|
*/
|
|
248
248
|
function trapHighLevelReaderWriterMethod(...args) {
|
|
249
|
-
return (0,
|
|
249
|
+
return (0, proxyFacade_1.runChangeOperation)(proxy, undefined, [], () => {
|
|
250
250
|
return origMethod.apply(this, args); // call original method
|
|
251
251
|
});
|
|
252
252
|
}
|
|
@@ -276,7 +276,7 @@ class WatchedProxyHandler extends proxyFacade_1.FacadeProxyHandler {
|
|
|
276
276
|
if (isNewProperty) {
|
|
277
277
|
hooksToServe.push(changeHooksForThisObject.changeOwnKeys);
|
|
278
278
|
}
|
|
279
|
-
(0,
|
|
279
|
+
(0, proxyFacade_1.runChangeOperation)(this.proxy, new common_1.UnspecificObjectChange(this.proxy), hooksToServe, () => {
|
|
280
280
|
super.rawChange(key, newUnproxiedValue);
|
|
281
281
|
});
|
|
282
282
|
}
|
|
@@ -285,7 +285,7 @@ class WatchedProxyHandler extends proxyFacade_1.FacadeProxyHandler {
|
|
|
285
285
|
if (!doesExists) {
|
|
286
286
|
return true;
|
|
287
287
|
}
|
|
288
|
-
return (0,
|
|
288
|
+
return (0, proxyFacade_1.runChangeOperation)(this.proxy, new common_1.UnspecificObjectChange(this.proxy), [(0, objectChangeTracking_1.getChangeHooksForObject)(this.proxy).changeOwnKeys], () => {
|
|
289
289
|
this.set(target, key, undefined, this.proxy); // Set to undefined first, so property change listeners will get informed
|
|
290
290
|
return super.deleteProperty(target, key);
|
|
291
291
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchedProxyFacade.js","sourceRoot":"","sources":["watchedProxyFacade.ts"],"names":[],"mappings":";;;;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"watchedProxyFacade.js","sourceRoot":"","sources":["watchedProxyFacade.ts"],"names":[],"mappings":"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"}
|