1/* eslint-disable */ 2// documentation officielle: https://developers.google.com/web/tools/workbox/ 3importScripts('/frontend/angular-1.3.15/serviceWorker/workbox-sw-3.5.0.js'); 4 5if (!workbox) { 6 console.error(`Workbox didn't load`); 7} else { 8 // activer les console de debug 9 // workbox.setConfig({ debug: true }); 10 const VERSION = 'v1.0'; 11 12 const OFFLINE_PAGE = 13 '/frontend/angular-1.3.15/serviceWorker/views/offline.html'; 14 15 var ROOT_URL = registration.scope.replace(/mobile\//gim, ''); 16 17 /* 18 * handleCacheParams 19 * 20 * clone une requette en retirant les parametre get de la requete qui gèrent le cache _= _t= et v= 21 */ 22 function handleCacheParams(request) { 23 var myUrl = new URL(request.url); 24 var isInternalRequest = request.url.indexOf(ROOT_URL) > -1; 25 var params = myUrl.searchParams; 26 if ( 27 isInternalRequest && 28 (params.has('_') || params.has('_t') || params.has('v')) 29 ) { 30 params.delete('_'); 31 params.delete('_t'); 32 params.delete('v'); 33 var url = myUrl.toString(); 34 request = new Request(url, { 35 method: request.method, 36 headers: request.headers, 37 mode: request.mode, 38 credentials: request.credentials, 39 redirect: request.redirect, 40 referrer: request.referrer, 41 integrity: request.integrity, 42 }); 43 } 44 return request; 45 } 46 47 /* 48 * removeCacheGetParamsPlugin 49 * 50 * Retire les parametre GET envoyés par le front pour eviter que 51 * le navigateur ne mette en cache les fichiers 52 * 53 * - retire le param lors du fetch vers le network 54 * - renomme l'url de l'appel dans le cache après son insertion 55 * - essaie de récupérer l'url sans les params dans le cache si fail 56 */ 57 const removeCacheGetParamsPlugin = { 58 requestWillFetch: async ({ request }) => { 59 return handleCacheParams(request); 60 }, 61 cachedResponseWillBeUsed: async ({ request, cachedResponse }) => { 62 if (cachedResponse) { 63 return cachedResponse; 64 } else { 65 var req = handleCacheParams(request); 66 return caches.match(req.url); 67 } 68 }, 69 cacheDidUpdate: async ({ cacheName, request }) => { 70 var myUrl = new URL(request.url); 71 var params = myUrl.searchParams; 72 if (params.get('_') || params.get('_t') || params.get('v')) { 73 params.delete('_'); 74 params.delete('_t'); 75 params.delete('v'); 76 const freshResponse = await caches.match(request, { cacheName }); 77 caches 78 .open(cacheName) 79 .then(function(cache) { 80 cache.delete(request.url); 81 return cache.put(myUrl.toString(), freshResponse); 82 }) 83 .catch(function(e) { 84 return freshResponse; 85 }); 86 } 87 }, 88 }; 89 90 // on lance le service worker de suite pour le client 91 workbox.skipWaiting(); 92 workbox.clientsClaim(); 93 94 // analytics 95 workbox.googleAnalytics.initialize(); 96 97 // init des nom de cache 98 workbox.core.setCacheNameDetails({ 99 prefix: 'oxatis', 100 suffix: VERSION, 101 precache: 'scripts', 102 runtime: 'runtime', 103 }); 104 105 // ne pas toucher -- sera modifié par la tache gulp 106 workbox.precaching.precacheAndRoute([ 107 { 108 "url": "/frontend/angular-1.3.15/modules/oxSharedCart/oxSharedCart.js", 109 "revision": "d946194bf8942e9cf917188ecc7bff64" 110 }, 111 { 112 "url": "/frontend/angular-1.3.15/angularFramework.js", 113 "revision": "76515364679ab64b2032928e811eedeb" 114 }, 115 { 116 "url": "/frontend/angular-1.3.15/lazyDirectives/all.js", 117 "revision": "7c9edad9576c01b379cc4831067c2a51" 118 }, 119 { 120 "url": "/frontend/angular-1.3.15/css/oxApps.css", 121 "revision": "f1a521d2db3452cd3d9e51c004bc1e0d" 122 }, 123 { 124 "url": "/frontend/angular-1.3.15/serviceWorker/views/offline.html", 125 "revision": "3d3d871594e3355ea018a06f567d06be" 126 } 127]); 128 129 // par défaut --> networkFirst + cache si 200 ou 404 (on ne cache pas les reponses 'opaques' ni les POST) 130 var defaultStrategy = workbox.strategies.networkFirst({ 131 cacheName: 'oxatis-runtime-' + VERSION, 132 plugins: [ 133 new workbox.cacheableResponse.Plugin({ statuses: [200, 404] }), 134 removeCacheGetParamsPlugin, 135 ], 136 }); 137 workbox.routing.setDefaultHandler({ 138 handle: args => { 139 // si entete uniquement cache, on ne renvoie rien 140 if ( 141 args.event.request.cache === 'only-if-cached' && 142 args.event.request.mode !== 'same-origin' 143 ) { 144 return; 145 }
146 if (args.event.request.method === 'GET') { 147 return defaultStrategy.handle(args); 148 } 149 return fetch(args.event.request); 150 }, 151 }); 152 153 const regAdmin = /\/(?:tk(.*)|ad(.*)|Login)\.asp/i; 154 const fnNetworkOnly = ({ event }) => 155 // urls externes 156 (event.request.url.indexOf(ROOT_URL) === -1 && 157 event.request.url.indexOf('.oxatis.com') === -1) || 158 // page d'admin ou toolkit 159 (!!event.request.referrer && !!event.request.referrer.match(regAdmin)) || 160 event.request.url.match(regAdmin); 161 162 workbox.routing.registerRoute( 163 fnNetworkOnly, 164 new workbox.strategies.NetworkOnly() 165 ); 166 167 // script frontend divers + apps (hors précache qui ne seront pas rapellés) 168 workbox.routing.registerRoute( 169 /\/frontend(.*)\/angular/, 170 workbox.strategies.staleWhileRevalidate({ 171 cacheName: 'oxatis-scripts-' + VERSION, 172 plugins: [removeCacheGetParamsPlugin], 173 }) 174 ); 175 176 // appels webservices 177 workbox.routing.registerRoute( 178 /\/ws\//, 179 workbox.strategies.networkFirst({ 180 cacheName: 'oxatis-ws-' + VERSION, 181 plugins: [ 182 new workbox.expiration.Plugin({ 183 maxAgeSeconds: 4 * 24 * 60 * 60, // 4 Days 184 }), 185 removeCacheGetParamsPlugin, 186 ], 187 }) 188 ); 189 190 // images 191 workbox.routing.registerRoute( 192 /\.(?:png|gif|jpg|jpeg|svg)$/, 193 workbox.strategies.cacheFirst({ 194 cacheName: 'oxatis-images-' + VERSION, 195 plugins: [ 196 new workbox.expiration.Plugin({ 197 maxAgeSeconds: 30 * 24 * 60 * 60, // 30 Days 198 }), 199 ], 200 }) 201 ); 202 203 // gestion des actions / pages de navigation 204 // --> networkFirst -> cache si pas de réseau --> page offline en dernier recours 205 const navigateHandler = workbox.strategies.networkFirst({ 206 cacheName: 'oxatis-navigate-' + VERSION, 207 }); 208 workbox.routing.registerRoute( 209 ({ event }) => event.request.mode === 'navigate', 210 ({ event }) => { 211 return navigateHandler 212 .handle({ event }) 213 .then(rsp => { 214 return ( 215 rsp || 216 caches.match(OFFLINE_PAGE).then(function(response) { 217 var init = { 218 status: response.status, 219 statusText: response.statusText, 220 headers: {}, 221 }; 222 response.headers.forEach(function(v, k) { 223 init.headers[k] = v; 224 }); 225 return response.text().then(function(body) { 226 return new Response(body, init); 227 }); 228 }) 229 ); 230 }) 231 .catch(() => { 232 return caches.match(OFFLINE_PAGE); 233 }); 234 } 235 ); 236}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.