@reidelsaltres/pureper 0.2.25 → 0.2.27
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/worker/ServiceWorker.d.ts +28 -0
- package/out/foundation/worker/ServiceWorker.d.ts.map +1 -1
- package/out/foundation/worker/ServiceWorker.js +96 -0
- package/out/foundation/worker/ServiceWorker.js.map +1 -1
- package/out/index.d.ts +1 -1
- package/out/index.d.ts.map +1 -1
- package/out/index.js.map +1 -1
- package/package.json +1 -1
- package/src/foundation/worker/ServiceWorker.ts +121 -0
- package/src/foundation/worker/serviceworker.js +145 -10
- package/src/index.ts +1 -1
|
@@ -3,6 +3,19 @@ export type ServiceWorkerConfig = {
|
|
|
3
3
|
scriptURL?: string;
|
|
4
4
|
scope?: string;
|
|
5
5
|
};
|
|
6
|
+
export interface FetchActivityItem {
|
|
7
|
+
id: number;
|
|
8
|
+
url: string;
|
|
9
|
+
startTime: number;
|
|
10
|
+
size?: number;
|
|
11
|
+
duration?: number;
|
|
12
|
+
fromCache?: boolean;
|
|
13
|
+
status: 'loading' | 'complete' | 'error';
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
export type PageSourceType = 'cache' | 'network' | 'unknown';
|
|
17
|
+
export type CacheStrategy = 'cache-first' | 'network-first';
|
|
18
|
+
export type PrecacheMode = 'precache' | 'normal' | 'disabled';
|
|
6
19
|
/**
|
|
7
20
|
* Client-side Service Worker manager for Purper SPA.
|
|
8
21
|
*
|
|
@@ -23,6 +36,12 @@ export default class ServiceWorker {
|
|
|
23
36
|
private static _registration?;
|
|
24
37
|
/** Observable connectivity state — subscribe for real-time changes. */
|
|
25
38
|
static readonly online: Observable<boolean>;
|
|
39
|
+
static readonly fetchActivities: Observable<FetchActivityItem[]>;
|
|
40
|
+
static readonly pageSource: Observable<PageSourceType>;
|
|
41
|
+
static readonly cacheStrategy: Observable<CacheStrategy>;
|
|
42
|
+
static readonly precacheMode: Observable<PrecacheMode>;
|
|
43
|
+
private static _fetchTrackingEnabled;
|
|
44
|
+
private static _fetchListenerBound;
|
|
26
45
|
private static _connectivityBound;
|
|
27
46
|
private static _bindConnectivity;
|
|
28
47
|
static register(config?: ServiceWorkerConfig): Promise<ServiceWorkerRegistration | undefined>;
|
|
@@ -40,6 +59,12 @@ export default class ServiceWorker {
|
|
|
40
59
|
static clearCache(): Promise<boolean>;
|
|
41
60
|
/** Check whether a URL exists in the SW cache. */
|
|
42
61
|
static isCached(url: string): Promise<boolean>;
|
|
62
|
+
static setCacheStrategy(strategy: CacheStrategy): void;
|
|
63
|
+
static setPrecacheMode(mode: PrecacheMode): void;
|
|
64
|
+
static getConfig(): Promise<{
|
|
65
|
+
strategy: CacheStrategy;
|
|
66
|
+
precacheMode: PrecacheMode;
|
|
67
|
+
}>;
|
|
43
68
|
/** Ask the waiting SW to activate immediately. */
|
|
44
69
|
static skipWaiting(): void;
|
|
45
70
|
/** Get the version string from the running SW. */
|
|
@@ -52,5 +77,8 @@ export default class ServiceWorker {
|
|
|
52
77
|
static isOnline(probeURL?: string): Promise<boolean>;
|
|
53
78
|
/** Current registration, if any. */
|
|
54
79
|
static get registration(): ServiceWorkerRegistration | undefined;
|
|
80
|
+
static enableFetchTracking(): void;
|
|
81
|
+
static disableFetchTracking(): void;
|
|
82
|
+
private static _bindFetchListener;
|
|
55
83
|
}
|
|
56
84
|
//# sourceMappingURL=ServiceWorker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"ServiceWorker.d.ts","sourceRoot":"","sources":["../../../src/foundation/worker/ServiceWorker.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,12 @@ export default class ServiceWorker {
|
|
|
19
19
|
static _registration;
|
|
20
20
|
/** Observable connectivity state — subscribe for real-time changes. */
|
|
21
21
|
static online = new Observable(navigator.onLine);
|
|
22
|
+
static fetchActivities = new Observable([]);
|
|
23
|
+
static pageSource = new Observable('unknown');
|
|
24
|
+
static cacheStrategy = new Observable('cache-first');
|
|
25
|
+
static precacheMode = new Observable('normal');
|
|
26
|
+
static _fetchTrackingEnabled = false;
|
|
27
|
+
static _fetchListenerBound = false;
|
|
22
28
|
// ── Connectivity listeners (bound once) ─────────────────────────
|
|
23
29
|
static _connectivityBound = false;
|
|
24
30
|
static _bindConnectivity() {
|
|
@@ -163,6 +169,18 @@ export default class ServiceWorker {
|
|
|
163
169
|
}
|
|
164
170
|
}
|
|
165
171
|
}
|
|
172
|
+
// ── Cache Strategy & Precache Mode ────────────────────────────
|
|
173
|
+
static setCacheStrategy(strategy) {
|
|
174
|
+
this.cacheStrategy.setObject(strategy);
|
|
175
|
+
this._postMessage({ type: 'SET_CACHE_STRATEGY', strategy });
|
|
176
|
+
}
|
|
177
|
+
static setPrecacheMode(mode) {
|
|
178
|
+
this.precacheMode.setObject(mode);
|
|
179
|
+
this._postMessage({ type: 'SET_PRECACHE_MODE', mode });
|
|
180
|
+
}
|
|
181
|
+
static async getConfig() {
|
|
182
|
+
return this._request({ type: 'GET_CONFIG' });
|
|
183
|
+
}
|
|
166
184
|
// ── Version & lifecycle ─────────────────────────────────────────
|
|
167
185
|
/** Ask the waiting SW to activate immediately. */
|
|
168
186
|
static skipWaiting() {
|
|
@@ -207,5 +225,83 @@ export default class ServiceWorker {
|
|
|
207
225
|
static get registration() {
|
|
208
226
|
return this._registration;
|
|
209
227
|
}
|
|
228
|
+
// ── Fetch Tracking ──────────────────────────────────────────────
|
|
229
|
+
static enableFetchTracking() {
|
|
230
|
+
if (!this._fetchTrackingEnabled) {
|
|
231
|
+
this._fetchTrackingEnabled = true;
|
|
232
|
+
this._postMessage({ type: 'ENABLE_FETCH_TRACKING' });
|
|
233
|
+
this._bindFetchListener();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
static disableFetchTracking() {
|
|
237
|
+
if (this._fetchTrackingEnabled) {
|
|
238
|
+
this._fetchTrackingEnabled = false;
|
|
239
|
+
this._postMessage({ type: 'DISABLE_FETCH_TRACKING' });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
static _bindFetchListener() {
|
|
243
|
+
if (this._fetchListenerBound)
|
|
244
|
+
return;
|
|
245
|
+
this._fetchListenerBound = true;
|
|
246
|
+
navigator.serviceWorker?.addEventListener('message', (event) => {
|
|
247
|
+
const data = event.data;
|
|
248
|
+
if (!data || !data.type)
|
|
249
|
+
return;
|
|
250
|
+
switch (data.type) {
|
|
251
|
+
case 'FETCH_START': {
|
|
252
|
+
const item = {
|
|
253
|
+
id: data.id,
|
|
254
|
+
url: data.url,
|
|
255
|
+
startTime: data.timestamp,
|
|
256
|
+
status: 'loading'
|
|
257
|
+
};
|
|
258
|
+
const current = [...this.fetchActivities.getObject()];
|
|
259
|
+
current.push(item);
|
|
260
|
+
this.fetchActivities.setObject(current);
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
case 'FETCH_COMPLETE': {
|
|
264
|
+
const current = [...this.fetchActivities.getObject()];
|
|
265
|
+
const idx = current.findIndex(i => i.id === data.id);
|
|
266
|
+
if (idx !== -1) {
|
|
267
|
+
current[idx] = {
|
|
268
|
+
...current[idx],
|
|
269
|
+
size: data.size,
|
|
270
|
+
duration: data.duration,
|
|
271
|
+
fromCache: data.fromCache,
|
|
272
|
+
status: 'complete'
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
this.fetchActivities.setObject(current);
|
|
276
|
+
setTimeout(() => {
|
|
277
|
+
const list = this.fetchActivities.getObject().filter(i => i.id !== data.id);
|
|
278
|
+
this.fetchActivities.setObject(list);
|
|
279
|
+
}, 3000);
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
case 'FETCH_ERROR': {
|
|
283
|
+
const current = [...this.fetchActivities.getObject()];
|
|
284
|
+
const idx = current.findIndex(i => i.id === data.id);
|
|
285
|
+
if (idx !== -1) {
|
|
286
|
+
current[idx] = {
|
|
287
|
+
...current[idx],
|
|
288
|
+
status: 'error',
|
|
289
|
+
error: data.error
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
this.fetchActivities.setObject(current);
|
|
293
|
+
setTimeout(() => {
|
|
294
|
+
const list = this.fetchActivities.getObject().filter(i => i.id !== data.id);
|
|
295
|
+
this.fetchActivities.setObject(list);
|
|
296
|
+
}, 5000);
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
case 'PAGE_SOURCE': {
|
|
300
|
+
this.pageSource.setObject(data.source);
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
210
306
|
}
|
|
211
307
|
//# sourceMappingURL=ServiceWorker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceWorker.js","sourceRoot":"","sources":["../../../src/foundation/worker/ServiceWorker.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ServiceWorker.js","sourceRoot":"","sources":["../../../src/foundation/worker/ServiceWorker.ts"],"names":[],"mappings":"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"}
|
package/out/index.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export { Implementation, ImplementationStruct, Placeholder } from './foundation/
|
|
|
13
13
|
export { default as Fetcher } from './foundation/Fetcher.js';
|
|
14
14
|
export * from './foundation/engine/TemplateEngine.js';
|
|
15
15
|
export { Router } from './foundation/worker/Router.js';
|
|
16
|
-
export { default as ServiceWorker, ServiceWorkerConfig } from './foundation/worker/ServiceWorker.js';
|
|
16
|
+
export { default as ServiceWorker, ServiceWorkerConfig, FetchActivityItem, PageSourceType, CacheStrategy, PrecacheMode } from './foundation/worker/ServiceWorker.js';
|
|
17
17
|
export * from './foundation/Hosting.js';
|
|
18
18
|
export * from './foundation/Theme.js';
|
|
19
19
|
//# sourceMappingURL=index.d.ts.map
|
package/out/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAE3D,cAAc,2CAA2C,CAAC;AAC1D,OAAO,EACN,OAAO,IAAI,UAAU,EACrB,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAC3F,YAAY,EACZ,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAE/E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE7D,cAAc,uCAAuC,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAE3D,cAAc,2CAA2C,CAAC;AAC1D,OAAO,EACN,OAAO,IAAI,UAAU,EACrB,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAC3F,YAAY,EACZ,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAE/E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE7D,cAAc,uCAAuC,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAErK,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC"}
|
package/out/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAE3D,cAAc,2CAA2C,CAAC;AAC1D,OAAO,EACN,OAAO,IAAI,UAAU,EAC+B,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAC3F,YAAY,EACZ,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAE/E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAiB,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzF,OAAO,EAAE,cAAc,EAAwB,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE7D,cAAc,uCAAuC,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAE3D,cAAc,2CAA2C,CAAC;AAC1D,OAAO,EACN,OAAO,IAAI,UAAU,EAC+B,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAC3F,YAAY,EACZ,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAE/E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAiB,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzF,OAAO,EAAE,cAAc,EAAwB,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE7D,cAAc,uCAAuC,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAuF,MAAM,sCAAsC,CAAC;AAErK,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAGtC,qEAAqE;AACrE;;WAEQ;AAER,yEAAyE"}
|
package/package.json
CHANGED
|
@@ -5,6 +5,22 @@ export type ServiceWorkerConfig = {
|
|
|
5
5
|
scope?: string;
|
|
6
6
|
};
|
|
7
7
|
|
|
8
|
+
export interface FetchActivityItem {
|
|
9
|
+
id: number;
|
|
10
|
+
url: string;
|
|
11
|
+
startTime: number;
|
|
12
|
+
size?: number;
|
|
13
|
+
duration?: number;
|
|
14
|
+
fromCache?: boolean;
|
|
15
|
+
status: 'loading' | 'complete' | 'error';
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type PageSourceType = 'cache' | 'network' | 'unknown';
|
|
20
|
+
|
|
21
|
+
export type CacheStrategy = 'cache-first' | 'network-first';
|
|
22
|
+
export type PrecacheMode = 'precache' | 'normal' | 'disabled';
|
|
23
|
+
|
|
8
24
|
/**
|
|
9
25
|
* Client-side Service Worker manager for Purper SPA.
|
|
10
26
|
*
|
|
@@ -27,6 +43,13 @@ export default class ServiceWorker {
|
|
|
27
43
|
/** Observable connectivity state — subscribe for real-time changes. */
|
|
28
44
|
static readonly online: Observable<boolean> = new Observable(navigator.onLine);
|
|
29
45
|
|
|
46
|
+
static readonly fetchActivities: Observable<FetchActivityItem[]> = new Observable([]);
|
|
47
|
+
static readonly pageSource: Observable<PageSourceType> = new Observable<PageSourceType>('unknown');
|
|
48
|
+
static readonly cacheStrategy: Observable<CacheStrategy> = new Observable<CacheStrategy>('cache-first');
|
|
49
|
+
static readonly precacheMode: Observable<PrecacheMode> = new Observable<PrecacheMode>('normal');
|
|
50
|
+
private static _fetchTrackingEnabled = false;
|
|
51
|
+
private static _fetchListenerBound = false;
|
|
52
|
+
|
|
30
53
|
// ── Connectivity listeners (bound once) ─────────────────────────
|
|
31
54
|
private static _connectivityBound = false;
|
|
32
55
|
private static _bindConnectivity(): void {
|
|
@@ -179,6 +202,22 @@ export default class ServiceWorker {
|
|
|
179
202
|
}
|
|
180
203
|
}
|
|
181
204
|
|
|
205
|
+
// ── Cache Strategy & Precache Mode ────────────────────────────
|
|
206
|
+
|
|
207
|
+
static setCacheStrategy(strategy: CacheStrategy): void {
|
|
208
|
+
this.cacheStrategy.setObject(strategy);
|
|
209
|
+
this._postMessage({ type: 'SET_CACHE_STRATEGY', strategy });
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
static setPrecacheMode(mode: PrecacheMode): void {
|
|
213
|
+
this.precacheMode.setObject(mode);
|
|
214
|
+
this._postMessage({ type: 'SET_PRECACHE_MODE', mode });
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
static async getConfig(): Promise<{ strategy: CacheStrategy; precacheMode: PrecacheMode }> {
|
|
218
|
+
return this._request<{ strategy: CacheStrategy; precacheMode: PrecacheMode }>({ type: 'GET_CONFIG' });
|
|
219
|
+
}
|
|
220
|
+
|
|
182
221
|
// ── Version & lifecycle ─────────────────────────────────────────
|
|
183
222
|
|
|
184
223
|
/** Ask the waiting SW to activate immediately. */
|
|
@@ -226,4 +265,86 @@ export default class ServiceWorker {
|
|
|
226
265
|
static get registration(): ServiceWorkerRegistration | undefined {
|
|
227
266
|
return this._registration;
|
|
228
267
|
}
|
|
268
|
+
|
|
269
|
+
// ── Fetch Tracking ──────────────────────────────────────────────
|
|
270
|
+
|
|
271
|
+
static enableFetchTracking(): void {
|
|
272
|
+
if (!this._fetchTrackingEnabled) {
|
|
273
|
+
this._fetchTrackingEnabled = true;
|
|
274
|
+
this._postMessage({ type: 'ENABLE_FETCH_TRACKING' });
|
|
275
|
+
this._bindFetchListener();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
static disableFetchTracking(): void {
|
|
280
|
+
if (this._fetchTrackingEnabled) {
|
|
281
|
+
this._fetchTrackingEnabled = false;
|
|
282
|
+
this._postMessage({ type: 'DISABLE_FETCH_TRACKING' });
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
private static _bindFetchListener(): void {
|
|
287
|
+
if (this._fetchListenerBound) return;
|
|
288
|
+
this._fetchListenerBound = true;
|
|
289
|
+
|
|
290
|
+
navigator.serviceWorker?.addEventListener('message', (event) => {
|
|
291
|
+
const data = event.data;
|
|
292
|
+
if (!data || !data.type) return;
|
|
293
|
+
|
|
294
|
+
switch (data.type) {
|
|
295
|
+
case 'FETCH_START': {
|
|
296
|
+
const item: FetchActivityItem = {
|
|
297
|
+
id: data.id,
|
|
298
|
+
url: data.url,
|
|
299
|
+
startTime: data.timestamp,
|
|
300
|
+
status: 'loading'
|
|
301
|
+
};
|
|
302
|
+
const current = [...this.fetchActivities.getObject()];
|
|
303
|
+
current.push(item);
|
|
304
|
+
this.fetchActivities.setObject(current);
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
case 'FETCH_COMPLETE': {
|
|
308
|
+
const current = [...this.fetchActivities.getObject()];
|
|
309
|
+
const idx = current.findIndex(i => i.id === data.id);
|
|
310
|
+
if (idx !== -1) {
|
|
311
|
+
current[idx] = {
|
|
312
|
+
...current[idx],
|
|
313
|
+
size: data.size,
|
|
314
|
+
duration: data.duration,
|
|
315
|
+
fromCache: data.fromCache,
|
|
316
|
+
status: 'complete'
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
this.fetchActivities.setObject(current);
|
|
320
|
+
setTimeout(() => {
|
|
321
|
+
const list = this.fetchActivities.getObject().filter(i => i.id !== data.id);
|
|
322
|
+
this.fetchActivities.setObject(list);
|
|
323
|
+
}, 3000);
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case 'FETCH_ERROR': {
|
|
327
|
+
const current = [...this.fetchActivities.getObject()];
|
|
328
|
+
const idx = current.findIndex(i => i.id === data.id);
|
|
329
|
+
if (idx !== -1) {
|
|
330
|
+
current[idx] = {
|
|
331
|
+
...current[idx],
|
|
332
|
+
status: 'error',
|
|
333
|
+
error: data.error
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
this.fetchActivities.setObject(current);
|
|
337
|
+
setTimeout(() => {
|
|
338
|
+
const list = this.fetchActivities.getObject().filter(i => i.id !== data.id);
|
|
339
|
+
this.fetchActivities.setObject(list);
|
|
340
|
+
}, 5000);
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
case 'PAGE_SOURCE': {
|
|
344
|
+
this.pageSource.setObject(data.source);
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
}
|
|
229
350
|
}
|
|
@@ -17,6 +17,18 @@
|
|
|
17
17
|
const CACHE_VERSION = 'purper-v1';
|
|
18
18
|
const SW_VERSION = '1.0.0';
|
|
19
19
|
|
|
20
|
+
let fetchCounter = 0;
|
|
21
|
+
let fetchTrackingEnabled = false;
|
|
22
|
+
|
|
23
|
+
let cacheStrategy = 'cache-first';
|
|
24
|
+
let precacheMode = 'normal';
|
|
25
|
+
|
|
26
|
+
function broadcastToClients(message) {
|
|
27
|
+
self.clients.matchAll().then((clients) => {
|
|
28
|
+
clients.forEach((c) => c.postMessage(message));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
20
32
|
// ── Install ─────────────────────────────────────────────────────────
|
|
21
33
|
self.addEventListener('install', (event) => {
|
|
22
34
|
console.log(`[ServiceWorker ${SW_VERSION}]: Installing...`);
|
|
@@ -59,6 +71,14 @@ self.addEventListener('fetch', (event) => {
|
|
|
59
71
|
// Only handle GET requests
|
|
60
72
|
if (request.method !== 'GET') return;
|
|
61
73
|
|
|
74
|
+
const tracking = fetchTrackingEnabled;
|
|
75
|
+
const fetchId = tracking ? ++fetchCounter : 0;
|
|
76
|
+
const startTime = tracking ? Date.now() : 0;
|
|
77
|
+
|
|
78
|
+
if (tracking) {
|
|
79
|
+
broadcastToClients({ type: 'FETCH_START', id: fetchId, url: request.url, timestamp: startTime });
|
|
80
|
+
}
|
|
81
|
+
|
|
62
82
|
// Navigation requests (HTML pages) — network-first, fall back to cache
|
|
63
83
|
if (request.mode === 'navigate') {
|
|
64
84
|
event.respondWith(
|
|
@@ -68,29 +88,116 @@ self.addEventListener('fetch', (event) => {
|
|
|
68
88
|
const clone = response.clone();
|
|
69
89
|
caches.open(CACHE_VERSION).then((cache) => cache.put(request, clone));
|
|
70
90
|
}
|
|
91
|
+
broadcastToClients({ type: 'PAGE_SOURCE', url: request.url, source: 'network' });
|
|
92
|
+
if (tracking) {
|
|
93
|
+
const duration = Date.now() - startTime;
|
|
94
|
+
const size = parseInt(response.headers.get('Content-Length')) || -1;
|
|
95
|
+
broadcastToClients({ type: 'FETCH_COMPLETE', id: fetchId, url: request.url, size, duration, fromCache: false, timestamp: Date.now() });
|
|
96
|
+
}
|
|
71
97
|
return response;
|
|
72
98
|
})
|
|
73
99
|
.catch(() => {
|
|
74
100
|
return caches.match(request).then((cached) => {
|
|
75
|
-
|
|
101
|
+
const result = cached || caches.match('/index.html');
|
|
102
|
+
broadcastToClients({ type: 'PAGE_SOURCE', url: request.url, source: 'cache' });
|
|
103
|
+
if (tracking) {
|
|
104
|
+
const duration = Date.now() - startTime;
|
|
105
|
+
broadcastToClients({ type: 'FETCH_COMPLETE', id: fetchId, url: request.url, size: -1, duration, fromCache: true, timestamp: Date.now() });
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
76
108
|
});
|
|
77
109
|
})
|
|
78
110
|
);
|
|
79
111
|
return;
|
|
80
112
|
}
|
|
81
113
|
|
|
82
|
-
// Sub-resources (CSS, JS, images, fonts, JSON)
|
|
114
|
+
// Sub-resources (CSS, JS, images, fonts, JSON)
|
|
115
|
+
// Strategy depends on cacheStrategy and precacheMode settings.
|
|
116
|
+
|
|
117
|
+
// Disabled mode — always fetch from network, never cache
|
|
118
|
+
if (precacheMode === 'disabled') {
|
|
119
|
+
event.respondWith(
|
|
120
|
+
fetch(request)
|
|
121
|
+
.then((response) => {
|
|
122
|
+
if (tracking) {
|
|
123
|
+
const duration = Date.now() - startTime;
|
|
124
|
+
const size = parseInt(response.headers.get('Content-Length')) || -1;
|
|
125
|
+
broadcastToClients({ type: 'FETCH_COMPLETE', id: fetchId, url: request.url, size, duration, fromCache: false, timestamp: Date.now() });
|
|
126
|
+
}
|
|
127
|
+
return response;
|
|
128
|
+
})
|
|
129
|
+
.catch((err) => {
|
|
130
|
+
if (tracking) {
|
|
131
|
+
broadcastToClients({ type: 'FETCH_ERROR', id: fetchId, url: request.url, error: err.message || String(err), timestamp: Date.now() });
|
|
132
|
+
}
|
|
133
|
+
throw err;
|
|
134
|
+
})
|
|
135
|
+
);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Network-first for sub-resources
|
|
140
|
+
if (cacheStrategy === 'network-first') {
|
|
141
|
+
event.respondWith(
|
|
142
|
+
fetch(request)
|
|
143
|
+
.then((response) => {
|
|
144
|
+
if (response.ok && response.type === 'basic') {
|
|
145
|
+
const clone = response.clone();
|
|
146
|
+
caches.open(CACHE_VERSION).then((cache) => cache.put(request, clone));
|
|
147
|
+
}
|
|
148
|
+
if (tracking) {
|
|
149
|
+
const duration = Date.now() - startTime;
|
|
150
|
+
const size = parseInt(response.headers.get('Content-Length')) || -1;
|
|
151
|
+
broadcastToClients({ type: 'FETCH_COMPLETE', id: fetchId, url: request.url, size, duration, fromCache: false, timestamp: Date.now() });
|
|
152
|
+
}
|
|
153
|
+
return response;
|
|
154
|
+
})
|
|
155
|
+
.catch(() => {
|
|
156
|
+
return caches.match(request).then((cached) => {
|
|
157
|
+
if (tracking) {
|
|
158
|
+
const duration = Date.now() - startTime;
|
|
159
|
+
const size = cached ? (parseInt(cached.headers.get('Content-Length')) || -1) : -1;
|
|
160
|
+
broadcastToClients({ type: 'FETCH_COMPLETE', id: fetchId, url: request.url, size, duration, fromCache: true, timestamp: Date.now() });
|
|
161
|
+
}
|
|
162
|
+
if (cached) return cached;
|
|
163
|
+
throw new Error('No cached response available');
|
|
164
|
+
});
|
|
165
|
+
})
|
|
166
|
+
);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Cache-first for sub-resources (default)
|
|
83
171
|
event.respondWith(
|
|
84
172
|
caches.match(request).then((cached) => {
|
|
85
|
-
if (cached)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
caches.open(CACHE_VERSION).then((cache) => cache.put(request, clone));
|
|
173
|
+
if (cached) {
|
|
174
|
+
if (tracking) {
|
|
175
|
+
const duration = Date.now() - startTime;
|
|
176
|
+
const size = parseInt(cached.headers.get('Content-Length')) || -1;
|
|
177
|
+
broadcastToClients({ type: 'FETCH_COMPLETE', id: fetchId, url: request.url, size, duration, fromCache: true, timestamp: Date.now() });
|
|
91
178
|
}
|
|
92
|
-
return
|
|
93
|
-
}
|
|
179
|
+
return cached;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return fetch(request)
|
|
183
|
+
.then((response) => {
|
|
184
|
+
if (response.ok && response.type === 'basic') {
|
|
185
|
+
const clone = response.clone();
|
|
186
|
+
caches.open(CACHE_VERSION).then((cache) => cache.put(request, clone));
|
|
187
|
+
}
|
|
188
|
+
if (tracking) {
|
|
189
|
+
const duration = Date.now() - startTime;
|
|
190
|
+
const size = parseInt(response.headers.get('Content-Length')) || -1;
|
|
191
|
+
broadcastToClients({ type: 'FETCH_COMPLETE', id: fetchId, url: request.url, size, duration, fromCache: false, timestamp: Date.now() });
|
|
192
|
+
}
|
|
193
|
+
return response;
|
|
194
|
+
})
|
|
195
|
+
.catch((err) => {
|
|
196
|
+
if (tracking) {
|
|
197
|
+
broadcastToClients({ type: 'FETCH_ERROR', id: fetchId, url: request.url, error: err.message || String(err), timestamp: Date.now() });
|
|
198
|
+
}
|
|
199
|
+
throw err;
|
|
200
|
+
});
|
|
94
201
|
})
|
|
95
202
|
);
|
|
96
203
|
});
|
|
@@ -185,6 +292,34 @@ self.addEventListener('message', (event) => {
|
|
|
185
292
|
break;
|
|
186
293
|
}
|
|
187
294
|
|
|
295
|
+
case 'ENABLE_FETCH_TRACKING':
|
|
296
|
+
fetchTrackingEnabled = true;
|
|
297
|
+
console.log('[ServiceWorker]: Fetch tracking enabled');
|
|
298
|
+
break;
|
|
299
|
+
|
|
300
|
+
case 'DISABLE_FETCH_TRACKING':
|
|
301
|
+
fetchTrackingEnabled = false;
|
|
302
|
+
console.log('[ServiceWorker]: Fetch tracking disabled');
|
|
303
|
+
break;
|
|
304
|
+
|
|
305
|
+
case 'SET_CACHE_STRATEGY':
|
|
306
|
+
if (event.data.strategy === 'cache-first' || event.data.strategy === 'network-first') {
|
|
307
|
+
cacheStrategy = event.data.strategy;
|
|
308
|
+
console.log(`[ServiceWorker]: Cache strategy set to "${cacheStrategy}"`);
|
|
309
|
+
}
|
|
310
|
+
break;
|
|
311
|
+
|
|
312
|
+
case 'SET_PRECACHE_MODE':
|
|
313
|
+
if (event.data.mode === 'precache' || event.data.mode === 'normal' || event.data.mode === 'disabled') {
|
|
314
|
+
precacheMode = event.data.mode;
|
|
315
|
+
console.log(`[ServiceWorker]: Precache mode set to "${precacheMode}"`);
|
|
316
|
+
}
|
|
317
|
+
break;
|
|
318
|
+
|
|
319
|
+
case 'GET_CONFIG':
|
|
320
|
+
if (port) port.postMessage({ strategy: cacheStrategy, precacheMode: precacheMode });
|
|
321
|
+
break;
|
|
322
|
+
|
|
188
323
|
default:
|
|
189
324
|
console.warn(`[ServiceWorker]: Unknown message type "${type}"`);
|
|
190
325
|
}
|
package/src/index.ts
CHANGED
|
@@ -24,7 +24,7 @@ export { default as Fetcher } from './foundation/Fetcher.js';
|
|
|
24
24
|
export * from './foundation/engine/TemplateEngine.js';
|
|
25
25
|
|
|
26
26
|
export { Router } from './foundation/worker/Router.js';
|
|
27
|
-
export { default as ServiceWorker, ServiceWorkerConfig } from './foundation/worker/ServiceWorker.js';
|
|
27
|
+
export { default as ServiceWorker, ServiceWorkerConfig, FetchActivityItem, PageSourceType, CacheStrategy, PrecacheMode } from './foundation/worker/ServiceWorker.js';
|
|
28
28
|
|
|
29
29
|
export * from './foundation/Hosting.js';
|
|
30
30
|
export * from './foundation/Theme.js';
|