Necesito definir mi Service Worker como persistente en mi extensión de Chrome porque estoy usando la API webRequest para interceptar algunos datos pasados en un formulario para una solicitud específica, pero no sé cómo puedo hacerlo. Lo he intentado todo, pero mi Service Worker sigue descargando.
¿Cómo puedo mantenerlo cargado y esperando hasta que se intercepte la solicitud?
Las devoluciones de llamada de WebSocket registradas desde los registros de escucha de chrome.runtime del trabajador de servicio de mis extensiones no se invocarían, lo que parece casi el mismo problema.
Me acerqué a este problema asegurándome de que mi trabajador de servicio nunca termine, al agregarle el siguiente código:
function keepServiceRunning() { setTimeout(keepServiceRunning, 2000); } keepServiceRunning()Después de esto, mis devoluciones de llamada ahora se invocan como se esperaba.
Si entiendo correctamente, puede despertar al trabajador del servicio (background.js) mediante alertas. Mira el siguiente ejemplo:
"permissions": [ "alarms" ], chrome.alarms.create({ periodInMinutes: 4.9 }) chrome.alarms.onAlarm.addListener(() => { console.log('log for debug') });Desafortunadamente, este no es mi problema y es posible que usted también tenga un problema diferente. Cuando actualizo la extensión de desarrollo o detengo y ejecuto la extensión de producción, algún trabajador del servicio muere. Cuando cierro y abro el navegador, el trabajador no se ejecuta y los oyentes dentro del trabajador tampoco lo ejecutan. Intentó registrar al trabajador manualmente. Por ejemplo:
// override.html <!DOCTYPE html> <html lang="en"> <head>...<head> <body> ... <script defer src="override.js"></script> <body> <html> // override.js - this code is running in new tab page navigator.serviceWorker.getRegistrations().then((res) => { for (let worker of res) { console.log(worker) if (worker.active.scriptURL.includes('background.js')) { return } } navigator.serviceWorker .register(chrome.runtime.getURL('background.js')) .then((registration) => { console.log('Service worker success:', registration) }).catch((error) => { console.log('Error service:', error) }) })Esta solución me ayudó parcialmente, pero no importa porque tengo que registrar al trabajador en diferentes pestañas. Puede ser que alguien sepa la decisión. daré placer.
a diferencia de la API de chrome.webRequest, la API de chrome.webNavigation funciona perfectamente porque la API de chrome.webNavigation puede despertar al trabajador del servicio , por ahora puede intentar colocar la API de la API de chrome.webRequest dentro de chrome.webNavigation .
chrome.webNavigation.onBeforeNavigate.addListener(function(){ chrome.webRequest.onResponseStarted.addListener(function(details){ //............. //............. },{urls: ["*://domain/*"],types: ["main_frame"]}); },{ url: [{hostContains:"domain"}] });Como la respuesta de Clairzil Bawon samdi de que chrome.webNavigation podría despertar al trabajador del servicio en MV3, aquí hay una solución en mi caso:
// manifest.json ... "background": { "service_worker": "background.js" }, "host_permissions": ["https://example.com/api/*"], "permissions": ["webRequest", "webNavigation"] ...En mi caso, escucha el evento onHistoryStateUpdated para despertar al trabajador del servicio:
// background.js chrome.webNavigation.onHistoryStateUpdated.addListener((details) => { console.log('wake me up'); }); chrome.webRequest.onSendHeaders.addListener( (details) => { // code here }, { urls: ['https://example.com/api/*'], types: ['xmlhttprequest'], }, ['requestHeaders'] );Encontré una solución diferente para mantener viva la extensión. Mejora la respuesta de wOxxOm al usar una extensión secundaria para abrir el puerto de conexión a nuestra extensión principal. Luego, ambas extensiones intentan comunicarse entre sí en caso de que alguna se desconecte, por lo tanto, las mantiene vivas.
La razón por la que esto era necesario era que, según otro equipo de mi empresa, la respuesta de wOxxOm resultó ser poco fiable. Según se informa, su SW eventualmente fallaría de manera no determinista.
Por otra parte, mi solución funciona para mi empresa ya que estamos implementando software de seguridad empresarial y forzaremos la instalación de las extensiones. Hacer que el usuario instale 2 extensiones aún puede ser indeseable en otros casos de uso.