Files
fn-registry agent c4c8e53915 chore: initial sync
2026-06-02 21:50:21 +02:00

105 lines
3.0 KiB
JavaScript

// web_proxy toggle — service worker.
//
// Mantiene el estado del proxy en chrome.storage.local y lo aplica a la
// configuracion de red de Chromium con la API chrome.proxy. El popup solo
// escribe el estado; este worker reacciona a los cambios y reconfigura el
// proxy. Asi un unico punto aplica la configuracion (popup, arranque,
// instalacion).
//
// Modelo de estado (chrome.storage.local key "state"):
// {
// enabled: boolean, // captura ON/OFF
// activeProxy: string, // id del proxy activo
// proxies: [
// { id, name, scheme, host, port } // proxy simple
// ]
// }
//
// Encadenacion de proxies (futuro): un proxy podra declarar
// `chain: [ {scheme,host,port}, ... ]` y se aplicara mediante un PAC script
// generado aqui. El modelo de lista ya lo permite sin migracion.
const DEFAULT_STATE = {
enabled: false,
activeProxy: "capture",
proxies: [
{
id: "capture",
name: "Captura web_proxy",
scheme: "http",
host: "127.0.0.1",
port: 8889,
},
],
};
async function getState() {
const r = await chrome.storage.local.get("state");
return r.state || DEFAULT_STATE;
}
async function setState(state) {
await chrome.storage.local.set({ state });
}
function setBadge(on) {
chrome.action.setBadgeText({ text: on ? "ON" : "" });
chrome.action.setBadgeBackgroundColor({ color: on ? "#16a34a" : "#666666" });
}
// Aplica el proxy activo si la captura esta encendida; si no, limpia la
// configuracion para volver a la conexion directa del sistema.
async function applyProxy() {
const st = await getState();
if (!st.enabled) {
await chrome.proxy.settings.clear({ scope: "regular" });
setBadge(false);
return;
}
const p =
st.proxies.find((x) => x.id === st.activeProxy) || st.proxies[0] || null;
if (!p) {
await chrome.proxy.settings.clear({ scope: "regular" });
setBadge(false);
return;
}
// fixed_servers con un unico proxy. Sin "<-loopback>" en bypassList, de modo
// que el trafico a loopback (incluida la propia UI del proxy) NO se proxea y
// por tanto no se captura. El trafico a sitios externos si pasa por el proxy.
const config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: p.scheme || "http",
host: p.host,
port: Number(p.port),
},
},
};
await chrome.proxy.settings.set({ value: config, scope: "regular" });
setBadge(true);
}
// Sembrar el estado por defecto la primera vez y aplicar.
chrome.runtime.onInstalled.addListener(async () => {
const r = await chrome.storage.local.get("state");
if (!r.state) {
await setState(DEFAULT_STATE);
}
applyProxy();
});
// Reaplicar al arrancar el navegador (la configuracion de proxy de la sesion
// no persiste entre arranques de Chromium).
chrome.runtime.onStartup.addListener(applyProxy);
// El popup escribe el estado; aqui se reconfigura el proxy en consecuencia.
chrome.storage.onChanged.addListener((changes, area) => {
if (area === "local" && changes.state) {
applyProxy();
}
});