[% SET bodyclass = "offlinepage"; # For selection of scripts PROCESS 'common_scripts.html'; SET offline_html = version('../templates/web/base/offline/fallback.html', '/offline/fallback'); SET scripts_seen = {}; ~%] importScripts('[% version('/vendor/idb-keyval-iife.min.js') %]'); const requiredOffline = [ "[% version('/cobrands/' _ c.cobrand.asset_moniker _ '/base.css') %]", "[% version('/cobrands/' _ c.cobrand.asset_moniker _ '/layout.css') %]", "[% version('/vendor/OpenLayers/theme/default/style.css') %]", "[% version('/vendor/fancybox/jquery.fancybox-1.3.4.css') %]", [% FOR script IN scripts; NEXT IF scripts_seen.${script}; scripts_seen.${script} = 1; ~%] "[%- script %]", [% END %] "[% offline_html %]" ]; const staticCache = 'static'; // const pageCache = 'pages'; addEventListener('install', function(evt) { evt.waitUntil(precache()); }); async function precache() { const cache = await caches.open(staticCache); return cache.addAll(requiredOffline); } addEventListener('fetch', fetchEvent => { const request = fetchEvent.request; const url = new URL(request.url); if (url.origin !== location.origin) { return; } // Handle inspection form submission if offline... if (request.method === 'POST' && RegExp('/report/\\d+$').test(url)) { fetchEvent.respondWith(async function() { const fetchPromise = fetch(request.clone()); try { return await fetchPromise; } catch { fetchEvent.waitUntil(async function() { var request_buffer = await request.arrayBuffer(); var headers = request.headers; let formData = {}; formData.contentType = headers.get('Content-Type'); let boundary_re = /.*boundary=(.*)/; let bound = formData.contentType.match(boundary_re); let saved = '--' + bound[1] + "\r\nContent-Disposition: form-data; name=\"saved_at\"\r\n\r\n" + Math.floor(+new Date() / 1000) + "\r\n"; var savedBuffer = new ArrayBuffer(saved.length); var bufView = new Uint8Array(savedBuffer); for (var i=0; i new Response('Service Unavailable', { status: 503, statusText: 'Service Unavailable', headers: { 'Content-Type': 'text/html' }});