Skip to content

Commit 9dd26ed

Browse files
committed
[frontend] wait for service worker to register before displaying page content
1 parent 15e5a02 commit 9dd26ed

File tree

1 file changed

+66
-25
lines changed

1 file changed

+66
-25
lines changed

frontend/src/main.tsx

Lines changed: 66 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,34 +36,75 @@ export const scramjet = new ScramjetController({
3636
},
3737
});
3838

39-
scramjet.init();
40-
navigator.serviceWorker.register("./sw.js");
41-
4239
export let browser: Browser;
4340

44-
try {
45-
let shell = <Shell></Shell>;
46-
browser = new Browser();
47-
let de = localStorage["browserstate"];
48-
if (de) {
49-
browser.deserialize(JSON.parse(de));
50-
} else {
51-
let tab = browser.newTab();
52-
browser.activetab = tab;
41+
function mount() {
42+
try {
43+
let shell = <Shell></Shell>;
44+
browser = new Browser();
45+
let de = localStorage["browserstate"];
46+
if (de) {
47+
browser.deserialize(JSON.parse(de));
48+
} else {
49+
let tab = browser.newTab();
50+
browser.activetab = tab;
51+
}
52+
53+
(self as any).browser = browser;
54+
let built = <App>{shell}</App>;
55+
app.replaceWith(built);
56+
built.addEventListener("contextmenu", (e) => {
57+
e.preventDefault();
58+
});
59+
} catch (e) {
60+
let err = e as any;
61+
app.replaceWith(
62+
document.createTextNode(
63+
`Error mounting: ${"message" in err ? err.message : err}`
64+
)
65+
);
66+
console.error(err);
5367
}
68+
}
5469

55-
(self as any).browser = browser;
56-
let built = <App>{shell}</App>;
57-
app.replaceWith(built);
58-
built.addEventListener("contextmenu", (e) => {
59-
e.preventDefault();
70+
function waitForStateChange(worker: ServiceWorker, targetState: string) {
71+
return new Promise<void>((resolve) => {
72+
if (worker.state === targetState) {
73+
resolve();
74+
return;
75+
}
76+
77+
worker.addEventListener("statechange", function listener() {
78+
if (worker.state === targetState) {
79+
worker.removeEventListener("statechange", listener);
80+
resolve();
81+
}
82+
});
6083
});
61-
} catch (e) {
62-
let err = e as any;
63-
app.replaceWith(
64-
document.createTextNode(
65-
`Error mounting: ${"message" in err ? err.message : err}`
66-
)
67-
);
68-
console.error(err);
6984
}
85+
async function init() {
86+
try {
87+
scramjet.init();
88+
let registration = await navigator.serviceWorker.register("./sw.js");
89+
90+
if (registration.installing) {
91+
app.innerText = "Installing service worker...";
92+
await waitForStateChange(registration.installing, "installed");
93+
}
94+
95+
if (registration.waiting) {
96+
app.innerText = "Service worker installed, activating...";
97+
await waitForStateChange(registration.waiting, "activated");
98+
}
99+
100+
if (registration.active) {
101+
app.innerText = "Service worker activated, mounting app...";
102+
mount();
103+
}
104+
} catch (e) {
105+
console.error("Error during service worker registration:", e);
106+
app.innerText =
107+
"Failed to register service worker. Check console for details.";
108+
}
109+
}
110+
init();

0 commit comments

Comments
 (0)