feat(ui): reload the SPA on maintenance recovery
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Successful in 1m6s
CI / conformance (pull_request) Successful in 9s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m47s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Successful in 1m6s
CI / conformance (pull_request) Successful in 9s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m47s
The deploy that ends a maintenance window may ship a client-incompatible change (wire/schema bump), and the in-session bundle is the old one. On recovery, reload to pick up the fresh client instead of just hiding the overlay. Ordering is safe: the edge maintenance flag (deploy/prod-deploy.sh) spans the WHOLE roll and clears only at script exit — after the gateway (which serves the embedded SPA) has rolled — so the edge 503s everything until the entire deploy is live; recovery therefore always serves the new SPA. A window.__maint.recover() hook + e2e cover the reload.
This commit is contained in:
@@ -41,7 +41,8 @@ export function reportMaintenance(retryAfterMs: number): void {
|
||||
if (probe) schedulePoll();
|
||||
}
|
||||
|
||||
/** clearMaintenance lowers the overlay and stops the poll (a successful read, or reset). */
|
||||
/** clearMaintenance lowers the overlay and stops the poll without reloading (a reset, or the
|
||||
* e2e hook). Prod recovery goes through maintenanceRecovered instead. */
|
||||
export function clearMaintenance(): void {
|
||||
active = false;
|
||||
if (pollTimer) {
|
||||
@@ -50,6 +51,21 @@ export function clearMaintenance(): void {
|
||||
}
|
||||
}
|
||||
|
||||
/** maintenanceRecovered runs when the edge answers again after a window we were showing.
|
||||
* The deploy that ended the window may have shipped a client-incompatible change (a wire /
|
||||
* schema bump), and the running bundle is the OLD one — so reload to pick up the fresh
|
||||
* client instead of merely hiding the overlay. A no-op unless the overlay was up; the cover
|
||||
* stays over the brief reload flash. In prod recovery is the only way the overlay clears. */
|
||||
export function maintenanceRecovered(): void {
|
||||
if (!active) return;
|
||||
active = false;
|
||||
if (pollTimer) {
|
||||
clearTimeout(pollTimer);
|
||||
pollTimer = null;
|
||||
}
|
||||
if (typeof location !== 'undefined') location.reload();
|
||||
}
|
||||
|
||||
/** retryNow forces an immediate re-check (the overlay's button). It never closes the
|
||||
* overlay itself — only a successful probe does. A no-op while a probe is in flight. */
|
||||
export function retryNow(): void {
|
||||
@@ -73,7 +89,7 @@ function runProbe(): void {
|
||||
probe().then(
|
||||
() => {
|
||||
probing = false;
|
||||
clearMaintenance();
|
||||
maintenanceRecovered();
|
||||
},
|
||||
() => {
|
||||
probing = false;
|
||||
|
||||
Reference in New Issue
Block a user