Skip to content

Commit d3960c3

Browse files
committed
fix service worker
1 parent f2f967a commit d3960c3

File tree

2 files changed

+57
-15
lines changed

2 files changed

+57
-15
lines changed

packages/playground/public/sw.js

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,72 @@
11
const cacheName = 'my-cache';
22

3-
async function fetchAndCacheIfOk(event, stale) {
3+
async function revalidate(event) {
4+
const client = await clients.get(event.clientId);
5+
client.postMessage({ type: 'cache' });
6+
}
7+
8+
async function fetchAndCacheIfOk(cache, event) {
49
try {
510
const response = await fetch(event.request);
611

712
if (response.ok) {
8-
const responseClone = response.clone();
9-
const cache = await caches.open(cacheName);
10-
await cache.put(event.request, responseClone);
11-
if (stale) self.postMessage({ type: 'cache' });
13+
await cache.put(event.request, response.clone());
1214
}
1315

1416
return response;
1517
} catch (e) {
16-
const cache = await caches.open(cacheName);
18+
console.error(e);
19+
1720
return await cache.match('/index.html');
1821
}
1922
}
2023

2124
async function fetchWithCache(event) {
2225
const cache = await caches.open(cacheName);
2326
const response = await cache.match(event.request);
24-
const result = fetchAndCacheIfOk(event, !!response);
27+
const result = fetchAndCacheIfOk(cache, event);
2528
if (!!response) {
26-
return response;
29+
result.then(async (response2) => {
30+
const reader1 = response.body.getReader();
31+
const reader2 = response2.body.getReader();
32+
33+
let i = 0;
34+
let j = 0;
35+
36+
let oldChunk1 = null;
37+
let oldChunk2 = null;
38+
if (!oldChunk1) {
39+
oldChunk1 = await reader1.read();
40+
}
41+
if (!oldChunk2) {
42+
oldChunk2 = await reader2.read();
43+
}
44+
while (!oldChunk1.done && !oldChunk2.done) {
45+
if (oldChunk1.value[i] !== oldChunk2.value[j]) {
46+
revalidate(event);
47+
return;
48+
}
49+
i++;
50+
j++;
51+
if (i === oldChunk1.value.length) {
52+
oldChunk1 = await reader1.read();
53+
i = 0;
54+
}
55+
if (j === oldChunk2.value.length) {
56+
oldChunk2 = await reader2.read();
57+
j = 0;
58+
}
59+
}
60+
61+
if (oldChunk1.done && oldChunk2.done) {
62+
return;
63+
} else {
64+
revalidate(event);
65+
return;
66+
}
67+
});
68+
69+
return response.clone();
2770
} else {
2871
return result;
2972
}

packages/playground/src/utils/serviceWorker.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,15 @@ function registerServiceWorker(): void {
1010
updated() {
1111
setEventBus(true);
1212
},
13-
ready(sw) {
14-
sw.addEventListener('message', (event) => {
15-
if (event.type == 'cache') {
16-
setEventBus(true);
17-
}
18-
});
19-
},
2013
});
2114
});
2215
}
2316
}
2417

18+
navigator.serviceWorker?.addEventListener('message', (event) => {
19+
if (event.data.type == 'cache') {
20+
setEventBus(true);
21+
}
22+
});
23+
2524
export { eventBus, setEventBus, registerServiceWorker };

0 commit comments

Comments
 (0)