mosx
Version:
Multiview observable state management engine
452 lines • 42.3 kB
JavaScript
"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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