ServiceWorkerContainer
======================

La interfaz `ServiceWorkerContainer` de la API Service Worker proporciona un objeto que representa al *service worker* como una unidad general en el ecosistema de la red, incluidas las facilidades para registrar, cancelar y actualizar los *service worker*, y acceder al estado de los *service worker* y sus altas.

Lo que es más importante, expone el método `ServiceWorkerContainer.register()` que se usa para registrar los *service worker* y la propiedad `ServiceWorkerContainer.controller` (en-US) que se usa para determinar si la página actual se controla activamente o no.

EventTarget

ServiceWorkerContainerPropiedades de instancia
------------------------

`ServiceWorkerContainer.controller` (en-US) Read only 

Devuelve un objeto `ServiceWorker` (en-US) si su estado es `activating` o `activated` (el mismo objeto devuelto por `ServiceWorkerRegistration.active` (en-US)). Esta propiedad devuelve `null` durante una solicitud de actualización forzada (*Shift* + actualizar) o si no hay ningún *worker* activo.

`ServiceWorkerContainer.ready` (en-US) Read only 

Proporciona una forma de retrasar la ejecución del código hasta que un *service worker* esté activo. Devuelve un `Promise` que nunca se rechazará y que espera indefinidamente hasta que el `ServiceWorkerRegistration` (en-US) asociado con la página actual tenga un `ServiceWorkerRegistration.active` (en-US). Una vez que se cumple esa condición, se resuelve con `ServiceWorkerRegistration` (en-US).

Eventos
-------

`controllerchange` (en-US)

Ocurre cuando el `ServiceWorkerRegistration` (en-US) asociado del documento adquiere un nuevo `active` (en-US) *worker*.

`error` (en-US) 
Obsoleto

Non-standard

Se activa cada vez que se produce un error en los *service worker* asociados.

`message` (en-US)

Ocurre cuando el objeto `ServiceWorkerContainer` recibe los mensajes entrantes (por ejemplo, a través de una llamada `MessagePort.postMessage()` (en-US)).

Métodos de instancia
--------------------

`ServiceWorkerContainer.register()`

Crea o actualiza un `ServiceWorkerRegistration` (en-US) para el `scriptURL` dado.

`ServiceWorkerContainer.getRegistration()` (en-US)

Obtiene un objeto `ServiceWorkerRegistration` (en-US) cuyo alcance coincide con la URL del documento proporcionado. El método devuelve un `Promise` que se resuelve en `ServiceWorkerRegistration` (en-US) o `undefined`.

`ServiceWorkerContainer.getRegistrations()` (en-US)

Devuelve todos los objetos `ServiceWorkerRegistration` (en-US) asociados con un `ServiceWorkerContainer` en una matriz. El método devuelve un `Promise` que se resuelve en una matriz de `ServiceWorkerRegistration` (en-US).

`ServiceWorkerContainer.startMessages()` (en-US)

Inicia explícitamente el flujo de mensajes que se envían desde un *service worker* a las páginas bajo su control (por ejemplo, enviados a través de `Client.postMessage()` (en-US)). Esto se puede usar para reaccionar antes a los mensajes enviados, incluso antes de que el contenido de esa página haya terminado de cargarse.

Ejemplos
--------

El siguiente ejemplo primero verifica si el navegador es compatible con *service worker*. Si se admite, el código registra el *service worker* y determina si controla activamente la página. Si no es así, solicita al usuario que vuelva a cargar la página para que el *service worker* pueda tomar el control. El código también informa de cualquier error de registro.


```js
if ("serviceWorker" in navigator) {
  // Registre un service worker alojado en la raíz del
  // sitio utilizando el alcance predeterminado.
  navigator.serviceWorker
    .register("/sw.js")
    .then((registration) => {
      console.log(
        "El registro del service worker se realizó correctamente:",
        registration,
      );

      // En este punto, opcionalmente puede hacer algo
      // con el registro. Ver https://developer.mozilla.org/es/docs/Web/API/ServiceWorkerRegistration
    })
    .catch((error) => {
      console.error(`El registro del service worker falló: ${error}`);
    });

  // Independientemente del registro, también mostremos información
  // sobre si la página actual está controlada por un service worker
  // existente y cuándo cambia ese controlador.

  // Primero, haga una verificación única si actualmente
  // hay un service worker en control.
  if (navigator.serviceWorker.controller) {
    console.log(
      "Esta página está actualmente controlada por: ",
      navigator.serviceWorker.controller,
    );
  }

  // Luego, registre un controlador para detectar cuándo
  // un service worker nuevo o actualizado toma el control.
  navigator.serviceWorker.oncontrollerchange = () => {
    console.log(
      "Esta página ahora está controlada por: ",
      navigator.serviceWorker.controller,
    );
  };
} else {
  console.log("Los service workers no son compatibles.");
}
```

Especificaciones
----------------

| Specification |
| --- |
| Service Workers # serviceworkercontainer-interface |

Compatibilidad con navegadores
------------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Véase también
-------------

* Uso de *Service Workers*
* Ejemplo de código básico de *service worker*
* ¿Está listo *ServiceWorker*?
* `Promise`
* Uso de trabajadores web