Keep offline completion outside the activation barrier

This commit is contained in:
Jonathan Sykes
2026-10-09 10:26:23 +08:00
parent 6b8d590638
commit 2c8d563d01
3 changed files with 30 additions and 12 deletions

View File

@@ -308,7 +308,7 @@ function completeAssets(force = false) {
if (!ASSET_SYNC) return Promise.resolve();
completionTask ||= (async () => {
const cache = await caches.open(AssetSyncCore.CACHE);
const m = await candidate(cache) || (await AssetSyncCore.state(cache))?.current;
const m = (await AssetSyncCore.state(cache))?.current;
if (!m || m.buildTag !== VERSION) return;
const job = await AssetSyncCore.complete(m, { cache, fetchFn: fetch, force,
notify: async status => {
@@ -573,7 +573,9 @@ async function activateAssets() {
for (const req of await cache.keys()) if(new URL(req.url).pathname.startsWith('/__ytp_candidate/')) await cache.delete(req);
await self.clients.claim();
if(old && old.current.buildTag !== m.buildTag) for(const c of await self.clients.matchAll({type:'window',includeUncontrolled:true})) c.postMessage({type:'SW_UPDATE_AVAILABLE',version:VERSION});
await completeAssets(true);
// Completion owns a message-event lifetime, not the activation barrier.
// In particular, a legacy client's four-second reload must not wait for it.
self.registration.active.postMessage({ type: 'COMPLETE_ASSETS' });
try { console.info('[asset-sync] storage', await self.navigator.storage.estimate()); } catch {}
}
async function assetFetch(request, clientId) {