@nexim/service-worker 1.0.4 → 2.0.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/CHANGELOG.md +19 -0
- package/README.md +2 -27
- package/dist/main.cjs +21 -11
- package/dist/main.cjs.map +2 -2
- package/dist/main.d.ts +17 -6
- package/dist/main.d.ts.map +1 -1
- package/dist/main.mjs +21 -11
- package/dist/main.mjs.map +2 -2
- package/dist/main.test.d.ts +2 -0
- package/dist/main.test.d.ts.map +1 -0
- package/docs/README.md +19 -0
- package/docs/functions/registerServiceWorker.md +33 -0
- package/docs/type-aliases/ServiceWorkerEvent.md +7 -0
- package/docs/variables/serviceWorkerSignal.md +17 -0
- package/package.json +19 -11
- package/dist/main.cjs.LEGAL.txt +0 -0
- package/dist/main.mjs.LEGAL.txt +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [2.0.0](https://github.com/the-nexim/nanolib/compare/@nexim/service-worker@2.0.0-alpha.0...@nexim/service-worker@2.0.0) (2025-04-21)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @nexim/service-worker
|
|
9
|
+
|
|
10
|
+
## [2.0.0-alpha.0](https://github.com/the-nexim/nanolib/compare/@nexim/service-worker@1.0.4...@nexim/service-worker@2.0.0-alpha.0) (2025-01-19)
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
* **service-worker:** add periodic update checks for service worker ([c2b5dd9](https://github.com/the-nexim/nanolib/commit/c2b5dd971d39e484db4f2ca5e6fe9be6b5b4bd67)) by @arashagp
|
|
15
|
+
* **service-worker:** add support for configurable periodic update checks ([68ecd16](https://github.com/the-nexim/nanolib/commit/68ecd167b9c301570bc5daf18b1e2a2d62849003)) by @arashagp
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **service-worker:** correctly set redundant event ([6167dee](https://github.com/the-nexim/nanolib/commit/6167dee8d96f790d4a5dae9037feb7f55f7c2a71)) by @njfamirm
|
|
20
|
+
|
|
21
|
+
### Code Refactoring
|
|
22
|
+
|
|
23
|
+
* **service-worker:** resolve comment ([f7bfb36](https://github.com/the-nexim/nanolib/commit/f7bfb360e3b76ee877634659a88c9beba2078766)) by @arashagp
|
|
24
|
+
|
|
6
25
|
## [1.0.4](https://github.com/the-nexim/nanolib/compare/@nexim/service-worker@1.0.3...@nexim/service-worker@1.0.4) (2025-01-11)
|
|
7
26
|
|
|
8
27
|
**Note:** Version bump only for package @nexim/service-worker
|
package/README.md
CHANGED
|
@@ -20,31 +20,6 @@ npm install @nexim/service-worker
|
|
|
20
20
|
yarn add @nexim/service-worker
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
##
|
|
23
|
+
## Documentation
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Register the service worker and handle updates.
|
|
28
|
-
|
|
29
|
-
```ts
|
|
30
|
-
import {registerServiceWorker} from '@nexim/service-worker';
|
|
31
|
-
|
|
32
|
-
const serviceWorkerPath = '/service-worker.js';
|
|
33
|
-
registerServiceWorker(serviceWorkerPath);
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### serviceWorkerSignal
|
|
37
|
-
|
|
38
|
-
Signal for service worker events.
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
import {serviceWorkerSignal} from '@nexim/service-worker';
|
|
42
|
-
|
|
43
|
-
serviceWorkerSignal.subscribe(({event}) => {
|
|
44
|
-
console.log('Service worker event:', event);
|
|
45
|
-
});
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Type ServiceWorkerEvent
|
|
49
|
-
|
|
50
|
-
The events that can be emitted by the service worker.
|
|
25
|
+
Read full documentation [here](./docs/README.md).
|
package/dist/main.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* @nexim/service-worker
|
|
1
|
+
/* @nexim/service-worker v2.0.0 */
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -25,27 +25,36 @@ __export(main_exports, {
|
|
|
25
25
|
serviceWorkerSignal: () => serviceWorkerSignal
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(main_exports);
|
|
28
|
+
var import_parse_duration = require("@alwatr/parse-duration");
|
|
28
29
|
var import_flux = require("@alwatr/flux");
|
|
29
30
|
var import_logger = require("@alwatr/logger");
|
|
30
31
|
var import_package_tracer = require("@alwatr/package-tracer");
|
|
31
|
-
__dev_mode__: import_package_tracer.packageTracer.add("@nexim/service-worker", "
|
|
32
|
+
__dev_mode__: import_package_tracer.packageTracer.add("@nexim/service-worker", "2.0.0");
|
|
32
33
|
var logger = /* @__PURE__ */ (0, import_logger.createLogger)("@nexim/service-worker");
|
|
33
34
|
var serviceWorkerSignal = /* @__PURE__ */ new import_flux.AlwatrSignal({
|
|
34
35
|
name: "serviceWorker"
|
|
35
36
|
});
|
|
36
|
-
async function registerServiceWorker(
|
|
37
|
-
logger.logMethodArgs?.("registerServiceWorker", {
|
|
38
|
-
if ("serviceWorker" in navigator
|
|
37
|
+
async function registerServiceWorker(options) {
|
|
38
|
+
logger.logMethodArgs?.("registerServiceWorker", { options });
|
|
39
|
+
if (!("serviceWorker" in navigator)) {
|
|
39
40
|
logger.incident?.("registerServiceWorker", "service_worker_not_supported");
|
|
40
41
|
return;
|
|
41
42
|
}
|
|
42
43
|
try {
|
|
43
|
-
const swRegistration = await navigator.serviceWorker.register(serviceWorkerPath);
|
|
44
|
+
const swRegistration = await navigator.serviceWorker.register(options.serviceWorkerPath);
|
|
44
45
|
serviceWorkerSignal.notify({ event: "service_worker_registered" });
|
|
45
|
-
swRegistration.addEventListener("updatefound", () =>
|
|
46
|
+
swRegistration.addEventListener("updatefound", () => {
|
|
47
|
+
serviceWorkerUpdateFoundHandler(swRegistration.installing);
|
|
48
|
+
});
|
|
46
49
|
logger.logOther?.("Service worker registered.");
|
|
50
|
+
if (options.timeForAutoUpdate != null) {
|
|
51
|
+
setInterval(async () => {
|
|
52
|
+
logger.logOther?.("startPeriodicUpdateChecks");
|
|
53
|
+
await swRegistration.update();
|
|
54
|
+
}, (0, import_parse_duration.parseDuration)(options.timeForAutoUpdate));
|
|
55
|
+
}
|
|
47
56
|
} catch (error) {
|
|
48
|
-
logger.error("registerServiceWorker", "registration_failed
|
|
57
|
+
logger.error("registerServiceWorker", "registration_failed", { error });
|
|
49
58
|
serviceWorkerSignal.notify({ event: "service_worker_register_failed" });
|
|
50
59
|
}
|
|
51
60
|
}
|
|
@@ -57,7 +66,9 @@ function serviceWorkerUpdateFoundHandler(serviceWorker) {
|
|
|
57
66
|
} else {
|
|
58
67
|
serviceWorkerSignal.notify({ event: "service_worker_first_install" });
|
|
59
68
|
}
|
|
60
|
-
serviceWorker.addEventListener("statechange", () =>
|
|
69
|
+
serviceWorker.addEventListener("statechange", () => {
|
|
70
|
+
serviceWorkerStateChangeHandler(serviceWorker);
|
|
71
|
+
});
|
|
61
72
|
}
|
|
62
73
|
function serviceWorkerStateChangeHandler(serviceWorker) {
|
|
63
74
|
logger.logMethodArgs?.("serviceWorkerStateChangeHandler", { state: serviceWorker.state });
|
|
@@ -69,7 +80,7 @@ function serviceWorkerStateChangeHandler(serviceWorker) {
|
|
|
69
80
|
}
|
|
70
81
|
} else if (serviceWorker.state === "redundant") {
|
|
71
82
|
logger.accident("serviceWorkerStateChangeHandler", "sw_redundant", "Service worker redundant");
|
|
72
|
-
serviceWorkerSignal.notify({ event: "
|
|
83
|
+
serviceWorkerSignal.notify({ event: "service_worker_update_failed" });
|
|
73
84
|
}
|
|
74
85
|
}
|
|
75
86
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -77,5 +88,4 @@ function serviceWorkerStateChangeHandler(serviceWorker) {
|
|
|
77
88
|
registerServiceWorker,
|
|
78
89
|
serviceWorkerSignal
|
|
79
90
|
});
|
|
80
|
-
/*! For license information please see main.cjs.LEGAL.txt */
|
|
81
91
|
//# sourceMappingURL=main.cjs.map
|
package/dist/main.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["import {AlwatrSignal} from '@alwatr/flux';\nimport {createLogger} from '@alwatr/logger';\nimport {packageTracer} from '@alwatr/package-tracer';\n\n/**\n * The events that can be emitted by the service worker.\n */\nexport type ServiceWorkerEvent =\n | 'service_worker_registered'\n | 'service_worker_register_failed'\n | 'service_worker_first_install'\n | 'service_worker_updated'\n | 'service_worker_installed'\n | 'service_worker_update_found';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = /* @__PURE__ */ createLogger(__package_name__);\n\n/**\n * Signal for service worker events.\n *\n * @example\n *
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import { type Duration, parseDuration } from '@alwatr/parse-duration';\nimport { AlwatrSignal } from '@alwatr/flux';\nimport { createLogger } from '@alwatr/logger';\nimport { packageTracer } from '@alwatr/package-tracer';\n\n/**\n * The events that can be emitted by the service worker.\n */\nexport type ServiceWorkerEvent =\n | 'service_worker_registered'\n | 'service_worker_register_failed'\n | 'service_worker_first_install'\n | 'service_worker_updated'\n | 'service_worker_installed'\n | 'service_worker_update_found'\n | 'service_worker_update_failed';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = /* @__PURE__ */ createLogger(__package_name__);\n\n/**\n * Signal for service worker events.\n *\n * @example\n * ```ts\n * import {serviceWorkerSignal} from '@nexim/service-worker';\n *\n * serviceWorkerSignal.subscribe(({event}) => {\n * console.log('Service worker event:', event);\n * });\n * ```\n */\nexport const serviceWorkerSignal = /* @__PURE__ */ new AlwatrSignal<{ event: ServiceWorkerEvent }>({\n name: 'serviceWorker',\n});\n\n/**\n * Register the service worker and handle updates.\n *\n * @param options - An object containing the service worker path and optional auto-update time.\n * @param serviceWorkerPath - [Options] The path to the service worker.\n * @param timeForAutoUpdate - [Options] Optional duration for automatically updating the service worker.\n *\n * @example\n * ```ts\n * import {registerServiceWorker} from '@nexim/service-worker';\n *\n * const serviceWorkerPath = '/service-worker.js';\n *\n * // without auto update\n * registerServiceWorker({ serviceWorkerPath });\n *\n * // with auto update\n * registerServiceWorker({ serviceWorkerPath, timeForAutoUpdate: '10m' });\n * ```\n */\nexport async function registerServiceWorker(options: { serviceWorkerPath: string; timeForAutoUpdate?: Duration }): Promise<void> {\n logger.logMethodArgs?.('registerServiceWorker', { options });\n if (!('serviceWorker' in navigator)) {\n logger.incident?.('registerServiceWorker', 'service_worker_not_supported');\n return;\n }\n\n try {\n const swRegistration = await navigator.serviceWorker.register(options.serviceWorkerPath);\n serviceWorkerSignal.notify({ event: 'service_worker_registered' });\n swRegistration.addEventListener('updatefound', () => {\n serviceWorkerUpdateFoundHandler(swRegistration.installing);\n });\n logger.logOther?.('Service worker registered.');\n\n if (options.timeForAutoUpdate != null) {\n setInterval(async () => {\n logger.logOther?.('startPeriodicUpdateChecks');\n\n await swRegistration.update();\n }, parseDuration(options.timeForAutoUpdate));\n }\n }\n catch (error) {\n logger.error('registerServiceWorker', 'registration_failed', { error });\n serviceWorkerSignal.notify({ event: 'service_worker_register_failed' });\n }\n}\n\n/**\n * Handle the 'updatefound' event\n *\n * @param serviceWorker - The service worker\n */\nfunction serviceWorkerUpdateFoundHandler(serviceWorker: ServiceWorker | null): void {\n if (serviceWorker == null) return;\n logger.logMethod?.('swUpdateFound');\n\n // Only notify update found if there's an existing controller\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({ event: 'service_worker_update_found' });\n }\n else {\n serviceWorkerSignal.notify({ event: 'service_worker_first_install' });\n }\n\n serviceWorker.addEventListener('statechange', () => {\n serviceWorkerStateChangeHandler(serviceWorker);\n });\n}\n\n/**\n * Handle the 'statechange' event.\n *\n * If the service worker state is 'installed' then it is either a new install or an update.\n * If the service worker state is 'redundant' then the service worker is redundant.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/state\n *\n * @param serviceWorker - The service worker.\n */\nfunction serviceWorkerStateChangeHandler(serviceWorker: ServiceWorker): void {\n logger.logMethodArgs?.('serviceWorkerStateChangeHandler', { state: serviceWorker.state });\n\n if (serviceWorker.state === 'installed') {\n // if old controller available then its update else its new install\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({ event: 'service_worker_updated' });\n }\n else {\n serviceWorkerSignal.notify({ event: 'service_worker_installed' });\n }\n }\n else if (serviceWorker.state === 'redundant') {\n logger.accident('serviceWorkerStateChangeHandler', 'sw_redundant', 'Service worker redundant');\n serviceWorkerSignal.notify({ event: 'service_worker_update_failed' });\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAA6C;AAC7C,kBAA6B;AAC7B,oBAA6B;AAC7B,4BAA8B;AAc9B,aAAc,qCAAc,IAAI,yBAAkB,OAAmB;AAErE,IAAM,SAAyB,gDAAa,uBAAgB;AAcrD,IAAM,sBAAsC,oBAAI,yBAA4C;AAAA,EACjG,MAAM;AACR,CAAC;AAsBD,eAAsB,sBAAsB,SAAqF;AAC/H,SAAO,gBAAgB,yBAAyB,EAAE,QAAQ,CAAC;AAC3D,MAAI,EAAE,mBAAmB,YAAY;AACnC,WAAO,WAAW,yBAAyB,8BAA8B;AACzE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,UAAU,cAAc,SAAS,QAAQ,iBAAiB;AACvF,wBAAoB,OAAO,EAAE,OAAO,4BAA4B,CAAC;AACjE,mBAAe,iBAAiB,eAAe,MAAM;AACnD,sCAAgC,eAAe,UAAU;AAAA,IAC3D,CAAC;AACD,WAAO,WAAW,4BAA4B;AAE9C,QAAI,QAAQ,qBAAqB,MAAM;AACrC,kBAAY,YAAY;AACtB,eAAO,WAAW,2BAA2B;AAE7C,cAAM,eAAe,OAAO;AAAA,MAC9B,OAAG,qCAAc,QAAQ,iBAAiB,CAAC;AAAA,IAC7C;AAAA,EACF,SACO,OAAO;AACZ,WAAO,MAAM,yBAAyB,uBAAuB,EAAE,MAAM,CAAC;AACtE,wBAAoB,OAAO,EAAE,OAAO,iCAAiC,CAAC;AAAA,EACxE;AACF;AAOA,SAAS,gCAAgC,eAA2C;AAClF,MAAI,iBAAiB,KAAM;AAC3B,SAAO,YAAY,eAAe;AAGlC,MAAI,UAAU,cAAc,YAAY;AACtC,wBAAoB,OAAO,EAAE,OAAO,8BAA8B,CAAC;AAAA,EACrE,OACK;AACH,wBAAoB,OAAO,EAAE,OAAO,+BAA+B,CAAC;AAAA,EACtE;AAEA,gBAAc,iBAAiB,eAAe,MAAM;AAClD,oCAAgC,aAAa;AAAA,EAC/C,CAAC;AACH;AAYA,SAAS,gCAAgC,eAAoC;AAC3E,SAAO,gBAAgB,mCAAmC,EAAE,OAAO,cAAc,MAAM,CAAC;AAExF,MAAI,cAAc,UAAU,aAAa;AAEvC,QAAI,UAAU,cAAc,YAAY;AACtC,0BAAoB,OAAO,EAAE,OAAO,yBAAyB,CAAC;AAAA,IAChE,OACK;AACH,0BAAoB,OAAO,EAAE,OAAO,2BAA2B,CAAC;AAAA,IAClE;AAAA,EACF,WACS,cAAc,UAAU,aAAa;AAC5C,WAAO,SAAS,mCAAmC,gBAAgB,0BAA0B;AAC7F,wBAAoB,OAAO,EAAE,OAAO,+BAA+B,CAAC;AAAA,EACtE;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/main.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import { type Duration } from '@alwatr/parse-duration';
|
|
1
2
|
import { AlwatrSignal } from '@alwatr/flux';
|
|
2
3
|
/**
|
|
3
4
|
* The events that can be emitted by the service worker.
|
|
4
5
|
*/
|
|
5
|
-
export type ServiceWorkerEvent = 'service_worker_registered' | 'service_worker_register_failed' | 'service_worker_first_install' | 'service_worker_updated' | 'service_worker_installed' | 'service_worker_update_found';
|
|
6
|
+
export type ServiceWorkerEvent = 'service_worker_registered' | 'service_worker_register_failed' | 'service_worker_first_install' | 'service_worker_updated' | 'service_worker_installed' | 'service_worker_update_found' | 'service_worker_update_failed';
|
|
6
7
|
/**
|
|
7
8
|
* Signal for service worker events.
|
|
8
9
|
*
|
|
9
10
|
* @example
|
|
10
|
-
* ```
|
|
11
|
+
* ```ts
|
|
11
12
|
* import {serviceWorkerSignal} from '@nexim/service-worker';
|
|
12
13
|
*
|
|
13
14
|
* serviceWorkerSignal.subscribe(({event}) => {
|
|
@@ -21,15 +22,25 @@ export declare const serviceWorkerSignal: AlwatrSignal<{
|
|
|
21
22
|
/**
|
|
22
23
|
* Register the service worker and handle updates.
|
|
23
24
|
*
|
|
24
|
-
* @param
|
|
25
|
+
* @param options - An object containing the service worker path and optional auto-update time.
|
|
26
|
+
* @param serviceWorkerPath - [Options] The path to the service worker.
|
|
27
|
+
* @param timeForAutoUpdate - [Options] Optional duration for automatically updating the service worker.
|
|
25
28
|
*
|
|
26
29
|
* @example
|
|
27
|
-
* ```
|
|
30
|
+
* ```ts
|
|
28
31
|
* import {registerServiceWorker} from '@nexim/service-worker';
|
|
29
32
|
*
|
|
30
33
|
* const serviceWorkerPath = '/service-worker.js';
|
|
31
|
-
*
|
|
34
|
+
*
|
|
35
|
+
* // without auto update
|
|
36
|
+
* registerServiceWorker({ serviceWorkerPath });
|
|
37
|
+
*
|
|
38
|
+
* // with auto update
|
|
39
|
+
* registerServiceWorker({ serviceWorkerPath, timeForAutoUpdate: '10m' });
|
|
32
40
|
* ```
|
|
33
41
|
*/
|
|
34
|
-
export declare function registerServiceWorker(
|
|
42
|
+
export declare function registerServiceWorker(options: {
|
|
43
|
+
serviceWorkerPath: string;
|
|
44
|
+
timeForAutoUpdate?: Duration;
|
|
45
|
+
}): Promise<void>;
|
|
35
46
|
//# sourceMappingURL=main.d.ts.map
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI5C;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,2BAA2B,GAC3B,gCAAgC,GAChC,8BAA8B,GAC9B,wBAAwB,GACxB,0BAA0B,GAC1B,6BAA6B,GAC7B,8BAA8B,CAAC;AAMnC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB;WAA6C,kBAAkB;EAE7F,CAAC;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B/H"}
|
package/dist/main.mjs
CHANGED
|
@@ -1,27 +1,36 @@
|
|
|
1
|
-
/* @nexim/service-worker
|
|
1
|
+
/* @nexim/service-worker v2.0.0 */
|
|
2
2
|
|
|
3
3
|
// src/main.ts
|
|
4
|
+
import { parseDuration } from "@alwatr/parse-duration";
|
|
4
5
|
import { AlwatrSignal } from "@alwatr/flux";
|
|
5
6
|
import { createLogger } from "@alwatr/logger";
|
|
6
7
|
import { packageTracer } from "@alwatr/package-tracer";
|
|
7
|
-
__dev_mode__: packageTracer.add("@nexim/service-worker", "
|
|
8
|
+
__dev_mode__: packageTracer.add("@nexim/service-worker", "2.0.0");
|
|
8
9
|
var logger = /* @__PURE__ */ createLogger("@nexim/service-worker");
|
|
9
10
|
var serviceWorkerSignal = /* @__PURE__ */ new AlwatrSignal({
|
|
10
11
|
name: "serviceWorker"
|
|
11
12
|
});
|
|
12
|
-
async function registerServiceWorker(
|
|
13
|
-
logger.logMethodArgs?.("registerServiceWorker", {
|
|
14
|
-
if ("serviceWorker" in navigator
|
|
13
|
+
async function registerServiceWorker(options) {
|
|
14
|
+
logger.logMethodArgs?.("registerServiceWorker", { options });
|
|
15
|
+
if (!("serviceWorker" in navigator)) {
|
|
15
16
|
logger.incident?.("registerServiceWorker", "service_worker_not_supported");
|
|
16
17
|
return;
|
|
17
18
|
}
|
|
18
19
|
try {
|
|
19
|
-
const swRegistration = await navigator.serviceWorker.register(serviceWorkerPath);
|
|
20
|
+
const swRegistration = await navigator.serviceWorker.register(options.serviceWorkerPath);
|
|
20
21
|
serviceWorkerSignal.notify({ event: "service_worker_registered" });
|
|
21
|
-
swRegistration.addEventListener("updatefound", () =>
|
|
22
|
+
swRegistration.addEventListener("updatefound", () => {
|
|
23
|
+
serviceWorkerUpdateFoundHandler(swRegistration.installing);
|
|
24
|
+
});
|
|
22
25
|
logger.logOther?.("Service worker registered.");
|
|
26
|
+
if (options.timeForAutoUpdate != null) {
|
|
27
|
+
setInterval(async () => {
|
|
28
|
+
logger.logOther?.("startPeriodicUpdateChecks");
|
|
29
|
+
await swRegistration.update();
|
|
30
|
+
}, parseDuration(options.timeForAutoUpdate));
|
|
31
|
+
}
|
|
23
32
|
} catch (error) {
|
|
24
|
-
logger.error("registerServiceWorker", "registration_failed
|
|
33
|
+
logger.error("registerServiceWorker", "registration_failed", { error });
|
|
25
34
|
serviceWorkerSignal.notify({ event: "service_worker_register_failed" });
|
|
26
35
|
}
|
|
27
36
|
}
|
|
@@ -33,7 +42,9 @@ function serviceWorkerUpdateFoundHandler(serviceWorker) {
|
|
|
33
42
|
} else {
|
|
34
43
|
serviceWorkerSignal.notify({ event: "service_worker_first_install" });
|
|
35
44
|
}
|
|
36
|
-
serviceWorker.addEventListener("statechange", () =>
|
|
45
|
+
serviceWorker.addEventListener("statechange", () => {
|
|
46
|
+
serviceWorkerStateChangeHandler(serviceWorker);
|
|
47
|
+
});
|
|
37
48
|
}
|
|
38
49
|
function serviceWorkerStateChangeHandler(serviceWorker) {
|
|
39
50
|
logger.logMethodArgs?.("serviceWorkerStateChangeHandler", { state: serviceWorker.state });
|
|
@@ -45,12 +56,11 @@ function serviceWorkerStateChangeHandler(serviceWorker) {
|
|
|
45
56
|
}
|
|
46
57
|
} else if (serviceWorker.state === "redundant") {
|
|
47
58
|
logger.accident("serviceWorkerStateChangeHandler", "sw_redundant", "Service worker redundant");
|
|
48
|
-
serviceWorkerSignal.notify({ event: "
|
|
59
|
+
serviceWorkerSignal.notify({ event: "service_worker_update_failed" });
|
|
49
60
|
}
|
|
50
61
|
}
|
|
51
62
|
export {
|
|
52
63
|
registerServiceWorker,
|
|
53
64
|
serviceWorkerSignal
|
|
54
65
|
};
|
|
55
|
-
/*! For license information please see main.mjs.LEGAL.txt */
|
|
56
66
|
//# sourceMappingURL=main.mjs.map
|
package/dist/main.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["import {AlwatrSignal} from '@alwatr/flux';\nimport {createLogger} from '@alwatr/logger';\nimport {packageTracer} from '@alwatr/package-tracer';\n\n/**\n * The events that can be emitted by the service worker.\n */\nexport type ServiceWorkerEvent =\n | 'service_worker_registered'\n | 'service_worker_register_failed'\n | 'service_worker_first_install'\n | 'service_worker_updated'\n | 'service_worker_installed'\n | 'service_worker_update_found';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = /* @__PURE__ */ createLogger(__package_name__);\n\n/**\n * Signal for service worker events.\n *\n * @example\n *
|
|
5
|
-
"mappings": ";;;AAAA,
|
|
4
|
+
"sourcesContent": ["import { type Duration, parseDuration } from '@alwatr/parse-duration';\nimport { AlwatrSignal } from '@alwatr/flux';\nimport { createLogger } from '@alwatr/logger';\nimport { packageTracer } from '@alwatr/package-tracer';\n\n/**\n * The events that can be emitted by the service worker.\n */\nexport type ServiceWorkerEvent =\n | 'service_worker_registered'\n | 'service_worker_register_failed'\n | 'service_worker_first_install'\n | 'service_worker_updated'\n | 'service_worker_installed'\n | 'service_worker_update_found'\n | 'service_worker_update_failed';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = /* @__PURE__ */ createLogger(__package_name__);\n\n/**\n * Signal for service worker events.\n *\n * @example\n * ```ts\n * import {serviceWorkerSignal} from '@nexim/service-worker';\n *\n * serviceWorkerSignal.subscribe(({event}) => {\n * console.log('Service worker event:', event);\n * });\n * ```\n */\nexport const serviceWorkerSignal = /* @__PURE__ */ new AlwatrSignal<{ event: ServiceWorkerEvent }>({\n name: 'serviceWorker',\n});\n\n/**\n * Register the service worker and handle updates.\n *\n * @param options - An object containing the service worker path and optional auto-update time.\n * @param serviceWorkerPath - [Options] The path to the service worker.\n * @param timeForAutoUpdate - [Options] Optional duration for automatically updating the service worker.\n *\n * @example\n * ```ts\n * import {registerServiceWorker} from '@nexim/service-worker';\n *\n * const serviceWorkerPath = '/service-worker.js';\n *\n * // without auto update\n * registerServiceWorker({ serviceWorkerPath });\n *\n * // with auto update\n * registerServiceWorker({ serviceWorkerPath, timeForAutoUpdate: '10m' });\n * ```\n */\nexport async function registerServiceWorker(options: { serviceWorkerPath: string; timeForAutoUpdate?: Duration }): Promise<void> {\n logger.logMethodArgs?.('registerServiceWorker', { options });\n if (!('serviceWorker' in navigator)) {\n logger.incident?.('registerServiceWorker', 'service_worker_not_supported');\n return;\n }\n\n try {\n const swRegistration = await navigator.serviceWorker.register(options.serviceWorkerPath);\n serviceWorkerSignal.notify({ event: 'service_worker_registered' });\n swRegistration.addEventListener('updatefound', () => {\n serviceWorkerUpdateFoundHandler(swRegistration.installing);\n });\n logger.logOther?.('Service worker registered.');\n\n if (options.timeForAutoUpdate != null) {\n setInterval(async () => {\n logger.logOther?.('startPeriodicUpdateChecks');\n\n await swRegistration.update();\n }, parseDuration(options.timeForAutoUpdate));\n }\n }\n catch (error) {\n logger.error('registerServiceWorker', 'registration_failed', { error });\n serviceWorkerSignal.notify({ event: 'service_worker_register_failed' });\n }\n}\n\n/**\n * Handle the 'updatefound' event\n *\n * @param serviceWorker - The service worker\n */\nfunction serviceWorkerUpdateFoundHandler(serviceWorker: ServiceWorker | null): void {\n if (serviceWorker == null) return;\n logger.logMethod?.('swUpdateFound');\n\n // Only notify update found if there's an existing controller\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({ event: 'service_worker_update_found' });\n }\n else {\n serviceWorkerSignal.notify({ event: 'service_worker_first_install' });\n }\n\n serviceWorker.addEventListener('statechange', () => {\n serviceWorkerStateChangeHandler(serviceWorker);\n });\n}\n\n/**\n * Handle the 'statechange' event.\n *\n * If the service worker state is 'installed' then it is either a new install or an update.\n * If the service worker state is 'redundant' then the service worker is redundant.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/state\n *\n * @param serviceWorker - The service worker.\n */\nfunction serviceWorkerStateChangeHandler(serviceWorker: ServiceWorker): void {\n logger.logMethodArgs?.('serviceWorkerStateChangeHandler', { state: serviceWorker.state });\n\n if (serviceWorker.state === 'installed') {\n // if old controller available then its update else its new install\n if (navigator.serviceWorker.controller) {\n serviceWorkerSignal.notify({ event: 'service_worker_updated' });\n }\n else {\n serviceWorkerSignal.notify({ event: 'service_worker_installed' });\n }\n }\n else if (serviceWorker.state === 'redundant') {\n logger.accident('serviceWorkerStateChangeHandler', 'sw_redundant', 'Service worker redundant');\n serviceWorkerSignal.notify({ event: 'service_worker_update_failed' });\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;AAAA,SAAwB,qBAAqB;AAC7C,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAc9B,aAAc,eAAc,IAAI,yBAAkB,OAAmB;AAErE,IAAM,SAAyB,6BAAa,uBAAgB;AAcrD,IAAM,sBAAsC,oBAAI,aAA4C;AAAA,EACjG,MAAM;AACR,CAAC;AAsBD,eAAsB,sBAAsB,SAAqF;AAC/H,SAAO,gBAAgB,yBAAyB,EAAE,QAAQ,CAAC;AAC3D,MAAI,EAAE,mBAAmB,YAAY;AACnC,WAAO,WAAW,yBAAyB,8BAA8B;AACzE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,UAAU,cAAc,SAAS,QAAQ,iBAAiB;AACvF,wBAAoB,OAAO,EAAE,OAAO,4BAA4B,CAAC;AACjE,mBAAe,iBAAiB,eAAe,MAAM;AACnD,sCAAgC,eAAe,UAAU;AAAA,IAC3D,CAAC;AACD,WAAO,WAAW,4BAA4B;AAE9C,QAAI,QAAQ,qBAAqB,MAAM;AACrC,kBAAY,YAAY;AACtB,eAAO,WAAW,2BAA2B;AAE7C,cAAM,eAAe,OAAO;AAAA,MAC9B,GAAG,cAAc,QAAQ,iBAAiB,CAAC;AAAA,IAC7C;AAAA,EACF,SACO,OAAO;AACZ,WAAO,MAAM,yBAAyB,uBAAuB,EAAE,MAAM,CAAC;AACtE,wBAAoB,OAAO,EAAE,OAAO,iCAAiC,CAAC;AAAA,EACxE;AACF;AAOA,SAAS,gCAAgC,eAA2C;AAClF,MAAI,iBAAiB,KAAM;AAC3B,SAAO,YAAY,eAAe;AAGlC,MAAI,UAAU,cAAc,YAAY;AACtC,wBAAoB,OAAO,EAAE,OAAO,8BAA8B,CAAC;AAAA,EACrE,OACK;AACH,wBAAoB,OAAO,EAAE,OAAO,+BAA+B,CAAC;AAAA,EACtE;AAEA,gBAAc,iBAAiB,eAAe,MAAM;AAClD,oCAAgC,aAAa;AAAA,EAC/C,CAAC;AACH;AAYA,SAAS,gCAAgC,eAAoC;AAC3E,SAAO,gBAAgB,mCAAmC,EAAE,OAAO,cAAc,MAAM,CAAC;AAExF,MAAI,cAAc,UAAU,aAAa;AAEvC,QAAI,UAAU,cAAc,YAAY;AACtC,0BAAoB,OAAO,EAAE,OAAO,yBAAyB,CAAC;AAAA,IAChE,OACK;AACH,0BAAoB,OAAO,EAAE,OAAO,2BAA2B,CAAC;AAAA,IAClE;AAAA,EACF,WACS,cAAc,UAAU,aAAa;AAC5C,WAAO,SAAS,mCAAmC,gBAAgB,0BAA0B;AAC7F,wBAAoB,OAAO,EAAE,OAAO,+BAA+B,CAAC;AAAA,EACtE;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.test.d.ts","sourceRoot":"","sources":["../src/main.test.js"],"names":[],"mappings":""}
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @nexim/service-worker
|
|
2
|
+
|
|
3
|
+
## Type Aliases
|
|
4
|
+
|
|
5
|
+
| Type Alias | Description |
|
|
6
|
+
| -------------------------------------------------------- | ----------------------------------------------------- |
|
|
7
|
+
| [ServiceWorkerEvent](type-aliases/ServiceWorkerEvent.md) | The events that can be emitted by the service worker. |
|
|
8
|
+
|
|
9
|
+
## Variables
|
|
10
|
+
|
|
11
|
+
| Variable | Description |
|
|
12
|
+
| ------------------------------------------------------- | --------------------------------- |
|
|
13
|
+
| [serviceWorkerSignal](variables/serviceWorkerSignal.md) | Signal for service worker events. |
|
|
14
|
+
|
|
15
|
+
## Functions
|
|
16
|
+
|
|
17
|
+
| Function | Description |
|
|
18
|
+
| ----------------------------------------------------------- | ----------------------------------------------- |
|
|
19
|
+
| [registerServiceWorker](functions/registerServiceWorker.md) | Register the service worker and handle updates. |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
[@nexim/service-worker](../README.md) / registerServiceWorker
|
|
2
|
+
|
|
3
|
+
# Function: registerServiceWorker()
|
|
4
|
+
|
|
5
|
+
> **registerServiceWorker**(`options`: `object`): `Promise`\<`void`\>
|
|
6
|
+
|
|
7
|
+
Register the service worker and handle updates.
|
|
8
|
+
|
|
9
|
+
## Parameters
|
|
10
|
+
|
|
11
|
+
| Parameter | Type | Description |
|
|
12
|
+
| ---------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------- |
|
|
13
|
+
| `options` | \{ `serviceWorkerPath`: `string`; `timeForAutoUpdate`: `Duration`; \} | An object containing the service worker path and optional auto-update time. |
|
|
14
|
+
| `options.serviceWorkerPath` | `string` | - |
|
|
15
|
+
| `options.timeForAutoUpdate?` | `Duration` | - |
|
|
16
|
+
|
|
17
|
+
## Returns
|
|
18
|
+
|
|
19
|
+
`Promise`\<`void`\>
|
|
20
|
+
|
|
21
|
+
## Example
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { registerServiceWorker } from '@nexim/service-worker';
|
|
25
|
+
|
|
26
|
+
const serviceWorkerPath = '/service-worker.js';
|
|
27
|
+
|
|
28
|
+
// without auto update
|
|
29
|
+
registerServiceWorker({ serviceWorkerPath });
|
|
30
|
+
|
|
31
|
+
// with auto update
|
|
32
|
+
registerServiceWorker({ serviceWorkerPath, timeForAutoUpdate: '10m' });
|
|
33
|
+
```
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
[@nexim/service-worker](../README.md) / ServiceWorkerEvent
|
|
2
|
+
|
|
3
|
+
# Type Alias: ServiceWorkerEvent
|
|
4
|
+
|
|
5
|
+
> **ServiceWorkerEvent** = `"service_worker_registered"` \| `"service_worker_register_failed"` \| `"service_worker_first_install"` \| `"service_worker_updated"` \| `"service_worker_installed"` \| `"service_worker_update_found"` \| `"service_worker_update_failed"`
|
|
6
|
+
|
|
7
|
+
The events that can be emitted by the service worker.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
[@nexim/service-worker](../README.md) / serviceWorkerSignal
|
|
2
|
+
|
|
3
|
+
# Variable: serviceWorkerSignal
|
|
4
|
+
|
|
5
|
+
> `const` **serviceWorkerSignal**: `AlwatrSignal`\<\{ `event`: [`ServiceWorkerEvent`](../type-aliases/ServiceWorkerEvent.md); \}\>
|
|
6
|
+
|
|
7
|
+
Signal for service worker events.
|
|
8
|
+
|
|
9
|
+
## Example
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { serviceWorkerSignal } from '@nexim/service-worker';
|
|
13
|
+
|
|
14
|
+
serviceWorkerSignal.subscribe(({ event }) => {
|
|
15
|
+
console.log('Service worker event:', event);
|
|
16
|
+
});
|
|
17
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexim/service-worker",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Utilities to simplify the usage of service workers in your web applications.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"worker",
|
|
@@ -40,21 +40,26 @@
|
|
|
40
40
|
],
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "wireit",
|
|
43
|
+
"doc": "wireit",
|
|
43
44
|
"test": "wireit",
|
|
44
45
|
"watch": "wireit"
|
|
45
46
|
},
|
|
46
47
|
"dependencies": {
|
|
47
|
-
"@alwatr/flux": "^4.0.
|
|
48
|
-
"@alwatr/logger": "^5.
|
|
49
|
-
"@alwatr/package-tracer": "^5.
|
|
48
|
+
"@alwatr/flux": "^4.0.5",
|
|
49
|
+
"@alwatr/logger": "^5.5.3",
|
|
50
|
+
"@alwatr/package-tracer": "^5.5.3",
|
|
51
|
+
"@alwatr/parse-duration": "^5.5.4"
|
|
50
52
|
},
|
|
51
53
|
"devDependencies": {
|
|
52
|
-
"@alwatr/nano-build": "^5.
|
|
53
|
-
"@alwatr/type-helper": "^5.
|
|
54
|
+
"@alwatr/nano-build": "^5.5.3",
|
|
55
|
+
"@alwatr/type-helper": "^5.4.1",
|
|
54
56
|
"@nexim/typescript-config": "^2.0.0",
|
|
55
57
|
"ava": "^6.2.0",
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
+
"typedoc": "^0.28.3",
|
|
59
|
+
"typedoc-plugin-markdown": "^4.6.2",
|
|
60
|
+
"typedoc-plugin-no-inherit": "^1.6.1",
|
|
61
|
+
"typescript": "^5.8.3",
|
|
62
|
+
"wireit": "^0.14.12"
|
|
58
63
|
},
|
|
59
64
|
"publishConfig": {
|
|
60
65
|
"access": "public"
|
|
@@ -70,7 +75,7 @@
|
|
|
70
75
|
]
|
|
71
76
|
},
|
|
72
77
|
"build:es": {
|
|
73
|
-
"command": "nano-build --preset=module",
|
|
78
|
+
"command": "yarn nano-build --preset=module",
|
|
74
79
|
"files": [
|
|
75
80
|
"src",
|
|
76
81
|
"tsconfig.json"
|
|
@@ -95,9 +100,12 @@
|
|
|
95
100
|
"service": true
|
|
96
101
|
},
|
|
97
102
|
"watch:es": {
|
|
98
|
-
"command": "nano-build --preset=module --watch",
|
|
103
|
+
"command": "yarn nano-build --preset=module --watch",
|
|
99
104
|
"service": true
|
|
105
|
+
},
|
|
106
|
+
"doc": {
|
|
107
|
+
"command": "typedoc"
|
|
100
108
|
}
|
|
101
109
|
},
|
|
102
|
-
"gitHead": "
|
|
110
|
+
"gitHead": "274503ac545a83a930686f09205cb3ed06ab475d"
|
|
103
111
|
}
|
package/dist/main.cjs.LEGAL.txt
DELETED
|
File without changes
|
package/dist/main.mjs.LEGAL.txt
DELETED
|
File without changes
|