Skip to content

Commit afdabfd

Browse files
committed
fix: prevent service worker errors for first time users
1 parent 78a6885 commit afdabfd

2 files changed

Lines changed: 67 additions & 6 deletions

File tree

static/assets/js/search.js

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,54 @@
1-
window.addEventListener("load", () => {
2-
navigator.serviceWorker.register("../sw.js", {
3-
scope: "/uv/",
4-
});
1+
2+
let swReady = false;
3+
let swReadyResolve;
4+
const swReadyPromise = new Promise(resolve => { swReadyResolve = resolve; });
5+
6+
window.addEventListener("load", async () => {
7+
if (!("serviceWorker" in navigator)) {
8+
swReady = true;
9+
swReadyResolve();
10+
return;
11+
}
12+
13+
try {
14+
const registration = await navigator.serviceWorker.register("../sw.js", {
15+
scope: "/uv/",
16+
});
17+
18+
if (registration.active) {
19+
swReady = true;
20+
swReadyResolve();
21+
return;
22+
}
23+
24+
const worker = registration.installing || registration.waiting;
25+
if (worker) {
26+
worker.addEventListener("statechange", function onStateChange() {
27+
if (this.state === "activated") {
28+
swReady = true;
29+
swReadyResolve();
30+
worker.removeEventListener("statechange", onStateChange);
31+
}
32+
});
33+
} else {
34+
swReady = true;
35+
swReadyResolve();
36+
}
37+
} catch (err) {
38+
console.error("[SW] registration failed:", err);
39+
swReady = true;
40+
swReadyResolve();
41+
}
542
});
643

44+
async function waitForServiceWorker() {
45+
if (swReady) return;
46+
await Promise.race([
47+
swReadyPromise,
48+
new Promise(resolve => setTimeout(resolve, 4000)),
49+
]);
50+
}
51+
752
const form = document.getElementById("fv");
853
const input = document.getElementById("input");
954

@@ -39,6 +84,8 @@ async function encodeUrl(url, proxyOverride) {
3984
}
4085

4186
async function navigate(value, path, proxyOverride) {
87+
await waitForServiceWorker();
88+
4289
let url = value.trim();
4390
const engine = localStorage.getItem("engine");
4491
const searchUrl = engine ? engine : "https://search.brave.com/search?q=";
@@ -78,4 +125,4 @@ function useDynamic(value) {
78125

79126
function isValidUrl(val = "") {
80127
return /^http(s?):\/\//.test(val) || (val.includes(".") && val[0] !== " ");
81-
}
128+
}

static/sw.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,20 @@ const sj = new ScramjetServiceWorker();
1313
const userKey = new URL(location).searchParams.get("userkey");
1414
self.dynamic = dynamic;
1515

16+
self.addEventListener("install", event => {
17+
event.waitUntil(self.skipWaiting());
18+
});
19+
20+
self.addEventListener("activate", event => {
21+
event.waitUntil(self.clients.claim());
22+
});
23+
24+
self.addEventListener("message", event => {
25+
if (event.data?.type === "SKIP_WAITING") {
26+
self.skipWaiting();
27+
}
28+
});
29+
1630
self.addEventListener("fetch", event => {
1731
event.respondWith(
1832
(async () => {
@@ -33,4 +47,4 @@ self.addEventListener("fetch", event => {
3347
return await fetch(event.request);
3448
})(),
3549
);
36-
});
50+
});

0 commit comments

Comments
 (0)