拓冰建站拓冰建站
首页 / 资讯中心 / 正文

OpenPencil 实时协作深度解析:基于 Yjs CRDT 与 Trystero WebRTC 的 P2P 协同设计

前端桌面应用AI 应用MCP 服务【免费下载链接】open-pencilAI-native design editor. Open-source Figma alternative.项目地址https://gitcode.com/gh_mirrors/op/open-pencil点击查看免费下载OpenPencil 内置了免服务器的多人实时协作能力多个参与者通过 WebRTC 直接互联使用 Yjs 的 CRDT无冲突复制数据类型自动合并并发修改整个过程中不需要任何 OpenPencil 账户也不会把设计文档上传到中心服务器。读完本文你将掌握如何启动并分享一个协作房间、理解文档/光标/选区/跟随视角等数据的同步机制以及从源码层面了解 Yjs、Trystero 与信令服务器在这一架构中各自承担的职责。启动一个协作会话在 OpenPencil 中发起协作非常简单打开协作菜单创建一个房间并分享链接即可。分享链接与房间 ID房间 ID 由 32 位 base36 字符小写字母 a-z 与数字 0-9随机生成实现位于 src/app/collab/awareness.ts 的generateRoomId()对应常量为ROOM_ID_LENGTH 32与ROOM_ID_CHARS见 src/constants.ts。如源码注释所述32 个 base36 字符约提供 165 比特熵房间 ID 相当于一张“持有者凭证”bearer credential必须能抵抗对公共信令话题的离线枚举攻击。分享链接由 src/constants.ts 的getShareURL()生成形如https://app.openpencil.dev/share/room-id在桌面端Tauri固定指向 Web 应用源浏览器端则使用当前窗口源。任何拿到链接的人都可以加入无需注册账户。从创建到加入的调用链从前端入口看src/app/collab/use.ts 的shareCurrentDoc()依次完成生成房间 ID →connect(roomId)→syncAllNodesToYjs()把当前文档全量同步进 Yjs 共享状态然后返回房间 ID 供 UI 复制分享。加入他人房间则直接调用connect(roomId)。共享的数据协作会话中同步的数据分为四类文档形状、文本、属性与布局的每一次编辑都实时同步Presenza在场信息每位参与者的名称、颜色、当前选中内容与活动页面Cursori光标每位参与者在画布上的光标位置Vista视图可以跟随另一位参与者的画布视口平移与缩放。数据模型在源码中的映射文档内容存储在 Yjs 的Y.Doc中通过nodes与images两个Y.Map分别承载场景图节点与图片数据见 src/app/collab/session.ts在场信息、光标与选区属于“awareness”层user字段携带名称与颜色cursor字段携带{ x, y, pageId, zoom }selection字段携带选中的节点 ID 列表见 src/app/collab/local-awareness.ts远程参与者的归一化结果定义在 src/app/collab/types.ts 的RemotePeer接口clientId、name、color、可选的cursor与selection。参与者颜色从PEER_COLORS8 种预设颜色见 src/constants.ts中按clientId % length兜底分配未设置名称时显示为 “Anonymous”见 src/app/collab/awareness.ts。跟随模式Follow Mode点击顶部栏中协作者的头像即可进入跟随模式你的画布会自动平移、缩放以匹配对方的视口并跟随对方切换活动页面再次点击即可退出。源码实现位于 src/app/collab/awareness.ts 的createFollowActions()tickFollow()读取被跟随者的cursor状态若其pageId与本地不同则调用store.switchPage()切换页面若对方cursor携带zoom则同步本地缩放通过panX cw / 2 - cursor.x * zoom、panY ch / 2 - cursor.y * zoom把对方视口中心对准本地画布并触发requestRender()如果对方光标消失如已断开跟随状态自动复位。自己的缩放变化也会通过watchAwarenessZoom()反向写入 awareness 的cursor.zoom字段见 src/app/collab/session.ts从而让跟随者看到与发起者一致的视野。架构Yjs CRDT Trystero WebRTC协作架构分三层协同工作Yjs以 CRDT 维护共享文档状态。并发编辑无需加锁即可自动合并天然无冲突Trystero负责发现参与者并建立 WebRTC 点对点连接支持通过 MQTT 等公共信令传输信令服务器仅在建立连接时起“介绍人”作用协助双方完成 WebRTC 握手不传输任何文档内容。传输层实现实际传输层封装在 src/app/collab/transport/trystero.ts通过trystero/mqtt的joinRoom以appId: openpencil见 src/constants.ts加入房间并配置了公开 ICE 服务器两个 STUNstun.l.google.com:19302、stun.cloudflare.com:3478与 openrelay 的 TURNUDP 与 TCP 两种 transport保证 NAT 后也能尽力建立直连或中继。开发模式下还支持可切换的测试传输当import.meta.env.DEV且运行配置collaborationTransport test时使用 src/app/collab/transport/test.ts 替代真实网络见 src/app/collab/transport/index.ts便于离线测试协作逻辑。房间消息协议src/app/collab/room.ts 通过 Trystero 的makeAction定义了四类命名空间消息yjs-update文档增量更新广播给所有参与者awareness光标/名称/选区等在场信息sync-step1/sync-reply新参与者加入时的状态向量请求与应答。新 peer 加入时onPeerJoin本地会发送Y.encodeStateVector(ydoc)作为同步起点对方据此只回传缺失的增量见 src/app/collab/room.ts避免全量重传ydoc.on(update)与awareness.on(update)则负责把本地变更广播出去并以origin remote区分远端来源防止回声src/app/collab/room.ts。本地持久化与重进房间会话创建时还会以IndexeddbPersistence(op-room- roomId)将Y.Doc持久化到浏览器本地 IndexedDB见 src/app/collab/session.ts。因此刷新页面后房间状态不会丢失——本地 CRDT 状态从 IndexedDB 恢复重新加入即可与在线参与者继续同步。浏览器与桌面端双支持协作在浏览器与桌面应用中均可使用。桌面端通过 Tauri 运行同一套前端协作栈分享链接统一指向app.openpencil.dev源见 src/constants.ts两端可以互相加入同一房间。隐私模型OpenPencil 协作的隐私设计是“无中心存储”文档内容不会被归档到任何 OpenPencil 服务器——数据只存在于参与者的浏览器之间直传每位参与者都在本地保留一份完整副本同时落在 Yjs 内存态与 IndexedDB 持久层由于房间 ID 即访问凭证请只把链接分享给信任的人。相应地连接质量完全取决于双方网络条件以及能否成功建立 WebRTCNAT 穿透失败时回退 TURN 中继与服务器带宽无关。结束协作会话关闭会话时远端参与者与远程光标会被清理disposeCollabSessionResources()见 src/app/collab/session.ts依次执行unbindGraphEvents()解绑场景图双向同步、stopZoomWatch()停止视口监听、room.leave()离开房间、awareness.destroy()销毁在场状态、persistence.destroy()与ydoc.destroy()释放资源最后复位跟随状态并清空remoteCursors。断开后远端光标与在场信息立即从画布移除断开方离线时其 awareness 状态由onPeerLeave通过removeAwarenessStates(awareness, remoteClients, peer-left)自动清理避免出现“幽灵光标”见 src/app/collab/room.ts已同步到本地文档的修改会完整保留——它们已通过 CRDT 合并进本地副本不会因他人离开而回滚。小结OpenPencil 的协作能力可以概括为一条清晰的链路Yjs 提供无冲突的文档状态Trystero 负责 WebRTC 的点对点互联公共信令服务器只做连接撮合IndexedDB 保证刷新后状态不丢。配合 165 比特熵的房间 ID 与“文档只存在于参与者本地”的隐私模型它非常适合需要即开即用、免账户、免自建服务器的多人设计评审与协同创作场景。相关实现可进一步查看 src/app/collab/ 目录下的完整源码或参考 协作功能官方文档。赞分享前端桌面应用AI 应用MCP 服务【免费下载链接】open-pencilAI-native design editor. Open-source Figma alternative.项目地址https://gitcode.com/gh_mirrors/op/open-pencil点击查看免费下载相关推荐OpenPencil 实时协作指南基于 Yjs CRDT 与 WebRTC 的无服务器 P2P 设计协作OpenPencil 实时协作指南基于 Yjs CRDT 与 WebRTC 的无服务器 P2P 设计协作 OpenPencil 内置了基于浏览器到浏览器P2前端桌面应用AI 应用MCP 服务OpenPencil 实时协作编辑指南基于 WebRTC P2P、Yjs CRDT 与 IndexedDB 的房间协作机制全解析OpenPencil 实时协作编辑指南基于 WebRTC P2P、Yjs CRDT 与 IndexedDB 的房间协作机制全解析 本篇指南以 collabor前端桌面应用AI 应用MCP 服务OpenPencil 实时协作完全指南基于 WebRTC 与 Yjs 的无服务器 P2P 协同编辑OpenPencil 实时协作完全指南基于 WebRTC 与 Yjs 的无服务器 P2P 协同编辑 导读 OpenPencil 项目仓库 https://l前端桌面应用AI 应用MCP 服务上一篇AListFlutter核心功能解析如何实现开箱即用的文件服务下一篇告别音频杂音Captura专业级音频配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门