const debugPort = process.env.CHROMIUM_DEBUG_PORT || '9225'; const targets = await fetch(`http://127.0.0.1:${debugPort}/json/list`).then((response) => response.json(), ); const worker = targets.find( (target) => target.type === 'service_worker' && target.url.endsWith('/dist/background/index.mjs'), ); if (!worker) throw new Error('Azon Seeker background service worker was not found.'); const socket = new WebSocket(worker.webSocketDebuggerUrl); const pending = new Map(); let nextId = 1; socket.addEventListener('message', (event) => { const message = JSON.parse(event.data); if (!message.id || !pending.has(message.id)) return; const { resolve, reject } = pending.get(message.id); pending.delete(message.id); message.error ? reject(new Error(message.error.message)) : resolve(message.result); }); await new Promise((resolve, reject) => { socket.addEventListener('open', resolve, { once: true }); socket.addEventListener('error', reject, { once: true }); }); function request(method, params = {}) { return new Promise((resolve, reject) => { const id = nextId++; pending.set(id, { resolve, reject }); socket.send(JSON.stringify({ id, method, params })); }); } const evaluation = await request('Runtime.evaluate', { expression: `(async () => ({ manifest: chrome.runtime.getManifest(), alarm: await chrome.alarms.get('amazon-sync-retry'), storage: await chrome.storage.local.get([ 'amazon-sync-queue-v1', 'amazon-sync-state-v1' ]) }))()`, awaitPromise: true, returnByValue: true, }); socket.close(); if (evaluation.exceptionDetails) { throw new Error(evaluation.exceptionDetails.text || 'Extension evaluation failed.'); } const runtime = evaluation.result.value; if (runtime.manifest.version !== '0.7.13') throw new Error('Unexpected extension version.'); if (!runtime.manifest.permissions.includes('alarms')) throw new Error('Missing alarms permission.'); if (runtime.alarm?.name !== 'amazon-sync-retry') throw new Error('Retry alarm was not created.'); const state = JSON.parse(runtime.storage['amazon-sync-state-v1']); if (state.pendingCount !== 0 || state.status !== 'synced') { throw new Error(`Unexpected initial sync state: ${JSON.stringify(state)}`); } console.log( JSON.stringify( { extensionId: new URL(worker.url).host, version: runtime.manifest.version, retryAlarm: runtime.alarm.name, syncState: state, }, null, 2, ), );