1+ export const serviceWorker = ( ) => `
2+ self.addEventListener('fetch', event => {
3+ const url = new URL(event.request.url);
4+ const isSameDomain = url.origin === self.location.origin;
5+
6+ if (!isSameDomain) {
7+ return event.respondWith(fetch(event.request));
8+ }
9+
10+ if (url.pathname.startsWith('/_ipx/_/') || ['jpg', 'png', 'jpeg', 'gif', 'webp'].includes(url.pathname.split('.').pop())) {
11+ console.log('Fetching from IndexedDB:', url.pathname);
12+ return event.respondWith(fetchFromIndexedDB(url));
13+ }
14+
15+ event.respondWith(fetch(event.request))
16+ })
17+
18+ function fetchFromIndexedDB(url) {
19+ const dbKey = ['public-assets:', url.pathname.replace('/_ipx/_/', '').replace('/', ':')].join('')
20+ return getData(dbKey).then(data => {
21+ if (!data) {
22+ return fetch(event.request);
23+ }
24+
25+ const json = JSON.parse(data)
26+ const parsed = parseDataUrl(json.modified.raw);
27+ const bytes = base64ToUint8Array(parsed.base64);
28+
29+ return new Response(bytes, {
30+ headers: { 'Content-Type': parsed.mime }
31+ });
32+ })
33+ }
34+
35+ function parseDataUrl(dataUrl) {
36+ // Example: data:image/png;base64,iVBORw0KG...
37+ const match = dataUrl.match(/^data:(.+);base64,(.+)$/);
38+ if (!match) return null;
39+ return {
40+ mime: match[1],
41+ base64: match[2]
42+ };
43+ }
44+
45+ function base64ToUint8Array(base64) {
46+ const binary = atob(base64);
47+ const len = binary.length;
48+ const bytes = new Uint8Array(len);
49+ for (let i = 0; i < len; i++) {
50+ bytes[i] = binary.charCodeAt(i);
51+ }
52+ return bytes;
53+ }
54+
55+ // IndexedDB
56+ function openDB() {
57+ return new Promise((resolve, reject) => {
58+ const request = indexedDB.open('nuxt-content-studio-media', 1);
59+ request.onupgradeneeded = event => {
60+ const db = event.target.result;
61+ db.createObjectStore('drafts', { keyPath: 'id' });
62+ };
63+ request.onsuccess = event => resolve(event.target.result);
64+ request.onerror = event => reject(event.target.error);
65+ });
66+ }
67+
68+ // Read data from the object store
69+ function getData(key) {
70+ return openDB().then(db => {
71+ return new Promise((resolve, reject) => {
72+ const tx = db.transaction('drafts', 'readonly');
73+ const store = tx.objectStore('drafts');
74+ const request = store.get(key);
75+ request.onsuccess = () => resolve(request.result);
76+ request.onerror = () => reject(request.error);
77+ });
78+ });
79+ }
80+ `
0 commit comments