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

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

[SecureContext, Exposed=(Window, Worker)]
interface ServiceWorkerContainer : EventTarget {
  readonly attribute ServiceWorker? controller;
  readonly attribute Promise<ServiceWorkerRegistration> ready;

  [NewObject] Promise<ServiceWorkerRegistration> register(USVString scriptURL, optional RegistrationOptions options = {});

  [NewObject] Promise<(ServiceWorkerRegistration or undefined)> getRegistration(optional USVString clientURL = "");
  [NewObject] Promise<FrozenArray<ServiceWorkerRegistration>> getRegistrations();

  undefined startMessages();

  // события
  attribute EventHandler oncontrollerchange;
  attribute EventHandler onmessage; // event.source of message events is ServiceWorker object
  attribute EventHandler onmessageerror;
};

 

dictionary RegistrationOptions {
   USVString scope;
   WorkerType type = "classic";
   ServiceWorkerUpdateViaCache updateViaCache = "imports";
};

 

Пользовательский агент должен создать объект ServiceWorkerContainer при создании объекта Navigator или объекта WorkerNavigator и связать его с этим объектом.

ServiceWorkerContainer предоставляет возможности для регистрации, отмены регистрации и обновления регистраций работников службы, а также предоставляет доступ к состоянию регистрации работников службы и связанных с ними работников службы.

ServiceWorkerContainer имеет связанный клиент работника службы (service worker client), который является клиентом работника службы, глобальный объект которого связан с объектом Navigator или объектом WorkerNavigator, из которого извлекается ServiceWorkerContainer.

У объекта ServiceWorkerContainer есть связанное готовое обещание (ready promise — обещание или null). Изначально он равен null.

Объект ServiceWorkerContainer имеет источник задачи, называемый очередью сообщений клиента (client message queue), изначально пустой. Очередь сообщений клиента может быть включена или отключена, и изначально она отключена. Когда очередь сообщений клиента объекта ServiceWorkerContainer включена, цикл событий должен использовать её в качестве одного из своих источников задач. Когда соответствующий глобальный объект объекта ServiceWorkerContainer является объектом Window, все задачи, поставленные в очередь его клиентских сообщений, должны быть связаны с ответственным документом соответствующего объекта настроек.

 

3.4.1. Атрибут controller

Атрибут controller должен выполнить следующие шаги:

1. Пусть client будет клиентом работника службы этого this.
2. Если активный работник службы клиента client равен null, верните null.
3. Вернуть результат получения объекта работника службы, который представляет активного работника службы клиента client в соответствующем объекте настроек этого this.
Примечание

navigator.serviceWorker.controller возвращает null, если запрос является принудительным обновлением (сдвиг+обновлениеshift+refresh).

 

3.4.2. Атрибут ready

Атрибут ready должен выполнить следующие шаги:

1. Если готовое обещание этого this имеет значение null, установите для готового обещания этого this новое обещание.
2. Пусть readyPromise будет готовым обещанием этого this.
3. Если readyPromise ожидает выполнения, выполните следующие подэтапы параллельно:
   3.1  Пусть регистрация registration будет результатом запуска "Регистрация Соответствия Работника Службы" (Match Service Worker Registration) с URL-адресом создания клиента работника службы этого this.
   3.2 Если регистрация registration не равна null, а активный работник registration не равен null, поставьте задачу в очередь на ответственный цикл событий соответствующего объекта настроек readyPromise, используя источник задачи манипулирования DOM, чтобы разрешить readyPromise с результатом получения объекта регистрации работника службы, который представляет registration в соответствующий объект настроек readyPromise.
4. Вернуть readyPromise.

 

Примечание

Возвращённое готовое обещание никогда не будет отклонено. Если оно не разрешается в этом алгоритме, оно в конечном итоге разрешится, когда будет зарегистрирована соответствующая регистрация работника службы и будет установлен его активный рабочий. (См. Соответствующий шаг алгоритма активации.)

 

Примечание

Метод register(scriptURL, options) создает или обновляет регистрацию работника службы для заданного URL-адреса области видимости. В случае успеха регистрация работника службы привязывает предоставленный scriptURL к URL-адресу области видимости, который впоследствии используется для сопоставления навигации.

Шаги метода register(scriptURL, options):

1. Пусть p будет обещанием.
2. Пусть client будет клиентом работника службы этого this.
3. Пусть scriptURL будет результатом синтаксического анализа scriptURL с базовым URL-адресом API соответствующего объекта настроек этого this.
4. Пусть scopeURL будет null.
5. Если options["scope"] существует, установите для scopeURL результат синтаксического анализа options["scope"] с базовым URL-адресом API соответствующего объекта настроек этого this.
6. Вызвать Стартовую Регистрацию с помощью scopeURL, scriptURL, p, client, URL-адреса создания client, options["type"] и options["updateViaCache"].
7. Вернуть p.

 

Шаги метода getRegistration(clientURL):

1. Пусть client будет клиентом работника службы этого this.
2. Пусть clientURL будет результатом синтаксического анализа clientURL с базовым URL API соответствующего объекта настроек этого this.
3. Если clientURL не удалось, вернуть обещание, отклонённое с ошибкой TypeError.
4. Установите для фрагмента clientURL значение null.
5. Если источник clientURL не является источником client, вернуть promise, отклоненное с помощью исключения DOMException "SecurityError".
6. Пусть promise станет новым обещанием.
7. Параллельно выполните следующие подшаги:
   7.1 Пусть регистрация registration будет результатом выполнения алгоритма "Регистрация Соответствия Работника Службы" (Match Service Worker Registration) с clientURL в качестве аргумента.
   7.2 Если регистрация registration равна null, разрешите promise с помощью undefined и прервите эти шаги.
   7.3 Разрешить promise с результатом получения объекта регистрации работника службы, который представляет registration в соответствующем объекте настроек promise.
8. Вернуть promise.

 

Шаги метода getRegistrations():

1. Пусть client будет клиентом работника службы этого this.
2. Пусть promise станет новым обещанием.
3. Параллельно выполните следующие шаги:
  3.1 Пусть регистрации registrations будут новым списком.
  3.2 Для каждой области видимости scoperegistrations для области видимости на карте:
    3.2.1 Если источник результата синтаксического анализа scope совпадает с тем же источником клиента client, тогда добавьте регистрацию registration к регистрациям registrations.
  3.3 Поставьте задачу в очередь на ответственный цикл событий объекта релевантных настроек обещания promise, используя источник задачи манипулирования DOM, чтобы выполнить следующие шаги:
    3.3.1 Пусть registrationObjects будет новым списком.
    3.3.2 Для каждой регистрации registration из регистраций registrations:
      3.3.2.1 Пусть registrationObj будет результатом получения объекта регистрации работника службы, который представляет регистрацию registration в соответствующем объекте настроек обещания promise.
      3.3.2.2 Добавьте registrationObj к registrationObjects.
    3.3.3 Выполните обещание promise с новым замороженным массивом registrationObjects в соответствующей Области обещания promise.
4. Вернуть promise.

 

Шаги метода startMessages() заключаются в том, чтобы включить очередь сообщений клиента этого this, если она не включена.

 

3.4.7 Обработчики событий ServiceWorkerContainer

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

Обработчик события (event handler) Тип события обработчика события (event handler event type)
oncontrollerchange controllerchange
onmessage message
onmessageerror messageerror

При первом выполнении шагов установки onmessage включите очередь сообщений клиента этого this.

 

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

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