feat(lotus): tell the host when the call drops, and let it press Reconnect (cinny #318) #50

Merged
jared merged 1 commits from lotus-call-error into lotus 2026-10-18 07:32:18 -04:00
Owner

Fork half of cinny #318 (the "host doesn't follow the call frame" part).

After a homeserver stall the frame shows "Connection lost · You were disconnected from the call · Reconnect", but the Lotus host kept showing the call as joined: call bar, mute/deafen, soundboard. None of those did anything any more.

Change (GroupCallErrorBoundary / ErrorPage), while the error page is mounted:

  • it reports io.lotus.call_error { code, recoverable } to the host, and { code: null } when the page goes away. recoverable covers ConnectionLost, LivekitConnection and PeerConnectionTimeout errors;
  • it accepts io.lotus.reconnect (allow-listed in LOTUS_TO_WIDGET_ACTIONS), which runs the page's own Reconnect / Try again. It does nothing for non-recoverable errors.

Hosts that don't send or handle these are unaffected.

Verified with a local build in Lotus (with the cinny half), freezing Synapse mid-call:

  • The frame shows "Connection lost" at 25 s, and the host's call bar shows "Call disconnected" at the same moment.
  • After SIGCONT the host sends io.lotus.reconnect once sync is back, and the call rejoins within 5 s.

The lotusActions test lists are updated. All src/lotus tests and GroupCallErrorBoundary tests pass (135). tsc and oxlint are clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5

Fork half of cinny #318 (the "host doesn't follow the call frame" part). After a homeserver stall the frame shows **"Connection lost · You were disconnected from the call · Reconnect"**, but the Lotus host kept showing the call as joined: call bar, mute/deafen, soundboard. None of those did anything any more. **Change** (`GroupCallErrorBoundary` / `ErrorPage`), while the error page is mounted: - it reports **`io.lotus.call_error { code, recoverable }`** to the host, and `{ code: null }` when the page goes away. `recoverable` covers ConnectionLost, LivekitConnection and PeerConnectionTimeout errors; - it accepts **`io.lotus.reconnect`** (allow-listed in `LOTUS_TO_WIDGET_ACTIONS`), which runs the page's own Reconnect / Try again. It does nothing for non-recoverable errors. Hosts that don't send or handle these are unaffected. **Verified** with a local build in Lotus (with the cinny half), freezing Synapse mid-call: - The frame shows "Connection lost" at 25 s, and the host's call bar shows "Call disconnected" at the same moment. - After `SIGCONT` the host sends `io.lotus.reconnect` once sync is back, and the call rejoins within 5 s. The `lotusActions` test lists are updated. All `src/lotus` tests and `GroupCallErrorBoundary` tests pass (135). `tsc` and oxlint are clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared added 1 commit 2026-10-18 00:54:48 -04:00
feat(lotus): tell the host when the call drops, and let it press Reconnect (cinny #318)
CI / Publish to Gitea npm registry (pull_request) Skipped
CI / Build embedded bundle (pull_request) Successful in 3m2s
07e1506dd8
After a homeserver stall the frame shows "Connection lost · Reconnect"
while the host kept showing the call as joined, with controls that did
nothing. While the error page is up, report io.lotus.call_error
{ code, recoverable } (and { code: null } when it clears), and accept
io.lotus.reconnect to run the page's own Reconnect / Try again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared merged commit d7d75cbba5 into lotus 2026-10-18 07:32:18 -04:00
Sign in to join this conversation.