mosx
Version:
Multiview observable state management engine
52 lines (37 loc) • 1.23 kB
text/typescript
import { PatchPack } from "patchpack"
import { ITreeNode, IReversibleJsonPatch } from "../internal"
import { Serializer } from "."
import { values } from "mobx"
export class MPackSerializer extends Serializer {
public encodeSnapshot(value: any): Buffer {
return PatchPack.encode(values)
}
public decodeSnapshot(buffer: Buffer): any {
return PatchPack.decode(buffer)
}
public encodePatch (patch: IReversibleJsonPatch, entry: ITreeNode): Buffer {
const op = ["add", "replace", "remove"].indexOf(patch.op)
const patchArr = [op, patch.path]
if ("value" in patch) {
patchArr.push(patch.value)
}
if ("oldValue" in patch) {
patchArr.push(patch.oldValue)
}
return PatchPack.encode(patchArr)
}
public decodePatch (buffer: Buffer): IReversibleJsonPatch {
const patchArr = PatchPack.decode(buffer).reverse()
const patch: IReversibleJsonPatch = {
op: ["add", "replace", "remove"][patchArr.pop()] as any,
path: patchArr.pop(),
}
if (patchArr.length && patch.op !== "remove") {
patch.value = patchArr.pop()
}
if (patchArr.length && patch.op !== "add") {
patch.oldValue = patchArr.pop()
}
return patch
}
}