-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathcoi-serviceworker.js
More file actions
78 lines (68 loc) · 2.64 KB
/
Copy pathcoi-serviceworker.js
File metadata and controls
78 lines (68 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
* COI service worker bootstrap for static hosting (including GitHub Pages).
* This enables SharedArrayBuffer-dependent features by applying COOP/COEP.
*/
if (typeof window === "undefined") {
self.addEventListener("install", () => self.skipWaiting());
self.addEventListener("activate", (event) => event.waitUntil(self.clients.claim()));
self.addEventListener("fetch", (event) => {
const request = event.request;
if (request.cache === "only-if-cached" && request.mode !== "same-origin") {
return;
}
event.respondWith(
fetch(request)
.then((response) => {
if (response.status === 0) {
return response;
}
const headers = new Headers(response.headers);
headers.set("Cross-Origin-Embedder-Policy", "require-corp");
headers.set("Cross-Origin-Opener-Policy", "same-origin");
headers.set("Cross-Origin-Resource-Policy", "cross-origin");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers,
});
})
.catch((error) => {
return new Response(String(error), {
status: 500,
statusText: "Service Worker Fetch Failed",
});
})
);
});
} else {
(async () => {
if (!window.isSecureContext) {
return;
}
if (!("serviceWorker" in navigator)) {
return;
}
try {
const workerUrl = new URL("coi-serviceworker.js", window.location.href).toString();
const registration = await navigator.serviceWorker.register(workerUrl);
// Reload once when a new worker takes control so COI headers become active.
if (!navigator.serviceWorker.controller) {
window.location.reload();
return;
}
if (registration.waiting) {
registration.waiting.postMessage({ type: "SKIP_WAITING" });
}
let reloaded = false;
navigator.serviceWorker.addEventListener("controllerchange", () => {
if (reloaded) {
return;
}
reloaded = true;
window.location.reload();
});
} catch (_error) {
// If service worker registration fails, app still loads without COI.
}
})();
}