在 Yjs 中,操作日志(Operation Log)记录对数据的修改,包括插入字符和删除字符。每个操作包含操作类型(插入或删除)、位置、内容和唯一标识符(用户 ID 与时间戳)。操作日志可生成差异(delta),并发送给其他副本以更新其状态。
收到新操作后,Yjs 先将其添加到操作日志,再应用到数据结构。离线时,用户仍可继续编辑,操作保存在本地操作日志中;网络恢复后,Yjs 通过发送和接收操作日志同步数据。
下面的示例说明如何使用和更新操作日志:
class OperationLog {
constructor() {
this.log = [];
}
// 添加一个新的操作到操作日志
add(operation) {
this.log.push(operation);
}
// 获取操作日志
get() {
return this.log;
}
// 将操作日志转换为差异
toDelta() {
// 以简单的方式,直接返回整个操作日志
// 在实际的 Yjs 系统中,会实现更复杂的差异计算算法
return this.log;
}
}
let opLog = new OperationLog();
opLog.add({type: 'insert', position: 0, content: 'Hello, world!', siteId: 'A', timestamp: Date.now()});
opLog.add({type: 'delete', position: 5, length: 1, siteId: 'A', timestamp: Date.now()});
console.log(opLog.get()); // 输出操作日志
console.log(opLog.toDelta()); // 输出操作日志的差异
示例创建了操作日志 opLog,并添加一个插入操作和一个删除操作。opLog.get() 返回操作日志,opLog.toDelta() 返回操作日志对应的差异。
示例直接返回完整操作日志。实际的 Yjs 系统会进行更复杂的处理,例如计算差异时比较两个副本的向量时钟,只包含接收方副本尚未执行的操作。
