@budarin/pluggable-serviceworker 1.0.32 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Вадим Бударин
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Вадим Бударин
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,398 +1,420 @@
1
- # @budarin/pluggable-serviceworker
2
-
3
- 🔌 Расширяемый через плагины Service Worker
4
-
5
- Библиотека для создания модульных и расширяемых Service Worker'ов с помощью системы плагинов.
6
-
7
- ## 🚀 Почему этот пакет облегчает разработку?
8
-
9
- Разработка Service Worker'ов традиционно сложна из-за необходимости вручную управлять множественными обработчиками событий, обработкой ошибок и порядком выполнения. Этот пакет решает эти проблемы:
10
-
11
- ### 🔌 **Модульная архитектура**
12
-
13
- - **Плагинная система** позволяет разбивать функциональность на независимые модули
14
- - Каждый плагин отвечает за свою задачу (кеширование, аутентификация, уведомления)
15
- - Легко добавлять/удалять функциональность без изменения основного кода
16
- - Не нужно думать об инфраструктурном коде в обработчиках событий - пишите простой код не думая о сложностях кода самого сервисворкера
17
-
18
- ### 🎯 **Управление порядком выполнения**
19
-
20
- - **Предсказуемый порядок** - плагины без `order` выполняются первыми, затем по возрастанию `order`
21
- - **Гибкость** - можно контролировать последовательность инициализации
22
- - **Масштабируемость** - легко добавлять новые плагины в нужном месте
23
-
24
- ### ⚡ **Оптимизированная логика выполнения**
25
-
26
- - **Параллельно** для `install`, `activate`, `message`, `sync` - независимые задачи выполняются одновременно
27
- - **Последовательно** для `fetch`, `push` - первый успешный результат прерывает цепочку
28
- - **Производительность** - правильный выбор стратегии для каждого типа события
29
-
30
- ### 🛡️ **Централизованная обработка ошибок**
31
-
32
- - **Единый обработчик** для всех типов ошибок
33
- - **Типизированные ошибки** - знаешь, что именно сломалось
34
- - **Изоляция** - ошибка в одном плагине не ломает остальные
35
- - **Автоматическая обработка** глобальных событий ошибок
36
-
37
- ### 📝 **Удобное логирование**
38
-
39
- - **Настраиваемый логгер** с разными уровнями
40
- - **Контекстная информация** в логах
41
- - **Отладка** становится намного проще
42
-
43
- ## 📦 Установка
44
-
45
- ```bash
46
- npm install @budarin/pluggable-serviceworker
47
- ```
48
-
49
- или
50
-
51
- ```bash
52
- pnpm add @budarin/pluggable-serviceworker
53
- ```
54
-
55
- ## 🚀 Быстрый старт
56
-
57
- ### Базовое использование
58
-
59
- ```typescript
60
- // sw.js
61
- import { initServiceWorker } from '@budarin/pluggable-serviceworker';
62
-
63
- // Простой плагин для кеширования
64
- const cachePlugin = {
65
- name: 'cache-plugin',
66
-
67
- install: async (event) => {
68
- const cache = await caches.open('my-cache-v1');
69
- await cache.addAll(['/', '/styles.css', '/script.js']);
70
- },
71
-
72
- fetch: async (event) => {
73
- const cachedResponse = await caches.match(event.request);
74
- return cachedResponse || fetch(event.request);
75
- },
76
- };
77
-
78
- // Инициализация Service Worker с плагинами
79
- initServiceWorker([cachePlugin], { logger: console });
80
- ```
81
-
82
- ## ⚙️ Конфигурация
83
-
84
- Функция `initializeServiceWorker` принимает второй параметр `config` типа `ServiceWorkerConfig`:
85
-
86
- ```typescript
87
- interface ServiceWorkerConfig {
88
- logger: Logger; // Обязательное поле
89
- // Опциональное поле
90
- onError?: (
91
- error: Error | any,
92
- event: Event,
93
- errorType?: ServiceWorkerErrorType
94
- ) => void;
95
- }
96
- ```
97
-
98
- ### Поля конфигурации
99
-
100
- #### `logger: Logger` (обязательное)
101
-
102
- Объект для логирования с методами `info`, `warn`, `error`, `debug`. Может быть передан `console` или любой другой объект, реализующий интерфейс `Logger`.
103
-
104
- ```typescript
105
- interface Logger {
106
- info: (...data: unknown[]) => void;
107
- warn: (...data: unknown[]) => void;
108
- error: (...data: unknown[]) => void;
109
- debug: (...data: unknown[]) => void;
110
- }
111
- ```
112
-
113
- **Пример:**
114
-
115
- ```typescript
116
- const config = {
117
- logger: console, // Использование стандартного console
118
- // или
119
- logger: {
120
- info: (...data) => customLog('INFO', ...data),
121
- warn: (...data) => customLog('WARN', ...data),
122
- error: (...data) => customLog('ERROR', ...data),
123
- debug: (...data) => customLog('DEBUG', ...data),
124
- },
125
- };
126
- ```
127
-
128
- #### `onError?: (error, event, errorType) => void` (опциональное)
129
-
130
- Единый обработчик для всех типов ошибок в Service Worker. **Дефолтного обработчика ошибок нет** - если `onError` не передан, ошибки будут проигнорированы (не обработаны).
131
-
132
- **Параметры:**
133
-
134
- - `error: Error | any` - объект ошибки
135
- - `event: Event` - событие, в контексте которого произошла ошибка
136
- - `errorType?: ServiceWorkerErrorType` - тип ошибки (см. раздел "Обработка ошибок")
137
-
138
- **Важно:** Если `onError` не указан, ошибки в плагинах и глобальные ошибки будут проигнорированы. Для production-окружения рекомендуется всегда указывать `onError` для логирования и мониторинга ошибок.
139
-
140
- **Пример минимальной конфигурации:**
141
-
142
- ```typescript
143
- // Без onError - ошибки будут проигнорированы
144
- initializeServiceWorker([cachePlugin], { logger: console });
145
-
146
- // С onError - ошибки будут обработаны
147
- initializeServiceWorker([cachePlugin], {
148
- logger: console,
149
- onError: (error, event, errorType) => {
150
- console.error('Service Worker error:', error, errorType);
151
- },
152
- });
153
- ```
154
-
155
- ### Обработка ошибок
156
-
157
- Библиотека предоставляет единый обработчик для всех типов ошибок в Service Worker:
158
-
159
- ```typescript
160
- import {
161
- initServiceWorker,
162
- ServiceWorkerErrorType,
163
- } from '@budarin/pluggable-serviceworker';
164
-
165
- const config = {
166
- onError: (error, event, errorType) => {
167
- console.log(`Ошибка типа "${errorType}":`, error);
168
-
169
- switch (errorType) {
170
- case ServiceWorkerErrorType.ERROR:
171
- // JavaScript ошибки
172
- console.error('JavaScript error:', error);
173
- break;
174
-
175
- case ServiceWorkerErrorType.MESSAGE_ERROR:
176
- // Ошибки сообщений
177
- console.error('Message error:', error);
178
- break;
179
-
180
- case ServiceWorkerErrorType.UNHANDLED_REJECTION:
181
- // Необработанные Promise rejection
182
- console.error('Unhandled promise rejection:', error);
183
- break;
184
-
185
- case ServiceWorkerErrorType.REJECTION_HANDLED:
186
- // Обработанные Promise rejection
187
- console.log('Promise rejection handled:', error);
188
- break;
189
-
190
- case ServiceWorkerErrorType.PLUGIN_ERROR:
191
- // Ошибки в плагинах
192
- console.error('Plugin error:', error);
193
- break;
194
-
195
- default:
196
- // Неизвестные типы ошибок
197
- console.error('Unknown error type:', error);
198
-
199
- // Отправка ошибки в аналитику
200
- fetch('/api/errors', {
201
- method: 'POST',
202
- body: JSON.stringify({
203
- error: error.message,
204
- eventType: event.type,
205
- url: event.request?.url,
206
- timestamp: Date.now(),
207
- }),
208
- }).catch(() => {
209
- // Игнорируем ошибки отправки логов
210
- });
211
- }
212
- },
213
- };
214
-
215
- initServiceWorker(
216
- [
217
- /* ваши плагины */
218
- ],
219
- config
220
- );
221
- ```
222
-
223
- ## 🔌 Интерфейс плагина
224
-
225
- Каждый плагин должен реализовывать интерфейс `ServiceWorkerPlugin`:
226
-
227
- ```typescript
228
- interface ServiceWorkerPlugin {
229
- /** Уникальное имя плагина */
230
- name: string;
231
-
232
- /** Порядок выполнения (опционально) */
233
- order?: number;
234
-
235
- /** Обработчик события install */
236
- install?: (event: ExtendableEvent) => Promise<void> | void;
237
-
238
- /** Обработчик события activate */
239
- activate?: (event: ExtendableEvent) => Promise<void> | void;
240
-
241
- /** Обработчик события fetch */
242
- fetch?: (
243
- event: FetchEvent
244
- ) => Promise<Response | undefined> | Response | undefined;
245
-
246
- /** Обработчик события message */
247
- message?: (event: ExtendableMessageEvent) => Promise<void> | void;
248
-
249
- /** Обработчик события sync */
250
- sync?: (event: SyncEvent) => Promise<void> | void;
251
-
252
- /** Обработчик события push */
253
- push?: (event: PushEvent) => Promise<void> | void;
254
-
255
- /** Обработчик события periodicsync */
256
- periodicsync?: (event: PeriodicSyncEvent) => Promise<void> | void;
257
- }
258
- ```
259
-
260
- ### 📝 Описание методов
261
-
262
- | Метод | Событие | Возвращает | Описание |
263
- | -------------- | -------------- | ----------------------- | --------------------------------------- |
264
- | `install` | `install` | `void` | Инициализация плагина при установке SW |
265
- | `activate` | `activate` | `void` | Активация плагина при обновлении SW |
266
- | `fetch` | `fetch` | `Response \| undefined` | Обработка сетевых запросов |
267
- | `message` | `message` | `void` | Обработка сообщений от основного потока |
268
- | `sync` | `sync` | `void` | Синхронизация данных в фоне |
269
- | `push` | `push` | `void` | Обработка push-уведомлений |
270
- | `periodicsync` | `periodicsync` | `void` | Периодические фоновые задачи |
271
-
272
- ### 🎯 Особенности обработчиков
273
-
274
- - **`fetch`**: Возвращает `Response` для завершения цепочки или `undefined` для передачи следующему плагину
275
- - **Остальные**: Не возвращают значения, выполняются для всех плагинов
276
- - **Все методы опциональны** - реализуйте только нужные события
277
-
278
- ## 🎯 Порядок выполнения
279
-
280
- Плагины выполняются в следующем порядке:
281
-
282
- 1. **Сначала ВСЕ плагины без `order`** - в том порядке, в котором они были добавлены
283
- 2. **Затем плагины с `order`** - в порядке возрастания значений `order`
284
-
285
- ### Пример:
286
-
287
- ```typescript
288
- const plugins = [
289
- { name: 'first' }, // без order - выполняется первым
290
- { name: 'fourth', order: 2 },
291
- { name: 'second' }, // без order - выполняется вторым
292
- { name: 'third', order: 1 },
293
- { name: 'fifth' }, // без order - выполняется третьим
294
- ];
295
-
296
- // Порядок выполнения: first → second → fifth → third → fourth
297
- ```
298
-
299
- **Преимущества новой системы:**
300
-
301
- - 🎯 **Предсказуемость** - плагины без `order` всегда выполняются первыми
302
- - 🔧 **Простота** - не нужно знать, какие номера уже заняты
303
- - 📈 **Масштабируемость** - легко добавлять новые плагины в нужном порядке
304
-
305
- ## Логика выполнения обработчиков
306
-
307
- Разные типы событий Service Worker обрабатываются по-разному в зависимости от их специфики:
308
-
309
- ### 🔄 Параллельное выполнение
310
-
311
- **События:** `install`, `activate`, `message`, `sync`, `periodicsync`
312
-
313
- Все обработчики выполняются **одновременно** с помощью `Promise.all()`:
314
-
315
- ```typescript
316
- // Все плагины инициализируются параллельно
317
- const installPlugin1 = {
318
- name: 'cache-assets',
319
- install: async () => {
320
- /* кеширование ресурсов приложения*/
321
- },
322
- };
323
- const installPlugin2 = {
324
- name: 'cache-ext',
325
- install: async () => {
326
- /* кэширование вспомогательных ресурсов */
327
- },
328
- };
329
-
330
- // Оба install обработчика выполнятся одновременно
331
- ```
332
-
333
- **Почему параллельно:**
334
-
335
- - **install/activate**: Все плагины должны инициализироваться независимо
336
- - **message**: Все плагины должны получить сообщение одновременно
337
- - **sync**: Разные задачи синхронизации независимы (синхронизация данных + кеша)
338
- - **periodicsync**: Периодические задачи независимы друг от друга
339
-
340
- ### ➡️ Последовательное выполнение
341
-
342
- **События:** `fetch`, `push`
343
-
344
- Обработчики выполняются **по очереди** до первого успешного результата:
345
-
346
- #### Fetch - с прерыванием цепочки
347
-
348
- ```typescript
349
- const authPlugin = {
350
- name: 'auth',
351
- // Без order - выполняется первым
352
- fetch: async (event) => {
353
- if (needsAuth(event.request)) {
354
- return new Response('Unauthorized', { status: 401 }); // Прерывает цепочку
355
- }
356
- return undefined; // Передает следующему плагину
357
- },
358
- };
359
- ```
360
-
361
- **Почему последовательно:**
362
-
363
- - **fetch**: Нужен только один ответ, первый успешный прерывает цепочку
364
- - **push**: Избегает конфликтов уведомлений, но все плагины должны обработать событие
365
-
366
- ### 📋 Сводная таблица
367
-
368
- | Событие | Выполнение | Прерывание | Причина |
369
- | -------------- | --------------- | ---------- | -------------------------------- |
370
- | `install` | Параллельно | Нет | Независимая инициализация |
371
- | `activate` | Параллельно | Нет | Независимая активация |
372
- | `fetch` | Последовательно | Да | Нужен один ответ |
373
- | `message` | Параллельно | Нет | Все получают сообщение |
374
- | `sync` | Параллельно | Нет | Независимые задачи |
375
- | `periodicsync` | Параллельно | Нет | Независимые периодические задачи |
376
- | `push` | Последовательно | Нет | Избегание конфликтов |
377
-
378
- ## 🛡️ Обработка ошибок
379
-
380
- Библиотека автоматически перехватывает и обрабатывает все типы ошибок в Service Worker через единый обработчик `config.onError` (см. раздел [Конфигурация](#-конфигурация)).
381
-
382
- **Особенности:**
383
-
384
- - **Единый обработчик** - все типы ошибок обрабатываются через `config.onError` (опциональное поле)
385
- - **Дефолтного обработчика нет** - если `onError` не указан, ошибки будут проигнорированы
386
- - **Типизированные ошибки** - третий параметр `errorType` указывает тип ошибки из `ServiceWorkerErrorType`
387
- - **Глобальные события** - автоматическая обработка `error`, `messageerror`, `unhandledrejection`, `rejectionhandled`
388
- - **Изоляция ошибок** - ошибка в одном плагине не останавливает выполнение других
389
- - **Безопасность** - ошибки в самих обработчиках ошибок логируются через `logger.error`
390
-
391
- ## Режим разработки
392
-
393
- Важно, чтобы в режиме разработки ни один из плагинов ничего не кэшировал и не пытался что-либо отдавать из кэша.
394
- В пакетах для этого можно использовть `import.meta.env.DEV` для Vite
395
-
396
- ## 📄 Лицензия
397
-
398
- MIT © Vadim Budarin
1
+ # @budarin/pluggable-serviceworker
2
+
3
+ 🔌 Расширяемый через плагины Service Worker
4
+
5
+ Библиотека для создания модульных и расширяемых Service Worker'ов с помощью системы плагинов.
6
+
7
+ ## 🚀 Почему этот пакет облегчает разработку?
8
+
9
+ Разработка Service Worker'ов традиционно сложна из-за необходимости вручную управлять множественными обработчиками событий, обработкой ошибок и порядком выполнения. Этот пакет решает эти проблемы:
10
+
11
+ ### 🔌 **Модульная архитектура**
12
+
13
+ - **Плагинная система** позволяет разбивать функциональность на независимые модули
14
+ - Каждый плагин отвечает за свою задачу (кеширование, аутентификация, уведомления)
15
+ - Легко добавлять/удалять функциональность без изменения основного кода
16
+ - Не нужно думать об инфраструктурном коде в обработчиках событий - пишите простой код не думая о сложностях кода самого сервисворкера
17
+
18
+ ### 🎯 **Управление порядком выполнения**
19
+
20
+ - **Предсказуемый порядок** - плагины без `order` выполняются первыми, затем по возрастанию `order`
21
+ - **Гибкость** - можно контролировать последовательность инициализации
22
+ - **Масштабируемость** - легко добавлять новые плагины в нужном месте
23
+
24
+ ### ⚡ **Оптимизированная логика выполнения**
25
+
26
+ - **Параллельно** для `install`, `activate`, `message`, `sync` - независимые задачи выполняются одновременно
27
+ - **Последовательно** для `fetch`, `push` - первый успешный результат прерывает цепочку
28
+ - **Производительность** - правильный выбор стратегии для каждого типа события
29
+
30
+ ### 🛡️ **Централизованная обработка ошибок**
31
+
32
+ - **Единый обработчик** для всех типов ошибок
33
+ - **Типизированные ошибки** - знаешь, что именно сломалось
34
+ - **Изоляция** - ошибка в одном плагине не ломает остальные
35
+ - **Автоматическая обработка** глобальных событий ошибок
36
+
37
+ ### 📝 **Удобное логирование**
38
+
39
+ - **Настраиваемый логгер** с разными уровнями
40
+ - **Контекстная информация** в логах
41
+ - **Отладка** становится намного проще
42
+
43
+ ## 📦 Установка
44
+
45
+ ```bash
46
+ npm install @budarin/pluggable-serviceworker
47
+ ```
48
+
49
+ или
50
+
51
+ ```bash
52
+ pnpm add @budarin/pluggable-serviceworker
53
+ ```
54
+
55
+ ## 🚀 Быстрый старт
56
+
57
+ ### Базовое использование
58
+
59
+ ```typescript
60
+ // sw.js
61
+ import { initServiceWorker } from '@budarin/pluggable-serviceworker';
62
+
63
+ // Простой плагин для кеширования
64
+ const cachePlugin = {
65
+ name: 'cache-plugin',
66
+
67
+ install: async (event) => {
68
+ const cache = await caches.open('my-cache-v1');
69
+ await cache.addAll(['/', '/styles.css', '/script.js']);
70
+ },
71
+
72
+ fetch: async (event) => {
73
+ const cachedResponse = await caches.match(event.request);
74
+ return cachedResponse || fetch(event.request);
75
+ },
76
+ };
77
+
78
+ // Инициализация Service Worker с плагинами
79
+ initServiceWorker([cachePlugin], { logger: console });
80
+ ```
81
+
82
+ ## ⚙️ Конфигурация
83
+
84
+ Функция `initServiceWorker` принимает второй параметр `config` типа `ServiceWorkerConfig`:
85
+
86
+ ```typescript
87
+ interface ServiceWorkerConfig {
88
+ logger?: Logger; // Опционально, по умолчанию console
89
+ onError?: (
90
+ error: Error | any,
91
+ event: Event,
92
+ errorType?: ServiceWorkerErrorType
93
+ ) => void;
94
+ }
95
+ ```
96
+
97
+ ### Поля конфигурации
98
+
99
+ #### `logger?: Logger` (опциональное)
100
+
101
+ Объект для логирования с методами `info`, `warn`, `error`, `debug`. По умолчанию используется `console`. Может быть передан любой объект, реализующий интерфейс `Logger`.
102
+
103
+ ```typescript
104
+ interface Logger {
105
+ info: (...data: unknown[]) => void;
106
+ warn: (...data: unknown[]) => void;
107
+ error: (...data: unknown[]) => void;
108
+ debug: (...data: unknown[]) => void;
109
+ }
110
+ ```
111
+
112
+ **Пример:**
113
+
114
+ ```typescript
115
+ const logger = console; // Использование стандартного console
116
+
117
+ const config = {
118
+ logger,
119
+ // или
120
+ logger: {
121
+ info: (...data) => customLog('INFO', ...data),
122
+ warn: (...data) => customLog('WARN', ...data),
123
+ error: (...data) => customLog('ERROR', ...data),
124
+ debug: (...data) => customLog('DEBUG', ...data),
125
+ },
126
+ };
127
+ ```
128
+
129
+ #### `onError?: (error, event, errorType) => void` (опциональное)
130
+
131
+ Единый обработчик для всех типов ошибок в Service Worker. **Дефолтного обработчика ошибок нет** - если `onError` не передан, ошибки будут проигнорированы (не обработаны).
132
+
133
+ **Параметры:**
134
+
135
+ - `error: Error | any` - объект ошибки
136
+ - `event: Event` - событие, в контексте которого произошла ошибка
137
+ - `errorType?: ServiceWorkerErrorType` - тип ошибки (см. раздел "Обработка ошибок")
138
+
139
+ **Важно:** Если `onError` не указан, ошибки в плагинах и глобальные ошибки будут проигнорированы. Для production-окружения рекомендуется всегда указывать `onError` для логирования и мониторинга ошибок.
140
+
141
+ **Пример минимальной конфигурации:**
142
+
143
+ ```typescript
144
+ // Без onError - ошибки будут проигнорированы
145
+ initServiceWorker([cachePlugin], { logger: console });
146
+
147
+ // С onError - ошибки будут обработаны
148
+ const logger = console; // Использование стандартного console
149
+
150
+ initServiceWorker([cachePlugin], {
151
+ logger,
152
+ onError: (error, event, errorType) => {
153
+ logger.error('Service Worker error:', error, errorType);
154
+ },
155
+ });
156
+ ```
157
+
158
+ ### Обработка ошибок
159
+
160
+ Библиотека предоставляет единый обработчик для всех типов ошибок в Service Worker:
161
+
162
+ ```typescript
163
+ import {
164
+ initServiceWorker,
165
+ ServiceWorkerErrorType,
166
+ } from '@budarin/pluggable-serviceworker';
167
+
168
+ const logger = console; // или свой объект с методами info, warn, error, debug
169
+
170
+ const config = {
171
+ logger,
172
+ onError: (error, event, errorType) => {
173
+ logger.info(`Ошибка типа "${errorType}":`, error);
174
+
175
+ switch (errorType) {
176
+ case ServiceWorkerErrorType.ERROR:
177
+ // JavaScript ошибки
178
+ logger.error('JavaScript error:', error);
179
+ break;
180
+
181
+ case ServiceWorkerErrorType.MESSAGE_ERROR:
182
+ // Ошибки сообщений
183
+ logger.error('Message error:', error);
184
+ break;
185
+
186
+ case ServiceWorkerErrorType.UNHANDLED_REJECTION:
187
+ // Необработанные Promise rejection
188
+ logger.error('Unhandled promise rejection:', error);
189
+ break;
190
+
191
+ case ServiceWorkerErrorType.REJECTION_HANDLED:
192
+ // Обработанные Promise rejection
193
+ logger.info('Promise rejection handled:', error);
194
+ break;
195
+
196
+ case ServiceWorkerErrorType.PLUGIN_ERROR:
197
+ // Ошибки в плагинах
198
+ logger.error('Plugin error:', error);
199
+ break;
200
+
201
+ default:
202
+ // Неизвестные типы ошибок
203
+ logger.error('Unknown error type:', error);
204
+
205
+ // можно даже так - отправка ошибки в аналитику
206
+ fetch('/api/errors', {
207
+ method: 'POST',
208
+ body: JSON.stringify({
209
+ error: error.message,
210
+ eventType: event.type,
211
+ url: event.request?.url,
212
+ timestamp: Date.now(),
213
+ }),
214
+ }).catch(() => {
215
+ // Игнорируем ошибки отправки логов
216
+ });
217
+ }
218
+ },
219
+ };
220
+
221
+ initServiceWorker(
222
+ [
223
+ /* ваши плагины */
224
+ ],
225
+ config
226
+ );
227
+ ```
228
+
229
+ ## 🔌 Интерфейс плагина
230
+
231
+ Каждый плагин должен реализовывать интерфейс `ServiceWorkerPlugin`:
232
+
233
+ ```typescript
234
+ interface ServiceWorkerPlugin {
235
+ /** Уникальное имя плагина */
236
+ name: string;
237
+
238
+ /** Порядок выполнения (опционально) */
239
+ order?: number;
240
+
241
+ /** Обработчик события install */
242
+ install?: (event: ExtendableEvent) => Promise<void> | void;
243
+
244
+ /** Обработчик события activate */
245
+ activate?: (event: ExtendableEvent) => Promise<void> | void;
246
+
247
+ /** Обработчик события fetch */
248
+ fetch?: (
249
+ event: FetchEvent
250
+ ) => Promise<Response | undefined> | Response | undefined;
251
+
252
+ /** Обработчик события message */
253
+ message?: (event: SwMessageEvent) => void;
254
+
255
+ /** Обработчик события sync */
256
+ sync?: (event: SyncEvent) => Promise<void> | void;
257
+
258
+ /** Обработчик события push */
259
+ push?: (event: PushEvent) => Promise<void> | void;
260
+
261
+ /** Обработчик события periodicsync */
262
+ periodicsync?: (event: PeriodicSyncEvent) => Promise<void> | void;
263
+ }
264
+ ```
265
+
266
+ ### 📝 Описание методов
267
+
268
+ | Метод | Событие | Возвращает | Описание |
269
+ | -------------- | -------------- | ----------------------- | --------------------------------------- |
270
+ | `install` | `install` | `void` | Инициализация плагина при установке SW |
271
+ | `activate` | `activate` | `void` | Активация плагина при обновлении SW |
272
+ | `fetch` | `fetch` | `Response \| undefined` | Обработка сетевых запросов |
273
+ | `message` | `message` | `void` | Обработка сообщений от основного потока |
274
+ | `sync` | `sync` | `void` | Синхронизация данных в фоне |
275
+ | `push` | `push` | `void` | Обработка push-уведомлений |
276
+ | `periodicsync` | `periodicsync` | `void` | Периодические фоновые задачи |
277
+
278
+ ### 🎯 Особенности обработчиков
279
+
280
+ - **`fetch`**: Возвращает `Response` для завершения цепочки или `undefined` для передачи следующему плагину
281
+ - **Остальные**: Не возвращают значения, выполняются для всех плагинов
282
+ - **Все методы опциональны** - реализуйте только нужные события
283
+
284
+ ### 🔄 Обновление Service Worker (skipWaiting / clients.claim)
285
+
286
+ Библиотека **не вызывает** `skipWaiting()` и `clients.claim()` — это поведение задаётся индивидуально в каждом проекте и оставлено на усмотрение плагинов. При необходимости вызывайте их в своих обработчиках `install` и `activate`:
287
+
288
+ ```typescript
289
+ const updatePlugin = {
290
+ name: 'update-plugin',
291
+ install: (event) => {
292
+ self.skipWaiting();
293
+ },
294
+ activate: (event) => {
295
+ event.waitUntil(self.clients.claim());
296
+ },
297
+ };
298
+ ```
299
+
300
+ ## 🎯 Порядок выполнения
301
+
302
+ Плагины выполняются в следующем порядке:
303
+
304
+ 1. **Сначала ВСЕ плагины без `order`** - в том порядке, в котором они были добавлены
305
+ 2. **Затем плагины с `order`** - в порядке возрастания значений `order`
306
+
307
+ ### Пример:
308
+
309
+ ```typescript
310
+ const plugins = [
311
+ { name: 'first' }, // без order - выполняется первым
312
+ { name: 'fourth', order: 2 },
313
+ { name: 'second' }, // без order - выполняется вторым
314
+ { name: 'third', order: 1 },
315
+ { name: 'fifth' }, // без order - выполняется третьим
316
+ ];
317
+
318
+ // Порядок выполнения: first → second → fifth → third → fourth
319
+ ```
320
+
321
+ **Преимущества новой системы:**
322
+
323
+ - 🎯 **Предсказуемость** - плагины без `order` всегда выполняются первыми
324
+ - 🔧 **Простота** - не нужно знать, какие номера уже заняты
325
+ - 📈 **Масштабируемость** - легко добавлять новые плагины в нужном порядке
326
+
327
+ ## ⚡ Логика выполнения обработчиков
328
+
329
+ Разные типы событий Service Worker обрабатываются по-разному в зависимости от их специфики:
330
+
331
+ ### 🔄 Параллельное выполнение
332
+
333
+ **События:** `install`, `activate`, `message`, `sync`, `periodicsync`
334
+
335
+ Все обработчики выполняются **одновременно** с помощью `Promise.all()`:
336
+
337
+ ```typescript
338
+ // Все плагины инициализируются параллельно
339
+ const installPlugin1 = {
340
+ name: 'cache-assets',
341
+ install: async () => {
342
+ /* кеширование ресурсов приложения*/
343
+ },
344
+ };
345
+ const installPlugin2 = {
346
+ name: 'cache-ext',
347
+ install: async () => {
348
+ /* кэширование вспомогательных ресурсов */
349
+ },
350
+ };
351
+
352
+ // Оба install обработчика выполнятся одновременно
353
+ ```
354
+
355
+ **Почему параллельно:**
356
+
357
+ - **install/activate**: Все плагины должны инициализироваться независимо
358
+ - **message**: Все плагины должны получить сообщение одновременно
359
+ - **sync**: Разные задачи синхронизации независимы (синхронизация данных + кеша)
360
+ - **periodicsync**: Периодические задачи независимы друг от друга
361
+
362
+ ### ➡️ Последовательное выполнение
363
+
364
+ **События:** `fetch`, `push`
365
+
366
+ Обработчики выполняются **по очереди** до первого успешного результата:
367
+
368
+ #### Fetch - с прерыванием цепочки
369
+
370
+ ```typescript
371
+ const authPlugin = {
372
+ name: 'auth',
373
+ // Без order - выполняется первым
374
+ fetch: async (event) => {
375
+ if (needsAuth(event.request)) {
376
+ return new Response('Unauthorized', { status: 401 }); // Прерывает цепочку
377
+ }
378
+ return undefined; // Передает следующему плагину
379
+ },
380
+ };
381
+ ```
382
+
383
+ **Почему последовательно:**
384
+
385
+ - **fetch**: Нужен только один ответ, первый успешный прерывает цепочку
386
+ - **push**: Избегает конфликтов уведомлений, но все плагины должны обработать событие
387
+
388
+ ### 📋 Сводная таблица
389
+
390
+ | Событие | Выполнение | Прерывание | Причина |
391
+ | -------------- | --------------- | ---------- | -------------------------------- |
392
+ | `install` | Параллельно | Нет | Независимая инициализация |
393
+ | `activate` | Параллельно | Нет | Независимая активация |
394
+ | `fetch` | Последовательно | Да | Нужен один ответ |
395
+ | `message` | Параллельно | Нет | Все получают сообщение |
396
+ | `sync` | Параллельно | Нет | Независимые задачи |
397
+ | `periodicsync` | Параллельно | Нет | Независимые периодические задачи |
398
+ | `push` | Последовательно | Нет | Избегание конфликтов |
399
+
400
+ ## 🛡️ Обработка ошибок
401
+
402
+ Библиотека автоматически перехватывает и обрабатывает все типы ошибок в Service Worker через единый обработчик `config.onError` (см. раздел [Конфигурация](#-конфигурация)).
403
+
404
+ **Особенности:**
405
+
406
+ - **Единый обработчик** - все типы ошибок обрабатываются через `config.onError` (опциональное поле)
407
+ - **Дефолтного обработчика нет** - если `onError` не указан, ошибки будут проигнорированы
408
+ - **Типизированные ошибки** - третий параметр `errorType` указывает тип ошибки из `ServiceWorkerErrorType`
409
+ - **Глобальные события** - автоматическая обработка `error`, `messageerror`, `unhandledrejection`, `rejectionhandled`
410
+ - **Изоляция ошибок** - ошибка в одном плагине не останавливает выполнение других
411
+ - **Безопасность** - ошибки в самих обработчиках ошибок логируются через `logger.error`
412
+
413
+ ## Режим разработки
414
+
415
+ Важно, чтобы в режиме разработки ни один из плагинов ничего не кэшировал и не пытался что-либо отдавать из кэша.
416
+ В пакетах для этого можно использовть `import.meta.env.DEV` для Vite
417
+
418
+ ## 📄 Лицензия
419
+
420
+ MIT © Vadim Budarin
package/dist/index.d.ts CHANGED
@@ -29,6 +29,7 @@ export interface Logger {
29
29
  error: (...data: unknown[]) => void;
30
30
  debug: (...data: unknown[]) => void;
31
31
  }
32
+ export declare function __resetServiceWorkerState(): void;
32
33
  interface ServiceWorkerEventHandlers {
33
34
  install?: (event: ExtendableEvent) => void | Promise<void>;
34
35
  activate?: (event: ExtendableEvent) => void | Promise<void>;
@@ -42,9 +43,9 @@ export interface ServiceWorkerPlugin extends ServiceWorkerEventHandlers {
42
43
  name: string;
43
44
  order?: number;
44
45
  }
45
- interface ServiceWorkerConfig {
46
- logger: Logger;
47
- onError?: (error: Error | any, event: Event, errorType?: ServiceWorkerErrorType) => void;
46
+ export interface ServiceWorkerConfig {
47
+ logger?: Logger;
48
+ onError?: (error: Error | unknown, event: Event, errorType?: ServiceWorkerErrorType) => void;
48
49
  }
49
50
  export type FetchResponse = Promise<Response | undefined>;
50
51
  export declare function createEventHandlers(plugins: ServiceWorkerPlugin[], config: ServiceWorkerConfig): {
@@ -60,6 +61,6 @@ export declare function createEventHandlers(plugins: ServiceWorkerPlugin[], conf
60
61
  unhandledrejection: (event: PromiseRejectionEvent) => void;
61
62
  rejectionhandled: (event: PromiseRejectionEvent) => void;
62
63
  };
63
- export declare function initServiceWorker(plugins: ServiceWorkerPlugin[], config: ServiceWorkerConfig): void;
64
+ export declare function initServiceWorker(plugins: ServiceWorkerPlugin[], config?: ServiceWorkerConfig): void;
64
65
  export {};
65
66
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -8,6 +8,10 @@ export var ServiceWorkerErrorType;
8
8
  ServiceWorkerErrorType["PLUGIN_ERROR"] = "plugin_error";
9
9
  })(ServiceWorkerErrorType || (ServiceWorkerErrorType = {}));
10
10
  const sw = self;
11
+ let serviceWorkerInitialized = false;
12
+ export function __resetServiceWorkerState() {
13
+ serviceWorkerInitialized = false;
14
+ }
11
15
  export function createEventHandlers(plugins, config) {
12
16
  const handlers = {
13
17
  install: [],
@@ -42,10 +46,14 @@ export function createEventHandlers(plugins, config) {
42
46
  });
43
47
  return {
44
48
  install: (event) => {
45
- event.waitUntil(Promise.all(handlers.install.map((handler) => Promise.resolve(handler(event)).catch((error) => config.onError?.(error, event, ServiceWorkerErrorType.PLUGIN_ERROR)))));
49
+ event.waitUntil(Promise.all(handlers.install.map((handler) => Promise.resolve()
50
+ .then(() => handler(event))
51
+ .catch((error) => config.onError?.(error, event, ServiceWorkerErrorType.PLUGIN_ERROR)))));
46
52
  },
47
53
  activate: (event) => {
48
- event.waitUntil(Promise.all(handlers.activate.map((handler) => Promise.resolve(handler(event)).catch((error) => config.onError?.(error, event, ServiceWorkerErrorType.PLUGIN_ERROR)))));
54
+ event.waitUntil(Promise.all(handlers.activate.map((handler) => Promise.resolve()
55
+ .then(() => handler(event))
56
+ .catch((error) => config.onError?.(error, event, ServiceWorkerErrorType.PLUGIN_ERROR)))));
49
57
  },
50
58
  fetch: (event) => {
51
59
  event.respondWith((async () => {
@@ -69,15 +77,19 @@ export function createEventHandlers(plugins, config) {
69
77
  handler(event);
70
78
  }
71
79
  catch (error) {
72
- config.onError?.(error, event);
80
+ config.onError?.(error, event, ServiceWorkerErrorType.PLUGIN_ERROR);
73
81
  }
74
82
  });
75
83
  },
76
84
  sync: (event) => {
77
- event.waitUntil(Promise.all(handlers.sync.map((handler) => Promise.resolve(handler(event)).catch((error) => config.onError?.(error, event, ServiceWorkerErrorType.PLUGIN_ERROR)))));
85
+ event.waitUntil(Promise.all(handlers.sync.map((handler) => Promise.resolve()
86
+ .then(() => handler(event))
87
+ .catch((error) => config.onError?.(error, event, ServiceWorkerErrorType.PLUGIN_ERROR)))));
78
88
  },
79
89
  periodicsync: (event) => {
80
- event.waitUntil(Promise.all(handlers.periodicsync.map((handler) => Promise.resolve(handler(event)).catch((error) => config.onError?.(error, event, ServiceWorkerErrorType.PLUGIN_ERROR)))));
90
+ event.waitUntil(Promise.all(handlers.periodicsync.map((handler) => Promise.resolve()
91
+ .then(() => handler(event))
92
+ .catch((error) => config.onError?.(error, event, ServiceWorkerErrorType.PLUGIN_ERROR)))));
81
93
  },
82
94
  push: (event) => {
83
95
  event.waitUntil((async () => {
@@ -96,7 +108,7 @@ export function createEventHandlers(plugins, config) {
96
108
  config.onError?.(event.error, event, ServiceWorkerErrorType.ERROR);
97
109
  }
98
110
  catch (error) {
99
- sw.logger.error('Error in error handler:', error);
111
+ (sw.logger ?? console).error('Error in error handler:', error);
100
112
  }
101
113
  },
102
114
  messageerror: (event) => {
@@ -104,7 +116,7 @@ export function createEventHandlers(plugins, config) {
104
116
  config.onError?.(event.data, event, ServiceWorkerErrorType.MESSAGE_ERROR);
105
117
  }
106
118
  catch (error) {
107
- sw.logger.error('Error in messageerror handler:', error);
119
+ (sw.logger ?? console).error('Error in messageerror handler:', error);
108
120
  }
109
121
  },
110
122
  unhandledrejection: (event) => {
@@ -112,7 +124,7 @@ export function createEventHandlers(plugins, config) {
112
124
  config.onError?.(event.reason, event, ServiceWorkerErrorType.UNHANDLED_REJECTION);
113
125
  }
114
126
  catch (error) {
115
- sw.logger.error('Error in unhandledrejection handler:', error);
127
+ (sw.logger ?? console).error('Error in unhandledrejection handler:', error);
116
128
  }
117
129
  },
118
130
  rejectionhandled: (event) => {
@@ -120,14 +132,29 @@ export function createEventHandlers(plugins, config) {
120
132
  config.onError?.(event.reason, event, ServiceWorkerErrorType.REJECTION_HANDLED);
121
133
  }
122
134
  catch (error) {
123
- sw.logger.error('Error in rejectionhandled handler:', error);
135
+ (sw.logger ?? console).error('Error in rejectionhandled handler:', error);
124
136
  }
125
137
  },
126
138
  };
127
139
  }
128
140
  export function initServiceWorker(plugins, config) {
129
- sw.logger = config.logger;
130
- const handlers = createEventHandlers(plugins, config);
141
+ if (serviceWorkerInitialized) {
142
+ return;
143
+ }
144
+ serviceWorkerInitialized = true;
145
+ sw.logger = config?.logger ?? console;
146
+ const names = new Set();
147
+ for (const plugin of plugins) {
148
+ if (names.has(plugin.name)) {
149
+ (sw.logger ?? console).warn(`Duplicate plugin name: "${plugin.name}"`);
150
+ }
151
+ names.add(plugin.name);
152
+ }
153
+ const handlers = createEventHandlers(plugins, config ?? {});
154
+ self.addEventListener(SW_EVENT_ERROR, handlers.error);
155
+ self.addEventListener(SW_EVENT_MESSAGEERROR, handlers.messageerror);
156
+ self.addEventListener(SW_EVENT_UNHANDLEDREJECTION, handlers.unhandledrejection);
157
+ self.addEventListener(SW_EVENT_REJECTIONHANDLED, handlers.rejectionhandled);
131
158
  self.addEventListener(SW_EVENT_INSTALL, handlers.install);
132
159
  self.addEventListener(SW_EVENT_ACTIVATE, handlers.activate);
133
160
  self.addEventListener(SW_EVENT_FETCH, handlers.fetch);
@@ -135,9 +162,5 @@ export function initServiceWorker(plugins, config) {
135
162
  self.addEventListener(SW_EVENT_SYNC, handlers.sync);
136
163
  self.addEventListener(SW_EVENT_PERIODICSYNC, handlers.periodicsync);
137
164
  self.addEventListener(SW_EVENT_PUSH, handlers.push);
138
- self.addEventListener(SW_EVENT_ERROR, handlers.error);
139
- self.addEventListener(SW_EVENT_MESSAGEERROR, handlers.messageerror);
140
- self.addEventListener(SW_EVENT_UNHANDLEDREJECTION, handlers.unhandledrejection);
141
- self.addEventListener(SW_EVENT_REJECTIONHANDLED, handlers.rejectionhandled);
142
165
  }
143
166
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@budarin/pluggable-serviceworker",
3
- "version": "1.0.32",
3
+ "version": "1.1.0",
4
4
  "description": "Extensible via plugins service worker",
5
5
  "keywords": [
6
6
  "serviceworker",
@@ -14,22 +14,29 @@
14
14
  "main": "dist/index.js",
15
15
  "types": "dist/index.d.ts",
16
16
  "type": "module",
17
+ "files": [
18
+ "dist",
19
+ "LICENSE",
20
+ "README.md"
21
+ ],
17
22
  "exports": {
18
- ".": "./dist/index.js",
19
- "./types": "./dist/index.d.ts"
23
+ ".": "./dist/index.js"
20
24
  },
21
25
  "devDependencies": {
22
26
  "@types/node": "^24.10.1",
23
27
  "@types/serviceworker": "^0.0.153",
24
28
  "@types/web": "^0.0.269",
25
29
  "prettier": "^3.6.2",
26
- "typescript": "^5.9.3"
30
+ "typescript": "^5.9.3",
31
+ "vitest": "^3.2.4"
27
32
  },
28
33
  "dependencies": {
29
34
  "@budarin/http-constants": "^1.0.16"
30
35
  },
31
36
  "scripts": {
32
37
  "build": "tsc",
38
+ "test": "vitest run",
39
+ "test:watch": "vitest",
33
40
  "pnpm-install": "pnpm install",
34
41
  "upgrade-deps": "pnpm upgrade -i",
35
42
  "publish-package": "pnpm build && pnpm publish --access=public"