var cacheName = "test-cache-name";
var filesToCache = [
"a",
"b",
"c",
"d"
];
var offlineFile = "a";
self.addEventListener('install', function (e) {
e.waitUntil(
caches.open(cacheName).then(function(cache) {
return cache.addAll(filesToCache);
})
);
});
self.addEventListener('activate', function (e) {
e.waitUntil(
caches.keys().then(function (keyList) {
return Promise.all(keyList.map(function(key) {
if (key !== cacheName) {
return caches.delete(key);
}
}));
})
);
return self.clients.claim();
});
self.addEventListener('fetch', function (e) {
var requestURL = e.request.url;
if (filesToCache.indexOf(requestURL) > 1) {
e.respondWith(
caches.match(e.request).then(function(response) {
return response || fetch(e.request).catch(function () {
caches.match(offlineFile).then(function (response) {
return response;
});
});
})
);
} else {
var requestWith = e.request.headers.get('X-Requested-With');
var htmlResponse = ! requestURL.match(/\.(?!html)([a-zA-Z]+)$/);
e.respondWith(
caches.open(cacheName).then(function(cache) {
return fetch(e.request).then(function(response) {
if (e.request.method === 'GET') cache.put(e.request, response.clone());
return response;
});
}).catch(function() {
return caches.match(e.request).then(function(response) {
return response ? response.clone() : requestWith === 'XMLHttpRequest' ? new Response(JSON.stringify({
error: "Network issues, try again when you're back online"
})) : htmlResponse ? caches.match(offlineFile) : new Response();
});
})
);
}
});