Source code

Revision control

Copy as Markdown

Other Tools

importScripts('sw-helpers.js');
async function getFetchResult(record) {
const response = await record.responseReady.catch(() => null);
if (!response) return null;
return {
url: response.url,
status: response.status,
text: await response.text().catch(() => 'error'),
};
}
function handleBackgroundFetchEvent(event) {
let matchFunction = null;
switch (event.registration.id) {
case 'matchexistingrequest':
matchFunction = event.registration.match.bind(
event.registration, '/background-fetch/resources/feature-name.txt');
break;
case 'matchexistingrequesttwice':
matchFunction = (async () => {
const match1 = await event.registration.match('/background-fetch/resources/feature-name.txt');
const match2 = await event.registration.match('/background-fetch/resources/feature-name.txt');
return [match1, match2];
}).bind(event.registration);
break;
case 'matchmissingrequest':
matchFunction = event.registration.match.bind(
event.registration, '/background-fetch/resources/missing.txt');
break;
default:
matchFunction = event.registration.matchAll.bind(event.registration);
break;
}
event.waitUntil(
matchFunction()
// Format `match(All)?` function results.
.then(records => {
if (!records) return []; // Nothing was matched.
if (!records.map) return [records]; // One entry was returned.
return records; // Already in a list.
})
// Extract responses.
.then(records =>
Promise.all(records.map(record => getFetchResult(record))))
// Clone registration and send message.
.then(results => {
const registrationCopy = cloneRegistration(event.registration);
sendMessageToDocument(
{ type: event.type, eventRegistration: registrationCopy, results })
})
.catch(error => {
sendMessageToDocument(
{ type: event.type, eventRegistration:{}, results:[], error:true })
}));
}
self.addEventListener('backgroundfetchsuccess', handleBackgroundFetchEvent);
self.addEventListener('backgroundfetchfail', handleBackgroundFetchEvent);
self.addEventListener('backgroundfetchabort', handleBackgroundFetchEvent);