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

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

 

[Exposed=ServiceWorker]
interface FetchEvent : ExtendableEvent {
  constructor(DOMString type, FetchEventInit eventInitDict);
  [SameObject] readonly attribute Request request;
  readonly attribute Promise<any> preloadResponse;
  readonly attribute DOMString clientId;
  readonly attribute DOMString resultingClientId;
  readonly attribute DOMString replacesClientId;
  readonly attribute Promise<undefined> handled;

  undefined respondWith(Promise<Response> r);
};

 

dictionary FetchEventInit : ExtendableEventInit {
  required Request request;
  Promise<any> preloadResponse;
  DOMString clientId = "";
  DOMString resultingClientId = "";
  DOMString replacesClientId = "";
  Promise<undefined> handled;
};

 

У работников службы есть важная функциональное событие выборки — fetch. Для события выборки fetch работники службы используют интерфейс FetchEvent, который расширяет интерфейс ExtendableEvent.

Каждое событие, использующее интерфейс FetchEvent, имеет связанный потенциальный ответ (potential responseответ), изначально установленный на null, и следующие связанные флаги, которые изначально не установлены:

  • wait to respond flag (ждать флаг ответа)
  • respond-with entered flag (ответить с введённым флагом)
  • respond-with error flag (ответ с флагом ошибки)

 

4.5.1. Атрибут event.request

Атрибут запроса request должен возвращать значение, которым он был инициализирован.

 

4.5.2. Атрибут event.preloadResponse

Атрибут preloadResponse должен возвращать значение, которым он был инициализирован. Когда создается событие, атрибут должен быть инициализирован обещанием, разрешенным с помощью undefined.

 

4.5.3. Атрибут event.clientId

Атрибут clientId должен возвращать значение, которым он был инициализирован. При создании события атрибут должен быть инициализирован пустой строкой.

 

4.5.4. Атрибут event.resultingClientId

Атрибут resultClientId должен возвращать значение, которым он был инициализирован. При создании события атрибут должен быть инициализирован пустой строкой.

 

4.5.5. Атрибут event.replacesClientId

Атрибут replacesClientId должен возвращать значение, которым он был инициализирован. При создании события атрибут должен быть инициализирован пустой строкой.

 

4.5.6. Атрибут event.handled

Атрибут handled должен возвращать значение, которым он был инициализирован. Когда создается событие, атрибут должен быть инициализирован как ожидающее обещание.

 

4.5.7. Метод event.respondWith(r)

Примечание

Разработчики могут установить аргумент r либо с обещанием, которое разрешается с помощью объекта Response, либо с объектом Response (который автоматически преобразуется в обещание). В противном случае в Fetch возвращается сетевая ошибка. Проверки безопасности на стороне средства визуализации на предмет заражения для содержимого из разных источников привязаны к типам отфильтрованных ответов, определенных в Fetch.

 

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

1. Пусть событие event будет этим this.
2. Если флаг отправки события event не установлен, выбросить исключение "InvalidStateError" DOMException.
3. Если установлен флаг ответа с введённым событием event, выбросить "InvalidStateError" DOMException.
4. Добавьте к событию event пожизненное обещание r.
Примечание

event.respondWith(r) по умолчанию продлевает время жизни события, как если бы вызывается event.waitUntil(r).

5. Установите флаг остановки распространения события event и флаг остановки немедленного распространения.
6. Установить флаг для ответа на событие события event.
7. Установить флаг ожидания ответа для события event.
8. Пусть targetRealm будет релевантной Областью для события event.
9. При отклонении r:
  9.1 Установите флаг ошибки ответа на событие event.
  9.2 Флаг ожидания ответа для события event не установлен.
10. При выполнении r с ответом response:
  10.1 Если ответ response не является объектом Response, установите флаг ошибки ответа.
Примечание

Если установлен флаг ошибки ответа, сетевая ошибка возвращается в Fetch через алгоритм «Обработки Выборки» (Handle Fetch). (См. Шаг 21.1.) В противном случае response значения возвращается в алгоритм Fetch через алгоритм «Обработки Выборки«. (См. Шаг 22.1.)

10.2 Иначе:
  10.2.1 Пусть байты bytes будут пустой последовательностью байтов.
  10.2.2 Пусть конец тела end-of-body будет ложным - false.
  10.2.3 Пусть сделано done будет ложью - false.
  10.2.4 Допустим, что possibleResponse будет копией связанного с ответом response, за исключением его тела.
  10.2.5 Если тело response не равно null, выполните следующие шаги:
    10.2.5.1 Пусть reader будет результатом получения читателя из потока тела ответа response.
    10.2.5.2 Пусть pullAlgorithm будет действием, выполняющим следующие шаги:
      10.2.5.2.1 Пусть readRequest будет новым запросом на чтение со следующими элементами:

шаги фрагмента, данный кусок chunk

1. Утверждение: чанк chunk — это Uint8Array.

2. Добавляет байты, представленные куском chunk, к байтам bytes.

3. Выполнять ! DetachArrayBuffer(chunk.[[ViewedArrayBuffer]]).

 

близкие шаги

1. Установите end-of-body в значение true.

шаги ошибки

1. ошибка newStream с TypeError.

      10.2.5.2.2 Прочитать кусок от читателя reader, заданного readRequest.
    10.2.5.3 Пусть cancelAlgorithm будет действием, отменяемым reader.
    10.2.5.4 Пусть highWaterMark будет неотрицательным числом, отличным от NaN, выбранным пользовательским агентом.
    10.2.5.5 Пусть sizeAlgorithm будет алгоритмом, который принимает объект кусочка и возвращает неотрицательное, отличное от NaN, не бесконечное число, выбранное пользовательским агентом.
    10.2.5.6 Пусть newStream будет результатом создания ReadableStream с pullAlgorithm, установленным на pullAlgorithm, cancelAlgorithm, установленным на cancelAlgorithm, highWaterMark, установленным на highWaterMark, и sizeAlgorithm, установленным на sizeAlgorithm, в targetRealm.
    10.2.5.7 Установите для тела possibleResponse новое тело, поток которого является newStream.
    10.2.5.8 Выполнять эти подшаги несколько раз параллельно, пока не done является false:
      10.2.5.8.1 Если newStream ошибочен, установите для параметра done значение true.
      10.2.5.8.2 В противном случае, если байты bytes пусты и конец тела end-of-body имеет значение true, закройте newStream и установите для параметра done значение true.
      10.2.5.8.3 В противном случае, если байты bytes не пусты, выполните следующие подподшаги:
        10.2.5.8.3.1 Пусть chunk будет подпоследовательностью байтов, начинающейся с начала байтов bytes.
        10.2.5.8.3.2 Удалите кусок chunk из байтов bytes.
        10.2.5.8.3.3 Пусть буфер buffer будет объектом ArrayBuffer, созданным в targetRealm и содержащим кусок - chunk.
        10.2.5.8.3.4 Поставить в очередь объект Uint8Array, созданный в targetRealm, и обернуть буфер в newStream.
Примечание

Эти подэтапы предназначены для создания наблюдаемого эквивалента «конвейерной передачи» потока тела ответа response в possibleResponse.

Примечание

Не гарантируется, что данные, записанные работником службы частями, будут считываться идентичными фрагментами клиентом, который получает данные. То есть клиент будет читать те же данные, которые были записаны, но браузер может их разбить по-разному.

  10.2.6 Задайте потенциальный ответ события event на possibleResponse.
10.3 Флаг ожидания ответа для события event не установлен.

 

 

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

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