mirror of
https://github.com/block/buzz.git
synced 2026-10-27 04:30:52 +00:00
fix(desktop): survive degraded networks with rate-limit-aware relay client (#2197)
Signed-off-by: Will Pfleger <pfleger.will@gmail.com> Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co> Co-authored-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co>
This commit is contained in:
41
AGENTS.md
41
AGENTS.md
@@ -462,34 +462,41 @@ new arbitrary text-size literal — px **or** rem/em. Genuinely decorative glyph
|
||||
(e.g. the `text-[6rem]` avatar emoji) are allowlisted by `path:line` in that
|
||||
script.
|
||||
|
||||
### Workspace Switching
|
||||
### Community Switching
|
||||
|
||||
The desktop app supports multiple workspaces (each backed by a different relay).
|
||||
Switching workspaces does **not** reload the page — it uses React key-based
|
||||
remounting. `<AppReady key={workspaceKey} />` in `App.tsx` forces the entire
|
||||
workspace-scoped subtree to unmount and remount with fresh state.
|
||||
The desktop app supports multiple communities (each backed by a different relay).
|
||||
Switching communities does **not** reload the page — it uses React key-based
|
||||
remounting. `<AppReady key={communityKey} />` in `App.tsx` forces the entire
|
||||
community-scoped subtree to unmount and remount with fresh state.
|
||||
|
||||
**Module-level singletons must be explicitly reset.** React remounting only
|
||||
clears React state (useState, useRef, context). Module-level variables (Maps,
|
||||
class instances, cached promises) survive across remounts. Every workspace-scoped
|
||||
singleton needs a reset function wired into `resetWorkspaceState()` in
|
||||
`desktop/src/features/workspaces/useWorkspaceInit.ts`.
|
||||
class instances, cached promises) survive across remounts. Every community-scoped
|
||||
singleton needs a reset function wired into `resetCommunityState()` in
|
||||
`desktop/src/features/communities/useCommunityInit.ts`.
|
||||
|
||||
Current singletons that are reset on workspace switch:
|
||||
Current singletons that are reset on community switch:
|
||||
- `relayClient.disconnect()` — WebSocket teardown + promise rejection
|
||||
- `resetMediaCaches()` — proxy port and relay origin caches
|
||||
- `clearSearchHitEventCache()` — search result event cache
|
||||
- `resetRateLimitGate()` — clears any active rate-limit window from the old relay
|
||||
- `clearAllDrafts()` — message draft cache
|
||||
- `resetAgentObserverStore()` — agent observer relay store
|
||||
- `resetActiveAgentTurnsStore()` — active agent turn timers
|
||||
- `resetAgentWorkingSignal()` — agent working indicator signal
|
||||
- `resetSidebarRelayConnectionCardState()` — sidebar relay card dismiss state
|
||||
- `resetMediaCaches()` — proxy port and relay origin caches
|
||||
- `resetVideoPlayerState()` — video player singleton
|
||||
- `resetRenderScopedReactionHydration()` — reaction hydration cache
|
||||
- `clearSearchHitEventCache()` — search result event cache
|
||||
- `clearMarkdownNodeCache()` — markdown parse-node cache
|
||||
|
||||
**If you add a new module-level cache, Map, or class instance that holds
|
||||
workspace-scoped data, you must add its reset to `resetWorkspaceState()`.**
|
||||
Failure to do so causes data from the old workspace to leak into the new one.
|
||||
community-scoped data, you must add its reset to `resetCommunityState()`.**
|
||||
Failure to do so causes data from the old community to leak into the new one.
|
||||
|
||||
Key files:
|
||||
- `desktop/src/app/App.tsx` — workspace key, init gate, remount boundary
|
||||
- `desktop/src/features/workspaces/useWorkspaceInit.ts` — `resetWorkspaceState()`, applies config to Tauri backend
|
||||
- `desktop/src/features/workspaces/useWorkspaces.tsx` — `WorkspacesProvider` context (shared state for App + AppShell)
|
||||
- `desktop/src/main.tsx` — provider hierarchy (`QueryClientProvider` > `WorkspacesProvider` > `App`)
|
||||
- `desktop/src/app/App.tsx` — community key, init gate, remount boundary
|
||||
- `desktop/src/features/communities/useCommunityInit.ts` — `resetCommunityState()`, applies config to Tauri backend
|
||||
- `desktop/src/main.tsx` — provider hierarchy (`QueryClientProvider` > `App`)
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user