@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 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
- try {
12
- // register the service worker
13
- const registration = await navigator.serviceWorker.register('/@fusion-spa-sw.js', {
14
- type: 'module',
15
- scope: '/',
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
- // listen for messages from the service worker
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,IAAI,CAAC;QACH,8BAA8B;QAC9B,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,EAAE;YAChF,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QAEH,0CAA0C;QAC1C,MAAM,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;QAEpC,uDAAuD;QACvD,SAAS,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAExC,wCAAwC;QACxC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC;YAC/B,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,eAAe;SACxB,CAAC,CAAC;QAEH,8CAA8C;QAC9C,SAAS,CAAC,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAClE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,qCAAqC;oBACrC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAkB,CAAC;oBAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBACtC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAC7C,CAAC;oBAED,uCAAuC;oBACvC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;oBAE5D,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAC7C,CAAC;oBAED,4CAA4C;oBAC5C,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;wBACzB,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE;qBACtC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;wBACzB,KAAK,EAAG,KAAe,CAAC,OAAO;qBAChC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"register-service-worker.js","sourceRoot":"","sources":["../../../src/html/register-service-worker.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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":"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"}
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '1.1.1';
2
+ export const version = '1.1.3';
3
3
  //# sourceMappingURL=version.js.map
@@ -42000,22 +42000,19 @@ async function registerServiceWorker(framework) {
42000
42000
  console.warn('Service worker config is not defined.');
42001
42001
  return;
42002
42002
  }
42003
- try {
42004
- // register the service worker
42005
- const registration = await navigator.serviceWorker.register('/@fusion-spa-sw.js', {
42006
- type: 'module',
42007
- scope: '/',
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
- // listen for messages from the service worker
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);