@equinor/fusion-framework-vite-plugin-spa 1.1.1 → 1.1.3
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 +42 -0
- package/dist/esm/html/register-service-worker.js +72 -13
- package/dist/esm/html/register-service-worker.js.map +1 -1
- package/dist/esm/html/sw.js +7 -1
- package/dist/esm/html/sw.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/html/bootstrap.js +72 -13
- package/dist/html/bootstrap.js.map +1 -1
- package/dist/html/sw.js +7 -1
- package/dist/html/sw.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/html/index.html.d.ts +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +5 -5
- package/src/html/register-service-worker.ts +85 -16
- package/src/html/sw.ts +8 -1
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# @equinor/fusion-framework-vite-plugin-spa
|
|
2
2
|
|
|
3
|
+
## 1.1.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`56c27ec`](https://github.com/equinor/fusion-framework/commit/56c27ec9de03e07e725eecfdf2c028a1e29b6ece) Thanks [@odinr](https://github.com/odinr)! - Updated workspace dependencies to use exact version specifiers for consistent release behavior.
|
|
8
|
+
|
|
9
|
+
- Changed workspace dependencies from `workspace:^` to `workspace:*` across CLI, dev-server, and SPA vite plugin packages
|
|
10
|
+
- Ensures exact version resolution within the monorepo for predictable builds and releases
|
|
11
|
+
- Affects both dependencies and devDependencies where applicable
|
|
12
|
+
|
|
13
|
+
## 1.1.2
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- [#3470](https://github.com/equinor/fusion-framework/pull/3470) [`0734026`](https://github.com/equinor/fusion-framework/commit/073402682cacae75d82e69068e18b3061228972b) Thanks [@eikeland](https://github.com/eikeland)! - Fixed service worker not intercepting requests during hard refresh in development mode.
|
|
18
|
+
|
|
19
|
+
**Problem**: During hard refresh, the service worker would not intercept fetch requests, causing authenticated API requests to fail. The service worker could be stuck in "waiting" state or already active but not controlling the page (`navigator.serviceWorker.controller` was `undefined`).
|
|
20
|
+
|
|
21
|
+
**Root Cause**: Two related issues in the service worker lifecycle during hard refresh:
|
|
22
|
+
|
|
23
|
+
1. **Waiting state**: When code changes, the new service worker enters "waiting" state, but `skipWaiting()` only runs in the `install` event (which already fired)
|
|
24
|
+
2. **No controller**: Even when active, `clients.claim()` only runs in the `activate` event, which doesn't fire again if the service worker is already active
|
|
25
|
+
|
|
26
|
+
**Solution**:
|
|
27
|
+
|
|
28
|
+
- **Force activation on config receipt**: When receiving `INIT_CONFIG`, immediately call both `skipWaiting()` and `clients.claim()` to ensure the service worker activates and takes control regardless of its current state
|
|
29
|
+
- **Wait for controller**: Registration now waits for `navigator.serviceWorker.controller` to be set before proceeding, ensuring fetch interception is ready
|
|
30
|
+
- **Disable service worker caching**: Added `updateViaCache: 'none'` to always fetch fresh service worker code during development
|
|
31
|
+
- **Comprehensive state handling**: Handle service workers in installing, waiting, and active states
|
|
32
|
+
|
|
33
|
+
**Changes**:
|
|
34
|
+
|
|
35
|
+
1. **sw.ts**: Call `skipWaiting()` and `clients.claim()` when receiving `INIT_CONFIG` message
|
|
36
|
+
2. **register-service-worker.ts**: Wait for controller with polling and timeout fallback; disable service worker HTTP caching
|
|
37
|
+
|
|
38
|
+
This ensures service workers always activate and take control during hard refresh, properly intercepting and authenticating requests in development mode.
|
|
39
|
+
|
|
40
|
+
reporter: [v3gard](https://github.com/v3gard)
|
|
41
|
+
|
|
42
|
+
resolves: [Force refresh (CTRL+Shift+R) causes app to throw #679
|
|
43
|
+
](https://github.com/equinor/fusion/issues/679)
|
|
44
|
+
|
|
3
45
|
## 1.1.1
|
|
4
46
|
|
|
5
47
|
### Patch Changes
|
|
@@ -8,22 +8,19 @@ export async function registerServiceWorker(framework) {
|
|
|
8
8
|
console.warn('Service worker config is not defined.');
|
|
9
9
|
return;
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
});
|
|
17
|
-
// wait for the service worker to be ready
|
|
18
|
-
await navigator.serviceWorker.ready;
|
|
19
|
-
// allow the service worker to start receiving messages
|
|
20
|
-
navigator.serviceWorker.startMessages();
|
|
21
|
-
// send the config to the service worker
|
|
22
|
-
registration.active?.postMessage({
|
|
11
|
+
/**
|
|
12
|
+
* Helper function to send configuration to the service worker
|
|
13
|
+
*/
|
|
14
|
+
const sendConfigToServiceWorker = (worker) => {
|
|
15
|
+
worker.postMessage({
|
|
23
16
|
type: 'INIT_CONFIG',
|
|
24
17
|
config: resourceConfigs,
|
|
25
18
|
});
|
|
26
|
-
|
|
19
|
+
};
|
|
20
|
+
try {
|
|
21
|
+
// allow the service worker to start receiving messages early
|
|
22
|
+
navigator.serviceWorker.startMessages();
|
|
23
|
+
// listen for messages from the service worker (set up before registration)
|
|
27
24
|
navigator.serviceWorker.addEventListener('message', async (event) => {
|
|
28
25
|
if (event.data.type === 'GET_TOKEN') {
|
|
29
26
|
try {
|
|
@@ -50,6 +47,68 @@ export async function registerServiceWorker(framework) {
|
|
|
50
47
|
}
|
|
51
48
|
}
|
|
52
49
|
});
|
|
50
|
+
// register the service worker
|
|
51
|
+
// updateViaCache: 'none' ensures the service worker script is always fetched fresh
|
|
52
|
+
// This is important during development to pick up code changes
|
|
53
|
+
const registration = await navigator.serviceWorker.register('/@fusion-spa-sw.js', {
|
|
54
|
+
type: 'module',
|
|
55
|
+
scope: '/',
|
|
56
|
+
updateViaCache: 'none',
|
|
57
|
+
});
|
|
58
|
+
// Handle service worker updates/installations
|
|
59
|
+
// If there's a service worker waiting or installing, send config when it activates
|
|
60
|
+
if (registration.waiting) {
|
|
61
|
+
sendConfigToServiceWorker(registration.waiting);
|
|
62
|
+
}
|
|
63
|
+
if (registration.installing) {
|
|
64
|
+
registration.installing.addEventListener('statechange', (event) => {
|
|
65
|
+
const worker = event.target;
|
|
66
|
+
if (worker.state === 'activated') {
|
|
67
|
+
sendConfigToServiceWorker(worker);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Listen for controller changes (happens during hard refresh or updates)
|
|
72
|
+
navigator.serviceWorker.addEventListener('controllerchange', () => {
|
|
73
|
+
if (navigator.serviceWorker.controller) {
|
|
74
|
+
sendConfigToServiceWorker(navigator.serviceWorker.controller);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// wait for the service worker to be ready
|
|
78
|
+
const readyRegistration = await navigator.serviceWorker.ready;
|
|
79
|
+
// ensure we have an active service worker before sending config
|
|
80
|
+
const activeWorker = readyRegistration.active;
|
|
81
|
+
if (!activeWorker) {
|
|
82
|
+
console.error('[Service Worker Registration] Service worker is not active after ready state');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// CRITICAL: Wait for the service worker to become the controller
|
|
86
|
+
// This ensures the service worker can intercept fetch requests
|
|
87
|
+
if (!navigator.serviceWorker.controller) {
|
|
88
|
+
await new Promise((resolve) => {
|
|
89
|
+
let checkInterval;
|
|
90
|
+
const finish = () => {
|
|
91
|
+
clearInterval(checkInterval);
|
|
92
|
+
navigator.serviceWorker.removeEventListener('controllerchange', onControllerChange);
|
|
93
|
+
resolve();
|
|
94
|
+
};
|
|
95
|
+
const onControllerChange = () => finish();
|
|
96
|
+
// If controllerchange fires, the service worker has taken control
|
|
97
|
+
navigator.serviceWorker.addEventListener('controllerchange', onControllerChange);
|
|
98
|
+
// Polling fallback and timeout to prevent infinite waiting
|
|
99
|
+
checkInterval = setInterval(() => {
|
|
100
|
+
if (navigator.serviceWorker.controller)
|
|
101
|
+
finish();
|
|
102
|
+
}, 200);
|
|
103
|
+
setTimeout(finish, 5000);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// send the config to the active service worker
|
|
107
|
+
sendConfigToServiceWorker(activeWorker);
|
|
108
|
+
// Also send to the controller if it exists and is different from active
|
|
109
|
+
if (navigator.serviceWorker.controller && navigator.serviceWorker.controller !== activeWorker) {
|
|
110
|
+
sendConfigToServiceWorker(navigator.serviceWorker.controller);
|
|
111
|
+
}
|
|
53
112
|
}
|
|
54
113
|
catch (error) {
|
|
55
114
|
console.error('Service Worker registration failed:', error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-service-worker.js","sourceRoot":"","sources":["../../../src/html/register-service-worker.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAwC;IAClF,IAAI,eAAe,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC;IAC5E,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"register-service-worker.js","sourceRoot":"","sources":["../../../src/html/register-service-worker.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/html/sw.js
CHANGED
|
@@ -139,10 +139,16 @@ self.addEventListener('activate', (event) => {
|
|
|
139
139
|
event.waitUntil(self.clients.claim());
|
|
140
140
|
});
|
|
141
141
|
// Handle configuration from main thread
|
|
142
|
-
self.addEventListener('message', (event) => {
|
|
142
|
+
self.addEventListener('message', async (event) => {
|
|
143
143
|
const { type, config } = event.data;
|
|
144
144
|
if (type === 'INIT_CONFIG') {
|
|
145
145
|
resourceConfigurations = config;
|
|
146
|
+
// CRITICAL: Force skipWaiting() and claim clients to ensure this service worker takes control
|
|
147
|
+
// This handles both waiting and already-active service workers during hard refresh
|
|
148
|
+
// - skipWaiting() forces activation if the service worker is in waiting state
|
|
149
|
+
// - clients.claim() takes control of all clients immediately
|
|
150
|
+
await self.skipWaiting();
|
|
151
|
+
await self.clients.claim();
|
|
146
152
|
}
|
|
147
153
|
});
|
|
148
154
|
// Handle fetch events
|
package/dist/esm/html/sw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sw.js","sourceRoot":"","sources":["../../../src/html/sw.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sw.js","sourceRoot":"","sources":["../../../src/html/sw.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAoBjC;;;;;;;;GAQG;AACH,MAAM,IAAI,GAAG,UAAiD,CAAC;AAE/D;;;;GAIG;AACH,IAAI,sBAAsB,GAA4B,EAAE,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,UAAU,GAAe,IAAI,GAAG,EAAE,CAAC;AAEzC;;;;;GAKG;AACH,SAAS,WAAW,CAAC,MAAgB;IACnC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,YAAY,CAAC,MAAgB;IACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,sBAAsB,CAAC,MAAgB;IACpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAE9C,qCAAqC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,0DAA0D;IAC1D,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzD,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;YACzC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,IAAkD,CAAC,CAAC;QACpE,CAAC,CAAC;QACF,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,+BAA+B;IAC/B,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,QAAQ,CAAC,MAAgB;IACtC,gDAAgD;IAChD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,gCAAgC;AAChC;;;;;;;;;;;;;;GAcG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAC9D,CAAC,IAAI,CAAC;QACP,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QAC3D,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAsB,EAAE,EAAE;IAC1D,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,iBAAiB;AACjB,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,KAAsB,EAAE,EAAE;IAC3D,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,wCAAwC;AACxC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,KAA6B,EAAE,EAAE;IACvE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;IACpC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,sBAAsB,GAAG,MAAiC,CAAC;QAE3D,8FAA8F;QAC9F,mFAAmF;QACnF,8EAA8E;QAC9E,6DAA6D;QAC7D,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAiB,EAAE,EAAE;IACnD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAExD,6CAA6C;IAC7C,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;YAC/B,oEAAoE;YACpE,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACnD,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,uDAAuD;YACvD,IAAI,OAAO,aAAa,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC9C,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;YACjF,CAAC;YAED,sDAAsD;YACtD,OAAO,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC;QACF,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,CAAC;IACrC,CAAC;AACH,CAAC,CAAC,CAAC"}
|
package/dist/esm/version.js
CHANGED
package/dist/html/bootstrap.js
CHANGED
|
@@ -42000,22 +42000,19 @@ async function registerServiceWorker(framework) {
|
|
|
42000
42000
|
console.warn('Service worker config is not defined.');
|
|
42001
42001
|
return;
|
|
42002
42002
|
}
|
|
42003
|
-
|
|
42004
|
-
|
|
42005
|
-
|
|
42006
|
-
|
|
42007
|
-
|
|
42008
|
-
});
|
|
42009
|
-
// wait for the service worker to be ready
|
|
42010
|
-
await navigator.serviceWorker.ready;
|
|
42011
|
-
// allow the service worker to start receiving messages
|
|
42012
|
-
navigator.serviceWorker.startMessages();
|
|
42013
|
-
// send the config to the service worker
|
|
42014
|
-
registration.active?.postMessage({
|
|
42003
|
+
/**
|
|
42004
|
+
* Helper function to send configuration to the service worker
|
|
42005
|
+
*/
|
|
42006
|
+
const sendConfigToServiceWorker = (worker) => {
|
|
42007
|
+
worker.postMessage({
|
|
42015
42008
|
type: 'INIT_CONFIG',
|
|
42016
42009
|
config: resourceConfigs,
|
|
42017
42010
|
});
|
|
42018
|
-
|
|
42011
|
+
};
|
|
42012
|
+
try {
|
|
42013
|
+
// allow the service worker to start receiving messages early
|
|
42014
|
+
navigator.serviceWorker.startMessages();
|
|
42015
|
+
// listen for messages from the service worker (set up before registration)
|
|
42019
42016
|
navigator.serviceWorker.addEventListener('message', async (event) => {
|
|
42020
42017
|
if (event.data.type === 'GET_TOKEN') {
|
|
42021
42018
|
try {
|
|
@@ -42042,6 +42039,68 @@ async function registerServiceWorker(framework) {
|
|
|
42042
42039
|
}
|
|
42043
42040
|
}
|
|
42044
42041
|
});
|
|
42042
|
+
// register the service worker
|
|
42043
|
+
// updateViaCache: 'none' ensures the service worker script is always fetched fresh
|
|
42044
|
+
// This is important during development to pick up code changes
|
|
42045
|
+
const registration = await navigator.serviceWorker.register('/@fusion-spa-sw.js', {
|
|
42046
|
+
type: 'module',
|
|
42047
|
+
scope: '/',
|
|
42048
|
+
updateViaCache: 'none',
|
|
42049
|
+
});
|
|
42050
|
+
// Handle service worker updates/installations
|
|
42051
|
+
// If there's a service worker waiting or installing, send config when it activates
|
|
42052
|
+
if (registration.waiting) {
|
|
42053
|
+
sendConfigToServiceWorker(registration.waiting);
|
|
42054
|
+
}
|
|
42055
|
+
if (registration.installing) {
|
|
42056
|
+
registration.installing.addEventListener('statechange', (event) => {
|
|
42057
|
+
const worker = event.target;
|
|
42058
|
+
if (worker.state === 'activated') {
|
|
42059
|
+
sendConfigToServiceWorker(worker);
|
|
42060
|
+
}
|
|
42061
|
+
});
|
|
42062
|
+
}
|
|
42063
|
+
// Listen for controller changes (happens during hard refresh or updates)
|
|
42064
|
+
navigator.serviceWorker.addEventListener('controllerchange', () => {
|
|
42065
|
+
if (navigator.serviceWorker.controller) {
|
|
42066
|
+
sendConfigToServiceWorker(navigator.serviceWorker.controller);
|
|
42067
|
+
}
|
|
42068
|
+
});
|
|
42069
|
+
// wait for the service worker to be ready
|
|
42070
|
+
const readyRegistration = await navigator.serviceWorker.ready;
|
|
42071
|
+
// ensure we have an active service worker before sending config
|
|
42072
|
+
const activeWorker = readyRegistration.active;
|
|
42073
|
+
if (!activeWorker) {
|
|
42074
|
+
console.error('[Service Worker Registration] Service worker is not active after ready state');
|
|
42075
|
+
return;
|
|
42076
|
+
}
|
|
42077
|
+
// CRITICAL: Wait for the service worker to become the controller
|
|
42078
|
+
// This ensures the service worker can intercept fetch requests
|
|
42079
|
+
if (!navigator.serviceWorker.controller) {
|
|
42080
|
+
await new Promise((resolve) => {
|
|
42081
|
+
let checkInterval;
|
|
42082
|
+
const finish = () => {
|
|
42083
|
+
clearInterval(checkInterval);
|
|
42084
|
+
navigator.serviceWorker.removeEventListener('controllerchange', onControllerChange);
|
|
42085
|
+
resolve();
|
|
42086
|
+
};
|
|
42087
|
+
const onControllerChange = () => finish();
|
|
42088
|
+
// If controllerchange fires, the service worker has taken control
|
|
42089
|
+
navigator.serviceWorker.addEventListener('controllerchange', onControllerChange);
|
|
42090
|
+
// Polling fallback and timeout to prevent infinite waiting
|
|
42091
|
+
checkInterval = setInterval(() => {
|
|
42092
|
+
if (navigator.serviceWorker.controller)
|
|
42093
|
+
finish();
|
|
42094
|
+
}, 200);
|
|
42095
|
+
setTimeout(finish, 5000);
|
|
42096
|
+
});
|
|
42097
|
+
}
|
|
42098
|
+
// send the config to the active service worker
|
|
42099
|
+
sendConfigToServiceWorker(activeWorker);
|
|
42100
|
+
// Also send to the controller if it exists and is different from active
|
|
42101
|
+
if (navigator.serviceWorker.controller && navigator.serviceWorker.controller !== activeWorker) {
|
|
42102
|
+
sendConfigToServiceWorker(navigator.serviceWorker.controller);
|
|
42103
|
+
}
|
|
42045
42104
|
}
|
|
42046
42105
|
catch (error) {
|
|
42047
42106
|
console.error('Service Worker registration failed:', error);
|