@reidelsaltres/pureper 0.2.15 → 0.2.18
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/out/foundation/Fetcher.d.ts.map +1 -1
- package/out/foundation/Fetcher.js +8 -13
- package/out/foundation/Fetcher.js.map +1 -1
- package/out/foundation/Injection.d.ts +87 -0
- package/out/foundation/Injection.d.ts.map +1 -0
- package/out/foundation/Injection.js +149 -0
- package/out/foundation/Injection.js.map +1 -0
- package/out/foundation/Triplet.d.ts +30 -25
- package/out/foundation/Triplet.d.ts.map +1 -1
- package/out/foundation/Triplet.js +96 -115
- package/out/foundation/Triplet.js.map +1 -1
- package/out/foundation/TripletDecorator.d.ts +11 -0
- package/out/foundation/TripletDecorator.d.ts.map +1 -1
- package/out/foundation/TripletDecorator.js +25 -8
- package/out/foundation/TripletDecorator.js.map +1 -1
- package/out/foundation/component_api/UniHtml.d.ts +5 -1
- package/out/foundation/component_api/UniHtml.d.ts.map +1 -1
- package/out/foundation/component_api/UniHtml.js +23 -5
- package/out/foundation/component_api/UniHtml.js.map +1 -1
- package/out/foundation/worker/ServiceWorker.d.ts +48 -17
- package/out/foundation/worker/ServiceWorker.d.ts.map +1 -1
- package/out/foundation/worker/ServiceWorker.js +186 -119
- package/out/foundation/worker/ServiceWorker.js.map +1 -1
- package/out/index.d.ts +4 -3
- package/out/index.d.ts.map +1 -1
- package/out/index.js +3 -2
- package/out/index.js.map +1 -1
- package/package.json +1 -1
- package/src/foundation/Fetcher.ts +9 -14
- package/src/foundation/Injection.ts +183 -0
- package/src/foundation/Triplet.ts +114 -141
- package/src/foundation/TripletDecorator.ts +32 -8
- package/src/foundation/component_api/UniHtml.ts +26 -5
- package/src/foundation/worker/ServiceWorker.ts +203 -129
- package/src/foundation/worker/serviceworker.js +191 -0
- package/src/index.ts +8 -5
- package/out/foundation/worker/serviceworker.d.ts +0 -1
- package/out/foundation/worker/serviceworker.d.ts.map +0 -1
- package/out/foundation/worker/serviceworker.js +0 -2
- package/out/foundation/worker/serviceworker.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Triplet.js","sourceRoot":"","sources":["../../src/foundation/Triplet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Triplet.js","sourceRoot":"","sources":["../../src/foundation/Triplet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,IAAI,MAAM,yBAAyB,CAAC;AAC3C,OAAO,SAAS,MAAM,8BAA8B,CAAC;AAErD,OAAO,cAAkC,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAwB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEnF,MAAM,CAAC,MAAM,QAAQ,GAAmB,EAAE,CAAC;AAE3C,MAAM,CAAN,IAAY,UAKX;AALD,WAAY,UAAU;IAClB,2CAAQ,CAAA;IACR,iDAAgB,CAAA;IAChB,+CAAe,CAAA;IACf,2CAAuB,CAAA;AAC3B,CAAC,EALW,UAAU,KAAV,UAAU,QAKrB;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IACP,MAAM,CAAa;IACnB,eAAe,CAAU;IACzB,cAAc,CAAiB;IAEhD,YAAmB,MAAqB,EAAE,QAAiB;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC;QAE/C,MAAM,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,SAAS,CAAC;QACzD,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAyB,EAAE,IAAY;QACzD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEnD,kFAAkF;QAClF,IAAI,WAAW,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,8BAA8B,IAAI,CAAC,cAAc,CAAC,IAAI,oCAAoC,IAAI,GAAG,CAAC,CAAC;YAChH,OAAO;QACX,CAAC;QAED,wDAAwD;QACxD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;gBACf,MAAM,SAAS,GAAG,IAAI,CAAC;gBACvB,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;oBAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAG,CAAC;oBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;oBAElC,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE;wBACrB,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC;wBACvC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;wBAC3D,IAAI,CAAC,SAAS;4BAAE,OAAO,EAAE,CAAC;wBAC1B,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACtE,CAAC,CAAC,EAAE,CAAC;oBAEL,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;oBAElC,8DAA8D;oBAC7D,QAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBACzC,QAAgB,CAAC,qBAAqB,GAAG,IAAI,CAAC;oBAC/C,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAEpC,OAAO,QAAQ,CAAC;gBACpB,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,IAAI,CAAC,4BAA4B,IAAI,6BAA6B,CAAC,CAAC;YAChF,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;gBACf,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,uBAAuB,CAAC,CAAC;gBAEpE,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,IAAI,SAAS,CAAC;gBACtD,MAAM,cAAc,GAAG,WAAW,CAAC;gBACnC,MAAM,eAAe,GAAG,IAAI,CAAC;gBAE7B,2EAA2E;gBAC3E,IAAI,KAAK,GAAG,GAAG,CAAC,SAAgB,CAAC;gBAEjC,KAAK,CAAC,KAAK,GAAG,KAAK;oBACf,wEAAwE;oBACxE,MAAM,IAAI,GAAoB,IAAY,CAAC,qBAAqB;2BACzD,cAAc,CAAC,SAAS,EAAE,CAAC;oBAElC,IAAI,CAAC,IAAI;wBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,eAAe,8BAA8B,CAAC,CAAC;oBAE1F,mBAAmB;oBAClB,IAAY,CAAC,gBAAgB,GAAG,eAAe,CAAC;oBACjD,IAAI,CAAE,IAAY,CAAC,qBAAqB;wBACnC,IAAY,CAAC,qBAAqB,GAAG,IAAI,CAAC;oBAE/C,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBAEnC,cAAc;oBACd,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;oBACrC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBAEzE,mBAAmB;oBACnB,MAAM,GAAG,GAA0B,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC;oBAC/D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;oBACjC,IAAI,OAAO,EAAE,CAAC;wBACV,GAAG,CAAC,kBAAkB,CAAC,IAAI,CACvB,MAAM,IAAI,aAAa,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;oBACpD,CAAC;oBAED,qBAAqB;oBACrB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC;oBACzC,IAAI,SAAS,EAAE,CAAC;wBACZ,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAC5B,MAAM,IAAI,aAAa,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;oBACtD,CAAC;oBAED,OAAO,MAAM,CAAC;gBAClB,CAAC,CAAC;gBAEF,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,WAAuC,CAAC,CAAC;gBACnF,OAAO,CAAC,IAAI,CAAC,8BAA8B,IAAI,6BAA6B,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
import { TripletStruct } from "./Triplet.js";
|
|
2
2
|
export declare function ReComponent(settings: TripletStruct, tag: string): (ctor: Function) => void;
|
|
3
3
|
export declare function RePage(settings: TripletStruct, route: string): (ctor: Function) => void;
|
|
4
|
+
/**
|
|
5
|
+
* Register an alternative implementation for an existing placeholder.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* @ReImplementation({ markupURL: './Fancy.hmle', cssURL: './Fancy.css' }, "re-button")
|
|
9
|
+
* class FancyButton extends Component { ... }
|
|
10
|
+
*
|
|
11
|
+
* // Then switch: Placeholder.switchTo("re-button", "FancyButton");
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare function ReImplementation(settings: TripletStruct, target: string): (ctor: Function) => void;
|
|
4
15
|
//# sourceMappingURL=TripletDecorator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TripletDecorator.d.ts","sourceRoot":"","sources":["../../src/foundation/TripletDecorator.ts"],"names":[],"mappings":"AACA,OAAgB,
|
|
1
|
+
{"version":3,"file":"TripletDecorator.d.ts","sourceRoot":"","sources":["../../src/foundation/TripletDecorator.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAErD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,IACpD,MAAM,QAAQ,UAYzB;AACD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,IACjD,MAAM,QAAQ,UAYzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,IAC5D,MAAM,QAAQ,UAiBzB"}
|
|
@@ -7,10 +7,6 @@ export function ReComponent(settings, tag) {
|
|
|
7
7
|
settings.class = ctor;
|
|
8
8
|
const triplet = new Triplet(settings);
|
|
9
9
|
triplet.register("markup", tag)
|
|
10
|
-
.then(ok => {
|
|
11
|
-
if (!ok)
|
|
12
|
-
console.error(`[ReComponent:${tag}] registration returned false`);
|
|
13
|
-
})
|
|
14
10
|
.catch(err => console.error(`[ReComponent:${tag}] register failed`, err));
|
|
15
11
|
};
|
|
16
12
|
}
|
|
@@ -22,11 +18,32 @@ export function RePage(settings, route) {
|
|
|
22
18
|
settings.class = ctor;
|
|
23
19
|
const triplet = new Triplet(settings);
|
|
24
20
|
triplet.register("router", route)
|
|
25
|
-
.then(ok => {
|
|
26
|
-
if (!ok)
|
|
27
|
-
console.error(`[RePage:${route}] registration returned false`);
|
|
28
|
-
})
|
|
29
21
|
.catch(err => console.error(`[RePage:${route}] register failed`, err));
|
|
30
22
|
};
|
|
31
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Register an alternative implementation for an existing placeholder.
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* @ReImplementation({ markupURL: './Fancy.hmle', cssURL: './Fancy.css' }, "re-button")
|
|
29
|
+
* class FancyButton extends Component { ... }
|
|
30
|
+
*
|
|
31
|
+
* // Then switch: Placeholder.switchTo("re-button", "FancyButton");
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function ReImplementation(settings, target) {
|
|
35
|
+
return (ctor) => {
|
|
36
|
+
if (target == null || target.length === 0)
|
|
37
|
+
throw new Error("Invalid implementation target.");
|
|
38
|
+
if (settings.class === null || settings.class === undefined)
|
|
39
|
+
settings.class = ctor;
|
|
40
|
+
// Use the class name as the implementation name
|
|
41
|
+
const implName = ctor.name;
|
|
42
|
+
const triplet = new Triplet(settings, implName);
|
|
43
|
+
// Register adds the implementation to the existing placeholder (or creates one)
|
|
44
|
+
triplet.register(target.includes("-") ? "markup" : "router", target)
|
|
45
|
+
.catch(err => console.error(`[ReImplementation:${target}] register failed`, err));
|
|
46
|
+
console.info(`[ReImplementation:${target}] registered implementation "${implName}"`);
|
|
47
|
+
};
|
|
48
|
+
}
|
|
32
49
|
//# sourceMappingURL=TripletDecorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TripletDecorator.js","sourceRoot":"","sources":["../../src/foundation/TripletDecorator.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"TripletDecorator.js","sourceRoot":"","sources":["../../src/foundation/TripletDecorator.ts"],"names":[],"mappings":"AACA,OAAO,OAA0B,MAAM,cAAc,CAAA;AAErD,MAAM,UAAU,WAAW,CAAC,QAAuB,EAAE,GAAW;IAC5D,OAAO,CAAC,IAAc,EAAE,EAAE;QACtB,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAExD,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;YACvD,QAAQ,CAAC,KAAK,GAAG,IAA+B,CAAC;QAErD,MAAM,OAAO,GAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;aAC1B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAC;IAClF,CAAC,CAAA;AACL,CAAC;AACD,MAAM,UAAU,MAAM,CAAC,QAAuB,EAAE,KAAa;IACzD,OAAO,CAAC,IAAc,EAAE,EAAE;QACtB,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAE3C,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;YACvD,QAAQ,CAAC,KAAK,GAAG,IAA+B,CAAC;QAErD,MAAM,OAAO,GAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;aAC5B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAA;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAuB,EAAE,MAAc;IACpE,OAAO,CAAC,IAAc,EAAE,EAAE;QACtB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAEtD,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;YACvD,QAAQ,CAAC,KAAK,GAAG,IAA+B,CAAC;QAErD,gDAAgD;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,MAAM,OAAO,GAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEzD,gFAAgF;QAChF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC/D,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAC;QAEtF,OAAO,CAAC,IAAI,CAAC,qBAAqB,MAAM,gCAAgC,QAAQ,GAAG,CAAC,CAAC;IACzF,CAAC,CAAA;AACL,CAAC"}
|
|
@@ -13,7 +13,6 @@ export default class UniHtml {
|
|
|
13
13
|
* @param element Target container (usually shadowRoot.host)
|
|
14
14
|
*/
|
|
15
15
|
load(element: HTMLElement | ShadowRoot): Promise<void>;
|
|
16
|
-
private _postInit;
|
|
17
16
|
private _init;
|
|
18
17
|
protected preInit(): Promise<void>;
|
|
19
18
|
/**
|
|
@@ -38,5 +37,10 @@ export default class UniHtml {
|
|
|
38
37
|
*/
|
|
39
38
|
protected render(holder: TemplateHolder, renderTarget: HTMLElement | DocumentFragment): Promise<void>;
|
|
40
39
|
dispose(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Reload this instance: dispose current state, then re-run the full lifecycle.
|
|
42
|
+
* Called automatically when the active Implementation is switched via Placeholder.
|
|
43
|
+
*/
|
|
44
|
+
reload(): Promise<void>;
|
|
41
45
|
}
|
|
42
46
|
//# sourceMappingURL=UniHtml.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UniHtml.d.ts","sourceRoot":"","sources":["../../../src/foundation/component_api/UniHtml.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IACjB,OAAO,EAAE,UAAU,CAAC,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,CAAiC;IAChG,SAAS,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC;IAE3C;;;;OAIG;IACU,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAsBrD,
|
|
1
|
+
{"version":3,"file":"UniHtml.d.ts","sourceRoot":"","sources":["../../../src/foundation/component_api/UniHtml.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IACjB,OAAO,EAAE,UAAU,CAAC,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,CAAiC;IAChG,SAAS,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC;IAE3C;;;;OAIG;IACU,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAsBrD,KAAK;cAIH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IACxC;;;;;OAKG;cACa,OAAO,CAAC,MAAM,EAAE,cAAc;IAC9C;;;;;OAKG;cACa,QAAQ,CAAC,MAAM,EAAE,cAAc;IAC/C;;;;;OAKG;cACa,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,GAAG,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B9F,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrC;;;OAGG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBvC"}
|
|
@@ -13,9 +13,9 @@ export default class UniHtml {
|
|
|
13
13
|
*/
|
|
14
14
|
async load(element) {
|
|
15
15
|
this._status.setObject("loading");
|
|
16
|
+
this._lastRenderTarget = element;
|
|
16
17
|
await this.preInit();
|
|
17
|
-
const
|
|
18
|
-
const html = await this._postInit(preHtml);
|
|
18
|
+
const html = await this._init();
|
|
19
19
|
// ВАЖНО: preLoad() вызывается ДО монтирования в DOM/Shadow DOM.
|
|
20
20
|
// Для компонентов (UniHtmlComponent) на этом этапе ещё нельзя полагаться на this.shadowRoot —
|
|
21
21
|
// используйте переданный localRoot для подготовки DOM, данных и навешивания обработчиков.
|
|
@@ -30,9 +30,6 @@ export default class UniHtml {
|
|
|
30
30
|
await this.postLoad(html);
|
|
31
31
|
this._status.setObject("ready");
|
|
32
32
|
}
|
|
33
|
-
async _postInit(html) {
|
|
34
|
-
throw new Error("Method not implemented.");
|
|
35
|
-
}
|
|
36
33
|
async _init() {
|
|
37
34
|
throw new Error("Method not implemented.");
|
|
38
35
|
}
|
|
@@ -86,5 +83,26 @@ export default class UniHtml {
|
|
|
86
83
|
this._templateHolder = undefined;
|
|
87
84
|
}
|
|
88
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Reload this instance: dispose current state, then re-run the full lifecycle.
|
|
88
|
+
* Called automatically when the active Implementation is switched via Placeholder.
|
|
89
|
+
*/
|
|
90
|
+
async reload() {
|
|
91
|
+
const renderTarget = this.shadowRoot ?? this._lastRenderTarget;
|
|
92
|
+
await this.dispose();
|
|
93
|
+
this._status.setObject("constructed");
|
|
94
|
+
if (renderTarget) {
|
|
95
|
+
// Clear existing content
|
|
96
|
+
while (renderTarget.firstChild) {
|
|
97
|
+
renderTarget.removeChild(renderTarget.firstChild);
|
|
98
|
+
}
|
|
99
|
+
// Clear adopted stylesheets so the new implementation applies its own
|
|
100
|
+
if ('adoptedStyleSheets' in renderTarget) {
|
|
101
|
+
renderTarget.adoptedStyleSheets = [];
|
|
102
|
+
}
|
|
103
|
+
await this.load(renderTarget);
|
|
104
|
+
}
|
|
105
|
+
console.info(`[UniHtml]: Instance reloaded`);
|
|
106
|
+
}
|
|
89
107
|
}
|
|
90
108
|
//# sourceMappingURL=UniHtml.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UniHtml.js","sourceRoot":"","sources":["../../../src/foundation/component_api/UniHtml.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAI5C;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IACjB,OAAO,GAAoD,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;IACtF,eAAe,CAAkB;IAE3C;;;;OAIG;IACI,KAAK,CAAC,IAAI,CAAC,OAAiC;QAC/C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"UniHtml.js","sourceRoot":"","sources":["../../../src/foundation/component_api/UniHtml.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,56 @@
|
|
|
1
|
+
import Observable from "../api/Observer.js";
|
|
2
|
+
export type ServiceWorkerConfig = {
|
|
3
|
+
scriptURL?: string;
|
|
4
|
+
scope?: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Client-side Service Worker manager for Purper SPA.
|
|
8
|
+
*
|
|
9
|
+
* Provides:
|
|
10
|
+
* - Registration with one call (`ServiceWorker.register()`)
|
|
11
|
+
* - Cache management: add / remove / list / clear
|
|
12
|
+
* - Connectivity detection with reactive `online` observable
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* ```ts
|
|
16
|
+
* await ServiceWorker.register(); // defaults to './serviceworker.js'
|
|
17
|
+
* await ServiceWorker.addToCache('/data.json');
|
|
18
|
+
* await ServiceWorker.removeFromCache('/old.css');
|
|
19
|
+
* ServiceWorker.online.subscribe(v => console.log('online:', v));
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
1
22
|
export default class ServiceWorker {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
23
|
+
private static _registration?;
|
|
24
|
+
/** Observable connectivity state — subscribe for real-time changes. */
|
|
25
|
+
static readonly online: Observable<boolean>;
|
|
26
|
+
private static _connectivityBound;
|
|
27
|
+
private static _bindConnectivity;
|
|
28
|
+
static register(config?: ServiceWorkerConfig): Promise<ServiceWorkerRegistration | undefined>;
|
|
29
|
+
private static _postMessage;
|
|
30
|
+
private static _request;
|
|
31
|
+
/** Add a single URL to the SW cache. */
|
|
6
32
|
static addToCache(url: string): Promise<void>;
|
|
7
|
-
/**
|
|
8
|
-
|
|
9
|
-
|
|
33
|
+
/** Add multiple URLs to the SW cache in one batch. */
|
|
34
|
+
static addAllToCache(urls: string[]): void;
|
|
35
|
+
/** Remove a URL from the SW cache. Returns true if it was found and deleted. */
|
|
36
|
+
static removeFromCache(url: string): Promise<boolean>;
|
|
37
|
+
/** Return all URLs currently in the SW cache. */
|
|
38
|
+
static getCacheKeys(): Promise<string[]>;
|
|
39
|
+
/** Wipe the entire SW cache. */
|
|
40
|
+
static clearCache(): Promise<boolean>;
|
|
41
|
+
/** Check whether a URL exists in the SW cache. */
|
|
42
|
+
static isCached(url: string): Promise<boolean>;
|
|
43
|
+
/** Ask the waiting SW to activate immediately. */
|
|
10
44
|
static skipWaiting(): void;
|
|
11
|
-
/**
|
|
12
|
-
* Gets the version of the currently active service worker.
|
|
13
|
-
* @returns A promise that resolves with the version string.
|
|
14
|
-
*/
|
|
45
|
+
/** Get the version string from the running SW. */
|
|
15
46
|
static getVersion(): Promise<string>;
|
|
16
47
|
/**
|
|
17
|
-
*
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Checks if the browser is online.
|
|
48
|
+
* Active connectivity probe — makes a real network request.
|
|
49
|
+
* Unlike `online` observable (which relies on browser events), this
|
|
50
|
+
* detects captive portals and lie-fi.
|
|
22
51
|
*/
|
|
23
|
-
static isOnline(): Promise<boolean>;
|
|
52
|
+
static isOnline(probeURL?: string): Promise<boolean>;
|
|
53
|
+
/** Current registration, if any. */
|
|
54
|
+
static get registration(): ServiceWorkerRegistration | undefined;
|
|
24
55
|
}
|
|
25
56
|
//# sourceMappingURL=ServiceWorker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceWorker.d.ts","sourceRoot":"","sources":["../../../src/foundation/worker/ServiceWorker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ServiceWorker.d.ts","sourceRoot":"","sources":["../../../src/foundation/worker/ServiceWorker.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAC9B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAA4B;IAEzD,uEAAuE;IACvE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAoC;IAG/E,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAS;IAC1C,OAAO,CAAC,MAAM,CAAC,iBAAiB;WAenB,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IA0CnG,OAAO,CAAC,MAAM,CAAC,YAAY;IAI3B,OAAO,CAAC,MAAM,CAAC,QAAQ;IAcvB,wCAAwC;WAC3B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBnD,sDAAsD;IACtD,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAI1C,gFAAgF;WACnE,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe3D,iDAAiD;WACpC,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAS9C,gCAAgC;WACnB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAS3C,kDAAkD;WACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBpD,kDAAkD;IAClD,MAAM,CAAC,WAAW,IAAI,IAAI;IAI1B,kDAAkD;WACrC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAO1C;;;;OAIG;WACU,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB1D,oCAAoC;IACpC,MAAM,KAAK,YAAY,IAAI,yBAAyB,GAAG,SAAS,CAE/D;CACJ"}
|
|
@@ -1,144 +1,211 @@
|
|
|
1
|
-
|
|
2
|
-
// Автоматически генерируем CACHE_NAME из base.json
|
|
3
|
-
//import base from '../../../data/base.json';
|
|
4
|
-
const CACHE_NAME = `pureper-v1`;
|
|
5
|
-
const STATIC_ASSETS = [
|
|
6
|
-
'/index.html'
|
|
7
|
-
];
|
|
8
|
-
/*if ('serviceWorker' in navigator) {
|
|
9
|
-
window.addEventListener('load', () => {
|
|
10
|
-
navigator.serviceWorker.register('./serviceWorker.js', { type: 'module' })
|
|
11
|
-
.then((registration) => {
|
|
12
|
-
console.log('ServiceWorker registration successful:', registration.scope);
|
|
13
|
-
})
|
|
14
|
-
.catch((error) => {
|
|
15
|
-
console.error('ServiceWorker registration failed:', error);
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
window.addEventListener('fetch', (event: FetchEvent) => {
|
|
19
|
-
event.respondWith(
|
|
20
|
-
caches.match(event.request).then((cachedResponse) => {
|
|
21
|
-
console.log(`[ServiceWorker]: Fetching ${event.request.url}`);
|
|
22
|
-
return cachedResponse || fetch(event.request);
|
|
23
|
-
})
|
|
24
|
-
);
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
|
|
1
|
+
import Observable from "../api/Observer.js";
|
|
28
2
|
/**
|
|
29
|
-
*
|
|
3
|
+
* Client-side Service Worker manager for Purper SPA.
|
|
4
|
+
*
|
|
5
|
+
* Provides:
|
|
6
|
+
* - Registration with one call (`ServiceWorker.register()`)
|
|
7
|
+
* - Cache management: add / remove / list / clear
|
|
8
|
+
* - Connectivity detection with reactive `online` observable
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```ts
|
|
12
|
+
* await ServiceWorker.register(); // defaults to './serviceworker.js'
|
|
13
|
+
* await ServiceWorker.addToCache('/data.json');
|
|
14
|
+
* await ServiceWorker.removeFromCache('/old.css');
|
|
15
|
+
* ServiceWorker.online.subscribe(v => console.log('online:', v));
|
|
16
|
+
* ```
|
|
30
17
|
*/
|
|
31
|
-
/*window.addEventListener('install', (event: ExtendableEvent) => {
|
|
32
|
-
console.log('ServiceWorker: Installing...');
|
|
33
|
-
const assetsToCache = [
|
|
34
|
-
...STATIC_ASSETS
|
|
35
|
-
];
|
|
36
|
-
// Remove duplicates
|
|
37
|
-
const uniqueAssets = Array.from(new Set(assetsToCache));
|
|
38
|
-
event.waitUntil(
|
|
39
|
-
caches.open(CACHE_NAME)
|
|
40
|
-
.then((cache: Cache) => {
|
|
41
|
-
console.log('ServiceWorker: Caching static assets and SPA routes');
|
|
42
|
-
return cache.addAll(uniqueAssets);
|
|
43
|
-
})
|
|
44
|
-
.then(() => {
|
|
45
|
-
console.log('ServiceWorker: Installation complete');
|
|
46
|
-
return swSelf.skipWaiting();
|
|
47
|
-
})
|
|
48
|
-
);
|
|
49
|
-
});*/
|
|
50
18
|
export default class ServiceWorker {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
static
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
19
|
+
static _registration;
|
|
20
|
+
/** Observable connectivity state — subscribe for real-time changes. */
|
|
21
|
+
static online = new Observable(navigator.onLine);
|
|
22
|
+
// ── Connectivity listeners (bound once) ─────────────────────────
|
|
23
|
+
static _connectivityBound = false;
|
|
24
|
+
static _bindConnectivity() {
|
|
25
|
+
if (this._connectivityBound)
|
|
26
|
+
return;
|
|
27
|
+
this._connectivityBound = true;
|
|
28
|
+
window.addEventListener('online', () => {
|
|
29
|
+
console.log('[ServiceWorker]: Browser went online');
|
|
30
|
+
this.online.setObject(true);
|
|
31
|
+
});
|
|
32
|
+
window.addEventListener('offline', () => {
|
|
33
|
+
console.log('[ServiceWorker]: Browser went offline');
|
|
34
|
+
this.online.setObject(false);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// ── Registration ────────────────────────────────────────────────
|
|
38
|
+
static async register(config) {
|
|
39
|
+
if (!('serviceWorker' in navigator)) {
|
|
40
|
+
console.warn('[ServiceWorker]: Service Workers are not supported in this browser');
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
this._bindConnectivity();
|
|
44
|
+
const scriptURL = config?.scriptURL ?? './serviceworker.js';
|
|
45
|
+
const scope = config?.scope ?? '/';
|
|
46
|
+
try {
|
|
47
|
+
const reg = await navigator.serviceWorker.register(scriptURL, { scope });
|
|
48
|
+
this._registration = reg;
|
|
49
|
+
console.log(`[ServiceWorker]: Registered "${scriptURL}" with scope "${reg.scope}"`);
|
|
50
|
+
reg.addEventListener('updatefound', () => {
|
|
51
|
+
const newWorker = reg.installing;
|
|
52
|
+
if (!newWorker)
|
|
53
|
+
return;
|
|
54
|
+
console.log('[ServiceWorker]: New version installing...');
|
|
55
|
+
newWorker.addEventListener('statechange', () => {
|
|
56
|
+
if (newWorker.state === 'activated') {
|
|
57
|
+
console.log('[ServiceWorker]: New version activated');
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
60
|
});
|
|
61
|
+
// Wait for the controller to be available
|
|
62
|
+
if (!navigator.serviceWorker.controller) {
|
|
63
|
+
await new Promise((resolve) => {
|
|
64
|
+
navigator.serviceWorker.addEventListener('controllerchange', () => resolve(), { once: true });
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return reg;
|
|
61
68
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
catch (err) {
|
|
70
|
+
console.error('[ServiceWorker]: Registration failed', err);
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ── Helpers ─────────────────────────────────────────────────────
|
|
75
|
+
static _postMessage(msg) {
|
|
76
|
+
navigator.serviceWorker?.controller?.postMessage(msg);
|
|
77
|
+
}
|
|
78
|
+
static _request(msg) {
|
|
79
|
+
return new Promise((resolve, reject) => {
|
|
80
|
+
if (!navigator.serviceWorker?.controller) {
|
|
81
|
+
reject('[ServiceWorker]: No active controller');
|
|
82
|
+
return;
|
|
71
83
|
}
|
|
72
|
-
|
|
73
|
-
|
|
84
|
+
const mc = new MessageChannel();
|
|
85
|
+
mc.port1.onmessage = (ev) => resolve(ev.data);
|
|
86
|
+
navigator.serviceWorker.controller.postMessage(msg, [mc.port2]);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// ── Cache Management ────────────────────────────────────────────
|
|
90
|
+
/** Add a single URL to the SW cache. */
|
|
91
|
+
static async addToCache(url) {
|
|
92
|
+
if (navigator.serviceWorker?.controller) {
|
|
93
|
+
this._postMessage({ type: 'CACHE_URL', url });
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Fallback: use Cache API directly
|
|
97
|
+
try {
|
|
98
|
+
const cache = await caches.open('purper-v1');
|
|
99
|
+
const response = await fetch(url);
|
|
100
|
+
if (response.ok) {
|
|
101
|
+
await cache.put(url, response);
|
|
102
|
+
console.log('[ServiceWorker]: Resource cached directly:', url);
|
|
74
103
|
}
|
|
75
104
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
* Asks the service worker to skip waiting and activate the new version.
|
|
79
|
-
*/
|
|
80
|
-
static skipWaiting() {
|
|
81
|
-
if ('serviceWorker' in navigator && navigator.serviceWorker.controller) {
|
|
82
|
-
navigator.serviceWorker.controller.postMessage({ type: 'SKIP_WAITING' });
|
|
105
|
+
catch (e) {
|
|
106
|
+
console.warn('[ServiceWorker]: Failed to cache resource:', url, e);
|
|
83
107
|
}
|
|
84
108
|
}
|
|
85
|
-
/**
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
};
|
|
101
|
-
navigator.serviceWorker.controller.postMessage({ type: 'GET_VERSION' }, [messageChannel.port2]);
|
|
109
|
+
/** Add multiple URLs to the SW cache in one batch. */
|
|
110
|
+
static addAllToCache(urls) {
|
|
111
|
+
this._postMessage({ type: 'CACHE_URLS', urls });
|
|
112
|
+
}
|
|
113
|
+
/** Remove a URL from the SW cache. Returns true if it was found and deleted. */
|
|
114
|
+
static async removeFromCache(url) {
|
|
115
|
+
try {
|
|
116
|
+
const data = await this._request({ type: 'REMOVE_URL', url });
|
|
117
|
+
return data.deleted;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Fallback
|
|
121
|
+
try {
|
|
122
|
+
const cache = await caches.open('purper-v1');
|
|
123
|
+
return await cache.delete(url);
|
|
102
124
|
}
|
|
103
|
-
|
|
104
|
-
|
|
125
|
+
catch {
|
|
126
|
+
return false;
|
|
105
127
|
}
|
|
106
|
-
}
|
|
128
|
+
}
|
|
107
129
|
}
|
|
108
|
-
/**
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
130
|
+
/** Return all URLs currently in the SW cache. */
|
|
131
|
+
static async getCacheKeys() {
|
|
132
|
+
try {
|
|
133
|
+
const data = await this._request({ type: 'GET_CACHE_KEYS' });
|
|
134
|
+
return data.keys;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Wipe the entire SW cache. */
|
|
141
|
+
static async clearCache() {
|
|
142
|
+
try {
|
|
143
|
+
const data = await this._request({ type: 'CLEAR_CACHE' });
|
|
144
|
+
return data.cleared;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/** Check whether a URL exists in the SW cache. */
|
|
151
|
+
static async isCached(url) {
|
|
152
|
+
try {
|
|
153
|
+
const data = await this._request({ type: 'HAS_URL', url });
|
|
154
|
+
return data.cached;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Fallback: CacheStorage directly
|
|
158
|
+
try {
|
|
159
|
+
return !!(await caches.match(url));
|
|
124
160
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
caches.match(url).then(match => resolve(!!match)).catch(() => resolve(false));
|
|
161
|
+
catch {
|
|
162
|
+
return false;
|
|
128
163
|
}
|
|
129
|
-
}
|
|
164
|
+
}
|
|
130
165
|
}
|
|
166
|
+
// ── Version & lifecycle ─────────────────────────────────────────
|
|
167
|
+
/** Ask the waiting SW to activate immediately. */
|
|
168
|
+
static skipWaiting() {
|
|
169
|
+
this._postMessage({ type: 'SKIP_WAITING' });
|
|
170
|
+
}
|
|
171
|
+
/** Get the version string from the running SW. */
|
|
172
|
+
static async getVersion() {
|
|
173
|
+
const data = await this._request({ type: 'GET_VERSION' });
|
|
174
|
+
return data.version;
|
|
175
|
+
}
|
|
176
|
+
// ── Connectivity ────────────────────────────────────────────────
|
|
131
177
|
/**
|
|
132
|
-
*
|
|
178
|
+
* Active connectivity probe — makes a real network request.
|
|
179
|
+
* Unlike `online` observable (which relies on browser events), this
|
|
180
|
+
* detects captive portals and lie-fi.
|
|
133
181
|
*/
|
|
134
|
-
static async isOnline() {
|
|
182
|
+
static async isOnline(probeURL) {
|
|
135
183
|
try {
|
|
136
|
-
|
|
137
|
-
|
|
184
|
+
// Try SW-side probe first
|
|
185
|
+
const data = await this._request({
|
|
186
|
+
type: 'IS_ONLINE',
|
|
187
|
+
url: probeURL ?? '/index.html'
|
|
188
|
+
});
|
|
189
|
+
this.online.setObject(data.online);
|
|
190
|
+
return data.online;
|
|
138
191
|
}
|
|
139
192
|
catch {
|
|
140
|
-
|
|
193
|
+
// Fallback: client-side probe
|
|
194
|
+
try {
|
|
195
|
+
const response = await fetch(probeURL ?? './index.html', { cache: 'no-store', method: 'HEAD' });
|
|
196
|
+
const result = response.ok;
|
|
197
|
+
this.online.setObject(result);
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
this.online.setObject(false);
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
141
204
|
}
|
|
142
205
|
}
|
|
206
|
+
/** Current registration, if any. */
|
|
207
|
+
static get registration() {
|
|
208
|
+
return this._registration;
|
|
209
|
+
}
|
|
143
210
|
}
|
|
144
211
|
//# sourceMappingURL=ServiceWorker.js.map
|