CI / Build & Quality Checks (push) Skipped
CI / Secret scan (gitleaks) (push) Skipped
CI / Playwright smoke (e2e) (push) Skipped
CI / Build & Quality Checks (pull_request) Successful in 3m57s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 10s
CI / Playwright smoke (e2e) (pull_request) Successful in 20m44s
On a first visit (or right after an update) the service worker only takes control when it activates. An image requested before then goes out without the access token, fails, and showed "Retry". Now a failed image waits for the worker to take control (or a moment) and retries once by itself; "Retry" appears only if that fails too. Encrypted media is unchanged. Also the cause of the flaky "#219 gallery lightbox" e2e test (1 in 4 locally, 10/10 after). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
export function pushSessionToSW(baseUrl?: string, accessToken?: string, userId?: string) {
|
|
if (!('serviceWorker' in navigator)) return;
|
|
if (!navigator.serviceWorker.controller) return;
|
|
|
|
navigator.serviceWorker.controller.postMessage({
|
|
type: 'setSession',
|
|
accessToken,
|
|
baseUrl,
|
|
userId,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Resolves once media requests can carry the session: immediately-ish when a
|
|
* service worker already controls the page, otherwise when one takes control
|
|
* (first visit / just updated) or after `timeoutMs`. Used to retry a media
|
|
* load that raced the worker's activation and went out without a token.
|
|
*/
|
|
export function whenMediaAuthReady(timeoutMs = 3000): Promise<void> {
|
|
return new Promise((resolve) => {
|
|
const sw = 'serviceWorker' in navigator ? navigator.serviceWorker : undefined;
|
|
if (!sw || sw.controller) {
|
|
window.setTimeout(resolve, 500);
|
|
return;
|
|
}
|
|
const done = () => {
|
|
sw.removeEventListener('controllerchange', done);
|
|
resolve();
|
|
};
|
|
sw.addEventListener('controllerchange', done);
|
|
window.setTimeout(done, timeoutMs);
|
|
});
|
|
}
|