🍠 Serve Your Media Without Limits From a "Potato" Computer Hosted in Mom's Basement: Take our Beloved "Series of Tubes" to Full Power
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

102 lines
3.4 KiB

const cacheVersion = 'v1';
// self.addEventListener('install', event => {
// event.waitUntil(caches.open(cacheVersion).then(cache => {
// // cache the /error endpoint which will be served by the serviceworker when the fetch client encounters a network error.
// return cache.addAll(['/error']);
// }));
// });
self.addEventListener('message', async event => {
const source = event.source || (await clients.get(event.clientId));
if(!source) {
return
}
if(event.data.pollInstalled) {
source.postMessage({confirmInstalled: true});
}
if(event.data.connect) {
var evtSource = new EventSource('/tuber-trickle-ice');
evtSource.onmessage = function(serverSentEvent) {
client.postMessage({ log: `sse: ${JSON.stringify(serverSentEvent, null, " ")}\n\n `});
}
}
});
self.addEventListener('fetch', event => {
event.respondWith(clients.get(event.clientId).then((client) => {
return caches.match(event.request).then(response => {
// caches.match() always resolves
// but in case of success response will have value
if (response !== undefined) {
if(client) {
client.postMessage({ log: `cache hit: ${event.request.method}, ${event.request.url}` });
}
return response;
} else {
if(client) {
client.postMessage({ log: `fetching: ${event.request.method}, ${event.request.url}` });
}
return fetch(event.request).then(async response => {
if(client) {
client.postMessage({ log: `fetching: ${event.request.method}, ${event.request.url}` });
}
// if(event.request.url.endsWith(".bpg")) {
// const pngBytes = await decodePromises[event.request.url];
// const makeModifiedResponse = () => {
// const newHeaders = new Headers(response.headers);
// newHeaders.set('content-type', 'image/png');
// newHeaders.set('content-length', String(pngBytes.length))
// return new Response(
// new ReadableStream({
// start(controller) {
// controller.enqueue(pngBytes);
// controller.close();
// }
// }), {
// status: response.status,
// statusText: response.statusText,
// headers: newHeaders
// });
// }
// client.postMessage({ log: `returning & caching modified response for: ${event.request.method}, ${event.request.url}` });
// caches.open(cacheVersion).then((cache) => {
// cache.put(event.request, makeModifiedResponse());
// });
// return makeModifiedResponse();
// }
if(client) {
client.postMessage({ log: `ignored: ${event.request.method}, ${event.request.url}` });
}
return response;
}).catch( e => {
if(client) {
client.postMessage({ log: `fetch failed in serviceworker! ${event.request.method}, ${event.request.url}: ${e} ` });
}
const errorMessage = "502 Bad Gateway from tuber serviceworker"
return new Response(
errorMessage, {
status: 502,
statusText: errorMessage,
headers: new Headers({"Content-Length": String(errorMessage.length)})
});
});
}
});
}));
});