Skip to content

Instantly share code, notes, and snippets.

@romgrk
Last active April 4, 2017 16:12
Show Gist options
  • Select an option

  • Save romgrk/e967f4703848e4b02201b497b4440115 to your computer and use it in GitHub Desktop.

Select an option

Save romgrk/e967f4703848e4b02201b497b4440115 to your computer and use it in GitHub Desktop.
Caches everything
/*
* main.js
* Copyright (C) 2016 romgrk <romgrk@Romgrk-ARCH>
*
* Distributed under terms of the MIT license.
*/
'use strict';
const serviceWorker = navigator.serviceWorker;
serviceWorker.register('/sw.js')
.then(registration => {
console.log('SW done:', registration)
})
.catch(err => {
console.log('SW failed:', err)
})
document.addEventListener('DOMContentLoaded', event => {
sendToServiceWorker('Page loaded')
.then(res => console.log(res))
.catch(err => console.log(err))
})
function sendToServiceWorker(message) {
return new Promise((resolve, reject) => {
var channel = new MessageChannel();
channel.port1.onmessage = event => {
if (event.data.error)
reject(event.data.error)
else
resolve(event.data)
}
serviceWorker.controller.postMessage(message, [channel.port2])
})
}
/*
* sw.js
* Copyright (C) 2016 romgrk <romgrk@Romgrk-ARCH>
*
* Distributed under terms of the MIT license.
*/
'use strict';
const CACHE_NAME = 'cache-v1'
const urls = [
'file.txt'
]
let counter = 0
self.addEventListener('install', (event) => {
console.log('SW: installing');
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
console.log('Cache opened');
return cache.addAll(urls)
})
)
})
self.addEventListener('activate', (event) => {
console.log('SW: activating');
})
self.addEventListener('fetch', event => {
console.log('SW: fetch:', event);
event.respondWith(
caches.match(event.request).then(cachedResponse => {
if (cachedResponse) {
console.log('Cache match.');
const fetchRequest = event.request.clone();
fetch(fetchRequest).then(response => {
if (!response || response.status !== 200 || response.type !== 'basic') {
return;
}
console.log('Cache match -- recache');
caches.open(CACHE_NAME).then(cache => {
cache.put(event.request, response);
});
})
return cachedResponse;
}
console.log('Cache miss');
const fetchRequest = event.request.clone();
return fetch(fetchRequest).then(response => {
if (!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
console.log('Cached');
const responseToCache = response.clone();
caches.open(CACHE_NAME).then(cache => {
cache.put(event.request, responseToCache);
});
return response;
})
})
)
})
self.addEventListener('message', event => {
console.log('SW: message:', event.data);
if (event.ports.length) {
var port = event.ports[0];
port.postMessage('Received.');
}
})
function sendToAllClients(message) {
clients.matchAll().then(clients => {
clients.forEach(client => sendToClient(client, message))
})
}
function sendToClient(client, message) {
return new Promise((resolve, reject) => {
var channel = new MessageChannel();
channel.port1.onmessage = event => {
if (event.data.error)
reject(event.data.error)
else
resolve(event.data)
}
client.postMessage(message, [channel.port2])
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment