[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"doc-\u002Fzh-Hans\u002Fyizhan\u002Fdev-guide\u002FDEV-001-architecture\u002F":3},"\u003Ch1 id=\"dev-001-%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#dev-001-%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84\">#\u003C\u002Fa> DEV-001 系统架构\u003C\u002Fh1>\n\u003Ch2 id=\"%E6%A6%82%E8%BF%B0\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#%E6%A6%82%E8%BF%B0\">#\u003C\u002Fa> 概述\u003C\u002Fh2>\n\u003Cp>驿站（yizhan）采用 pnpm monorepo 架构，三个包协同工作：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>packages\u002F\n├── shared\u002F    # 共享类型、常量、协议、工具\n├── server\u002F    # Fastify HTTP + WebSocket 后端\n└── web\u002F       # Vue 3 + Vite SPA 前端\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"%E9%80%9A%E4%BF%A1%E6%9E%B6%E6%9E%84\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#%E9%80%9A%E4%BF%A1%E6%9E%B6%E6%9E%84\">#\u003C\u002Fa> 通信架构\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>┌─────────────────────────────────────────┐\n│              web (Vue 3 SPA)            │\n│  ┌─────────┐ ┌─────────┐ ┌──────────┐  │\n│  │终端列表  │ │聊天区域  │ │终端管理  │  │\n│  └─────────┘ └─────────┘ └──────────┘  │\n│       │             │          │        │\n│       └─────────────┼──────────┘        │\n│                     │                   │\n│           WebSocket + WebRTC            │\n└─────────────────────┬───────────────────┘\n                      │\n┌─────────────────────┴───────────────────┐\n│            server (Fastify)             │\n│  ┌────────┐ ┌──────────┐ ┌──────────┐  │\n│  │Auth\u002FJWT│ │Terminal  │ │Transfer  │  │\n│  │Service │ │Registry  │ │Relay     │  │\n│  └────────┘ └──────────┘ └──────────┘  │\n│                     │                   │\n│           PostgreSQL + Redis            │\n└─────────────────────────────────────────┘\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"%E6%95%B0%E6%8D%AE%E6%B5%81\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#%E6%95%B0%E6%8D%AE%E6%B5%81\">#\u003C\u002Fa> 数据流\u003C\u002Fh2>\n\u003Ch3 id=\"%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93%E6%B5%81%E7%A8%8B\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93%E6%B5%81%E7%A8%8B\">#\u003C\u002Fa> 文件传输流程\u003C\u002Fh3>\n\u003Col>\n\u003Cli>发送方选文件 → \u003Ccode>transfer_request\u003C\u002Fcode> WS 消息\u003C\u002Fli>\n\u003Cli>服务器创建 DB 记录 → 通知接收方（在线直接推，离线标记 queued）\u003C\u002Fli>\n\u003Cli>接收方确认 → \u003Ccode>transfer_accept\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>发送方启动传输：\n\u003Cul>\n\u003Cli>\u003Cstrong>同源\u002Flocalhost\u003C\u002Fstrong> → 直接 relay（WS binary frame）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>远程\u003C\u002Fstrong> → 尝试 P2P（2s 超时）→ 降级 relay\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>relay：文件分 64KB chunk → WS binary frame → 服务器转发 → 接收方拼装 → 存 IndexedDB\u003C\u002Fli>\n\u003Cli>传输完成 → 更新 DB 状态\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"%E7%A6%BB%E7%BA%BF%E6%8E%92%E9%98%9F\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#%E7%A6%BB%E7%BA%BF%E6%8E%92%E9%98%9F\">#\u003C\u002Fa> 离线排队\u003C\u002Fh3>\n\u003Cp>接收方离线时，文件暂存服务器 \u003Ccode>data\u002Fqueue\u002F\u003C\u002Fcode>（24h TTL）。终端上线后自动推送 queued 记录。\u003C\u002Fp>\n\u003Ch2 id=\"%E7%AB%AF%E5%8F%A3%E5%88%86%E9%85%8D\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#%E7%AB%AF%E5%8F%A3%E5%88%86%E9%85%8D\">#\u003C\u002Fa> 端口分配\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>服务\u003C\u002Fth>\n\u003Cth>端口\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>web (Vite dev)\u003C\u002Ftd>\n\u003Ctd>12670\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>server (Fastify)\u003C\u002Ftd>\n\u003Ctd>12671\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>PostgreSQL\u003C\u002Ftd>\n\u003Ctd>12672\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Redis\u003C\u002Ftd>\n\u003Ctd>12673\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"%E6%8A%80%E6%9C%AF%E6%A0%88\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#%E6%8A%80%E6%9C%AF%E6%A0%88\">#\u003C\u002Fa> 技术栈\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>层\u003C\u002Fth>\n\u003Cth>技术\u003C\u002Fth>\n\u003Cth>版本\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Runtime\u003C\u002Ftd>\n\u003Ctd>Node.js\u003C\u002Ftd>\n\u003Ctd>22+\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Package Manager\u003C\u002Ftd>\n\u003Ctd>pnpm\u003C\u002Ftd>\n\u003Ctd>10\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Frontend\u003C\u002Ftd>\n\u003Ctd>Vue 3 + Vite + Tailwind CSS 4\u003C\u002Ftd>\n\u003Ctd>3.5 \u002F 8 \u002F 4\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>UI\u003C\u002Ftd>\n\u003Ctd>shadcn-vue (planned)\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Backend\u003C\u002Ftd>\n\u003Ctd>Fastify 5 + Drizzle + Zod + Pino\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>DB\u003C\u002Ftd>\n\u003Ctd>PostgreSQL 16\u003C\u002Ftd>\n\u003Ctd>16\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Cache\u003C\u002Ftd>\n\u003Ctd>Redis 7\u003C\u002Ftd>\n\u003Ctd>7\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Real-time\u003C\u002Ftd>\n\u003Ctd>WebSocket (ws) + WebRTC (native)\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Language\u003C\u002Ftd>\n\u003Ctd>TypeScript\u003C\u002Ftd>\n\u003Ctd>6\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n",1786290226006]