From a1fb1a6258ff60340cef74ff94820365dad3cb3c Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Sat, 2 Jun 2018 22:14:48 +0200 Subject: [PATCH] add persistence decoder --- .gitignore | 2 + src/Persistences/decodePersisted.mjs | 55 ++++++++++++++++++++++++++++ src/Util/fromCodePoint.mjs | 0 3 files changed, 57 insertions(+) create mode 100644 src/Persistences/decodePersisted.mjs create mode 100644 src/Util/fromCodePoint.mjs diff --git a/.gitignore b/.gitignore index d784cd40..379570ed 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ bower_components docs /y.* /examples/yjs-dist.js* +.vscode +.yjsPersisted diff --git a/src/Persistences/decodePersisted.mjs b/src/Persistences/decodePersisted.mjs new file mode 100644 index 00000000..cda8c3f6 --- /dev/null +++ b/src/Persistences/decodePersisted.mjs @@ -0,0 +1,55 @@ +import { integrateRemoteStructs } from '../MessageHandler/integrateRemoteStructs.mjs' +import { writeStructs } from '../MessageHandler/syncStep1.mjs' +import { writeDeleteSet, readDeleteSet } from '../MessageHandler/deleteSet.mjs' + +const PERSIST_UPDATE = 0 +/** + * Write an update to an encoder. + * + * @param {Yjs} y A Yjs instance + * @param {BinaryEncoder} updateEncoder I.e. transaction.encodedStructs + */ +export function encodeUpdate (y, updateEncoder, encoder) { + encoder.writeVarUint(PERSIST_UPDATE) + encoder.writeBinaryEncoder(updateEncoder) +} + +const PERSIST_STRUCTS_DS = 1 + +/** + * Write the current Yjs data model to an encoder. + * + * @param {Yjs} y A Yjs instance + * @param {BinaryEncoder} encoder An encoder to write to + */ +export function encodeStructsDS (y, encoder) { + encoder.writeVarUint(PERSIST_STRUCTS_DS) + writeStructs(y, encoder, new Map()) + writeDeleteSet(y, encoder) +} + +/** + *Feed the Yjs instance with the persisted state + * @param {Yjs} y A Yjs instance. + * @param {BinaryDecoder} decoder A Decoder instance that holds the file content. + */ +export function decodePersisted (y, decoder) { + y.transact(() => { + while (decoder.hasContent()) { + const contentType = decoder.readVarUint() + switch (contentType) { + case PERSIST_UPDATE: + y.transact(() => { + integrateRemoteStructs(y, decoder) + }) + break + case PERSIST_STRUCTS_DS: + y.transact(() => { + integrateRemoteStructs(y, decoder) + readDeleteSet(y, decoder) + }) + break + } + } + }) +} diff --git a/src/Util/fromCodePoint.mjs b/src/Util/fromCodePoint.mjs new file mode 100644 index 00000000..e69de29b