Skip to content

v1.1.1 — Reliability hardening

Choose a tag to compare

@nickhamze nickhamze released this 12 Apr 20:43
· 50 commits to main since this release

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.