Some checks failed
Beta Release / beta (push) Failing after 48s
Adds a WXT-based browser extension that replaces manual JS snippet injection for AI-driven browser testing. The extension auto-connects to the Muyue server via WebSocket on every page, using the exact same protocol as the existing snippet — zero backend changes needed. - Chrome/Edge (MV3) + Firefox (MV2) from single codebase via WXT - Content script: auto-connect WS, console capture, URL tracking, RPC - Background service worker: token management, screenshots, badge - Popup + side panel with server status, sessions, URL config - CI workflows: build extension, attach .zip to releases - Makefile targets: ext, ext-chrome, ext-firefox, ext-zip - Version bumped to 0.8.0 Assisted-by: GLM-5.1 via Crush <crush@charm.land>
57 lines
1.7 KiB
JavaScript
57 lines
1.7 KiB
JavaScript
const DEFAULT_PORT = 8080;
|
|
const DEFAULT_HOST = '127.0.0.1';
|
|
const DEFAULT_URL = `http://${DEFAULT_HOST}:${DEFAULT_PORT}`;
|
|
|
|
function isServiceWorker() {
|
|
return typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;
|
|
}
|
|
|
|
export async function getServerUrl() {
|
|
if (isServiceWorker()) {
|
|
const result = await chrome.storage.local.get('muyue_server_url');
|
|
return result.muyue_server_url || DEFAULT_URL;
|
|
}
|
|
const stored = localStorage.getItem('muyue_server_url');
|
|
return stored || DEFAULT_URL;
|
|
}
|
|
|
|
export async function setServerUrl(url) {
|
|
if (isServiceWorker()) {
|
|
await chrome.storage.local.set({ muyue_server_url: url });
|
|
} else {
|
|
localStorage.setItem('muyue_server_url', url);
|
|
}
|
|
}
|
|
|
|
export async function buildWsUrl(token) {
|
|
const base = await getServerUrl();
|
|
const wsBase = base.replace(/^http/, 'ws');
|
|
return `${wsBase}/api/ws/browser-test?token=${encodeURIComponent(token)}`;
|
|
}
|
|
|
|
export async function fetchToken() {
|
|
const base = await getServerUrl();
|
|
const res = await fetch(`${base}/api/test/snippet`);
|
|
if (!res.ok) throw new Error(`Server returned ${res.status}`);
|
|
const data = await res.json();
|
|
return { token: data.token, wsUrl: data.ws_url, expiresIn: data.expires_in };
|
|
}
|
|
|
|
export async function fetchSessions() {
|
|
const base = await getServerUrl();
|
|
const res = await fetch(`${base}/api/test/sessions`);
|
|
if (!res.ok) throw new Error(`Server returned ${res.status}`);
|
|
const data = await res.json();
|
|
return data.sessions || [];
|
|
}
|
|
|
|
export async function checkServerHealth() {
|
|
try {
|
|
const base = await getServerUrl();
|
|
const res = await fetch(`${base}/api/info`, { signal: AbortSignal.timeout(3000) });
|
|
return res.ok;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|