azon_seeker/scripts/verify-extension-runtime.mjs
2026-09-02 09:31:25 +08:00

72 lines
2.4 KiB
JavaScript

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,
),
);