UNPKG

mosx

Version:

Multiview observable state management engine

1 lines 19.9 kB
(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{364:function(t,a,s){"use strict";s.r(a);var e=s(42),n=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"serializer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#serializer"}},[t._v("#")]),t._v(" Serializer")]),t._v(" "),s("h2",{attrs:{id:"concept"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#concept"}},[t._v("#")]),t._v(" Concept")]),t._v(" "),s("p",[t._v("By default all patches and snapshotes are not serialized")]),t._v(" "),s("p",[t._v("The following serializers are currently avalible:")]),t._v(" "),s("ul",[s("li",[t._v("MpackSerializer")]),t._v(" "),s("li",[t._v("LightSerializer")]),t._v(" "),s("li",[t._v("SchemaSerializer")])]),t._v(" "),s("h2",{attrs:{id:"mpackserializer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mpackserializer"}},[t._v("#")]),t._v(" "),s("strong",[t._v("MpackSerializer")])]),t._v(" "),s("p",[t._v("Simple serializer based on "),s("a",{attrs:{href:"https://msgpack.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("messagePack"),s("OutboundLink")],1),t._v(". Patch converted to array format and then encoded with "),s("a",{attrs:{href:"https://github.com/darrachequesne/notepack",target:"_blank",rel:"noopener noreferrer"}},[t._v("notepack.io"),s("OutboundLink")],1),t._v(" serialization. DecodeMap is not required for decoding:")]),t._v(" "),s("p",[t._v("Zero array element is used for patch.op converted to number:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("patch.op")]),t._v(" "),s("th",[t._v("op")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v('"add"')]),t._v(" "),s("td",[t._v("0")])]),t._v(" "),s("tr",[s("td",[t._v('"replace"')]),t._v(" "),s("td",[t._v("1")])]),t._v(" "),s("tr",[s("td",[t._v('"remove"')]),t._v(" "),s("td",[t._v("2")])])])]),t._v(" "),s("p",[t._v("First array element for patch.path, others elements for patch.value and patch.oldValue.")]),t._v(" "),s("p",[t._v("Example of Json patch:")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"op"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"add"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"path"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/players/0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Patch converted to array:")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/players/0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),s("h2",{attrs:{id:"lightserializer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#lightserializer"}},[t._v("#")]),t._v(" "),s("strong",[t._v("LightSerializer")])]),t._v(" "),s("p",[t._v("Simple serializer based on messagePack and with static decodeMap. DecodeMap will added to encoded snapshot and required for decoding.")]),t._v(" "),s("p",[t._v("Patch converted to tuple array format, "),s("code",[t._v("patch.path")]),t._v(" converted from string to bytes with indexes in static decode Map.\nThe algoritms is following - patch consists of 2 parts: header and body:")]),t._v(" "),s("ul",[s("li",[t._v("Header includes excoded patch.op and patch.path")]),t._v(" "),s("li",[t._v("Body includes array of params and value/oldValue and encoded with notepack.io")])]),t._v(" "),s("p",[t._v("When light serializer used patch endoded in following way:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th"),t._v(" "),s("th",[t._v("0")]),t._v(" "),s("th",[t._v("1")]),t._v(" "),s("th",[t._v("2...n+2")]),t._v(" "),s("th",[t._v("n+3...")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("byte")]),t._v(" "),s("td",[t._v("op")]),t._v(" "),s("td",[t._v("n")]),t._v(" "),s("td",[t._v("path")]),t._v(" "),s("td",[t._v("[...params, value, oldValue]*")])])])]),t._v(" "),s("p",[t._v('"*" - encoded with notepack')]),t._v(" "),s("p",[t._v("Zero byte is used for operation:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("patch.op")]),t._v(" "),s("th",[t._v("op")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v('"add"')]),t._v(" "),s("td",[t._v("0")])]),t._v(" "),s("tr",[s("td",[t._v('"replace"')]),t._v(" "),s("td",[t._v("1")])]),t._v(" "),s("tr",[s("td",[t._v('"remove"')]),t._v(" "),s("td",[t._v("2")])])])]),t._v(" "),s("p",[t._v("First byte is used for path size - number of nodes in "),s("code",[t._v("patch.path")]),t._v(" (x2 byte for each)")]),t._v(" "),s("p",[t._v("From second byte to n + 2 path encoded:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("byte")]),t._v(" "),s("th",[t._v("option 1")]),t._v(" "),s("th",[t._v("option 2")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("0")]),t._v(" "),s("td",[t._v("typeIndex")]),t._v(" "),s("td",[t._v("-1")])]),t._v(" "),s("tr",[s("td",[t._v("1")]),t._v(" "),s("td",[t._v("propIndex")]),t._v(" "),s("td",[t._v("paramIndex")])])])]),t._v(" "),s("p",[t._v("All map keys are not included in static encode Map as they are dynamic, so all keys added to body array.\npatch.value and patch.oldValue also added to body array and encode with notepack.io")]),t._v(" "),s("h2",{attrs:{id:"schemaserializer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#schemaserializer"}},[t._v("#")]),t._v(" "),s("strong",[t._v("SchemaSerializer")])]),t._v(" "),s("p",[t._v("This serializer based on "),s("a",{attrs:{href:"https://github.com/udamir/patchpack",target:"_blank",rel:"noopener noreferrer"}},[t._v("patchPack"),s("OutboundLink")],1),t._v(' library. The main difference from "light" version is that dynamic decode Map will be used (schema). Schema will be updated by decoding snapshot and patches. This serialize algorithm minimize size of encoded patch.')]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("tracker parameter "),s("code",[t._v("privateMapValuePatch = true")]),t._v(" will be applied.")])]),t._v(" "),s("h3",{attrs:{id:"schema-format"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#schema-format"}},[t._v("#")]),t._v(" Schema format")]),t._v(" "),s("p",[t._v("As in LightSerializer decodeMap included in encoded snapshot.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" tracker "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Mosx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createTracker")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n serializer"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" SchemaSerializer\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// privateMapValuePatch: true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" snapshot "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tracker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("snapshot")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"custom-serializer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-serializer"}},[t._v("#")]),t._v(" Custom Serializer")]),t._v(" "),s("p",[t._v("You can build your own serializer extending "),s("code",[t._v("Serializer")]),t._v(" class:")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CustomSerializer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Serializer")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tree nodes")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" nodes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" WeakMap"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ITreeNode"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tracker listeneres")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" listeneres"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Set"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("IListener"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// state tree root")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" root"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onCreate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// on serializer create")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("beforeChange")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("change"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IChange"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITreeNode")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// before sending patches to listeners")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("afterChange")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("change"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IChange"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITreeNode")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// after sending patches to listeners")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onCreateNode")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entry"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITreeNode"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// on create new tree node")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onDeleteNode")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entry"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITreeNode")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// on delete tree node")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("encodeSnapshot")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Buffer "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add encode snapshot algorithms")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("decodeSnapshot")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add decode snapshot algorithms")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("encodePatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("patch"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IReversibleJsonPatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Buffer "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add encode patch algorithms")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("decodePatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("buffer"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IReversibleJsonPatch "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add decode patch algorithms")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]);