Ночные Работники Службы | Интерфейс ServiceWorker

[SecureContext, Exposed=(Window,Worker)]
interface ServiceWorker : EventTarget {
   readonly attribute USVString scriptURL;
   readonly attribute ServiceWorkerState state;
   undefined postMessage(any message, sequence<object> transfer);
   undefined postMessage(any message, optional StructuredSerializeOptions options = {});

   // событие
   attribute EventHandler onstatechange;
};
ServiceWorker includes AbstractWorker;

enum ServiceWorkerState {
   "parsed",
   "installing",
   "installed",
   "activating",
   "activated",
   "redundant"
};

 

Объект ServiceWorker представляет работника службы. Каждый объект ServiceWorker связан с работником службы. Несколько отдельных объектов, реализующих интерфейс ServiceWorker для документов и рабочих, могут быть связаны с одним и тем же работником службы одновременно.

Объект ServiceWorker имеет связанный объект ServiceWorkerState, который сам связан с состоянием работника службы.

3.1.1 Получение экземпляров ServiceWorker

У объекта настроек среды есть карта объектов работника службы (service worker object map), карта, где ключиработники службы, а значения — объекты ServiceWorker.

Чтобы получить объект работника службы (get the service worker object), представляющий serviceWorker (работник службы) в среде environment (объект настроек среды), выполните следующие действия:

1. Пусть objectMap будет картой объекта работника службы среды environment.
2. Если objectMap[serviceWorker] не существует, тогда:
   2.1 Пусть serviceWorkerObj будет новым ServiceWorker в Области среды, и свяжите его с serviceWorker.
   2.2 Установите состояние state serviceWorkerObj на состояние serviceWorker.
   2.3 Установите для objectMap[serviceWorker] значение serviceWorkerObj.
3. Вернуть objectMap[serviceWorker].

 

3.1.2 Геттер scriptURL

Шаги получателя scriptURL должны вернуть сериализованный URL-адрес сценария работника службы.

Пример 2

Например, рассмотрим документ, созданный путем перехода на «https://example.com/app.html«, который соответствует следующему вызову регистрации, который был ранее выполнен:

// Сценарий на странице https://example.com/app.html
navigator.serviceWorker.register("/service_worker.js");

Значение navigator.serviceWorker.controller.scriptURL будет «https://example.com/service_worker.js«.

 

3.1.3 Атрибут state

Атрибут состояния state должен возвращать значение (в перечислении ServiceWorkerState), которое было установлено в последний раз.

 

3.1.4 Метод postMessage(message, transfer)

Шаги метода postMessage(message, transfer):

1. Пусть options будут «[ "transfer" → transfer ]».
2. Вызов postMessage(message, options) с сообщением message и параметрами options в качестве аргументов.

 

3.1.5 Метод postMessage(message, options)

Шаги метода postMessage(message, options):

1. Пусть serviceWorker будет представителем этого работника службы.
2. Пусть incumbentSettings будет существующим объектом настроек.
3. Пусть incumbentGlobal будет глобальным объектом incumbentSettings.
4. Пусть serializeWithTransferResult будет StructuredSerializeWithTransfer (message, options["transfer"]). Перебросьте все исключения.
5. Если результат выполнения алгоритма Should Skip Event (Должен Пропустить Событие) с "message" и serviceWorker является true, то вернитесь.
6. Выполните эти подэтапы параллельно:
  6.1 Если в результате выполнения алгоритма Run Service Worker (Запустить Работника Службы) с serviceWorker произошел сбой, вернитесь.
  6.2 Поставьте задачу в очередь в источнике задачи манипулирования DOM, чтобы выполнить следующие шаги:
    6.2.1 Пусть source определяется переключением типа incumbentGlobal:

ServiceWorkerGlobalScope
Результат получения объекта работника службы, который представляет работника службы incumbentGlobal в подходящем объекте настроек глобального объекта serviceWorker.

Window
новый объект WindowClient, представляющий подходящий объект настроек incumbentGlobal.

В противном случае
новый объект Client, который представляет работника, связанного с incumbentGlobal.

    6.2.2 Пусть origin будет сериализацией источника incumbentSettings.
    6.2.3 Пусть местом назначения destination будет объект ServiceWorkerGlobalScope, связанный с serviceWorker.
    6.2.4 Пусть deserializeRecord будет StructuredDeserializeWithTransfer(serializeWithTransferResult, Область destination).
        Если это вызывает исключение, пусть e будет результатом создания события с именем messageerror, используя ExtendableMessageEvent, с атрибутом origin, инициализированным как origin, и атрибутом source, инициализированным как source.
    6.2.5 Иначе
      6.2.5.1 Пусть messageClone будет deserializeRecord.[[Deserialized]].
      6.2.5.2 Пусть newPorts будет новым замороженным массивом, состоящим из всех объектов MessagePort в deserializeRecord.[[TransferredValues]], если они есть, сохраняя их относительный порядок.
      6.2.5.3 Пусть e будет результатом создания события с именем message с использованием ExtendableMessageEvent, с атрибутом origin, инициализированным значением origin, атрибутом source, инициализированным значением source, атрибутом data, инициализированным значением messageClone, и атрибутом ports, инициализированным значением newPorts.
    6.2.6 Отправить e в пункте назначения destination.
    6.2.7 Вызвать набор расширенных событий работника службы обновления (Update Service Worker Extended Events Set) с помощью serviceWorker и e.

 

3.1.6 Обработчик событий ServiceWorker

Ниже приводится обработчик событий (и соответствующий ему тип события обработчика событий), который должен поддерживаться в качестве IDL-атрибутов обработчика событий всеми объектами, реализующими интерфейс ServiceWorker:

event handler event handler event type
onstatechange statechange

 

 

Информационные ссылки

Стандарт Service Workers Nightlyhttps://w3c.github.io/ServiceWorker/#serviceworker-interface

Поделись записью