v1.1.1 — Reliability hardening
What's new
This release is a focused reliability pass — no new features, no breaking changes. All existing installs will update seamlessly.
Fix: Nonce expiry — no more silent failures after long sessions
WordPress REST nonces expire after ~12 hours. Previously every background call (badges, health, data queries, SSE) would silently fail without any recovery, leaving the shell in a broken state mid-session.
Now apiFetch() detects a 401, calls GET /wp-json/ to refresh the nonce from the X-WP-Nonce response header, and retries the original call automatically. SSE reconnects and background pollers always read the current nonce via getter properties.
Fix: Concurrent navigation — no more interleaved view transitions
Rapid double-clicks or ware-triggered navigations during an in-flight transition could corrupt the loading state, direction attribute, and iframe activation simultaneously. Navigation calls are now serialised with a last-wins pending queue released in transition.finished.
Fix: `bazaar:navigate` postMessage — navigation requests from unregistered windows are now dropped
Any same-origin frame could previously trigger shell navigation. Messages without a recognised `fromSlug` are now silently discarded.
Fix: WareUpdater — ware no longer destroyed on failed update
If a ware's files were deleted and the remote re-install failed (network error, registry outage), the ware was permanently gone with no path to recovery. The old registry manifest is now snapshotted before deletion; if install fails, the entry is restored so the ware remains visible and re-installable from the Manage screen.
Fix: `cacheQuery` — wares no longer hang on non-JSON responses
If the proxied REST endpoint returned a non-JSON content type, the shell would return without posting a reply. Requesting wares were left waiting indefinitely on an unresolved promise. All non-response exit paths now post `bazaar:query-error`.
Fix: `bazaar:badge` — DOM updates coalesced per animation frame
A ware sending rapid badge updates previously triggered a synchronous renderNav() + renderTaskbar() + homeScreen.refresh() reflow for every message. Updates are now batched into a single requestAnimationFrame flush.
Fix: Analytics — final view duration now always captured
If the user closed or reloaded the page while viewing a ware, the last session's duration was never sent. visibilitychange and pagehide listeners now flush the pending entry on page exit.