feat(collab): one `yrs` room hosted on a Durable Object and on axum (spike 0005 first)

未關閉
#54 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

還沒有人認領這個 Issue。

評估

難度
5/5
預估耗時
一週以上
新手友好度
25/100
Issue 類型
功能
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
rust, wasm

研究方向

Start with spike 0005 at spikes/0005-collab-yrs-durable-objects.md and record whether each exit criterion passes, including the same room running on axum. The issue also points to crates/thrust-worker/src/durable.rs and crates/thrust-editor-doc/Cargo.toml; read ADR-0060 and ADR-0061 for the room and persistence requirements. Done means the report and acceptance checks cover both hosts, convergence, persistence, authorization, and the stated load target.

由索引模型根據 Issue 內容生成。

描述

area:app prio:p1 review:fable-2026-10-19

Context

P0 has no collaborative editing: descriptions and pages are plain saves (ADR-0060, round 6). The only room-shaped code is the spike's RoomDo (crates/thrust-worker/src/durable.rs:79-153): WebSocket hibernation plus SQLite storage, a text echo that ignores binary frames (:119-121), reachable only through /_test/room/... with test routes and the admin token (:159-176). yrs is already in the workspace for the editor conversions (crates/thrust-editor-doc/Cargo.toml:15). ADR-0060 (accepted) chose a Collab port with a Durable Object adapter and a Hocuspocus + Redis adapter (lines 31, 38); round 21 left the self-hosted adapter open between Hocuspocus + Redis (TypeScript) and a Rust axum + yrs service (line 115; Q-0061.2, QUESTIONS.md:103). Spike 0005 has not run (spikes/README.md:46).

Problem

  • FR-15: Hocuspocus + Redis as the self-hosted adapter is a shipped TypeScript service with no exit plan, which ADR-0006's round-22 policy does not allow (bounded shims behind a port with an exit plan, ADR-0006 line 75).
  • FR-05: it also brings Redis back into a twin that is otherwise one binary, and two different room implementations must be kept behaviour-identical (ADR-0060 line 66).
  • The kept editor connects with HocuspocusProvider, so whatever hosts the room speaks Hocuspocus framing or the editor's collab provider changes, which Q-R2 allows (ADR-0060 line 60; QUESTIONS.md:260). Yjs sync uses binary frames, which RoomDo drops today.
  • A Durable Object class must be exported from the same Wasm module as fetch (ADR-0060 round 26, line 123), so the room needs a Worker root of its own.

Proposal

  • Spike 0005 first, with the round-29 exit criterion "the same room runs on axum" added to the existing ones: 50 editors with p95 update fan-out < 250 ms, no data loss on forced eviction, a P0-saved page opens unchanged, cost within the envelope (spikes/0005-collab-yrs-durable-objects.md:23-26). Its step 5 (Hocuspocus or a Rust service, line 19) is answered by ADR-0060 (round-29 note).
  • One room crate (for example crates/thrust-collab): sync and awareness over yrs, Hocuspocus framing (or the provider swapped under Q-R2), the short-lived signed token on upgrade (ADR-0060 round 19), persistence through CollabPersistence over the core ports (ADR-0061). It is runtime-free and listed in CLEAN_CRATES (scripts/check-deps.sh:14).
  • Two hosts of the same crate: a hibernating Durable Object in a collab Worker root, added when the room lands (ADR-0090 round-29 note, FR-11), and an axum WebSocket route in thrust-server. No Node service and no Redis.
  • Pages open collaboratively from the P0 stored triple (#48); the binary for a work-item description is derived from its HTML on first open by thrust-editor-doc (research/0008 §8).

Acceptance criteria

  • The spike 0005 report exists; each exit criterion, including "the same room runs on axum", is met, or the editor cap is recorded.
  • The ADR-0060 Confirmation tests (lines 73-75) run on the worker-cf and native targets: two clients converge, awareness propagates, an unauthorized socket is refused, persistence receives the update. Control: a room that drops binary frames, as RoomDo does, fails the convergence test.
  • scripts/check-deps.sh passes with the room crate in CLEAN_CRATES and fails when a worker or tokio dependency is added to it (control).
  • The stock @plane/editor opens a P0-saved page in a room on both hosts with no data migration.
  • A 50-editor load test on the Durable Object host has p95 fan-out < 250 ms (M5 exit criterion).
  • ADR-0060 and the ARCHITECTURE §1c Collab row (ARCHITECTURE.md:92) read "one yrs room, two hosts"; Q-0061.2 is answered.

References

  • Review: .agents/plans/contrail/reviews/2026-10-19-fable-architecture-review.md (FR-05, FR-15)
  • crates/thrust-worker/src/durable.rs:79-176; crates/thrust-editor-doc/Cargo.toml:15; scripts/check-deps.sh:14
  • ADR-0060 (lines 31, 38, 60, 66, 73-75, 115, 123; round-29 note), ADR-0061, ADR-0006 (line 75), ADR-0090 (round-29 note)
  • spikes/0005-collab-yrs-durable-objects.md:19,23-26; research/0008-editor-conversions.md §8
  • Q-0061.2, Q-R2, Q-G4.1, Q-0060.1; .agents/plans/contrail/ARCHITECTURE.md:92,157

Blocked by: #46

Finding: FR-05, FR-15

主要語言
Rust
星號
0
分支
0
平均合併
1 小時 35 分鐘
30 天內合併 PR
67

環境準備

  • 沒有 Dockerfile 或 Docker Compose 檔案
  • 沒有 Pull Request 範本
  • 閱讀貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

aRustyDev/thrust 的其他 Issue

查看 aRustyDev/thrust 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。