@c11/engine.db
Version:
The engine db
130 lines • 10.1 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var isFunction_1 = __importDefault(require("lodash/isFunction"));
var triggerListener_1 = require("../fn/triggerListener");
var updateTriggers_1 = __importDefault(require("../fn/updateTriggers"));
var err_1 = __importDefault(require("../fn/err"));
var isWildcardPath_1 = require("../fn/isWildcardPath");
var engine_types_1 = require("@c11/engine.types");
var triggerWildcardFn_1 = require("../fn/triggerWildcardFn");
var pathTriggers_1 = __importDefault(require("../fn/pathTriggers"));
var listenerId = 0;
/**
* on
*
* Adds a listener
*
* - when a listener is first added a check is made
* on the path and if it exists then the listener
* is executed (async!)
*/
var on = function (db) {
return function (path, fn, refinee) {
var _a;
if (refinee === void 0) { refinee = { type: engine_types_1.AccessMethods.value, args: [] }; }
var obj = {
path: path,
fn: fn,
};
if (!(0, isFunction_1.default)(fn)) {
(0, err_1.default)(db, "/err/types/on/1", obj);
return;
}
/*
if (fn.length !== 1) {
err(db, '/err/types/on/1', obj)
return
}
*/
listenerId += 1;
if (!db.updates.fns[path]) {
db.updates.fns[path] = {};
db.updates.fns[path][listenerId] = {
fn: fn,
refinee: refinee,
};
db.updates.cache[path] = {};
(0, updateTriggers_1.default)(db, path);
}
else {
db.updates.fns[path][listenerId] = {
fn: fn,
refinee: refinee,
};
}
if (!db.updates.refinees[path]) {
db.updates.refinees[path] = (_a = {},
_a[engine_types_1.AccessMethods.value] = [],
_a[engine_types_1.AccessMethods.includes] = [],
_a[engine_types_1.AccessMethods.length] = [],
_a[engine_types_1.AccessMethods.isObserved] = [],
_a);
}
db.updates.refinees[path][refinee.type].push(listenerId);
if ((0, isWildcardPath_1.isWildcardPath)(path)) {
(0, triggerWildcardFn_1.triggerWildcardFn)(db, path, listenerId);
}
else {
(0, triggerListener_1.triggerListenerFn)(db, path, listenerId);
}
var triggerIsObserved = function () {
var impactedPaths = (0, pathTriggers_1.default)(db, path);
impactedPaths.forEach(function (impactedPath) {
if (!db.updates.refinees[impactedPath] ||
!db.updates.refinees[impactedPath][engine_types_1.AccessMethods.isObserved]) {
return;
}
var idx = db.updates.refinees[impactedPath][engine_types_1.AccessMethods.isObserved].length;
while (idx--) {
var id_1 = db.updates.refinees[impactedPath][engine_types_1.AccessMethods.isObserved][idx];
(0, triggerListener_1.triggerListenerFn)(db, impactedPath, id_1, (0, isWildcardPath_1.isWildcardPath)(impactedPath) ? [{ op: "test", path: path }] : []);
}
});
};
// special case of isObserved
if (refinee.type !== engine_types_1.AccessMethods.isObserved) {
triggerIsObserved();
}
var id = listenerId;
return function unsubscribe() {
if (db.updates.fns[path]) {
delete db.updates.fns[path][id];
}
// Remove everything related to this path as no
// more listeners exist
if (Object.keys(db.updates.fns[path]).length === 0) {
db.updates.fns[path] = null;
delete db.updates.fns[path];
db.updates.cache[path] = null;
delete db.updates.cache[path];
var triggers = db.updates.triggers;
var key = void 0;
var keys = Object.keys(triggers);
var l = keys.length;
var i = void 0;
var arr = void 0;
while (l--) {
key = keys[l];
arr = triggers[key];
i = arr.indexOf(path);
if (i !== -1) {
arr.splice(i, 1);
}
if (arr.length === 0) {
triggers[key] = null;
delete triggers[key];
}
}
}
// special case of isObserved
if (refinee.type !== engine_types_1.AccessMethods.isObserved) {
triggerIsObserved();
}
};
};
};
exports.default = on;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaUVBQTJDO0FBRTNDLHlEQUEyRTtBQUUzRSx3RUFBa0Q7QUFFbEQsa0RBQTRCO0FBQzVCLHVEQUFzRDtBQUN0RCxrREFBa0Q7QUFDbEQsNkRBQTREO0FBQzVELG9FQUE4QztBQUU5QyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFbkI7Ozs7Ozs7O0dBUUc7QUFDSCxJQUFNLEVBQUUsR0FDTixVQUFDLEVBQUU7SUFDSCxPQUFBLFVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFpRDs7UUFBakQsd0JBQUEsRUFBQSxZQUFZLElBQUksRUFBRSw0QkFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1FBQzFELElBQUksR0FBRyxHQUFHO1lBQ1IsSUFBSSxFQUFFLElBQUk7WUFDVixFQUFFLEVBQUUsRUFBRTtTQUNQLENBQUM7UUFFRixJQUFJLENBQUMsSUFBQSxvQkFBVSxFQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ25CLElBQUEsYUFBRyxFQUFDLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoQyxPQUFPO1NBQ1I7UUFFRDs7Ozs7UUFLQTtRQUVBLFVBQVUsSUFBSSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pCLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxQixFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRztnQkFDakMsRUFBRSxJQUFBO2dCQUNGLE9BQU8sU0FBQTthQUNSLENBQUM7WUFDRixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJ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
;