← 中文资源

简体中文版本

构建 CRDT 文本协作

一个后写胜出文本 CRDT:支持多端并发插入删除,无需协调即收敛,操作可序列化传输。

阅读英文原文

项目概述

本项目实现后写胜出文本 CRDT:每字符为节点含唯一 id(peer+lamport)、左邻居 id、字符与墓碑。插入在两邻居间建节点,删除标记墓碑,节点保留以保并发插入锚点。合并按 id 应用操作,重复无害,幂等。渲染按左邻居 id 排序、id 破并列、滤墓碑拼接。测试两端同位并发插入交换两种顺序断言收敛一致;一端删一端插后交换断言收敛;同操作合并两次断言幂等;不同顺序应用断言交换律;删除断言字符消失节点保留;并发插墓碑后断言有序;合并更高时钟断言本地推进。操作经任意传输交换,无需中央协调;中继助非同时在线端。持久化操作日志非节点映射;重启重放重建。peer id 与时钟须跨重启稳定。墓碑无仲裁不可回收;仅纯文本;默认时钟内存不持久。

架构与实施

构建 CRDT 文本协作的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。

限制与后续

当前构建 CRDT 文本协作实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整node:crypto版本。

代码示例

pnpm init

pnpm add -D typescript tsx vitest
crdt-text-collab/
├── src/crdt.ts
├── src/merge.ts
├── src/serialize.ts
├── tests/crdt.test.ts
└── package.json
const node = {id: [peer, clock++], left: leftId, right: rightId, ch, dead:false};
nodes.get(id).dead = true;
if (!nodes.has(op.id)) nodes.set(op.id, op.node); else applyTombstone(op);
return [...nodes.values()].sort(byLeftNeighbor).filter(n=>!n.dead).map(n=>n.ch).join("");
pnpm vitest run