react-obsidian
Version:
Dependency injection framework for React and React Native applications
51 lines • 1.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ColdMediatorObservable = void 0;
const MediatorObservable_1 = require("../mediator/MediatorObservable");
const reflect_1 = require("../../utils/reflect");
class ColdMediatorObservable extends MediatorObservable_1.MediatorObservable {
constructor(obj, handler = new PropertyAccessTrackingProxy()) {
super(new Proxy(obj, handler));
this.handler = handler;
}
set value(_) {
throw new Error('Cannot set value of ColdMediatorObservable, use setValue(value, key) instead');
}
get value() {
return super.value;
}
setValue(key, value) {
if (this.handler.hasAccessedProperty(key)) {
this.handler.suspendTracking();
super.value = { ...this.value, [key]: value };
this.handler.resumeTracking();
}
}
addSource(source, onNext) {
source.subscribe(onNext);
return this;
}
}
exports.ColdMediatorObservable = ColdMediatorObservable;
class PropertyAccessTrackingProxy {
constructor() {
this.accessedProperties = new Set();
this.trackingSuspended = false;
}
get(target, p, receiver) {
if (!this.trackingSuspended) {
this.accessedProperties.add(p);
}
return reflect_1.Reflect.get(target, p, receiver);
}
hasAccessedProperty(key) {
return this.accessedProperties.has(key);
}
suspendTracking() {
this.trackingSuspended = true;
}
resumeTracking() {
this.trackingSuspended = false;
}
}
//# sourceMappingURL=ColdMediatorObservable.js.map