Skip to content

P2P 实时协作系统

模块概述

版本: v1.0.0 状态: ✅ 已实现 IPC处理器: 21个 最后更新: 2026-03-05

基于 Yjs CRDT 和 libp2p 的 P2P 实时协作系统。支持多人实时编辑、光标感知、区域锁定、冲突解决、行内评论和版本快照,提供完整的协作编辑体验。

核心特性

  • Yjs CRDT: 无冲突复制数据类型,自动合并并发编辑
  • libp2p 同步: P2P 网络实时广播文档更新和感知状态
  • 区域锁定: 支持全文/段落/区域级别的锁定机制
  • 冲突解决: 检测并提供手动/自动冲突解决
  • 行内评论: 支持线程化评论和解决跟踪
  • 版本快照: Yjs 快照保存和历史版本恢复
  • 组织知识同步: 跨组织 P2P 知识库同步

1. 架构设计

1.1 整体架构图

┌──────────────────────────────────────────────────────────────────┐
│                        前端 (Vue3)                                │
├──────────────────────────────────────────────────────────────────┤
│             Pinia Store: collab.ts (1,245行)                      │
│  ┌─────────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌────────┐ ┌────────┐  │
│  │ 文档编辑 │ │ 锁定  │ │ 评论  │ │ 版本  │ │ Yjs桥  │ │ 协作房间│  │
│  └─────────┘ └──────┘ └──────┘ └──────┘ └────────┘ └────────┘  │
└──────────────────────────────────────────────────────────────────┘
                              ↕ IPC (21个通道)
┌──────────────────────────────────────────────────────────────────┐
│                        主进程 (Electron)                          │
├──────────────────────────────────────────────────────────────────┤
│              realtime-collab-ipc.js (663行)                       │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │  RealtimeCollabManager (1,329行)                            │  │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐     │  │
│  │  │ 锁定管理      │  │ 冲突解决      │  │ 评论系统      │     │  │
│  │  └──────────────┘  └──────────────┘  └──────────────┘     │  │
│  └────────────────────────────────────────────────────────────┘  │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │  YjsCollabManager (676行)        │ OrgKnowledgeSyncManager │  │
│  │  Yjs CRDT + libp2p 同步          │ 组织知识P2P同步 (937行)  │  │
│  └────────────────────────────────────────────────────────────┘  │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │  PermissionManager (683行)  │  SQLite Database              │  │
│  └────────────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────────┘
                              ↕ libp2p
┌──────────────────────────────────────────────────────────────────┐
│                         P2P 网络                                  │
│  协议: /chainlesschain/yjs-sync/1.0.0                            │
│  协议: /chainlesschain/yjs-awareness/1.0.0                       │
└──────────────────────────────────────────────────────────────────┘

1.2 数据流

用户编辑 → Yjs Y.Doc → Y.applyUpdate()
    ↓ collab:yjs-update IPC
YjsCollabManager → 广播到 libp2p peers
    ↓ /chainlesschain/yjs-sync/1.0.0
远端 peer → Y.applyUpdate(doc, update, 'peer')
    ↓ collab:yjs-remote-update
前端 → 更新编辑器内容

1.3 核心组件

组件文件行数说明
RealtimeCollabManagerrealtime-collab-manager.js1,329协作核心 (锁/冲突/评论)
YjsCollabManageryjs-collab-manager.js676Yjs CRDT + P2P同步
OrgKnowledgeSyncManagerorg-knowledge-sync-manager.js937组织知识同步
PermissionManagerpermission-manager.js683协作权限管理
RealtimeCollabIPCrealtime-collab-ipc.js66321个IPC处理器
Pinia Storecollab.ts1,245前端状态管理

2. 核心模块

2.1 RealtimeCollabManager

协作核心管理器,处理文档打开/关闭、锁定、冲突和评论。

核心方法:

javascript
class RealtimeCollabManager extends EventEmitter {
  // 文档操作
  async openDocument(docId, userDid, userName, orgId?)
  async closeDocument(docId, userDid)

  // Yjs同步桥接
  async syncUpdate(docId, update, userDid, version)
  async receiveUpdate(docId, fromVersion)

  // 感知 (光标/选区)
  async getAwareness(docId)
  async updateCursor(docId, userDid, userName, cursor, selection?)

  // 区域锁定
  async acquireLock(docId, userDid, userName, lockType, sectionStart, sectionEnd, durationMs?)
  async releaseLock(lockId, userDid)
  async releaseUserLocks(docId, userDid)

  // 冲突解决
  async requestConflictResolution(docId, conflictData)
  async resolveConflict(conflictId, resolverDid, resolution)

  // 行内评论
  async addInlineComment(docId, comment)
  async resolveComment(commentId, resolverDid)
  async getComments(docId, options?)

  // 版本历史
  async getDocumentHistory(docId, options?)
  async restoreVersion(docId, versionId, userDid)

  // 导出
  async exportWithComments(docId, format?)
}

2.2 YjsCollabManager

Yjs CRDT 集成和 libp2p P2P 同步。

javascript
class YjsCollabManager extends EventEmitter {
  // 文档管理
  getDocument(docId)                      // 获取/创建 Y.Doc
  async openDocument(docId, orgId?)       // 打开文档 + 连接peer
  async closeDocument(docId)              // 关闭文档

  // 光标跟踪
  async updateCursor(docId, cursor, selection?)
  getActiveUsers(docId)

  // 版本管理
  async createSnapshot(docId, metadata?)  // 创建快照
  async restoreSnapshot(docId, snapshotId) // 恢复快照
  async getVersionHistory(docId, limit?)  // 版本列表
}

libp2p 协议:

  • /chainlesschain/yjs-sync/1.0.0 — 文档更新同步
  • /chainlesschain/yjs-awareness/1.0.0 — 感知状态 (lib0 编码)

2.3 锁定机制

锁定类型: full | section | paragraph

获取锁定:
  1. 检查是否存在冲突锁 (区域重叠)
  2. 冲突 → 返回 { success: false, error: "LOCK_CONFLICT", conflictingLocks }
  3. 无冲突 → 创建锁记录, 设置过期定时器 (默认5分钟)
  4. 过期 → 自动释放并通知 lock_expired 事件

释放锁定:
  1. 验证释放者身份 (必须是锁拥有者)
  2. 删除锁记录, 清除定时器
  3. 通知 lock_released 事件

3. 数据模型

3.1 collaboration_sessions

字段类型说明
idTEXT PK会话ID
knowledge_idTEXT文档ID
org_idTEXT组织ID
user_didTEXT用户DID
user_nameTEXT用户名
user_colorTEXT用户颜色
last_activityINTEGER最后活动时间
statusTEXT状态 (active)
created_atINTEGER创建时间

3.2 collab_document_locks

字段类型说明
idTEXT PK锁ID
knowledge_idTEXT文档ID
locked_by_didTEXT锁定者DID
locked_by_nameTEXT锁定者名称
lock_typeTEXT锁类型 (full/section/paragraph)
section_startINTEGER区域起始位置
section_endINTEGER区域结束位置
expires_atINTEGER过期时间
created_atINTEGER创建时间

3.3 knowledge_comments

字段类型说明
idTEXT PK评论ID
knowledge_idTEXT文档ID
author_didTEXT作者DID
contentTEXT评论内容
position_startINTEGER起始位置
position_endINTEGER结束位置
thread_idTEXT线程ID
parent_comment_idTEXT父评论ID
statusTEXT状态 (open/resolved)
created_atINTEGER创建时间

3.4 其他表

  • collab_cursor_positions — 光标/选区感知
  • collab_conflict_history — 冲突解决历史
  • knowledge_yjs_updates — Yjs 更新持久化
  • knowledge_snapshots — Yjs 快照版本
  • collab_stats — 协作统计
  • org_knowledge_folders — 组织文件夹层级
  • org_knowledge_items — 组织知识条目
  • knowledge_activities — 活动审计日志

4. IPC接口 (21个)

4.1 文档操作 (2个)

通道说明参数
collab:open-document打开文档docId, userDid, userName, orgId?
collab:close-document关闭文档docId, userDid

4.2 同步操作 (2个)

通道说明参数
collab:sync-update同步更新docId, update, userDid, version?
collab:receive-update接收更新docId, fromVersion?

4.3 感知 (2个)

通道说明参数
collab:get-awareness获取感知状态docId
collab:update-cursor更新光标docId, userDid, cursor, selection?

4.4 锁定管理 (2个)

通道说明参数
collab:acquire-lock获取锁docId, userDid, lockType, sectionStart?, sectionEnd?
collab:release-lock释放锁lockId, userDid

4.5 冲突解决 (2个)

通道说明参数
collab:request-conflict-resolution请求冲突解决docId, conflictData
collab:resolve-conflict解决冲突conflictId, resolverDid, resolution

4.6 评论 (3个)

通道说明参数
collab:add-inline-comment添加评论docId, comment
collab:resolve-comment解决评论commentId, resolverDid
collab:get-comments获取评论列表docId, options?

4.7 版本历史 (2个)

通道说明参数
collab:get-document-history获取版本历史docId, options?
collab:restore-version恢复版本docId, versionId, userDid

4.8 统计/导出/订阅 (3个)

通道说明参数
collab:get-stats获取协作统计docId
collab:export-with-comments导出含评论docId, format?
collab:subscribe-changes订阅变更事件docId

4.9 Yjs CRDT 桥接 (3个)

通道说明参数
collab:yjs-connect连接Yjs文档documentId
collab:yjs-update应用Yjs更新documentId, update (Uint8Array)
collab:yjs-disconnect断开YjsdocumentId

5. 前端页面

5.1 Pinia Store: collab.ts

typescript
interface CollabState {
  currentDocument: CollabDocument | null;
  collaborators: Collaborator[];
  cursorPositions: Record<string, CursorPosition>;
  locks: Lock[];
  pendingConflicts: Conflict[];
  comments: Comment[];
  versionHistory: Version[];
  connectionStatus: ConnectionStatus;
  yjsConnected: boolean;
  yjsSynced: boolean;
  activeCollaborators: ActiveCollaborator[];
  currentRoom: CollabRoom | null;
}

// Getters
hasUnresolvedConflicts; // 是否有未解决冲突
isDocumentLocked; // 文档是否被锁定
myLockedSections; // 我的锁定区域
onlineCollaboratorCount; // 在线协作者数量
isYjsReady; // Yjs 是否就绪

6. 文件结构

desktop-app-vue/src/main/collaboration/
├── realtime-collab-manager.js    # 协作核心 (1,329行)
├── realtime-collab-ipc.js        # 21个IPC处理器 (663行)
├── yjs-collab-manager.js         # Yjs CRDT + P2P (676行)
├── org-knowledge-sync-manager.js # 组织知识同步 (937行)
├── permission-manager.js         # 协作权限 (683行)
├── collaboration-manager.js      # 遗留ShareDB (889行)
└── collaboration-ipc.js          # 遗留IPC (190行)

desktop-app-vue/src/renderer/
└── stores/collab.ts              # 协作状态管理 (1,245行)

7. 相关文档


文档版本: 1.0 最后更新: 2026-03-05

基于 MIT 许可发布