import browser from 'webextension-polyfill'; import type { UserlandBrowser } from './routes/userland'; console.debug('Loading Extension'); setTimeout(async () => { const { sc } = await browser.storage.local.get('sc'); if (typeof sc === 'undefined') { console.warn('No value set!'); } else if (typeof sc !== 'string') { throw new Error('typeof sc is not str nor undefined'); } else { console.debug('Found Script (length', sc.length, ':3)'); console.debug('Loading esbuild-wasm'); const { initialize, transform } = await import('esbuild-wasm').catch( (e) => { console.error('Failed to load esbuild-wasm!'); throw e; } ); console.debug("Loading esbuild's WASM Module"); const wasmModule = new WebAssembly.Module( await fetch('./generated/esbuild.wasm') .catch((e) => { console.error('Failed to fetch() the esbuild wasm file.'); throw e; }) .then((v) => v.arrayBuffer()) ); console.debug('Attempting to initialize esbuild-wasm'); try { await initialize({ wasmModule, worker: false, }); } catch (error) { console.error(error); throw new Error('Failed to initialize esbuild - see above error'); } console.debug('Transforming Content'); const built = await transform(sc, { loader: 'ts', }); console.debug('Got result', built); const b = browser; const brow: UserlandBrowser = { get webRequest() { return b.webRequest; }, }; const f = new Function( 'browser', built.code.includes('await') ? `return (async()=>{${built.code} })();` : built.code ); console.debug('Environment Information:', { func: f, browser: brow, realBrowser: b, }); (globalThis as any).browser = brow; console.debug('Evaluating...'); await f(brow); console.debug('Function Exited'); } }, 0);