Skip to content

Commit 13a607b

Browse files
committed
fix(wasm): service worker handshake
1 parent 5724df8 commit 13a607b

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

packages/utoo-web/src/project.ts

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,42 @@ export class Project implements ProjectEndpoint {
7070
if (this.serviceWorkerOptions) {
7171
const { url, scope } = this.serviceWorkerOptions;
7272
// Should add "Service-Worker-Allowed": "/" in page root response headers,
73-
await navigator.serviceWorker.register(url, { scope: "/" });
73+
const registration = await navigator.serviceWorker.register(url, {
74+
scope: "/",
75+
});
7476

75-
navigator.serviceWorker.controller?.postMessage({
76-
[ServiceWorkerHandShake]: true,
77-
scope,
77+
return new Promise<void>((resolve) => {
78+
function sendMessage(sw: ServiceWorker) {
79+
sw.postMessage({
80+
[ServiceWorkerHandShake]: true,
81+
scope,
82+
});
83+
resolve();
84+
}
85+
86+
function listenForActivation(sw: ServiceWorker) {
87+
sw.addEventListener("statechange", () => {
88+
if (sw.state === "activated") {
89+
sendMessage(sw);
90+
}
91+
});
92+
}
93+
94+
function checkSWState(registration: ServiceWorkerRegistration) {
95+
if (registration.active) {
96+
sendMessage(registration.active);
97+
} else if (registration.installing) {
98+
listenForActivation(registration.installing);
99+
}
100+
101+
registration.addEventListener("updatefound", () => {
102+
if (registration.installing) {
103+
listenForActivation(registration.installing);
104+
}
105+
});
106+
}
107+
108+
checkSWState(registration);
78109
});
79110
}
80111
}

packages/utoo-web/src/serviceWorker.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ let _projectEndpoint: ProjectEndpoint;
1313

1414
let _serviceWorkerScope: string;
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+
1624
self.addEventListener("message", (event) => {
1725
if (event.data && event.data[ServiceWorkerHandShake] === true) {
1826
_serviceWorkerScope = event.data.scope;

0 commit comments

Comments
 (0)