@budarin/pluggable-serviceworker 1.5.5 → 1.5.6
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/README.md +14 -7
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -0
- package/dist/client/register.d.ts +1 -0
- package/dist/client/register.js +22 -0
- package/dist/client/updateWhenControlled.d.ts +3 -0
- package/dist/client/updateWhenControlled.js +25 -0
- package/dist/plugins/reloadUncontrolledClients.d.ts +2 -0
- package/dist/plugins/reloadUncontrolledClients.js +15 -0
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -617,16 +617,23 @@ activateOnNextVisitServiceWorker({
|
|
|
617
617
|
});
|
|
618
618
|
```
|
|
619
619
|
|
|
620
|
-
На странице регистрируйте этот файл: `navigator.serviceWorker.register('/sw.js')` (или путь, по которому сборка отдаёт ваш sw.js).
|
|
621
|
-
|
|
622
620
|
### Публикуемые утилиты
|
|
623
621
|
|
|
624
|
-
|
|
622
|
+
| Название | Где использовать | Описание |
|
|
623
|
+
| -------------------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
624
|
+
| `registerServiceWorker(scriptURL, options?)` | клиент | Регистрация SW; при первом заходе при необходимости один автоматический reload (обход [бага браузера](https://issues.chromium.org/issues/482903583)). Импорт: `@budarin/pluggable-serviceworker/client`. |
|
|
625
|
+
| `normalizeUrl(url)` | SW | Нормализует URL (относительный → абсолютный по origin SW) для сравнения. Импорт: `@budarin/pluggable-serviceworker/utils`. |
|
|
626
|
+
| `notifyClients(messageType)` | SW | Отправляет сообщение `{ type: messageType }` всем окнам-клиентам. Импорт: `@budarin/pluggable-serviceworker/utils`. |
|
|
627
|
+
|
|
628
|
+
На странице используйте **клиентский API** библиотеки, чтобы SW корректно взял контроль уже на первой загрузке (обход [бага браузера](https://issues.chromium.org/issues/482903583)):
|
|
629
|
+
|
|
630
|
+
```typescript
|
|
631
|
+
import { registerServiceWorker } from '@budarin/pluggable-serviceworker/client';
|
|
632
|
+
|
|
633
|
+
const reg = await registerServiceWorker('/sw.js');
|
|
634
|
+
```
|
|
625
635
|
|
|
626
|
-
|
|
627
|
-
| ---------------------------- | ------------------------------------------------------------------------ |
|
|
628
|
-
| `normalizeUrl(url)` | Нормализует URL (относительный → абсолютный по origin SW) для сравнения. |
|
|
629
|
-
| `notifyClients(messageType)` | Отправляет сообщение `{ type: messageType }` всем окнам-клиентам (SW). |
|
|
636
|
+
Без этого API на первом визите страница может остаться без контроллера до перезагрузки.
|
|
630
637
|
|
|
631
638
|
## Разработка пакета плагина
|
|
632
639
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { registerServiceWorker } from './register.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { registerServiceWorker } from './register.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function registerServiceWorker(scriptURL: string, options?: RegistrationOptions): Promise<ServiceWorkerRegistration | undefined>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export async function registerServiceWorker(scriptURL, options) {
|
|
2
|
+
if (!('serviceWorker' in navigator)) {
|
|
3
|
+
return undefined;
|
|
4
|
+
}
|
|
5
|
+
const reg = await navigator.serviceWorker.register(scriptURL, options);
|
|
6
|
+
await navigator.serviceWorker.ready;
|
|
7
|
+
if (navigator.serviceWorker.controller != null) {
|
|
8
|
+
return reg;
|
|
9
|
+
}
|
|
10
|
+
const key = `pluggable-sw-reload-${reg.scope}`;
|
|
11
|
+
try {
|
|
12
|
+
if (sessionStorage.getItem(key) != null) {
|
|
13
|
+
return reg;
|
|
14
|
+
}
|
|
15
|
+
sessionStorage.setItem(key, '1');
|
|
16
|
+
location.reload();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return reg;
|
|
20
|
+
}
|
|
21
|
+
return reg;
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function updateWhenControlled(registration, options = {}) {
|
|
2
|
+
const { timeoutMs = 5000 } = options;
|
|
3
|
+
if (navigator.serviceWorker.controller != null) {
|
|
4
|
+
registration.update();
|
|
5
|
+
return Promise.resolve();
|
|
6
|
+
}
|
|
7
|
+
return new Promise((resolve) => {
|
|
8
|
+
const doUpdate = () => {
|
|
9
|
+
registration.update();
|
|
10
|
+
cleanup();
|
|
11
|
+
resolve();
|
|
12
|
+
};
|
|
13
|
+
const cleanup = () => {
|
|
14
|
+
navigator.serviceWorker.removeEventListener('controllerchange', onControllerChange);
|
|
15
|
+
clearTimeout(timer);
|
|
16
|
+
};
|
|
17
|
+
const onControllerChange = () => {
|
|
18
|
+
if (navigator.serviceWorker.controller != null) {
|
|
19
|
+
doUpdate();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
navigator.serviceWorker.addEventListener('controllerchange', onControllerChange);
|
|
23
|
+
const timer = setTimeout(doUpdate, timeoutMs);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function reloadUncontrolledClients() {
|
|
2
|
+
return {
|
|
3
|
+
name: 'reloadUncontrolledClients',
|
|
4
|
+
activate: async () => {
|
|
5
|
+
const controlled = await self.clients.matchAll({ type: 'window' });
|
|
6
|
+
if (controlled.length > 0)
|
|
7
|
+
return;
|
|
8
|
+
const all = await self.clients.matchAll({
|
|
9
|
+
type: 'window',
|
|
10
|
+
includeUncontrolled: true,
|
|
11
|
+
});
|
|
12
|
+
await Promise.all(all.map((client) => client.navigate(client.url)));
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budarin/pluggable-serviceworker",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.6",
|
|
4
4
|
"description": "Extensible via plugins service worker",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"serviceworker",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
],
|
|
22
22
|
"exports": {
|
|
23
23
|
".": "./dist/index.js",
|
|
24
|
+
"./client": "./dist/client/index.js",
|
|
24
25
|
"./plugins": "./dist/plugins/index.js",
|
|
25
26
|
"./presets": "./dist/presets/index.js",
|
|
26
27
|
"./sw": "./dist/sw/index.js",
|
|
@@ -44,6 +45,7 @@
|
|
|
44
45
|
"test:watch": "vitest",
|
|
45
46
|
"clear-caches": "sh scripts/clear-caches.sh",
|
|
46
47
|
"pnpm-install": "pnpm install",
|
|
48
|
+
"sync-workspace": "sh scripts/sync-workspace.sh",
|
|
47
49
|
"upgrade-deps": "sh scripts/upgrade-deps.sh",
|
|
48
50
|
"publish-package": "pnpm build && pnpm publish --access=public"
|
|
49
51
|
}
|