Service Worker API
==================

Service worker фактически выполняет роль прокси-сервера, находящегося между веб-приложением и браузером, а также сетью (если доступна). Он позволяет (кроме прочего) описывать корректное поведение веб-приложения в режиме офлайн, перехватывать запросы сети и принимать соответствующие меры, основываясь на доступности сети, и обновлять данные, находящиеся на сервере при доступе к нему. Также они имеют доступ к push-уведомлениям и API для фоновой синхронизации.

Концепция и использование Service Worker
----------------------------------------

Service worker — это событийно-управляемый worker, регистрируемый на уровне источника и пути. Он представляет собой JavaScript-файл, который может контролировать веб-страницу/сайт, с которым он ассоциируется, перехватывать и модифицировать запросы навигации и ресурсов, очень гибко кешировать ресурсы, для того чтобы предоставить вам полный контроль над тем, как приложение ведёт себя в определённых ситуациях (например, когда сеть не доступна).

Service worker запускается в контексте воркеров, поэтому он не имеет доступа к DOM и работает в потоке отдельном от основного потока JavaScript, управляющего вашим приложением, а следовательно — не блокирует его. Он призван быть полностью асинхронным; как следствие, синхронные API, такие как XHR и localStorage (en-US), в Service Worker'е использовать нельзя.

Из соображений безопасности service worker'ы работают только по HTTPS (либо, в целях разработки, на `localhost`). Давать сторонним людям возможность изменять сетевые запросы крайне опасно. Кроме того, Service Worker API недоступен в режиме приватного просмотра браузера Firefox.

**Примечание:** Service Worker'ы выигрывают у предыдущих решений, таких как AppCache, потому что не делают предположений о том, что вы пытаетесь сделать, и не ломаются, в случаях если их предположения не оказываются верными; вы имеете полный контроль над всем.

**Примечание:** Service worker'ы широко используют промисы (Promises). В общем случае они будут ждать ответа, после которого вернутся с успешным или неудачным завершением. Архитектура на промисах для этого подходит идеально.

### Регистрация

Service worker сначала регистрируется с помощью метода `ServiceWorkerContainer.register()`. В случае успешной регистрации, service worker будет загружен клиентом и попытается установиться/активироваться (см. ниже) для всех URL, доступных пользователю, или только для указанного вами подмножества.

### Загрузка, установка и активация

Service Worker будет следовать следующему жизненному циклу:

1. Загрузка
2. Установка
3. Активация

Когда пользователь впервые запросит доступ к сайту/странице, контролируемой Service Worker'ом, тот моментально будет загружен .

После этого он будет загружаться каждые 24 часа или около того. Он *может* загружаться и чаще, но он **должен** загружаться как минимум каждые 24 часа, чтобы предотвратить использование старой версии кода клиентом.

Установка производится в случае если загружаемый файл признается новым — либо отличным от уже установленного service worker (определяется через побайтовое сравнение), либо первым устанавливаемым service воркером для этой страницы/сайта.

Если это первый раз, когда service worker оказался доступен, будет проведена установка, а после успешного её завершения — активация.

Если service worker уже существует, новая версия устанавливается в фоновом режиме, но не активируется — worker переходит в состояние *в ожидании*. Новая версия активируется только тогда, когда больше не останется загруженных страниц, использующих старый service worker. Как только это случится, новый service worker активируется (станет *активным воркером*). Активация может произойти раньше при использовании `ServiceWorkerGlobalScope.skipWaiting()` (en-US), а существующие страницы могут быть переведены под контроль активного воркера с помощью `Clients.claim()`.

Вы можете подписаться на `InstallEvent` (en-US); для того чтобы подготовить ваш service worker к использованию, к примеру, чтобы создать кеш при помощи встроенного API хранилища и разместить внутри него данные, которые вам необходимы в вашем приложении для работы офлайн.

Есть также событие `activate`. Момент, когда это событие наступает, является удачным для очистки старого кеша и всего, что ассоциировалось с предыдущей версией вашего service worker'а.

Service worker может отвечать на запросы, используя событие `FetchEvent`. Вы можете изменять ответ на эти запросы на своё усмотрение используя метод `FetchEvent.respondWith` (en-US).

**Примечание:** Так как выполнение `oninstall`/`onactivate` может занять время, спецификация service worker предоставляет метод `waitUntil`, который возвращает промис, когда вызывается `oninstall` или `onactivate`. Функциональные события не отправляются service worker, пока промис не завершится успешно.

Для полного руководства по созданию рабочего примера читайте Использование Service Worker (en-US).

Другие варианты использования
-----------------------------

Service worker'ы также предназначены для таких вещей, как:

* Фоновая синхронизация данных
* Ответ на запросы от других источников
* Получение централизованного обновления для данных использующих тяжёлые вычисления, таких как геолокация или гироскоп, для того чтобы несколько страниц могли использовать одни и те же данные
* Компиляция и управление зависимостями на клиентской стороне для CoffeeScript, less, CJS/AMD модулей и т.д. для целей разработки
* Подписка на фоновые сервисы
* Кастомная шаблонизация, основанная на определённых паттернах URL
* Улучшение производительности, с помощью предварительной загрузки ресурсов, которые понадобятся пользователю в ближайшем будущем, например несколько последующих картинок в фотоальбоме.

В будущем service worker'ы будут способны на многие другие полезные вещи для веб-платформ, приближая их к нативным приложениям. Примечательно, что другие спецификации могут и будут использовать контекст service worker, к примеру для:

* Фоновой синхронизации: запускать service worker даже когда ни одного пользователя нет на сайте, чтобы обновить кеш.
* Реакции на пуш-сообщения: запускать service worker для отправки сообщений пользователям, чтобы оповестить их о новом доступном контенте.
* Реакции на определённое время и дату
* Введение гео-ограничений
Интерфейс
---------

`Cache`

Представляет хранилище для объектов `Request` / `Response`, которые кешируются, как часть жизненного цикла `ServiceWorker`.

`CacheStorage`

Представляет хранилище для объектов `Cache`. Он создаёт главную директорию для всех именованных кешей, к которым `ServiceWorker` имеет доступ, и поддерживает отображение строковых имён соответствующего объекта `Cache`.

`Client` (en-US)

Представляет область видимости клиента service worker. Это либо документ в контексте браузера, либо `SharedWorker`, который контролируется активным воркером.

`Clients`

Представляет контейнер для списка объектов `Client` (en-US); основной способ получить доступ к клиентам активного service worker'а текущего источника.

`ExtendableEvent` (en-US)

Расширяет жизненный цикл событий `install` и `activate`, отправляемых `ServiceWorkerGlobalScope` (en-US) как часть жизненного цикла service worker'а. Это гарантирует, что любое функциональное событие (как `FetchEvent`) не отправится в `ServiceWorker`, пока он не обновит шаблон данных, удалив устаревшие данные кеша.

`ExtendableMessageEvent` (en-US)

Объект событий `message` запускается в service worker (когда канал сообщений в `ServiceWorkerGlobalScope` (en-US) получил новое сообщение из другого контекста) — расширяет жизненный цикл таких событий.

`FetchEvent`

Параметр, передающийся в обработчик `ServiceWorkerGlobalScope.onfetch`, `FetchEvent` представляет собой событие получения, которое отправляется в `ServiceWorkerGlobalScope` (en-US) `ServiceWorker`. Он содержит информацию о запросе и результирующем ответе и обеспечивает `FetchEvent.respondWith()` (en-US) метод, который позволяет отправить произвольный ответ обратно контролируемой странице.

`InstallEvent` (en-US)

Параметр, передающийся в `oninstall` обработчик, `InstallEvent` представляет собой событие установки, которое отправляется `ServiceWorkerGlobalScope` (en-US) `ServiceWorker`. Как наследник `ExtendableEvent` (en-US), он гарантирует, что функциональные события, такие как `FetchEvent`, не будут отправлены во время установки.

`Navigator.serviceWorker`

Возвращает объект `ServiceWorkerContainer`, который обеспечивает доступ к регистрации, удалению, обновлению и коммуникации с объектами `ServiceWorker`ассоциируемого документа.

`NotificationEvent` (en-US)

Параметр, передаваемый в обработчик `onnotificationclick`, интерфейс `NotificationEvent` представляет событие уведомления на клик, которое отправляется в `ServiceWorkerGlobalScope` (en-US) service worker'а.

`ServiceWorker`

Представляет service worker. Несколько контекстов браузера (страницы, worker'ы, и т.д.) могут быть ассоциированы с одним объектом `ServiceWorker`.

`ServiceWorkerContainer`

Предоставляет объект, описывающий service worker как общий блок в экосистеме сети, включая возможность регистрировать, отключать и обновлять service worker'ы, и предоставляет доступ к состоянию текущего и других зарегистрированных service воркеров.

`ServiceWorkerGlobalScope` (en-US)

Представляет глобальный контекст исполнения service worker'а.

`ServiceWorkerMessageEvent` (en-US)

Содержит информацию о событии, отправленном целевому `ServiceWorkerContainer`.

`ServiceWorkerRegistration`

Представляет регистрацию service worker'а.

`SyncEvent` (en-US) 
Non-standard

SyncEvent представляет синхронное действие, которое отправляется `ServiceWorkerGlobalScope` (en-US) ServiceWorker.

`SyncManager` (en-US) 
Non-standard

Обеспечивает интерфейс регистрации и перечисления синхронных регистрации.

`WindowClient`

Представляет область видимости клиентского service worker'а, представленного в виде документа в контакте браузера, контролируемого активным воркером. Это особый тип объекта `Client` (en-US) с некоторыми дополнительными методами и свойствами.

Спецификации
------------

| Specification |
| --- |
| Service Workers  |

Совместимость с браузерами
--------------------------

{{Compat}}Смотрите также
--------------

* Кулинарная книга ServiceWorker
* ИспользованиеService Workers (en-US)
* Основные примеры кода Service workers
* Готов ли ServiceWorker?
* Перспектива
* Using web workers (en-US)