@wordpress/sync
Version:
44 lines (43 loc) • 1.2 kB
JavaScript
// packages/sync/src/utils.ts
import * as Y from "yjs";
import * as buffer from "lib0/buffer";
import {
CRDT_DOC_META_PERSISTENCE_KEY,
CRDT_DOC_VERSION,
CRDT_STATE_MAP_KEY,
CRDT_STATE_VERSION_KEY
} from "./config";
function createYjsDoc(documentMeta) {
const metaMap = new Map(
Object.entries(documentMeta)
);
const ydoc = new Y.Doc({ meta: metaMap });
const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY);
stateMap.set(CRDT_STATE_VERSION_KEY, CRDT_DOC_VERSION);
return ydoc;
}
function serializeCrdtDoc(crdtDoc) {
return JSON.stringify({
document: buffer.toBase64(Y.encodeStateAsUpdateV2(crdtDoc))
});
}
function deserializeCrdtDoc(serializedCrdtDoc) {
try {
const { document } = JSON.parse(serializedCrdtDoc);
const docMetaMap = /* @__PURE__ */ new Map();
docMetaMap.set(CRDT_DOC_META_PERSISTENCE_KEY, true);
const ydoc = createYjsDoc({ meta: docMetaMap });
const yupdate = buffer.fromBase64(document);
Y.applyUpdateV2(ydoc, yupdate);
ydoc.clientID = Math.floor(Math.random() * 1e9);
return ydoc;
} catch (e) {
return null;
}
}
export {
createYjsDoc,
deserializeCrdtDoc,
serializeCrdtDoc
};
//# sourceMappingURL=utils.js.map