Skip to content

Commit e23d786

Browse files
committed
fix: sw
1 parent 4a18f08 commit e23d786

2 files changed

Lines changed: 55 additions & 6 deletions

File tree

public/sw.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const GITHUB_API_BASE = 'https://api.github.com';
66
const GITHUB_API_CACHE = 'github-api-cache-v2';
77
const STATIC_CACHE = 'static-cache-v2';
88
const TOKEN_STORE = 'github-token-store';
9+
const STATIC_ASSETS = ['/', '/index.html', '/sw.js'];
910

1011
// Install event - cache essential static assets
1112
self.addEventListener('install', (event) => {
@@ -105,7 +106,6 @@ async function handleStaticRequest(request) {
105106
try {
106107
const response = await fetch(request);
107108
if (response.ok) {
108-
// Cache successful responses
109109
const cache = await caches.open(STATIC_CACHE);
110110
cache.put(request, response.clone()).catch(err => {
111111
console.warn('Failed to cache response:', err);
@@ -114,12 +114,19 @@ async function handleStaticRequest(request) {
114114
}
115115
throw new Error('Network response not ok');
116116
} catch (error) {
117-
// Fall back to cache
118117
const cached = await caches.match(request);
119118
if (cached) {
120119
return cached;
121120
}
122-
121+
122+
const navigationFallback = request.mode === 'navigate' || (request.headers.get('accept')?.includes('text/html'));
123+
if (navigationFallback) {
124+
const shell = await caches.match('/index.html');
125+
if (shell) {
126+
return shell;
127+
}
128+
}
129+
123130
return new Response('Offline - Resource unavailable', {
124131
status: 503,
125132
statusText: 'Service Unavailable'

src/lib/serviceWorker.ts

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
class ServiceWorkerManager {
55
private registration: ServiceWorkerRegistration | null = null;
66
private pendingToken: string | null = null;
7+
private pendingCacheClear = false;
78

89
async register(): Promise<void> {
910
if (!('serviceWorker' in navigator)) {
@@ -12,11 +13,13 @@ class ServiceWorkerManager {
1213
}
1314

1415
try {
15-
this.registration = await navigator.serviceWorker.register('/sw.js', {
16-
scope: '/'
16+
const baseUrl = import.meta.env.BASE_URL || '/';
17+
const swUrl = new URL('sw.js', window.location.origin + baseUrl).href;
18+
this.registration = await navigator.serviceWorker.register(swUrl, {
19+
scope: baseUrl
1720
});
1821

19-
console.log('Service Worker registered successfully');
22+
console.log('Service Worker registered successfully at', swUrl, 'scope', baseUrl);
2023

2124
// Wait for the service worker to be ready
2225
await navigator.serviceWorker.ready;
@@ -30,9 +33,20 @@ class ServiceWorkerManager {
3033
this.pendingToken = null;
3134
}
3235

36+
// Send any queued cache clear request once the worker is active
37+
if (this.pendingCacheClear && this.registration?.active) {
38+
this.sendCacheClear();
39+
this.pendingCacheClear = false;
40+
}
41+
3342
// Set up message handling
3443
navigator.serviceWorker.addEventListener('message', this.handleMessage.bind(this));
3544

45+
// Expose manual cache clear command in console
46+
window.clearGitHubApiCache = async () => {
47+
await this.clearCache();
48+
};
49+
3650
} catch (error) {
3751
console.error('Service Worker registration failed:', error);
3852
}
@@ -80,7 +94,35 @@ class ServiceWorkerManager {
8094
}
8195
}
8296

97+
async clearCache(): Promise<void> {
98+
if (!this.registration?.active) {
99+
this.pendingCacheClear = true;
100+
return;
101+
}
102+
103+
this.sendCacheClear();
104+
}
105+
106+
private sendCacheClear(): void {
107+
if (!this.registration?.active) {
108+
console.warn('Service worker not active, cannot clear cache');
109+
return;
110+
}
111+
112+
try {
113+
this.registration.active.postMessage({
114+
type: 'CLEAR_CACHE'
115+
});
116+
} catch (error) {
117+
console.error('Failed to send cache clear command to service worker:', error);
118+
}
119+
}
120+
83121
private handleMessage(event: MessageEvent): void {
122+
if (event.data?.type === 'CACHE_CLEARED') {
123+
console.log('Service worker cache cleared');
124+
return;
125+
}
84126
// Handle messages from service worker if needed
85127
if (event.data?.type === 'TOKEN_STORED') {
86128
console.log('Token successfully stored in service worker');

0 commit comments

Comments
 (0)