'use strict';
|
|
var CACHE = 'ttss-app-v1';
|
var CACHE_RESOURCES = [
|
'/version.php',
|
'/',
|
'/common.js',
|
'/index.css',
|
'/index.html',
|
'/index.js',
|
'/lang_en.js',
|
'/lang_pl.js',
|
'/map.css',
|
'/map.html',
|
'/map.js',
|
'/serviceworker-install.js',
|
'https://code.jquery.com/jquery-3.1.1.min.js',
|
'https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList',
|
'https://openlayers.org/en/v4.1.0/build/ol.js'
|
];
|
|
var self = this;
|
|
this.addEventListener('install', event => {
|
event.waitUntil(
|
caches.open(CACHE).then(cache => {
|
return cache.addAll(CACHE_RESOURCES);
|
})
|
);
|
});
|
|
this.addEventListener('fetch', event => {
|
event.respondWith(
|
caches.match(event.request).then(response => response || fetch(event.request))
|
);
|
|
if(event.request.url.endsWith('/version.php')) {
|
event.waitUntil(
|
Promise.all([
|
caches.open(CACHE),
|
fetch(event.request)
|
]).then(results => {
|
var cache = results[0];
|
var v2 = results[1];
|
var v2copy = v2.clone();
|
|
return Promise.all([
|
cache.match(event.request).then(v1 => v1.json()),
|
v2copy.json()
|
]).then(results => {
|
var v1json = results[0];
|
var v2json = results[1];
|
|
return updateCache(cache, v1json, v2json).then(_ => cache.put(event.request, v2)).then(function() {
|
console.log('Service Worker: update successful!');
|
self.skipWaiting();
|
postMessage({action: 'updated'});
|
});
|
});
|
}).catch(function(error) {
|
console.log('Service Worker: update failed: ', error);
|
postMessage({action: 'updateFailed'});
|
})
|
);
|
}
|
});
|
|
this.addEventListener('activate', event => {
|
event.waitUntil(
|
caches.keys().then(keyList => Promise.all(
|
keyList.map(key => {
|
if (key != CACHE) {
|
return caches.delete(key);
|
}
|
})
|
)).then(caches.open(CACHE)).then(cache => cache.keys()).then(keys =>
|
console.log(keys)
|
|
/*Promise.all(
|
keys.map(key => {
|
console.log(key);
|
if(!(key in CACHE_RESOURCES)) {
|
//return cache.delete(key);
|
}
|
})*/
|
)
|
);
|
});
|
|
function postMessage(message) {
|
self.clients.matchAll().then(clients => {
|
clients.forEach(client => {
|
client.postMessage(message);
|
});
|
});
|
}
|
|
function updateCache(cache, cachedVersion, currentVersion) {
|
var remove = [];
|
var add = [];
|
|
for(var cachedFile in cachedVersion) {
|
if(!currentVersion[cachedFile]) {
|
remove.push('/' + cachedFile);
|
} else if(cachedVersion[cachedFile] != currentVersion[cachedFile]) {
|
add.push('/' + cachedFile);
|
}
|
}
|
for(var currentFile in currentVersion) {
|
if(CACHE_RESOURCES.indexOf('/' + currentFile) === -1) {
|
continue;
|
} else if(!cachedVersion[currentFile]) {
|
add.push('/' + currentFile);
|
}
|
}
|
|
console.log('Service Worker: updating files: ', add);
|
console.log('Service Worker: deleting files: ', remove);
|
|
return cache.addAll(add).then(function() {
|
return Promise.all(
|
remove.map(filename => {
|
return caches.delete(filename)
|
})
|
);
|
});
|
}
|
|
this.addEventListener('message', function(event) {
|
switch(event.data.action) {
|
case 'skipWaiting':
|
self.skipWaiting();
|
break;
|
}
|
});
|