feat(collab): one `yrs` room hosted on a Durable Object and on axum (spike 0005 first)
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 5/5
- Tempo estimado
- Mais de uma semana
- Facilidade para iniciantes
- 25/100
- Tipo de issue
- Funcionalidade
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- rust, wasm
- Domínio
- backend, databases, distributed-systems
Direção de pesquisa
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.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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, whichRoomDodrops 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 overyrs, Hocuspocus framing (or the provider swapped under Q-R2), the short-lived signed token on upgrade (ADR-0060 round 19), persistence throughCollabPersistenceover the core ports (ADR-0061). It is runtime-free and listed inCLEAN_CRATES(scripts/check-deps.sh:14). - Two hosts of the same crate: a hibernating Durable Object in a
collabWorker root, added when the room lands (ADR-0090 round-29 note, FR-11), and an axum WebSocket route inthrust-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-cfand native targets: two clients converge, awareness propagates, an unauthorized socket is refused, persistence receives the update. Control: a room that drops binary frames, asRoomDodoes, fails the convergence test. -
scripts/check-deps.shpasses with the room crate inCLEAN_CRATESand fails when aworkerortokiodependency is added to it (control). - The stock
@plane/editoropens 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
Collabrow (ARCHITECTURE.md:92) read "oneyrsroom, 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
- Linguagem predominante
- Rust
- Estrelas
- 0
- Forks
- 0
- Merge médio
- 1h 35min
- PRs com merge (30d)
- 67
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de aRustyDev/thrust
-
area:process prio:p1 type:security
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
Mantenedores costumam responder em até 1 dia
-
area:process bug prio:p1
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 38/100
Mantenedores costumam responder em até 1 dia
-
area:process prio:p1
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 55/100
Mantenedores costumam responder em até 1 dia
-
area:process prio:p1
Dificuldade 4/5 1-2 dias Facilidade para iniciantes 55/100
Mantenedores costumam responder em até 1 dia
-
area:process prio:p1
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 56/100
Mantenedores costumam responder em até 1 dia
Todas as issues de aRustyDev/thrust
Issues semelhantes
-
bug good first issue help wanted linux macos testing
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
Mantenedores costumam responder em até 1 dia
-
area: app type: test
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia
-
bug priority: medium
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
storytold/photocraft#12706 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
bug priority-low to-agent
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
Mantenedores costumam responder em até 1 dia
-
examples/dca and limit-order: swap always fails on the real Soroswap router (deadline equals now)Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
sorocon-labs/sorocron#172 ·
Mantenedores costumam responder em até 1 dia