merge ui stuff

This commit is contained in:
Eduard Gert
2026-05-15 10:20:51 +02:00
parent 288f8dec08
commit d32721d7fc
3 changed files with 91 additions and 24 deletions

View File

@@ -4,6 +4,26 @@
/**
* Peers serves the dashboard data: one polled Status RPC and a long-running
* SubscribeEvents stream that re-emits every event over the Wails event bus.
*
* Profile-switch suppression: ProfileSwitcher calls BeginProfileSwitch
* before tearing down the old profile when it would otherwise be followed
* by an Up on the new profile (i.e. previous status was Connected or
* Connecting). statusStreamLoop then swallows the transient stale
* Connected and Idle pushes the daemon emits during Down so the tray
* and the React Status page both see Connecting → new-profile-state
* instead of Connected → Connected → Idle → Connecting → new-state.
*
* Suppression transition (applied by shouldSuppress before each emit):
*
* ┌────────────────────────────────────────────┬──────────────────────────────────┐
* │ Incoming daemon status │ Action │
* ├────────────────────────────────────────────┼──────────────────────────────────┤
* │ Connected, Idle │ Suppress (the blink we hide) │
* │ Connecting │ Emit, clear flag (new Up began) │
* │ NeedsLogin, LoginFailed, SessionExpired, │ Emit, clear flag (new profile's │
* │ DaemonUnavailable │ "Up won't run" terminal state) │
* │ (timeout elapsed) │ Clear flag, emit normally │
* └────────────────────────────────────────────┴──────────────────────────────────┘
* @module
*/
@@ -15,6 +35,30 @@ import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Cr
// @ts-ignore: Unused imports
import * as $models from "./models.js";
/**
* BeginProfileSwitch is called by ProfileSwitcher at the start of a switch
* when the previous status was Connected/Connecting — i.e. the daemon is
* about to emit Connected updates during Down's peer-count teardown and
* then an Idle before the new profile's Up resumes the stream. The flag
* makes statusStreamLoop drop those transient events. A synthetic
* Connecting snapshot is emitted right away so both consumers (tray and
* React) paint the optimistic state immediately. A 30s safety timeout
* clears the flag if the daemon never emits a follow-up status.
*/
export function BeginProfileSwitch(): $CancellablePromise<void> {
return $Call.ByID(3532998514);
}
/**
* CancelProfileSwitch is called by callers that abort the switch midway
* (the tray's Disconnect click while Connecting). Clears the suppression
* flag so the next daemon Idle paints through immediately instead of
* being swallowed.
*/
export function CancelProfileSwitch(): $CancellablePromise<void> {
return $Call.ByID(4190545179);
}
/**
* Get returns the current daemon status snapshot.
*/

View File

@@ -2,21 +2,44 @@
// This file is automatically generated. DO NOT EDIT
/**
* ProfileSwitcher encapsulates the full profile-switching reconnect policy so
* both the tray and the React frontend use identical logic.
* ProfileSwitcher encapsulates the full profile-switching reconnect policy
* so both the tray and the React frontend use identical logic.
*
* Reconnect policy:
* Reconnect policy + optimistic-feedback table (driven by prevStatus
* captured from Peers.Get at SwitchActive entry):
*
* ┌─────────────────┬──────────────────────┬────────────────────────────────────┐
* │ Previous status │ Action │ Rationale
* ├─────────────────┼──────────────────────┼────────────────────────────────────┤
* │ Connected │ Switch + Down + Up │ Reconnect with the new profile. │
* │ Connecting │ Switch + Down + Up │ Stop old retry loop, restart.
* │ NeedsLogin │ Switch + Down │ Clear stale error; user logs in.
* │ LoginFailed │ Switch + Down │ Clear stale error; user logs in.
* │ SessionExpired │ Switch + Down │ Clear stale error; user logs in.
* │ Idle │ Switch only │ User chose offline; don't connect.
* └─────────────────┴──────────────────────┴────────────────────────────────────┘
* ┌─────────────────┬──────────────────────┬──────────────────────────┬────────────────────┐
* │ Previous status │ Action │ Optimistic UI label │ Suppressed events
* │ │ │ shown immediately │ until new flow │
* ├─────────────────┼──────────────────────┼──────────────────────────┼────────────────────┤
* │ Connected │ Switch + Down + Up │ Connecting (synthetic) │ Connected, Idle
* │ Connecting │ Switch + Down + Up │ Connecting (unchanged) │ Connected, Idle
* │ NeedsLogin │ Switch + Down │ (no change) │ —
* │ LoginFailed │ Switch + Down │ (no change) │ —
* │ SessionExpired │ Switch + Down │ (no change) │ —
* │ Idle │ Switch only │ (no change) │ — │
* └─────────────────┴──────────────────────┴──────────────────────────┴────────────────────┘
*
* Only Connected/Connecting trigger the optimistic Connecting paint
* (via Peers.BeginProfileSwitch): they're the only prevStatuses where
* the daemon emits stale Connected updates (peer count drops as the
* engine tears down) and then Idle, before the new profile's Up
* resumes the stream. Both are swallowed by Peers.shouldSuppress
* until a status that signals the new flow has begun (Connecting, or
* any of the "Up won't run" terminal states: NeedsLogin / LoginFailed /
* SessionExpired / DaemonUnavailable). The other prevStatuses either
* don't drive Down/Up at all (Idle) or stop after Down (NeedsLogin /
* LoginFailed / SessionExpired) — the resulting Idle is the correct
* terminal state, so no suppression is needed.
*
* Rationale for each Action choice:
*
* Connected → Reconnect with the new profile.
* Connecting → Stop old retry loop, restart.
* NeedsLogin → Clear stale error; user logs in.
* LoginFailed → Clear stale error; user logs in.
* SessionExpired → Clear stale error; user logs in.
* Idle → User chose offline; don't connect.
* @module
*/