当前的 agiletc 存在 bug。用户执行撤销 (undo) 操作时,前后端无 message 交互,导致前后端的版本信息会失配,当用户再次编辑时,会出现版本信息不一致的报错。同时,撤销的动作也无法同步给其他的在线用户。
前端的撤销/重做等操作,应该与其他的编辑操作一致,向后端发送 patch,从而保持版本信息的一致性。
1.客户端保存 redoDiffs/undoDiffs 的列表,客户端操作时将 patch 分别放入 2 个列表;
2.客户端做 undo/redo 时分别从列表中进行偏移操作,同时将相关的 patch 发送给服务端,服务端转发给其他客户端;
3.服务端保留用例最新内容信息。
4.客户端需要区分正常编辑的 patch 和 undo/redo 的 patch,因为不同的 patch,版本信息变化逻辑不一致。
缺点:1.改造成本比较高,对原 patch 处置机制进行梳理,适配 undo/redo 场景。2.客户端操作链路复杂度提升,初步分析产生操作冲突的概率会增加,且前端在多节点情况下的性能可能会进一步下降。
优点:1.后端无需改造。
前端执行撤销/重做时,给后端发送 undo/redo 的消息。
优点:1.前端逻辑简化,JsonDiff 计算减少,理论上能够提升多节点场景下编辑性能;2.中心化处理后,推测编辑冲突概率会降低。
缺点:1.服务的复杂度提升,用户太多的场景下可能出现性能瓶颈。