diff --git a/packages/breadboard-web/public/manifest.json b/packages/breadboard-web/public/manifest.json new file mode 100644 index 00000000000..31c227b6921 --- /dev/null +++ b/packages/breadboard-web/public/manifest.json @@ -0,0 +1,20 @@ +{ + "short_name": "Breadboard", + "name": "Breadboard", + "icons": [ + { + "src": "/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "start_url": "/", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} \ No newline at end of file diff --git a/packages/breadboard-web/public/sw.js b/packages/breadboard-web/public/sw.js new file mode 100644 index 00000000000..d795cd6f0fe --- /dev/null +++ b/packages/breadboard-web/public/sw.js @@ -0,0 +1,54 @@ +const CACHE_NAME = 'breadboard-cache-v1'; +const STATIC_ASSETS = [ + '/', + '/index.html', + '/manifest.json' +]; + +self.addEventListener('install', (event) => { + event.waitUntil( + caches.open(CACHE_NAME).then((cache) => { + return cache.addAll(STATIC_ASSETS); + }).catch((err) => { + console.error('Failed to cache static assets:', err); + }) + ); + self.skipWaiting(); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then((cacheNames) => { + return Promise.all( + cacheNames + .filter((name) => name !== CACHE_NAME) + .map((name) => caches.delete(name)) + ); + }) + ); + self.clients.claim(); +}); + +self.addEventListener('fetch', (event) => { + if (event.request.method !== 'GET') { + return; + } + + event.respondWith( + caches.match(event.request).then((response) => { + if (response) { + return response; + } + return fetch(event.request).then((fetchResponse) => { + if (!fetchResponse || fetchResponse.status !== 200 || fetchResponse.type !== 'basic') { + return fetchResponse; + } + const responseToCache = fetchResponse.clone(); + caches.open(CACHE_NAME).then((cache) => { + cache.put(event.request, responseToCache); + }); + return fetchResponse; + }); + }) + ); +}); \ No newline at end of file diff --git a/packages/breadboard-web/src/register-service-worker.ts b/packages/breadboard-web/src/register-service-worker.ts new file mode 100644 index 00000000000..9f7f64c6cc4 --- /dev/null +++ b/packages/breadboard-web/src/register-service-worker.ts @@ -0,0 +1,13 @@ +export function registerServiceWorker(): void { + if ('serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker.register('/sw.js') + .then((registration) => { + console.log('ServiceWorker registered:', registration.scope); + }) + .catch((error) => { + console.error('ServiceWorker registration failed:', error); + }); + }); + } +} \ No newline at end of file