@budarin/pluggable-serviceworker 1.0.19 → 1.0.20
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 +21 -21
- package/README.md +239 -239
- package/TODO.md +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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,239 +1,239 @@
|
|
|
1
|
-
# @budarin/pluggable-serviceworker
|
|
2
|
-
|
|
3
|
-
🔌 Расширяемый через плагины Service Worker
|
|
4
|
-
|
|
5
|
-
Библиотека для создания модульных и расширяемых Service Worker'ов с помощью системы плагинов. Позволяет легко добавлять функциональность через плагины с поддержкой приоритетов и обработки ошибок.
|
|
6
|
-
|
|
7
|
-
## ✨ Особенности
|
|
8
|
-
|
|
9
|
-
- 🔌 **Система плагинов** - модульная архитектура для расширения функциональности
|
|
10
|
-
- 📊 **Порядок выполнения** - предсказуемый контроль порядка выполнения плагинов
|
|
11
|
-
- 🛡️ **Обработка ошибок** - централизованная обработка ошибок
|
|
12
|
-
- 📝 **Логирование** - настраиваемое логирование с поддержкой различных уровней
|
|
13
|
-
- 🎯 **TypeScript** - полная поддержка типов
|
|
14
|
-
- 🚀 **Простота использования** - минимальная настройка
|
|
15
|
-
|
|
16
|
-
## 📦 Установка
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npm install @budarin/pluggable-serviceworker
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
или
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
pnpm add @budarin/pluggable-serviceworker
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 🚀 Быстрый старт
|
|
29
|
-
|
|
30
|
-
### Базовое использование
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
// sw.js
|
|
34
|
-
import { initializeServiceWorker } from '@budarin/pluggable-serviceworker';
|
|
35
|
-
|
|
36
|
-
// Простой плагин для кеширования
|
|
37
|
-
const cachePlugin = {
|
|
38
|
-
name: 'cache-plugin',
|
|
39
|
-
|
|
40
|
-
install: async (event) => {
|
|
41
|
-
const cache = await caches.open('my-cache-v1');
|
|
42
|
-
await cache.addAll(['/', '/styles.css', '/script.js']);
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
fetch: async (event) => {
|
|
46
|
-
const cachedResponse = await caches.match(event.request);
|
|
47
|
-
return cachedResponse || fetch(event.request);
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
// Инициализация Service Worker с плагинами
|
|
52
|
-
initializeServiceWorker([cachePlugin], { logger: console });
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Обработка ошибок
|
|
56
|
-
|
|
57
|
-
Библиотека предоставляет единый обработчик для всех типов ошибок в Service Worker:
|
|
58
|
-
|
|
59
|
-
```typescript
|
|
60
|
-
import {
|
|
61
|
-
initializeServiceWorker,
|
|
62
|
-
ServiceWorkerErrorType,
|
|
63
|
-
} from '@budarin/pluggable-serviceworker';
|
|
64
|
-
|
|
65
|
-
const config = {
|
|
66
|
-
logger: {
|
|
67
|
-
info: (...data) => console.log('[SW INFO]', ...data),
|
|
68
|
-
warn: (...data) => console.warn('[SW WARN]', ...data),
|
|
69
|
-
error: (...data) => console.error('[SW ERROR]', ...data),
|
|
70
|
-
debug: (...data) => console.debug('[SW DEBUG]', ...data),
|
|
71
|
-
},
|
|
72
|
-
onError: (error, event, errorType) => {
|
|
73
|
-
console.log(`Ошибка типа "${errorType}":`, error);
|
|
74
|
-
|
|
75
|
-
switch (errorType) {
|
|
76
|
-
case ServiceWorkerErrorType.ERROR:
|
|
77
|
-
// JavaScript ошибки
|
|
78
|
-
console.error('JavaScript error:', error);
|
|
79
|
-
break;
|
|
80
|
-
|
|
81
|
-
case ServiceWorkerErrorType.MESSAGE_ERROR:
|
|
82
|
-
// Ошибки сообщений
|
|
83
|
-
console.error('Message error:', error);
|
|
84
|
-
break;
|
|
85
|
-
|
|
86
|
-
case ServiceWorkerErrorType.UNHANDLED_REJECTION:
|
|
87
|
-
// Необработанные Promise rejection
|
|
88
|
-
console.error('Unhandled promise rejection:', error);
|
|
89
|
-
break;
|
|
90
|
-
|
|
91
|
-
case ServiceWorkerErrorType.REJECTION_HANDLED:
|
|
92
|
-
// Обработанные Promise rejection
|
|
93
|
-
console.log('Promise rejection handled:', error);
|
|
94
|
-
break;
|
|
95
|
-
|
|
96
|
-
case ServiceWorkerErrorType.PLUGIN_ERROR:
|
|
97
|
-
// Ошибки в плагинах
|
|
98
|
-
console.error('Plugin error:', error);
|
|
99
|
-
break;
|
|
100
|
-
|
|
101
|
-
default:
|
|
102
|
-
// Неизвестные типы ошибок
|
|
103
|
-
console.error('Unknown error type:', error);
|
|
104
|
-
|
|
105
|
-
// Отправка ошибки в аналитику
|
|
106
|
-
fetch('/api/errors', {
|
|
107
|
-
method: 'POST',
|
|
108
|
-
body: JSON.stringify({
|
|
109
|
-
error: error.message,
|
|
110
|
-
eventType: event.type,
|
|
111
|
-
url: event.request?.url,
|
|
112
|
-
timestamp: Date.now(),
|
|
113
|
-
}),
|
|
114
|
-
}).catch(() => {
|
|
115
|
-
// Игнорируем ошибки отправки логов
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
initializeServiceWorker(
|
|
122
|
-
[
|
|
123
|
-
/* ваши плагины */
|
|
124
|
-
],
|
|
125
|
-
config
|
|
126
|
-
);
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## 🎯 Порядок выполнения
|
|
130
|
-
|
|
131
|
-
Плагины выполняются в следующем порядке:
|
|
132
|
-
|
|
133
|
-
1. **Сначала ВСЕ плагины без `order`** - в том порядке, в котором они были добавлены
|
|
134
|
-
2. **Затем плагины с `order`** - в порядке возрастания значений `order`
|
|
135
|
-
|
|
136
|
-
### Пример:
|
|
137
|
-
|
|
138
|
-
```typescript
|
|
139
|
-
const plugins = [
|
|
140
|
-
{ name: 'first' }, // без order - выполняется первым
|
|
141
|
-
{ name: 'fourth', order: 2 },
|
|
142
|
-
{ name: 'second' }, // без order - выполняется вторым
|
|
143
|
-
{ name: 'third', order: 1 },
|
|
144
|
-
{ name: 'fifth' }, // без order - выполняется третьим
|
|
145
|
-
];
|
|
146
|
-
|
|
147
|
-
// Порядок выполнения: first → second → fifth → third → fourth
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
**Преимущества новой системы:**
|
|
151
|
-
|
|
152
|
-
- 🎯 **Предсказуемость** - плагины без `order` всегда выполняются первыми
|
|
153
|
-
- 🔧 **Простота** - не нужно знать, какие номера уже заняты
|
|
154
|
-
- 📈 **Масштабируемость** - легко добавлять новые плагины в нужном порядке
|
|
155
|
-
|
|
156
|
-
## ⚡ Логика выполнения обработчиков
|
|
157
|
-
|
|
158
|
-
Разные типы событий Service Worker обрабатываются по-разному в зависимости от их специфики:
|
|
159
|
-
|
|
160
|
-
### 🔄 Параллельное выполнение
|
|
161
|
-
|
|
162
|
-
**События:** `install`, `activate`, `message`, `sync`, `periodicsync`
|
|
163
|
-
|
|
164
|
-
Все обработчики выполняются **одновременно** с помощью `Promise.all()`:
|
|
165
|
-
|
|
166
|
-
```typescript
|
|
167
|
-
// Все плагины инициализируются параллельно
|
|
168
|
-
const installPlugin1 = {
|
|
169
|
-
name: 'cache',
|
|
170
|
-
install: async () => {
|
|
171
|
-
/* кеширование */
|
|
172
|
-
},
|
|
173
|
-
};
|
|
174
|
-
const installPlugin2 = {
|
|
175
|
-
name: 'db',
|
|
176
|
-
install: async () => {
|
|
177
|
-
/* инициализация БД */
|
|
178
|
-
},
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
// Оба install обработчика выполнятся одновременно
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**Почему параллельно:**
|
|
185
|
-
|
|
186
|
-
- **install/activate**: Все плагины должны инициализироваться независимо
|
|
187
|
-
- **message**: Все плагины должны получить сообщение одновременно
|
|
188
|
-
- **sync**: Разные задачи синхронизации независимы (синхронизация данных + кеша)
|
|
189
|
-
- **periodicsync**: Периодические задачи независимы друг от друга
|
|
190
|
-
|
|
191
|
-
### ➡️ Последовательное выполнение
|
|
192
|
-
|
|
193
|
-
**События:** `fetch`, `push`
|
|
194
|
-
|
|
195
|
-
Обработчики выполняются **по очереди** до первого успешного результата:
|
|
196
|
-
|
|
197
|
-
#### Fetch - с прерыванием цепочки
|
|
198
|
-
|
|
199
|
-
```typescript
|
|
200
|
-
const authPlugin = {
|
|
201
|
-
name: 'auth',
|
|
202
|
-
// Без order - выполняется первым
|
|
203
|
-
fetch: async (event) => {
|
|
204
|
-
if (needsAuth(event.request)) {
|
|
205
|
-
return new Response('Unauthorized', { status: 401 }); // Прерывает цепочку
|
|
206
|
-
}
|
|
207
|
-
return undefined; // Передает следующему плагину
|
|
208
|
-
},
|
|
209
|
-
};
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
**Почему последовательно:**
|
|
213
|
-
|
|
214
|
-
- **fetch**: Нужен только один ответ, первый успешный прерывает цепочку
|
|
215
|
-
- **push**: Избегает конфликтов уведомлений, но все плагины должны обработать событие
|
|
216
|
-
|
|
217
|
-
### 📋 Сводная таблица
|
|
218
|
-
|
|
219
|
-
| Событие | Выполнение | Прерывание | Причина |
|
|
220
|
-
| -------------- | --------------- | ---------- | -------------------------------- |
|
|
221
|
-
| `install` | Параллельно | Нет | Независимая инициализация |
|
|
222
|
-
| `activate` | Параллельно | Нет | Независимая активация |
|
|
223
|
-
| `fetch` | Последовательно | Да | Нужен один ответ |
|
|
224
|
-
| `message` | Параллельно | Нет | Все получают сообщение |
|
|
225
|
-
| `sync` | Параллельно | Нет | Независимые задачи |
|
|
226
|
-
| `periodicsync` | Параллельно | Нет | Независимые периодические задачи |
|
|
227
|
-
| `push` | Последовательно | Нет | Избегание конфликтов |
|
|
228
|
-
|
|
229
|
-
## 🛡️ Обработка ошибок
|
|
230
|
-
|
|
231
|
-
- **Единый обработчик** - все типы ошибок обрабатываются через `config.onError`
|
|
232
|
-
- **Типизированные ошибки** - третий параметр `errorType` указывает тип ошибки
|
|
233
|
-
- **Глобальные события** - автоматическая обработка `error`, `messageerror`, `unhandledrejection`, `rejectionhandled`
|
|
234
|
-
- **Изоляция ошибок** - ошибка в одном плагине не останавливает выполнение других
|
|
235
|
-
- **Безопасность** - ошибки в самих обработчиках ошибок логируются в консоль
|
|
236
|
-
|
|
237
|
-
## 📄 Лицензия
|
|
238
|
-
|
|
239
|
-
MIT © Vadim Budarin
|
|
1
|
+
# @budarin/pluggable-serviceworker
|
|
2
|
+
|
|
3
|
+
🔌 Расширяемый через плагины Service Worker
|
|
4
|
+
|
|
5
|
+
Библиотека для создания модульных и расширяемых Service Worker'ов с помощью системы плагинов. Позволяет легко добавлять функциональность через плагины с поддержкой приоритетов и обработки ошибок.
|
|
6
|
+
|
|
7
|
+
## ✨ Особенности
|
|
8
|
+
|
|
9
|
+
- 🔌 **Система плагинов** - модульная архитектура для расширения функциональности
|
|
10
|
+
- 📊 **Порядок выполнения** - предсказуемый контроль порядка выполнения плагинов
|
|
11
|
+
- 🛡️ **Обработка ошибок** - централизованная обработка ошибок
|
|
12
|
+
- 📝 **Логирование** - настраиваемое логирование с поддержкой различных уровней
|
|
13
|
+
- 🎯 **TypeScript** - полная поддержка типов
|
|
14
|
+
- 🚀 **Простота использования** - минимальная настройка
|
|
15
|
+
|
|
16
|
+
## 📦 Установка
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install @budarin/pluggable-serviceworker
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
или
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pnpm add @budarin/pluggable-serviceworker
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 🚀 Быстрый старт
|
|
29
|
+
|
|
30
|
+
### Базовое использование
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// sw.js
|
|
34
|
+
import { initializeServiceWorker } from '@budarin/pluggable-serviceworker';
|
|
35
|
+
|
|
36
|
+
// Простой плагин для кеширования
|
|
37
|
+
const cachePlugin = {
|
|
38
|
+
name: 'cache-plugin',
|
|
39
|
+
|
|
40
|
+
install: async (event) => {
|
|
41
|
+
const cache = await caches.open('my-cache-v1');
|
|
42
|
+
await cache.addAll(['/', '/styles.css', '/script.js']);
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
fetch: async (event) => {
|
|
46
|
+
const cachedResponse = await caches.match(event.request);
|
|
47
|
+
return cachedResponse || fetch(event.request);
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// Инициализация Service Worker с плагинами
|
|
52
|
+
initializeServiceWorker([cachePlugin], { logger: console });
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Обработка ошибок
|
|
56
|
+
|
|
57
|
+
Библиотека предоставляет единый обработчик для всех типов ошибок в Service Worker:
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import {
|
|
61
|
+
initializeServiceWorker,
|
|
62
|
+
ServiceWorkerErrorType,
|
|
63
|
+
} from '@budarin/pluggable-serviceworker';
|
|
64
|
+
|
|
65
|
+
const config = {
|
|
66
|
+
logger: {
|
|
67
|
+
info: (...data) => console.log('[SW INFO]', ...data),
|
|
68
|
+
warn: (...data) => console.warn('[SW WARN]', ...data),
|
|
69
|
+
error: (...data) => console.error('[SW ERROR]', ...data),
|
|
70
|
+
debug: (...data) => console.debug('[SW DEBUG]', ...data),
|
|
71
|
+
},
|
|
72
|
+
onError: (error, event, errorType) => {
|
|
73
|
+
console.log(`Ошибка типа "${errorType}":`, error);
|
|
74
|
+
|
|
75
|
+
switch (errorType) {
|
|
76
|
+
case ServiceWorkerErrorType.ERROR:
|
|
77
|
+
// JavaScript ошибки
|
|
78
|
+
console.error('JavaScript error:', error);
|
|
79
|
+
break;
|
|
80
|
+
|
|
81
|
+
case ServiceWorkerErrorType.MESSAGE_ERROR:
|
|
82
|
+
// Ошибки сообщений
|
|
83
|
+
console.error('Message error:', error);
|
|
84
|
+
break;
|
|
85
|
+
|
|
86
|
+
case ServiceWorkerErrorType.UNHANDLED_REJECTION:
|
|
87
|
+
// Необработанные Promise rejection
|
|
88
|
+
console.error('Unhandled promise rejection:', error);
|
|
89
|
+
break;
|
|
90
|
+
|
|
91
|
+
case ServiceWorkerErrorType.REJECTION_HANDLED:
|
|
92
|
+
// Обработанные Promise rejection
|
|
93
|
+
console.log('Promise rejection handled:', error);
|
|
94
|
+
break;
|
|
95
|
+
|
|
96
|
+
case ServiceWorkerErrorType.PLUGIN_ERROR:
|
|
97
|
+
// Ошибки в плагинах
|
|
98
|
+
console.error('Plugin error:', error);
|
|
99
|
+
break;
|
|
100
|
+
|
|
101
|
+
default:
|
|
102
|
+
// Неизвестные типы ошибок
|
|
103
|
+
console.error('Unknown error type:', error);
|
|
104
|
+
|
|
105
|
+
// Отправка ошибки в аналитику
|
|
106
|
+
fetch('/api/errors', {
|
|
107
|
+
method: 'POST',
|
|
108
|
+
body: JSON.stringify({
|
|
109
|
+
error: error.message,
|
|
110
|
+
eventType: event.type,
|
|
111
|
+
url: event.request?.url,
|
|
112
|
+
timestamp: Date.now(),
|
|
113
|
+
}),
|
|
114
|
+
}).catch(() => {
|
|
115
|
+
// Игнорируем ошибки отправки логов
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
initializeServiceWorker(
|
|
122
|
+
[
|
|
123
|
+
/* ваши плагины */
|
|
124
|
+
],
|
|
125
|
+
config
|
|
126
|
+
);
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## 🎯 Порядок выполнения
|
|
130
|
+
|
|
131
|
+
Плагины выполняются в следующем порядке:
|
|
132
|
+
|
|
133
|
+
1. **Сначала ВСЕ плагины без `order`** - в том порядке, в котором они были добавлены
|
|
134
|
+
2. **Затем плагины с `order`** - в порядке возрастания значений `order`
|
|
135
|
+
|
|
136
|
+
### Пример:
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
const plugins = [
|
|
140
|
+
{ name: 'first' }, // без order - выполняется первым
|
|
141
|
+
{ name: 'fourth', order: 2 },
|
|
142
|
+
{ name: 'second' }, // без order - выполняется вторым
|
|
143
|
+
{ name: 'third', order: 1 },
|
|
144
|
+
{ name: 'fifth' }, // без order - выполняется третьим
|
|
145
|
+
];
|
|
146
|
+
|
|
147
|
+
// Порядок выполнения: first → second → fifth → third → fourth
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Преимущества новой системы:**
|
|
151
|
+
|
|
152
|
+
- 🎯 **Предсказуемость** - плагины без `order` всегда выполняются первыми
|
|
153
|
+
- 🔧 **Простота** - не нужно знать, какие номера уже заняты
|
|
154
|
+
- 📈 **Масштабируемость** - легко добавлять новые плагины в нужном порядке
|
|
155
|
+
|
|
156
|
+
## ⚡ Логика выполнения обработчиков
|
|
157
|
+
|
|
158
|
+
Разные типы событий Service Worker обрабатываются по-разному в зависимости от их специфики:
|
|
159
|
+
|
|
160
|
+
### 🔄 Параллельное выполнение
|
|
161
|
+
|
|
162
|
+
**События:** `install`, `activate`, `message`, `sync`, `periodicsync`
|
|
163
|
+
|
|
164
|
+
Все обработчики выполняются **одновременно** с помощью `Promise.all()`:
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// Все плагины инициализируются параллельно
|
|
168
|
+
const installPlugin1 = {
|
|
169
|
+
name: 'cache',
|
|
170
|
+
install: async () => {
|
|
171
|
+
/* кеширование */
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
const installPlugin2 = {
|
|
175
|
+
name: 'db',
|
|
176
|
+
install: async () => {
|
|
177
|
+
/* инициализация БД */
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// Оба install обработчика выполнятся одновременно
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Почему параллельно:**
|
|
185
|
+
|
|
186
|
+
- **install/activate**: Все плагины должны инициализироваться независимо
|
|
187
|
+
- **message**: Все плагины должны получить сообщение одновременно
|
|
188
|
+
- **sync**: Разные задачи синхронизации независимы (синхронизация данных + кеша)
|
|
189
|
+
- **periodicsync**: Периодические задачи независимы друг от друга
|
|
190
|
+
|
|
191
|
+
### ➡️ Последовательное выполнение
|
|
192
|
+
|
|
193
|
+
**События:** `fetch`, `push`
|
|
194
|
+
|
|
195
|
+
Обработчики выполняются **по очереди** до первого успешного результата:
|
|
196
|
+
|
|
197
|
+
#### Fetch - с прерыванием цепочки
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
const authPlugin = {
|
|
201
|
+
name: 'auth',
|
|
202
|
+
// Без order - выполняется первым
|
|
203
|
+
fetch: async (event) => {
|
|
204
|
+
if (needsAuth(event.request)) {
|
|
205
|
+
return new Response('Unauthorized', { status: 401 }); // Прерывает цепочку
|
|
206
|
+
}
|
|
207
|
+
return undefined; // Передает следующему плагину
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Почему последовательно:**
|
|
213
|
+
|
|
214
|
+
- **fetch**: Нужен только один ответ, первый успешный прерывает цепочку
|
|
215
|
+
- **push**: Избегает конфликтов уведомлений, но все плагины должны обработать событие
|
|
216
|
+
|
|
217
|
+
### 📋 Сводная таблица
|
|
218
|
+
|
|
219
|
+
| Событие | Выполнение | Прерывание | Причина |
|
|
220
|
+
| -------------- | --------------- | ---------- | -------------------------------- |
|
|
221
|
+
| `install` | Параллельно | Нет | Независимая инициализация |
|
|
222
|
+
| `activate` | Параллельно | Нет | Независимая активация |
|
|
223
|
+
| `fetch` | Последовательно | Да | Нужен один ответ |
|
|
224
|
+
| `message` | Параллельно | Нет | Все получают сообщение |
|
|
225
|
+
| `sync` | Параллельно | Нет | Независимые задачи |
|
|
226
|
+
| `periodicsync` | Параллельно | Нет | Независимые периодические задачи |
|
|
227
|
+
| `push` | Последовательно | Нет | Избегание конфликтов |
|
|
228
|
+
|
|
229
|
+
## 🛡️ Обработка ошибок
|
|
230
|
+
|
|
231
|
+
- **Единый обработчик** - все типы ошибок обрабатываются через `config.onError`
|
|
232
|
+
- **Типизированные ошибки** - третий параметр `errorType` указывает тип ошибки
|
|
233
|
+
- **Глобальные события** - автоматическая обработка `error`, `messageerror`, `unhandledrejection`, `rejectionhandled`
|
|
234
|
+
- **Изоляция ошибок** - ошибка в одном плагине не останавливает выполнение других
|
|
235
|
+
- **Безопасность** - ошибки в самих обработчиках ошибок логируются в консоль
|
|
236
|
+
|
|
237
|
+
## 📄 Лицензия
|
|
238
|
+
|
|
239
|
+
MIT © Vadim Budarin
|
package/TODO.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
- а что если нужно последовательно выполнить куяу плагинов параллельно ?
|
package/dist/index.d.ts
CHANGED
|
@@ -29,6 +29,17 @@ export interface Logger {
|
|
|
29
29
|
error: (...data: unknown[]) => void;
|
|
30
30
|
debug: (...data: unknown[]) => void;
|
|
31
31
|
}
|
|
32
|
+
export declare const SW_EVENT_INSTALL = "install";
|
|
33
|
+
export declare const SW_EVENT_ACTIVATE = "activate";
|
|
34
|
+
export declare const SW_EVENT_FETCH = "fetch";
|
|
35
|
+
export declare const SW_EVENT_MESSAGE = "message";
|
|
36
|
+
export declare const SW_EVENT_SYNC = "sync";
|
|
37
|
+
export declare const SW_EVENT_PERIODICSYNC = "periodicsync";
|
|
38
|
+
export declare const SW_EVENT_PUSH = "push";
|
|
39
|
+
export declare const SW_EVENT_ERROR = "error";
|
|
40
|
+
export declare const SW_EVENT_MESSAGEERROR = "messageerror";
|
|
41
|
+
export declare const SW_EVENT_UNHANDLEDREJECTION = "unhandledrejection";
|
|
42
|
+
export declare const SW_EVENT_REJECTIONHANDLED = "rejectionhandled";
|
|
32
43
|
interface ServiceWorkerEventHandlers {
|
|
33
44
|
install?: (event: ExtendableEvent) => void | Promise<void>;
|
|
34
45
|
activate?: (event: ExtendableEvent) => void | Promise<void>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAY,sBAAsB;IAC9B,KAAK,UAAU;IACf,aAAa,iBAAiB;IAC9B,mBAAmB,uBAAuB;IAC1C,iBAAiB,qBAAqB;IACtC,YAAY,iBAAiB;CAChC;AAED,UAAU,SAAU,SAAQ,eAAe;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAChC;AAED,UAAU,iBAAkB,SAAQ,eAAe;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACxB;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,gCAAgC;QACtC,IAAI,EAAE,SAAS,CAAC;QAChB,YAAY,EAAE,iBAAiB,CAAC;KACnC;CACJ;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxE,IAAI,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;CACL;AAED,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,17 @@ export var ServiceWorkerErrorType;
|
|
|
7
7
|
ServiceWorkerErrorType["PLUGIN_ERROR"] = "plugin_error";
|
|
8
8
|
})(ServiceWorkerErrorType || (ServiceWorkerErrorType = {}));
|
|
9
9
|
const sw = self;
|
|
10
|
+
export const SW_EVENT_INSTALL = 'install';
|
|
11
|
+
export const SW_EVENT_ACTIVATE = 'activate';
|
|
12
|
+
export const SW_EVENT_FETCH = 'fetch';
|
|
13
|
+
export const SW_EVENT_MESSAGE = 'message';
|
|
14
|
+
export const SW_EVENT_SYNC = 'sync';
|
|
15
|
+
export const SW_EVENT_PERIODICSYNC = 'periodicsync';
|
|
16
|
+
export const SW_EVENT_PUSH = 'push';
|
|
17
|
+
export const SW_EVENT_ERROR = 'error';
|
|
18
|
+
export const SW_EVENT_MESSAGEERROR = 'messageerror';
|
|
19
|
+
export const SW_EVENT_UNHANDLEDREJECTION = 'unhandledrejection';
|
|
20
|
+
export const SW_EVENT_REJECTIONHANDLED = 'rejectionhandled';
|
|
10
21
|
export function createEventHandlers(plugins, config) {
|
|
11
22
|
const handlers = {
|
|
12
23
|
install: [],
|
|
@@ -127,16 +138,16 @@ export function createEventHandlers(plugins, config) {
|
|
|
127
138
|
export function initializeServiceWorker(plugins, config) {
|
|
128
139
|
sw.logger = config.logger;
|
|
129
140
|
const handlers = createEventHandlers(plugins, config);
|
|
130
|
-
self.addEventListener(
|
|
131
|
-
self.addEventListener(
|
|
132
|
-
self.addEventListener(
|
|
133
|
-
self.addEventListener(
|
|
134
|
-
self.addEventListener(
|
|
135
|
-
self.addEventListener(
|
|
136
|
-
self.addEventListener(
|
|
137
|
-
self.addEventListener(
|
|
138
|
-
self.addEventListener(
|
|
139
|
-
self.addEventListener(
|
|
140
|
-
self.addEventListener(
|
|
141
|
+
self.addEventListener(SW_EVENT_INSTALL, handlers.install);
|
|
142
|
+
self.addEventListener(SW_EVENT_ACTIVATE, handlers.activate);
|
|
143
|
+
self.addEventListener(SW_EVENT_FETCH, handlers.fetch);
|
|
144
|
+
self.addEventListener(SW_EVENT_MESSAGE, handlers.message);
|
|
145
|
+
self.addEventListener(SW_EVENT_SYNC, handlers.sync);
|
|
146
|
+
self.addEventListener(SW_EVENT_PERIODICSYNC, handlers.periodicsync);
|
|
147
|
+
self.addEventListener(SW_EVENT_PUSH, handlers.push);
|
|
148
|
+
self.addEventListener(SW_EVENT_ERROR, handlers.error);
|
|
149
|
+
self.addEventListener(SW_EVENT_MESSAGEERROR, handlers.messageerror);
|
|
150
|
+
self.addEventListener(SW_EVENT_UNHANDLEDREJECTION, handlers.unhandledrejection);
|
|
151
|
+
self.addEventListener(SW_EVENT_REJECTIONHANDLED, handlers.rejectionhandled);
|
|
141
152
|
}
|
|
142
153
|
//# 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":"AAAA,MAAM,CAAN,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAC9B,yCAAe,CAAA;IACf,wDAA8B,CAAA;IAC9B,oEAA0C,CAAA;IAC1C,gEAAsC,CAAA;IACtC,uDAA6B,CAAA;AACjC,CAAC,EANW,sBAAsB,KAAtB,sBAAsB,QAMjC;AA+BD,MAAM,EAAE,GAAG,IAEV,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|