mosx
Version:
Multiview observable state management engine
170 lines • 13 kB
JavaScript
;
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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