const promises = new Map(); let socket; let socketPromise; const string0 = String.fromCharCode(0); const createWebSocket = () => { // eslint-disable-next-line no-restricted-globals socket = new WebSocket(`wss://${location.host}/vite-booster`); socket.addEventListener('message', (event) => { const indexOf0 = event.data.indexOf(string0); const key = event.data.slice(0, indexOf0); const data = event.data.slice(indexOf0 + 1); const promise = promises.get(key); if (promise) { promise.resolve(data); } else { console.error('failed to find a promise for', key); } }); socket.onerror = () => { createWebSocket(); }; socket.onclose = () => { createWebSocket(); }; socketPromise = new Promise((res) => { socket.onopen = res; }); }; createWebSocket(); // eslint-disable-next-line no-restricted-globals self.addEventListener('unload', () => { socket.onclose = null; socket.close(); }); const makeResponse = ({ request }) => { if (promises.has(request.url)) { return promises.get(request.url); } let resolve; const promise = new Promise((res) => { resolve = res; }); promises.set( request.url, Object.assign(promise, { resolve: (data) => { const headers = {}; if (request.destination === 'script') { headers['Content-Type'] = 'application/javascript'; } if (request.destination === 'worker') { headers['Content-Type'] = 'application/javascript'; headers['Cross-Origin-Opener-Policy'] = 'same-origin'; headers['Cross-Origin-Embedder-Policy'] = 'require-corp'; } resolve(new Response(data, { status: 200, headers })); promises.delete(request.url); }, }), ); socketPromise.then(() => socket.send(request.url)); return promise; }; // eslint-disable-next-line no-restricted-globals self.addEventListener('fetch', (event) => { const { request } = event; const url = new URL(request.url); if ( request.method !== 'GET' || // eslint-disable-next-line no-restricted-globals url.origin !== location.origin || !(url.pathname.startsWith('/src/') || url.pathname.startsWith('/node_modules/') || url.pathname.startsWith('/@')) || request.destination === 'document' || request.url.endsWith('.wasm') ) { return; } event.respondWith(makeResponse(event)); });