@@ -131,64 +131,77 @@ export async function refresh_access_token() {
131131export let secret : Uint8Array | null = null ;
132132export let pub_key : Uint8Array | null = null ;
133133
134- // Service Worker communication functions
134+ let storeSecretKeyPromise : Promise < void > | null = null ;
135135export async function storeSecretKeyInServiceWorker ( secretKey : string ) : Promise < void > {
136- if ( ! navigator . serviceWorker . controller ) {
137- return ;
136+ if ( storeSecretKeyPromise ) {
137+ return storeSecretKeyPromise ;
138138 }
139139
140- const msg : Message = {
141- type : MessageType . StoreSecret ,
142- data : secretKey
143- } ;
144- navigator . serviceWorker . controller . postMessage ( msg ) ;
145- }
140+ storeSecretKeyPromise = new Promise ( async ( resolve , reject ) => {
141+ // We dont use navigator.serviceWorker.controller here since it can be, for whatever reason,
142+ // null for an entire browser session
143+ const controller = await navigator . serviceWorker . ready ;
144+
145+ const timeout = setTimeout ( ( ) => {
146+ console . error ( "Service Worker: Failed to store secretKey within timeout. Retrying..." ) ;
147+ storeSecretKeyPromise = null ;
148+ reject ( "Timeout waiting for storing secretKey in Service Worker" ) ;
149+ } , 5000 ) ;
150+
151+ const handleMessage = ( event : MessageEvent ) => {
152+ const msg = event . data as Message ;
153+ if ( msg . type === MessageType . StoreSecret ) {
154+ if ( msg . data !== "stored" ) {
155+ clearTimeout ( timeout ) ;
156+ navigator . serviceWorker . removeEventListener ( 'message' , handleMessage ) ;
157+ storeSecretKeyPromise = null ;
158+ reject ( "Failed to store secretKey in Service Worker: " + msg . data ) ;
159+ return ;
160+ }
161+ clearTimeout ( timeout ) ;
162+ navigator . serviceWorker . removeEventListener ( 'message' , handleMessage ) ;
163+ storeSecretKeyPromise = null ;
164+ resolve ( ) ;
165+ }
166+ } ;
146167
147- let gettingSecretInProgress = false ;
148- let secretKeyPromise : Promise < string | null > | null = null ;
149- let retries = 0 ;
168+ navigator . serviceWorker . addEventListener ( 'message' , handleMessage ) ;
169+
170+ const msg : Message = {
171+ type : MessageType . StoreSecret ,
172+ data : secretKey
173+ } ;
174+ controller . active ?. postMessage ( msg ) ;
175+ } ) ;
150176
151- export async function getSecretKeyFromServiceWorker ( ) : Promise < string | null > {
152- if ( gettingSecretInProgress ) {
177+ return storeSecretKeyPromise ;
178+ }
179+
180+ let secretKeyPromise : Promise < string > | null = null ;
181+ export async function getSecretKeyFromServiceWorker ( ) : Promise < string > {
182+ if ( secretKeyPromise ) {
153183 return secretKeyPromise ;
154184 }
155185
156- secretKeyPromise = new Promise ( async ( resolve ) => {
186+ secretKeyPromise = new Promise ( async ( resolve , reject ) => {
157187 // We dont use navigator.serviceWorker.controller here since it can be, for whatever reason,
158188 // null for an entire browser session
159- const controller = await navigator . serviceWorker . getRegistration ( location . origin ) ;
160- if ( ! controller ?. active && retries < 3 ) {
161- console . error ( "ServiceWorker controller not active, retrying..." ) ;
162- retries ++ ;
163- setTimeout ( async ( ) => {
164- resolve ( await getSecretKeyFromServiceWorker ( ) ) ;
165- } , 500 ) ;
166- return ;
167- } else if ( ! controller ?. active ) {
168- console . error ( "service worker controller not active" ) ;
169- return resolve ( null ) ;
170- } else if ( retries >= 3 ) {
171- console . error ( "Max retries reached for getting secretKey from service worker" ) ;
172- return resolve ( null ) ;
173- }
174- gettingSecretInProgress = true ;
189+ const controller = await navigator . serviceWorker . ready ;
175190
176191 const timeout = setTimeout ( async ( ) => {
177192 console . error ( "Service Worker: Failed to get secretKey within timeout. Retrying..." ) ;
178193 if ( ! appSleeps || ! Median . isNativeApp ( ) ) {
179- gettingSecretInProgress = false ;
180- retries ++ ;
181- resolve ( await getSecretKeyFromServiceWorker ( ) ) ;
194+ reject ( "Timeout waiting for secretKey from Service Worker" ) ;
182195 }
196+ secretKeyPromise = null ;
183197 } , 5000 ) ;
184- retries = 0 ;
185198
186199 const handleMessage = ( event : MessageEvent ) => {
187200 const msg = event . data as Message ;
188201 if ( msg . type === MessageType . StoreSecret ) {
189202 clearTimeout ( timeout ) ;
190203 navigator . serviceWorker . removeEventListener ( 'message' , handleMessage ) ;
191- gettingSecretInProgress = false ;
204+ secretKeyPromise = null ;
192205 resolve ( msg . data as string ) ;
193206 }
194207 } ;
@@ -206,15 +219,12 @@ export async function getSecretKeyFromServiceWorker(): Promise<string | null> {
206219}
207220
208221export async function clearSecretKeyFromServiceWorker ( ) : Promise < void > {
209- if ( ! navigator . serviceWorker . controller ) {
210- return ;
211- }
212-
222+ const controller = await navigator . serviceWorker . ready ;
213223 const msg : Message = {
214224 type : MessageType . ClearSecret ,
215225 data : null
216226 } ;
217- navigator . serviceWorker . controller . postMessage ( msg ) ;
227+ controller . active ? .postMessage ( msg ) ;
218228}
219229
220230export async function get_decrypted_secret ( ) {
0 commit comments