UNPKG

mosx

Version:

Multiview observable state management engine

170 lines 13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LightSerializer = void 0; const patchpack_1 = require("patchpack"); const internal_1 = require("../internal"); const _1 = require("."); const mobx_1 = require("mobx"); class LightSerializer extends _1.Serializer { constructor() { super(...arguments); this._schema = {}; } onCreate() { const context = internal_1.mx.$context; const propType = (prop) => { if (typeof prop.type === "string") { return prop.type; } else if (Array.isArray(prop.type)) { return { type: "array", items: prop.type.map.name, }; } else if (typeof prop.type === "function") { return prop.type.name; } else if (typeof prop.type === "object") { return { type: "map", items: prop.type.map.name, }; } }; context.types.forEach(({ name, $mx }) => { const propSchema = {}; $mx.props.forEach((prop) => { propSchema[prop.key] = propType(prop); }); const meta = context.meta.get(name); if (!meta) { return; } this._schema[name] = { index: meta.index, parent: meta.parent, props: $mx.props.map((prop) => prop.key), schema: propSchema, }; }); } entryTypePath(entry) { const pathArr = []; while (entry) { pathArr.push(entry.meta && entry.meta.type || ""); entry = entry.parent; } return pathArr.reverse(); } /** * light compression * | | 0 | 1 | 2...n+2 | n+3... | * |------|----|----|---------|----------------------------| * | byte | op | n | path | [params, value, oldValue]* | * * op: * 0 -> "add" * 1 -> "replace" * 2 -> "remove" * * n: length of path * * path: * first byte >= 0 -> typeIndex, second byte -> propIndex * first byte < 0 -> param * * "*" - encoded with notepack */ encodePatch(patch, entry) { const pathTypes = this.entryTypePath(entry); const op = ["add", "replace", "remove"].indexOf(patch.op); const pathArr = patch.path.replace(/^\/+|\/+$/g, "").split("/"); const pathBuffer = []; const pathParams = []; pathArr.forEach((key, i) => { const typeName = pathTypes[i]; if (!typeName) { pathBuffer.push(-1); pathParams.push(key); } else { pathBuffer.push(...this.typePropIndex(typeName, key)); } }); // tslint:disable-next-line: no-bitwise const buffer = Buffer.from([op, pathBuffer.length, ...pathBuffer]); if (patch.op !== "remove") { pathParams.push(patch.value); } if (patch.op !== "add" && "oldValue" in patch) { pathParams.push(patch.oldValue); } const paramsBuffer = Buffer.from(patchpack_1.PatchPack.encode(pathParams)); return Buffer.concat([buffer, paramsBuffer]); } typePropIndex(type, prop) { const meta = internal_1.mx.$context.meta.get(type); if (!meta) { throw new Error(`Cannot get prop ${prop} index - object type ${type} not found!`); } const props = meta.ref.$mx.props; const index = props.findIndex(({ key }) => key === prop); return [meta.index, index]; } decodePatch(buffer) { const opIndex = buffer.readInt8(0); const pathLength = buffer.readInt8(1); const pathBuffer = buffer.slice(2, pathLength + 2); const paramsBuffer = buffer.slice(pathLength + 2); const params = patchpack_1.PatchPack.decode(paramsBuffer).reverse(); let path = ""; for (let i = 0; i < pathBuffer.length; i++) { const typeIndex = pathBuffer.readInt8(i); if (typeIndex < 0) { path += "/" + params.pop(); } else { const propIndex = pathBuffer.readInt8(++i); path += "/" + this.propName(typeIndex, propIndex); } } const patch = { op: ["add", "replace", "remove"][opIndex], path, }; if (params.length && patch.op !== "remove") { patch.value = params.pop(); } if (params.length && patch.op !== "add") { patch.oldValue = params.pop(); } if (params.length) { throw new Error(`Unhandled params: ${params.toString()}`); } return patch; } propName(typeIndex, propIndex) { const context = internal_1.mx.$context; const typeName = context.index[typeIndex]; const meta = context.meta.get(typeName); if (!meta) { throw new Error(`Cannot get prop ${propIndex} name - object type ${typeName} not found!`); } const prop = meta.ref.$mx.props[propIndex]; if (!prop) { throw new Error(`Cannot get prop ${propIndex} name - property not found!`); } return prop.key; } encodeSnapshot(value) { return patchpack_1.PatchPack.encode([this._schema, mobx_1.values]); } decodeSnapshot(buffer) { const [schema, snapshot] = patchpack_1.PatchPack.decode(buffer); this._schema = schema; return snapshot; } } exports.LightSerializer = LightSerializer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VyaWFsaXplci9saWdodC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBcUM7QUFFckMsMENBQWlFO0FBQ2pFLHdCQUE4QjtBQUM5QiwrQkFBNkI7QUFzQjdCLE1BQWEsZUFBZ0IsU0FBUSxhQUFVO0lBQS9DOztRQUNVLFlBQU8sR0FBaUIsRUFBRSxDQUFBO0lBc0xwQyxDQUFDO0lBcExRLFFBQVE7UUFDYixNQUFNLE9BQU8sR0FBRyxhQUFFLENBQUMsUUFBUSxDQUFBO1FBRTNCLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUE7YUFDakI7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkMsT0FBTztvQkFDTCxJQUFJLEVBQUUsT0FBTztvQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTtpQkFDMUIsQ0FBQTthQUNGO2lCQUFNLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtnQkFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTthQUN0QjtpQkFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQ3hDLE9BQU87b0JBQ0wsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUk7aUJBQzFCLENBQUE7YUFDRjtRQUNILENBQUMsQ0FBQTtRQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVB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