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

[SecureContext, Exposed=(Window,Worker)]
interface Cache {
  [NewObject] Promise<(Response или undefined)> match(RequestInfo request, optional CacheQueryOptions options = {});
  [NewObject] Promise<FrozenArray<Response>> matchAll(optional RequestInfo request, optional CacheQueryOptions options = {});
  [NewObject] Promise<undefined> add(RequestInfo request);
  [NewObject] Promise<undefined> addAll(sequence<RequestInfo> requests);
  [NewObject] Promise<undefined> put(RequestInfo request, Response response);
  [NewObject] Promise<boolean> delete(RequestInfo request, optional CacheQueryOptions options = {});
  [NewObject] Promise<FrozenArray<Request>> keys(optional RequestInfo request, optional CacheQueryOptions options = {});
};

 

dictionary CacheQueryOptions {
  boolean ignoreSearch = false;
  boolean ignoreMethod = false;
  boolean ignoreVary = false;
};

 

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

Пакетная операция кеширования (cache batch operation) — это структура, состоящая из:

  • Тип (type — «delete» or «put» («удалить» или «положить»)).
  • Запрос (requestзапрос).
  • Ответ (responseответ).
  • Параметры (optionsCacheQueryOptions).

5.4.1. Метод match(request, options)

Шаги метода сопоставления match(request, options):

1. Пусть обещание promise станет новым обещанием.
2. Выполните эти подэтапы параллельно:
  2.1 Пусть p будет результатом выполнения алгоритма, указанного в методе matchAll(request, options), с запросом request и параметрами options.
  2.2 Подождите, пока p не осядет.
  2.3 Если p отклоняет с исключением, то:
    2.3.1 Отклонить обещание promise с этим исключением.
  2.4 Иначе, если p разрешается с массивом, ответы responses, то:
    2.4.1 Если ответы responses - пустой массив, то:
      2.4.1.1 Разрешить обещание promise с undefined.
    2.4.2 Иначе:
      2.4.2.1 Разрешите обещание promise с помощью первого элемента ответов responses.
3. Вернуть обещание promise.

 

5.4.2. Метод matchAll(request, options)

Шаги метода сопоставления всех matchAll(request, options):

1. Пусть r равно null.
2. Если необязательный аргумент запроса request не пропущен, то:
  2.1 Если запрос request является объектом Request, то:
    2.1.1 Установите r на запрос request.
    2.1.2 Если метод r не является `GET` и options.ignoreMethod имеет значение false, вернуть обещание, разрешенное с пустым массивом.
  2.2 Иначе, если запрос request является строкой, то:
    2.2.1 Установите r на связанный запрос результата вызова начального значения Request в качестве конструктора с запросом request в качестве аргумента. Если это выбрасывает исключение, верните обещание, отклоненное с этим исключением.
3. Пусть область realm будет соответствующей областью этого this.
4. Пусть обещание promise станет новым обещанием.
5. Выполните эти подэтапы параллельно:
  5.1 Пусть ответы responses будут пустым списком.
  5.2 Если необязательный аргумент запроса request опущен, то:
    5.2.1 Для каждого requestResponse соответствующего списка ответов на запрос:
      5.2.1.1 Добавьте копию ответа requestResponse к ответам responses.
  5.3 Иначе:
    5.3.1 Пусть requestResponses будет результатом выполнения (Query Cache) с r и options.
    5.3.2 Для каждого requestResponse из requestResponses:
      5.3.2.1 Добавьте копию ответа requestResponse к ответам responses.
  5.4 Для каждого ответа response из ответов responses:
    5.4.1 Если тип ответа response является "opaque" («непрозрачный») и проверка политики ресурсов с разными источниками с использованием источника соответствующего объекта настроек обещания promise, соответствующего объекта настроек обещания promise, "" и внутренний ответ response возвращается заблокированным (blocked), то отклоните обещание promise с помощью TypeError и прервите эти шаги.
  5.5 Поставьте задачу в очередь в соответствующем цикле событий соответствующего объекта настроек обещания promise, используя источник задачи манипулирования DOM, чтобы выполнить следующие шаги:
    5.5.1 Пусть responseList будет списком.
    5.5.2 Для каждого ответа response из ответов responses:
      5.5.2.1 Добавьте новый объект Response, связанный с response, и новый объект Headers, защита которого "immutable" ("неизменна"), в responseList.
    5.5.3 Разрешить обещание promise с замороженным массивом, созданным из responseList, в realm.
6. Вернуть обещание promise.

 

5.4.3. Метод add(request)

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

1. Пусть запросы requests будут массивом, содержащим только запрос request.
2. Пусть responseArrayPromise будет результатом выполнения алгоритма, указанного в addAll(requests), передавая запросы requests в качестве аргумента.
3. Верните результат реакции на responseArrayPromise с помощью обработчика выполнения, который возвращает undefined.

 

5.4.4. Метод addAll(requests)

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

1. Пусть responsePromises будет пустым списком.
2. Пусть requestList будет пустым списком.
3. Для каждого запроса request чей тип является Request в requests:
  3.1 Пусть r будет запросом request.
  3.2 Если схема URL-адреса r не является одной из "http" и "https" или метод r не является GET, вернуть обещание, отклоненное с ошибкой TypeError.
4. Для каждого запроса request в запросах requests:
  4.1 Пусть r будет связанным запросом результата вызова начального значения Request в качестве конструктора с request в качестве аргумента. Если это вызывает исключение, верните обещание, отклоненное с этим исключением.
  4.2 Если схема URL-адреса r не является одной из "http" и "https":
    4.2.1 Завершить все текущие выборки, инициированные запросами requests с установленным флагом прерывания.
    4.2.2 Вернуть обещание, отклоненное с помощью TypeError.
  4.3 Если глобальный объект клиента r является объектом ServiceWorkerGlobalScope, установите для режима работника службы запроса request значение "none".
  4.4 Установите для инициатора r значение "fetch", а для пункта назначения - "subresource".
  4.5 Добавьте r в requestList.
  4.6 Пусть responsePromise будет новым обещанием.
  4.7 Параллельно выполните следующие подшаги:

  + Принесите (Выгребите) Fetch r.

  + Чтобы обработать ответ для response, выполните следующие подэтапы:

    4.7.1. Если тип response является "error", или статус response не является нормальным или равен 206, отклоните responsePromise с ошибкой TypeError.
    4.7.2. Иначе, если список заголовков ответа response содержит заголовок с именем `Vary`, тогда:
      4.7.2.1. Пусть fieldValues ​​будет списком, содержащим элементы, соответствующие значениям полей заголовка Vary.
      4.7.2.2. Для каждого fieldValue из fieldValues:
        4.7.2.2.1. Если fieldValue соответствует "*", то:
          4.7.2.2.1.1. Отклонить responsePromise с ошибкой TypeError.
          4.7.2.2.1.2. Завершить все текущие выборки, инициированные запросами requests с установленным флагом прерывания.
          4.7.2.2.1.3. Прервите эти шаги.

  + Чтобы обработать конец тела ответа для ответа response, выполните следующие подэтапы:

    1. Если установлен флаг прерывания ответа response, отклоните responsePromise с "AbortError" DOMException и прервите эти шаги.
    2. Разрешить responsePromise с ответом response.

    Примечание. Фиксация кеша разрешена, когда тело ответа получено полностью.

4.8 Добавьте responsePromise в responsePromises.

5. Пусть p будет результатом получения обещания ждать всех responsePromises.
6. Вернуть результат реакции на p с помощью обработчика выполнения, который при вызове с аргументами responses выполняет следующие подшаги:
  6.1 Пусть операции operations будет пустым списком.
  6.2 Пусть индекс index равен нулю (zero).
  6.3 Для каждого ответа response в ответах responses:
    6.3.1 Пусть операция operation будет пакетной операцией кеширования.
    6.3.2 Установите тип операции operation на "put" ("положить").
    6.3.3 Установите запрос операции operation значение requestList[index].
    6.3.4 Установите ответ операции operation на ответ response.
    6.3.5 Добавить операцию operation к операциям operations.
    6.3.6 Увеличить индекс index на единицу.
  6.4 Пусть realm будет соответствующим пространством этого this.
  6.5 Пусть cacheJobPromise будет новым обещанием.
  6.6 Параллельно выполните следующие подшаги:
    6.6.1 Пусть errorData будет null.
    6.6.2 Вызов "Операций Пакетного Кеширования" (Batch Cache Operations) с помощью операций operations. Если это вызывает исключение, установите для исключения errorData.
    6.6.3 Поставьте задачу в очередь в ответственном цикле событий соответствующего объекта настроек cacheJobPromise, используя источник задачи манипулирования DOM, для выполнения следующих подшагов:
      6.6.3.1 Если errorData имеет значение null, разрешите cacheJobPromise с undefined.
      6.6.3.2 В противном случае отклоните cacheJobPromise с новым исключением с errorData и сообщением, определяемым пользовательским агентом, в области realm.
  6.7 Вернуть cacheJobPromise.

 

5.4.5. Метод put(request, response)

Шаги метода put(request, response):

1. Пусть innerRequest будет null.
2. Если запрос request является объектом Request, тогда установите innerRequest на запрос request .
3. Иначе:
  3.1 Пусть requestObj будет результатом вызова конструктора Request с запросом request в качестве аргумента. Если это вызывает исключение exception, вернуть обещание, отклоненное с исключением exception.
  3.2 Установите для innerRequest значение запроса requestObj.
4. Если схема url-адреса innerRequest не совпадает с "http" и "https" или метод innerRequest не является `GET`, вернуть обещание, отклонённое с помощью TypeError.
5. Пусть innerResponse будет ответом response.
6. Если статус innerResponse равен 206, вернуть обещание, отклоненное с помощью TypeError.
7. Если список заголовков innerResponse содержит заголовок с именем `Vary`, тогда:
  7.1 Пусть fieldValues ​​будет списком, содержащим элементы, соответствующие значениям полей заголовка Vary.
  7.2 Для каждого fieldValue в fieldValues:
    7.2.1 Если fieldValue соответствует «*», вернуть обещание, отклоненное с помощью TypeError.
8. Если тело innerResponse нарушено или заблокировано, вернуть обещание, отклоненное с помощью TypeError.
9. Пусть clonedResponse будет клоном innerResponse.
10. Пусть bodyReadPromise будет обещанием, разрешенным с помощью undefined.
11. Если тело innerResponse не равно null, выполните следующие подшаги:
  11.1 Пусть stream будет потоком тела innerResponse.
  11.2 Пусть reader будет результатом получения читателя для потока stream.
  11.3 Установите bodyReadPromise равным результату чтения всех байтов из читателя reader.

Примечание. Это гарантирует, что тело innerResponse заблокировано, и у нас будет полная буферизованная копия тела в clonedResponse. Реализация может быть оптимизирована путем потоковой передачи непосредственно на диск, а не в память.

12. Пусть операции operations будут пустым списком.
13. Пусть операция operation будет пакетной операцией кеширования.
14. Установите тип операции operation на "put".
15. Установите запрос операции operation на innerRequest.
16. Установите ответ операции operation на clonedResponse.
17. Добавить операцию operation к операциям operations.
18. Пусть realm будет соответствующим пространством этого this.
19. Вернуть результат выполнения bodyReadPromise:
  19.1 Пусть cacheJobPromise будет новым обещанием.
  19.2 Верните cacheJobPromise и выполните эти шаги параллельно:
    19.2.1 Пусть errorData будет null.
    19.2.2 Вызов "Операций Пакетного Кеширования" (Batch Cache Operations) с помощью операций operations. Если это вызывает исключение, установите для исключения errorData.
    19.2.3 Поставьте задачу в очередь в ответственном цикле событий соответствующего объекта настроек cacheJobPromise, используя источник задачи манипулирования DOM, для выполнения следующих подшагов:
      19.2.3.1 Если errorData имеет значение null, разрешите cacheJobPromise с undefined.
      19.2.3.2 В противном случае отклоните cacheJobPromise с новым исключением с errorData и сообщением, определяемым пользовательским агентом, в области realm.

 

5.4.6. Метод delete(request, options)

Шаги метода delete(request, options):

1. Пусть r равно null.
2. Если запрос request является объектом Request, то:
  2.1 Установите r на запрос request.
  2.2 Если метод r не является `GET` и options.ignoreMethod имеет значение false, вернуть обещание, разрешенное с помощью false.
3. Иначе, если запрос request является строкой, то:
  3.1 Установите r на связанный запрос результата вызова начального значения Request в качестве конструктора с request в качестве аргумента. Если это вызывает исключение, верните обещание, отклоненное с этим исключением.
4. Пусть операции operations будут пустым списком.
5. Пусть операция operation будет пакетной операцией кеширования.
6. Установите тип операции operation на "delete".
7. Установите запрос операции operation на r.
8. Установите для параметров операции operation значение options.
9. Добавить операцию operation к операциям operations.
10. Пусть realm будет соответствующим пространством этого this.
11. Пусть cacheJobPromise будет новым обещанием.
12. Параллельно выполните следующие подшаги:
  12.1 Пусть errorData будет null.
  12.2 Пусть requestResponses будет результатом выполнения "Операций Пакетного Кеширования" (Batch Cache Operations) с операциями operations. Если это вызывает исключение, установите для исключения errorData.
  12.3 Поставьте задачу в очередь в ответственном цикле событий соответствующего объекта настроек cacheJobPromise, используя источник задачи манипулирования DOM, для выполнения следующих подшагов:
    12.3.1 Если errorData имеет значение null, то:
      12.3.1.1 Если requestResponses не пуст, разрешите cacheJobPromise с true.
      12.3.1.2 В противном случае разрешите cacheJobPromise с false.
  12.3.2 В противном случае отклоните cacheJobPromise с новым исключением с errorData и сообщением, определяемым пользовательским агентом, в области realm.
13. Вернуть cacheJobPromise.

 

5.4.7. Метод keys(request, options)

Шаги метода keys(request, options):

1. Пусть r равно null.
2. Если необязательный аргумент запроса request не пропущен, то:
  2.1 Если запрос request является объектом Request, то:
    2.1.1 Установите r на запрос request.
    2.1.2 Если метод r не является `GET` и options.ignoreMethod имеет значение false, вернуть обещание, разрешенное с пустым массивом.
  2.2 Иначе, если запрос request является строкой, то:
    2.2.1 Установите r на связанный запрос результата вызова начального значения Request в качестве конструктора с запросом request в качестве аргумента. Если это вызывает исключение, верните обещание, отклоненное с этим исключением.
3. Пусть realm будет соответствующим пространством этого this.
4. Пусть обещание promise станет новым обещанием.
5. Выполните эти подэтапы параллельно:
  5.1 Пусть запросы requests будут пустым списком.
  5.2 Если необязательный аргумент запроса request опущен, то:
    5.2.1 Для каждого requestResponse соответствующего списка ответов на запрос:
      5.2.1.1 Добавить запрос requestResponse в запросы requests.
  5.3 Иначе:
    5.3.1 Пусть requestResponses будет результатом выполнения (Query Cache) с r и параметрами options.
    5.3.2 Для каждого requestResponse из requestResponses:
      5.3.2.1 Добавить запрос requestResponse в запросы requests.
  5.4 Поставьте задачу в очередь в ответственном цикле событий соответствующего объекта настроек обещания promise, используя источник задачи манипулирования DOM, чтобы выполнить следующие шаги:
    5.4.1 Пусть requestList будет списком.
    5.4.2 Для каждого запроса request из запросов requests:
      5.4.2.1 Добавьте новый объект Request, связанный с запросом request, и новый связанный объект Headers, защита которого является "immutable" («неизменной»), в requestList.
    5.4.3 Разрешить обещание promise с замороженным массивом, созданным из requestList, в области realm.
6. Вернуть обещание promise.

 

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

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

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