@@ -34,12 +34,16 @@ function withServiceWorker(controller: Partial<ServiceWorker> & { postMessage: (
3434 active : controller as ServiceWorker ,
3535 } ) ) ;
3636
37+ const ready = Promise . resolve ( {
38+ active : controller as ServiceWorker ,
39+ } as ServiceWorkerRegistration ) ;
40+
3741 Object . defineProperty ( navigator , 'serviceWorker' , {
3842 value : {
39- controller,
4043 addEventListener,
4144 removeEventListener,
4245 getRegistration,
46+ ready,
4347 } ,
4448 configurable : true ,
4549 } ) ;
@@ -97,33 +101,22 @@ describe('utils', () => {
97101
98102 describe ( 'Service Worker secret key helpers' , ( ) => {
99103 it ( 'stores secret in service worker if controller exists' , async ( ) => {
100- const postMessage = vi . fn ( ) ;
104+ const postMessage = vi . fn ( ( msg ) => {
105+ if ( msg . type === MessageType . StoreSecret ) {
106+ triggerSWMessage ( { type : MessageType . StoreSecret , data : "stored" } ) ;
107+ }
108+ } ) ;
101109 withServiceWorker ( { postMessage } as any ) ;
102110 await utils . storeSecretKeyInServiceWorker ( 'abc' ) ;
103111 expect ( postMessage ) . toHaveBeenCalledWith ( { type : MessageType . StoreSecret , data : 'abc' } ) ;
104112 } ) ;
105113
106- it ( 'does nothing when no service worker controller (store)' , async ( ) => {
107- Object . defineProperty ( navigator , 'serviceWorker' , {
108- value : {
109- controller : null ,
110- getRegistration : vi . fn ( async ( ) => null ) ,
111- } ,
112- configurable : true
113- } ) ;
114- await utils . storeSecretKeyInServiceWorker ( 'abc' ) ;
115- // no error thrown
116- } ) ;
117-
118114 it ( 'requests secret and resolves with response (getSecretKeyFromServiceWorker)' , async ( ) => {
119115 const postMessage = vi . fn ( ( msg : any ) => {
120116 // When the service worker receives a RequestSecret message,
121117 // simulate it responding with the secret
122118 if ( msg . type === MessageType . RequestSecret ) {
123- // Use queueMicrotask to ensure the message handler is set up first
124- queueMicrotask ( ( ) => {
125- triggerSWMessage ( { type : MessageType . StoreSecret , data : 'encoded' } ) ;
126- } ) ;
119+ triggerSWMessage ( { type : MessageType . RequestSecret , data : 'encoded' } ) ;
127120 }
128121 } ) ;
129122 withServiceWorker ( { postMessage } as any ) ;
@@ -136,20 +129,6 @@ describe('utils', () => {
136129 expect ( key ) . toBe ( 'encoded' ) ;
137130 } ) ;
138131
139- it ( 'returns null when no service worker controller available' , async ( ) => {
140- // Setup no controller scenario - will retry 3 times with 500ms delays each = 1500ms total
141- Object . defineProperty ( navigator , 'serviceWorker' , {
142- value : {
143- controller : null ,
144- getRegistration : vi . fn ( async ( ) => null ) ,
145- } ,
146- configurable : true ,
147- } ) ;
148-
149- const result = await utils . getSecretKeyFromServiceWorker ( ) ;
150- expect ( result ) . toBeNull ( ) ;
151- } , 10000 ) ; // Generous timeout to allow for multiple retries
152-
153132 it ( 'clears secret key via service worker' , async ( ) => {
154133 const postMessage = vi . fn ( ) ;
155134 withServiceWorker ( { postMessage } as any ) ;
@@ -161,10 +140,7 @@ describe('utils', () => {
161140 // Create a mock service worker that immediately responds
162141 const postMessage = vi . fn ( ( msg : any ) => {
163142 if ( msg . type === MessageType . RequestSecret ) {
164- // Immediately trigger the response
165- setTimeout ( ( ) => {
166- triggerSWMessage ( { type : MessageType . StoreSecret , data : 'immediate-response' } ) ;
167- } , 0 ) ;
143+ triggerSWMessage ( { type : MessageType . RequestSecret , data : 'immediate-response' } ) ;
168144 }
169145 } ) ;
170146
@@ -183,14 +159,8 @@ describe('utils', () => {
183159 it ( 'nulls secret and pub_key and calls clearSecretKeyFromServiceWorker' , ( ) => {
184160 // Provide a mock service worker controller to observe the clear message
185161 const postMessage = vi . fn ( ) ;
186- Object . defineProperty ( navigator , 'serviceWorker' , {
187- value : {
188- controller : { postMessage } ,
189- getRegistration : vi . fn ( async ( ) => ( { active : { postMessage } } ) ) ,
190- } ,
191- configurable : true ,
192- } ) ;
193162
163+ withServiceWorker ( { postMessage } ) ;
194164 // Ensure calling resetSecret sets them to null state and triggers postMessage with ClearSecret
195165 utils . resetSecret ( ) ;
196166 expect ( ( utils as any ) . secret ) . toBeNull ( ) ;
@@ -227,7 +197,7 @@ describe('utils', () => {
227197 // Mock service worker so getSecretKeyFromServiceWorker resolves with value
228198 const postMessage = vi . fn ( ( msg : any ) => {
229199 if ( msg . type === MessageType . RequestSecret ) {
230- triggerSWMessage ( { type : MessageType . StoreSecret , data : 'SGVjcmV0' } ) ;
200+ triggerSWMessage ( { type : MessageType . RequestSecret , data : 'SGVjcmV0' } ) ;
231201 }
232202 } ) ;
233203 withServiceWorker ( { postMessage } as any ) ;
@@ -266,7 +236,7 @@ describe('utils', () => {
266236 ( window . localStorage . getItem as any ) . mockImplementation ( ( key : string ) => key === 'loginSalt' ? 'salty' : null ) ;
267237 const postMessage = vi . fn ( ( msg : any ) => {
268238 if ( msg . type === MessageType . RequestSecret ) {
269- triggerSWMessage ( { type : MessageType . StoreSecret , data : 'ANY' } ) ;
239+ triggerSWMessage ( { type : MessageType . RequestSecret , data : 'ANY' } ) ;
270240 }
271241 } ) ;
272242 withServiceWorker ( { postMessage } as any ) ;
@@ -297,14 +267,13 @@ describe('utils', () => {
297267
298268 it ( 'catch block resets secret if tokens missing' , async ( ) => {
299269 ( window . localStorage . getItem as any ) . mockImplementation ( ( ) => null ) ;
300- // Ensure no service worker controller - will retry 3 times with 500ms delays each
301- Object . defineProperty ( navigator , 'serviceWorker' , {
302- value : {
303- controller : null ,
304- getRegistration : vi . fn ( async ( ) => null ) ,
305- } ,
306- configurable : true
270+ const postMessage = vi . fn ( ( event ) => {
271+ if ( event . type === MessageType . RequestSecret ) {
272+ triggerSWMessage ( { type : MessageType . RequestSecret , data : null } ) ; // No secret
273+ }
307274 } ) ;
275+ withServiceWorker ( { postMessage } ) ;
276+
308277 // Start from LoggedOut so we can ensure it does not become LoggedIn
309278 utils . loggedIn . value = utils . AppState . LoggedOut ;
310279 ( utils . fetchClient as any ) . GET = vi . fn ( async ( path : string ) => {
0 commit comments