fteqw/engine/web/fte_pwa_sw.js

102 lines
2.3 KiB
JavaScript

const addResourcesToCache = async (resources) =>
{
const cache = await caches.open('v1');
await cache.addAll(resources);
};
const putInCache = async (request, response) =>
{
const cache = await caches.open('v1');
await cache.put(request, response);
};
function shouldcache(name)
{
if (name.indexOf("/raw/"))
return false;
if (name.indexOf("/downloadables"))
return false;
return true;
};
const cacheFirst = async ({ request, preloadResponsePromise }) =>
{
// First try to get the resource from the cache
const responseFromCache = await caches.match(request);
if (responseFromCache)
{
// console.log("cacheFirst - from cache", request, preloadResponsePromise, responseFromCache);
return responseFromCache;
}
// Next try to use the preloaded response, if it's there
const preloadResponse = await preloadResponsePromise;
if (preloadResponse)
{
// console.info('using preload response', preloadResponse);
if (shouldcache(request.url))
putInCache(request, preloadResponse.clone());
return preloadResponse;
}
// Next try to get the resource from the network
try
{
const responseFromNetwork = await fetch(request.clone());
// response may be used only once
// we need to save clone to put one copy in cache
// and serve second one
if (shouldcache(request.url))
putInCache(request, responseFromNetwork.clone());
// console.info('fetching from network', responseFromNetwork);
return responseFromNetwork;
}
catch (error)
{
// console.info('failure', preloadResponse);
// there is nothing we can do, but we must always
// return a Response object
return new Response('Network error happened',
{
status: 408,
headers: { 'Content-Type': 'text/plain' },
});
}
};
const enableNavigationPreload = async () =>
{
if (self.registration.navigationPreload)
{
// Enable navigation preloads!
await self.registration.navigationPreload.enable();
}
};
self.addEventListener('activate', (event) =>
{
event.waitUntil(enableNavigationPreload());
});
self.addEventListener('install', (event) =>
{
event.waitUntil(
addResourcesToCache([
'./',
'./fte_pwa.json',
'./fte_pwa_sw.js',
'./ftewebgl.js',
'./ftewebgl.wasm'
])
);
});
self.addEventListener('fetch', (event) =>
{
event.respondWith(cacheFirst(
{
request: event.request,
preloadResponsePromise: event.preloadResponse
}));
});