@ribajs/core
Version:
Core module of Riba.js
152 lines • 12.6 kB
JavaScript
export class DotAdapter {
static ARRAY_METHODS = [
"push",
"pop",
"shift",
"unshift",
"sort",
"reverse",
"splice",
];
name = ".";
counter = 0;
weakmap = {};
weakReference(obj) {
if (!Object.hasOwnProperty.bind(obj)("__rv")) {
const id = this.counter++;
Object.defineProperty(obj, "__rv", {
value: id,
});
}
if (!this.weakmap[obj.__rv]) {
this.weakmap[obj.__rv] = {
callbacks: {},
};
}
return this.weakmap[obj.__rv];
}
cleanupWeakReference(ref, id) {
if (!Object.keys(ref.callbacks).length) {
if (!(ref.pointers && Object.keys(ref.pointers).length)) {
delete this.weakmap[id];
}
}
}
stubFunction(obj, fn) {
const original = obj[fn];
const map = this.weakReference(obj);
const weakmap = this.weakmap;
obj[fn] = (...args) => {
const response = original.apply(obj, args);
Object.keys(map.pointers).forEach((r) => {
const k = map.pointers[r];
if (weakmap[r]) {
if (Array.isArray(weakmap[r].callbacks[k])) {
weakmap[r].callbacks[k].forEach((callback) => {
callback.sync();
});
}
}
});
return response;
};
}
observeMutations(obj, ref, keypath) {
if (Array.isArray(obj)) {
const map = this.weakReference(obj);
if (!map.pointers) {
map.pointers = {};
DotAdapter.ARRAY_METHODS.forEach((fn) => {
this.stubFunction(obj, fn);
});
}
if (!map.pointers[ref]) {
map.pointers[ref] = [];
}
if (map.pointers[ref].indexOf(keypath) === -1) {
map.pointers[ref].push(keypath);
}
}
}
unobserveMutations(obj, ref, keypath) {
if (Array.isArray(obj) && obj.__rv != null) {
const map = this.weakmap[obj.__rv];
if (map) {
const pointers = map.pointers[ref];
if (pointers) {
const idx = pointers.indexOf(keypath);
if (idx > -1) {
pointers.splice(idx, 1);
}
if (!pointers.length) {
delete map.pointers[ref];
}
this.cleanupWeakReference(map, obj.__rv);
}
}
}
}
observe(obj, keypath, callback) {
let value;
const callbacks = this.weakReference(obj).callbacks;
if (!callbacks[keypath]) {
callbacks[keypath] = [];
const desc = Object.getOwnPropertyDescriptor(obj, keypath);
if (!desc || !(desc.get || desc.set || !desc.configurable)) {
value = obj[keypath];
Object.defineProperty(obj, keypath, {
enumerable: true,
get: () => {
return value;
},
set: (newValue) => {
if (newValue !== value) {
this.unobserveMutations(value, obj.__rv, keypath);
value = newValue;
const map = this.weakmap[obj.__rv];
if (map) {
const _callbacks = map.callbacks[keypath];
if (_callbacks) {
_callbacks.forEach((cb) => {
cb.sync();
});
}
this.observeMutations(newValue, obj.__rv, keypath);
}
}
},
});
}
}
if (callbacks[keypath].indexOf(callback) === -1) {
callbacks[keypath].push(callback);
}
this.observeMutations(obj[keypath], obj.__rv, keypath);
}
unobserve(obj, keypath, callback) {
const map = this.weakmap[obj.__rv];
if (map) {
const callbacks = map.callbacks[keypath];
if (callbacks) {
const idx = callbacks.indexOf(callback);
if (idx > -1) {
callbacks.splice(idx, 1);
if (!callbacks.length) {
delete map.callbacks[keypath];
this.unobserveMutations(obj[keypath], obj.__rv, keypath);
}
}
this.cleanupWeakReference(map, obj.__rv);
}
}
}
get(obj, keypath) {
return obj[keypath];
}
set(obj, keypath, value) {
obj[keypath] = value;
}
}
const dotAdapter = new DotAdapter();
export { dotAdapter };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90LmFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvZG90LmFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsTUFBTSxPQUFPLFVBQVU7SUFDZCxNQUFNLENBQUMsYUFBYSxHQUFHO1FBQzVCLE1BQU07UUFDTixLQUFLO1FBQ0wsT0FBTztRQUNQLFNBQVM7UUFDVCxNQUFNO1FBQ04sU0FBUztRQUNULFFBQVE7S0FDVCxDQUFDO0lBRUssSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUVYLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLEdBQVEsRUFBRSxDQUFDO0lBRWxCLGFBQWEsQ0FBQyxHQUFRO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUUxQixNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUU7Z0JBQ2pDLEtBQUssRUFBRSxFQUFFO2FBQ1YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHO2dCQUN2QixTQUFTLEVBQUUsRUFBRTthQUNkLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU0sb0JBQW9CLENBQUMsR0FBUSxFQUFFLEVBQVU7UUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLFlBQVksQ0FBQyxHQUFRLEVBQUUsRUFBVTtRQUN0QyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBVyxFQUFtQixFQUFFO1lBQzVDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUN0QyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUUxQixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNmLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDM0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQzdCLENBQUMsUUFBOEIsRUFBRSxFQUFFOzRCQUNqQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2xCLENBQUMsQ0FDRixDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVNLGdCQUFnQixDQUFDLEdBQVEsRUFBRSxHQUFXLEVBQUUsT0FBZTtRQUM1RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXBDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUVsQixVQUFVLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO29CQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsQ0FBQztZQUVELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU0sa0JBQWtCLENBQUMsR0FBWSxFQUFFLEdBQVcsRUFBRSxPQUFlO1FBQ2xFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRW5DLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFbkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUV0QyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNiLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMxQixDQUFDO29CQUVELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ3JCLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDM0IsQ0FBQztvQkFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFRLEVBQUUsT0FBZSxFQUFFLFFBQThCO1FBQ3RFLElBQUksS0FBVSxDQUFDO1FBRWYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFcEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hCLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUUzRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFckIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFO29CQUNsQyxVQUFVLEVBQUUsSUFBSTtvQkFFaEIsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixPQUFPLEtBQUssQ0FBQztvQkFDZixDQUFDO29CQUVELEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO3dCQUNoQixJQUFJLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQzs0QkFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRCQUNsRCxLQUFLLEdBQUcsUUFBUSxDQUFDOzRCQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFFbkMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQ0FDUixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dDQUUxQyxJQUFJLFVBQVUsRUFBRSxDQUFDO29DQUNmLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUF3QixFQUFFLEVBQUU7d0NBQzlDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQ0FDWixDQUFDLENBQUMsQ0FBQztnQ0FDTCxDQUFDO2dDQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs0QkFDckQsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLFNBQVMsQ0FBQyxHQUFRLEVBQUUsT0FBZSxFQUFFLFFBQThCO1FBQ3hFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXpDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFeEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDYixTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFFekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDdEIsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUM5QixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQzNELENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxHQUFHLENBQUMsR0FBUSxFQUFFLE9BQWU7UUFDbEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVNLEdBQUcsQ0FBQyxHQUFRLEVBQUUsT0FBZSxFQUFFLEtBQVU7UUFDOUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDOztBQUdILE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDIn0=