@budarin/pluggable-serviceworker 1.5.5 → 1.5.7
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 +16 -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,25 @@ activateOnNextVisitServiceWorker({
|
|
|
617
617
|
});
|
|
618
618
|
```
|
|
619
619
|
|
|
620
|
-
На странице регистрируйте этот файл: `navigator.serviceWorker.register('/sw.js')` (или путь, по которому сборка отдаёт ваш sw.js).
|
|
621
|
-
|
|
622
620
|
### Публикуемые утилиты
|
|
623
621
|
|
|
624
|
-
|
|
622
|
+
| Название | Где использовать | Описание |
|
|
623
|
+
| --------------------------------------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
624
|
+
| `registerServiceWorkerWithClaimWorkaround(scriptURL, options?)` | клиент | Регистрация SW для случая, когда в activate вызывается claim(); при первом заходе при необходимости один автоматический 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 корректно взял контроль уже на первой загрузке если сервисворкер использует `claim()` для того, чтобы сразу же установить контроль над страницей (обход [бага браузера](https://issues.chromium.org/issues/482903583)):
|
|
629
|
+
|
|
630
|
+
```typescript
|
|
631
|
+
import { registerServiceWorkerWithClaimWorkaround } from '@budarin/pluggable-serviceworker/client';
|
|
632
|
+
|
|
633
|
+
const reg = await registerServiceWorkerWithClaimWorkaround('/sw.js', {
|
|
634
|
+
type: 'module',
|
|
635
|
+
});
|
|
636
|
+
```
|
|
625
637
|
|
|
626
|
-
|
|
627
|
-
| ---------------------------- | ------------------------------------------------------------------------ |
|
|
628
|
-
| `normalizeUrl(url)` | Нормализует URL (относительный → абсолютный по origin SW) для сравнения. |
|
|
629
|
-
| `notifyClients(messageType)` | Отправляет сообщение `{ type: messageType }` всем окнам-клиентам (SW). |
|
|
638
|
+
Без этого API на первом визите страница может остаться без контроллера до перезагрузки.
|
|
630
639
|
|
|
631
640
|
## Разработка пакета плагина
|
|
632
641
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { registerServiceWorkerWithClaimWorkaround } from './register.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { registerServiceWorkerWithClaimWorkaround } from './register.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function registerServiceWorkerWithClaimWorkaround(scriptURL: string, options?: RegistrationOptions): Promise<ServiceWorkerRegistration | undefined>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export async function registerServiceWorkerWithClaimWorkaround(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.7",
|
|
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
|
}
|