我已经实现了一个系统,前端和后端可以对 CRDT 文档进行更改。
前端和后端通过 Websocket 进行通信,并且在某个时刻这两对将同步。
问题是,如果前端在没有同步所有内容的情况下关闭套接字,则最新的更改永远不会保留。
如何暂停关闭套接字,直到前端文档和后端文档同步最新更改?
当我检测到套接字将要关闭时,我所做的就是询问后端文档是否有前端的最新更改。
为此,我使用 automerge 的
getAllChanges
函数并查看前端发送的哈希是否存在。
但是要做到这一点,我必须一遍又一遍地阅读文档中的所有更改......
我正在从事类似的工作,最终使用提供的同步协议。 根据文档,计划是在每次更改时发送由generateSyncMessage生成的消息。
万一恢复,您可以重播所有更改。
免责声明:我尚未成功获取文档后的syncMessage 中的所有更改。以下是如何根据文档生成synceMessag的示例:
const dummyDoc = automerge.change(automerge.from(
{content: ""}), doc => { doc.content = "dummy" })
let dummyState = automerge.initSyncState()
let msg: Uint8Array | null = null;
[dummyState, msg] = automerge.generateSyncMessage(dummyDoc, dummyState)
通过网络发送消息......在对等端:
let msg: Uint8Array | null = null;
[peerDoc, peerSyncState, msg] = automerge.receiveSyncMessage(this._document, this._syncState, message);
if (msg) {
// communicate that back to the first peer.
}
这样应该有一些来回......直到文档完全同步......
为了确保更改不会因连接重置或网络问题而丢失,我们还可以向通信通道添加一些缓冲。
希望我有帮助。