-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcoi-serviceworker.js
More file actions
63 lines (61 loc) · 2.77 KB
/
coi-serviceworker.js
File metadata and controls
63 lines (61 loc) · 2.77 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
/*! coi-serviceworker - Cross-Origin Isolation via Service Worker */
/*
* Adds Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers
* to enable SharedArrayBuffer on static hosts like GitHub Pages.
*
* Usage: <script src="coi-serviceworker.js"></script>
*/
if (typeof window !== 'undefined') {
// --- Page context ---
if (window.crossOriginIsolated) {
// Already isolated, nothing to do
console.log('[COI] Already cross-origin isolated');
} else if ('serviceWorker' in navigator) {
// Guard against infinite reload loop: only reload once per session
var reloadKey = 'coi-sw-reloaded';
if (sessionStorage.getItem(reloadKey)) {
console.warn('[COI] Service worker active but crossOriginIsolated is still false — browser may not support COOP/COEP. Proceeding without isolation.');
} else {
navigator.serviceWorker.register(window.document.currentScript.src)
.then(function (reg) {
console.log('[COI] Service worker registered, scope:', reg.scope);
// Reload once active so the SW can inject headers
navigator.serviceWorker.ready.then(function () {
sessionStorage.setItem(reloadKey, '1');
window.location.reload();
});
})
.catch(function (err) {
console.error('[COI] Service worker registration failed:', err);
});
}
}
} else {
// --- Service Worker context ---
self.addEventListener('install', function () { self.skipWaiting(); });
self.addEventListener('activate', function (event) { event.waitUntil(self.clients.claim()); });
self.addEventListener('fetch', function (event) {
if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') {
return;
}
var url = new URL(event.request.url);
if (url.origin !== self.location.origin) {
return;
}
event.respondWith(
fetch(event.request).then(function (response) {
var newHeaders = new Headers(response.headers);
newHeaders.set('Cross-Origin-Embedder-Policy', 'require-corp');
newHeaders.set('Cross-Origin-Opener-Policy', 'same-origin');
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders,
});
}).catch(function (e) {
console.error('[COI] Fetch failed:', event.request.url, e.message);
return new Response('Service Worker fetch failed', { status: 502 });
})
);
});
}