UNPKG

mosx

Version:

Multiview observable state management engine

452 lines 42.3 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MosxTracker = void 0; const mobx = __importStar(require("mobx")); const debug_1 = __importDefault(require("debug")); const internal_1 = require("./internal"); const info = (0, debug_1.default)("tracker"); class MosxTracker { constructor(object, params = {}) { this._adding = false; this.lastId = 0; this.patchedObjects = new Map(); this.listeners = new Set(); this.nodes = new WeakMap(); if (internal_1.Mosx.getParent(object)) { throw Error("Can track only root object!"); } this.root = object; this.reversible = params.reversible || false; this.privateMapValuePatch = params.privateMapValuePatch || false; this.serializer = params.serializer && new params.serializer(this); this.observeRecursively(this.root, undefined, ""); } onPatch(handler, params = {}) { let { tags = [], filter = [] } = params; const { reversible = this.reversible, spy = false } = params; filter = Array.isArray(filter) ? filter : [filter]; tags = Array.isArray(tags) ? tags : [tags]; const listener = { handler, filter: new Set(filter), tags, reversible, spy }; this.listeners.add(listener); return () => { this.listeners.delete(listener); }; } dispose() { this.unobserveRecursively(this.root); } tagChanged() { this.patchedObjects.clear(); } snapshot(params) { const state = internal_1.Mosx.getSnapshot(this.root, params === null || params === void 0 ? void 0 : params.tags, params === null || params === void 0 ? void 0 : params.spy); return this.serializer ? this.serializer.encodeSnapshot(state) : state; } tagExist(entryTags, tags = []) { const tagsArr = entryTags ? [...entryTags] : []; // tslint:disable-next-line: no-bitwise return !!tagsArr.find((tag) => !!~tags.indexOf(tag)); } getParentValue(entry) { entry.path; } tagChange(object, change) { var _a, _b; // skip if parent is added if (this._adding) { return; } const node = this.nodes.get(object); if (!node) { return; } node.tags = change.newValue; let path = "/" + this.buildPath(node); // object props const props = node.meta.props.filter((prop) => prop.hidden); if (!props.length && !node.hidden) { return; } for (const { handler: listener, tags, reversible, filter, spy } of this.listeners.values()) { // spy don't need updates if (spy) { continue; } // check if listeners already got this patch let patchedObjects = this.patchedObjects.get(listener); if (!patchedObjects) { patchedObjects = []; this.patchedObjects.set(listener, patchedObjects); } else { let alreadyPatched = false; for (const parent of patchedObjects) { alreadyPatched = object === parent || internal_1.Mosx.isParent(object, parent); if (alreadyPatched) { break; } } if (alreadyPatched) { continue; } } // check if tag inhereted from private parent if (node.parent && node.parent.hidden) { continue; } // check if update needed const wasVisible = this.tagExist(change.oldValue, tags); const nowVisible = this.tagExist(change.newValue, tags); if (wasVisible === nowVisible) { continue; } const changedObjects = []; if (node.hidden) { // handle private object const op = !this.privateMapValuePatch && ((_b = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.meta) === null || _b === void 0 ? void 0 : _b.type) === "map" ? nowVisible ? "add" : "remove" : "replace"; if (filter.size && !filter.has(op)) { continue; } changedObjects.push({ op, path, object }); } else { // handle private properties const op = nowVisible ? "add" : "remove"; if (filter.size && !filter.has(op)) { continue; } path = path.slice(-1) !== "/" ? path + "/" : path; for (const prop of props) { changedObjects.push({ op, path: path + prop.key, object: object[prop.key] }); } } for (const changedObject of changedObjects) { // create patch for each changed object/property const patch = { op: changedObject.op, path: changedObject.path, value: nowVisible ? (0, internal_1.snapshot)(changedObject.object, { tags }) : undefined, }; if (reversible) { patch.oldValue = wasVisible ? (0, internal_1.snapshot)(changedObject.object, { tags, objTags: change.oldValue }) : undefined; } if (this.serializer) { patch.encoded = this.serializer.encodePatch(patch, node); } // save patched object if (changedObject.object instanceof internal_1.Mosx) { patchedObjects.push(changedObject.object); } info(`patch [${patch.op}] on tag change [${tags.join(", ")}] ${spy ? "[spy] " : ""} %o`, patch); listener(patch, changedObject.object, this.root); } } } computedChange(object, change) { const entry = this.nodes.get(object); if (!entry) { return; } this.processChange(change, entry); } isHidden(node, tags) { var _a; while (node) { if (node.hidden) { const nodeTags = node.tags || ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.tags) || new Set(); if (!this.tagExist(nodeTags, tags)) { return true; } } node = node.parent; } return false; } processAddChange(change, parent, path) { if (change.type !== "add") { return; } this._adding = true; const entry = this.observeRecursively(change.newValue, parent, change.name) || parent; this._adding = false; for (const { handler, tags, filter, spy } of this.listeners.values()) { if (filter.size && !filter.has("add")) { continue; } if (!spy && this.isHidden(parent, tags)) { continue; } // check if object is visible for listener if (!spy && !this.privateMapValuePatch && this.isHidden(entry, tags)) { continue; } const patch = { op: "add", path: path + change.name, value: (0, internal_1.snapshot)(change.newValue, { tags, spy }), }; if (this.serializer) { patch.encoded = this.serializer.encodePatch(patch, entry); } info(`patch [add] on add [${tags.join(", ")}] ${spy ? "[spy] " : ""} %o`, patch); handler(patch, change.object, this.root); } } processUpdateChange(change, parent, path) { var _a; if (change.type !== "update") { return; } const key = change.name || "" + change.index; const props = parent.meta && parent.meta.props || []; this.unobserveRecursively(change.oldValue); const entry = this.observeRecursively(change.newValue, parent, key) || parent; // ignore observable properies if (((_a = parent.meta) === null || _a === void 0 ? void 0 : _a.props) && !props.find((prop) => prop.key === key)) { return; } const hidden = parent.hidden || !!props.find((prop) => prop.key === key && !!prop.hidden); for (const { handler, tags, reversible, filter, spy } of this.listeners.values()) { if (filter.size && !filter.has("replace")) { continue; } if (!spy && this.isHidden(parent, tags)) { continue; } // check if object and field are visible for listener if (!spy && hidden && !this.tagExist(entry.tags || parent.tags || new Set(), tags)) { continue; } const patch = { op: "replace", path: path + key, value: (0, internal_1.snapshot)(change.newValue, { tags, spy }), }; if (reversible) { patch.oldValue = (0, internal_1.snapshot)(change.oldValue, { tags, spy }); } if (this.serializer) { patch.encoded = this.serializer.encodePatch(patch, entry); } info(`patch [replece] on update [${tags.join(", ")}] ${spy ? "[spy] " : ""} %o`, patch); handler(patch, change.object, this.root); } } processDeleteChange(change, parent, path) { if (change.type !== "delete" && change.type !== "remove") { return; } const entry = this.unobserveRecursively(change.oldValue) || parent; for (const { handler, tags, reversible, filter, spy } of this.listeners.values()) { if (filter.size && !filter.has("remove")) { continue; } if (!spy && this.isHidden(parent, tags)) { continue; } // check if object is visible for listener if (!spy && !this.privateMapValuePatch && this.isHidden(entry, tags)) { continue; } const patch = { op: "remove", path: path + change.name, }; if (reversible) { patch.oldValue = (0, internal_1.snapshot)(change.oldValue, { tags, spy }); } if (this.serializer) { patch.encoded = this.serializer.encodePatch(patch, entry); } info(`patch [remove] on delete [${tags.join(", ")}] ${spy ? "[spy] " : ""} %o`, patch); handler(patch, change.object, this.root); } } processSpliceChange(change, parent, path) { change.removed.forEach((item) => { const entry = this.unobserveRecursively(item) || parent; for (const { handler, tags, reversible, filter, spy } of this.listeners.values()) { if (filter.size && !filter.has("remove")) { continue; } if (!spy && this.isHidden(parent, tags)) { continue; } const patch = { op: "remove", path: path + change.index, }; if (reversible) { patch.oldValue = (spy || !this.isHidden(entry, tags)) ? (0, internal_1.snapshot)(item, { tags, spy }) : undefined; } if (this.serializer) { patch.encoded = this.serializer.encodePatch(patch, entry); } info(`patch [remove] on splice [${tags.join(", ")}] ${spy ? "[spy] " : ""} %o`, patch); handler(patch, change.object, this.root); } }); change.added.forEach((item, idx) => { this._adding = true; const entry = this.observeRecursively(item, parent, "" + (change.index + idx)) || parent; this._adding = false; for (const { handler, tags, filter, spy } of this.listeners.values()) { if (filter.size && !filter.has("add")) { continue; } if (!spy && this.isHidden(parent, tags)) { continue; } const patch = { op: "add", path: path + change.index, value: (0, internal_1.snapshot)(item, { tags, spy }), }; if (this.serializer) { patch.encoded = this.serializer.encodePatch(patch, entry); } info(`patch [add] on splice [${tags.join(", ")}] ${spy ? "[spy] " : ""} %o`, patch); handler(patch, change.object, this.root); } }); // update paths for (let i = change.index + change.addedCount; i < change.object.length; i++) { if (this.isRecursivelyObservable(change.object[i])) { const itemEntry = this.nodes.get(change.object[i]); if (itemEntry) { itemEntry.path = "" + i; } } } } processChange(change, parent) { let path = "/" + this.buildPath(parent); path = path !== "/" ? path + "/" : "/"; switch (change.type) { case "add": return this.processAddChange(change, parent, path); case "update": return this.processUpdateChange(change, parent, path); case "delete": case "remove": return this.processDeleteChange(change, parent, path); case "splice": return this.processSpliceChange(change, parent, path); } } isRecursivelyObservable(node) { return mobx.isObservableObject(node) || mobx.isObservableArray(node) || mobx.isObservableMap(node); } buildPath(entry) { if (!entry) { return ""; } const res = []; while (entry.parent) { res.push(entry.path); entry = entry.parent; } return res.reverse().join("/"); } observeRecursively(node, parent, path) { if (!this.isRecursivelyObservable(node)) { return; } let entry = this.nodes.get(node); if (entry && (entry.parent !== parent || entry.path !== path)) { throw new Error(`The same observable object cannot appear twice in the same tree,` + ` trying to assign it to '${this.buildPath(parent)}/${path}',` + ` but it already exists at '${this.buildPath(entry.parent)}/${entry.path}'`); } if (!entry) { // create entry entry = this.createEntry(node, parent, path); mobx.entries(node).forEach(([key, value]) => { this.observeRecursively(value, entry, key); }); } return entry; } createEntry(value, parent, path) { var _a; // observe node const dispose = mobx.observe(value, (change) => { const parentNode = this.nodes.get(change.object); // notify serializer this.serializer && this.serializer.beforeChange(change, parentNode); this.processChange(change, parentNode); // notify serializer this.serializer && this.serializer.afterChange(change, parentNode); }); // current node metadata let meta; if (value instanceof internal_1.Mosx) { meta = internal_1.Mosx.meta(value); meta.type = value.constructor.name || value.constructor.__proto__.name; } else { meta = { type: "", props: undefined, hidden: false }; meta.type = mobx.isObservableMap(value) && "map" || mobx.isObservableArray(value) && "array" || mobx.isObservableObject(value) && "object" || ""; } // check if path is hidden const parentProps = ((_a = parent === null || parent === void 0 ? void 0 : parent.meta) === null || _a === void 0 ? void 0 : _a.props) || []; const hiddenProp = !!parentProps.find((prop) => prop.key === path && (prop.hidden || false)); // check if current or parent nodes are hidden const hidden = !!meta && meta.hidden || !!parent && (parent.hidden || hiddenProp); // collect node tags or parent node tags const tags = internal_1.Mosx.getTags(value); const entry = { id: this.lastId++, parent, path, dispose, meta, hidden, tags }; this.nodes.set(value, entry); // notify serializer this.serializer && this.serializer.onCreateNode(entry, value); // add default parent (root) to mosx object tagsTree if (value !== this.root && value instanceof internal_1.Mosx && !internal_1.Mosx.getParent(value)) { internal_1.Mosx.setParent(value, this.root); } info(`create node [${entry.id}] "/${this.buildPath(entry)}" ${entry.hidden ? "[hidden] " : ""}tags [${[...tags || []].join(", ")}] `); // store endtry return entry; } unobserveRecursively(node) { if (!this.isRecursivelyObservable(node)) { return; } const entry = this.nodes.get(node); if (!entry) { return; } info(`unobserve [${entry.id}] "${this.buildPath(entry.parent)}/${entry.path}"`); this.nodes.delete(node); entry.dispose(); if (node instanceof internal_1.Mosx) { internal_1.Mosx.destroy(node); } // notify serializer this.serializer && this.serializer.onDeleteNode(entry); // unobserve children mobx.values(node).forEach(this.unobserveRecursively.bind(this)); return entry; } } exports.MosxTracker = MosxTracker; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNEI7QUFDNUIsa0RBQTBCO0FBRTFCLHlDQUltQjtBQUVuQixNQUFNLElBQUksR0FBRyxJQUFBLGVBQU0sRUFBQyxTQUFTLENBQUMsQ0FBQTtBQUU5QixNQUFhLFdBQVc7SUFZdEIsWUFBWSxNQUFTLEVBQUUsU0FBNkIsRUFBRTtRQVg5QyxZQUFPLEdBQVksS0FBSyxDQUFBO1FBQ3hCLFdBQU0sR0FBVyxDQUFDLENBQUE7UUFDbEIsbUJBQWMsR0FBcUMsSUFBSSxHQUFHLEVBQStCLENBQUE7UUFDMUYsY0FBUyxHQUFzQixJQUFJLEdBQUcsRUFBZ0IsQ0FBQTtRQUN0RCxVQUFLLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUE7UUFRMUMsSUFBSSxlQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFCLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUE7U0FDM0M7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQTtRQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFBO1FBQzVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLElBQUksS0FBSyxDQUFBO1FBQ2hFLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFFTSxPQUFPLENBQUMsT0FBNkIsRUFBRSxTQUEyQixFQUFFO1FBQ3pFLElBQUksRUFBRSxJ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