@@ -165,7 +165,7 @@ export async function getToken(
165
165
await writeTokenToStorage ( app , token ) ;
166
166
}
167
167
168
- if ( ! shouldCallListeners ) {
168
+ if ( shouldCallListeners ) {
169
169
notifyTokenListeners ( app , interopTokenResult ) ;
170
170
}
171
171
return interopTokenResult ;
@@ -184,17 +184,20 @@ export function addTokenListener(
184
184
error : onError ,
185
185
type
186
186
} ;
187
- const newState = {
187
+ setState ( app , {
188
188
...state ,
189
189
tokenObservers : [ ...state . tokenObservers , tokenObserver ]
190
- } ;
190
+ } ) ;
191
191
192
192
// Invoke the listener async immediately if there is a valid token
193
193
// in memory.
194
194
if ( state . token && isValid ( state . token ) ) {
195
195
const validToken = state . token ;
196
196
Promise . resolve ( )
197
- . then ( ( ) => listener ( { token : validToken . token } ) )
197
+ . then ( ( ) => {
198
+ listener ( { token : validToken . token } ) ;
199
+ initTokenRefresher ( appCheck ) ;
200
+ } )
198
201
. catch ( ( ) => {
199
202
/* we don't care about exceptions thrown in listeners */
200
203
} ) ;
@@ -206,28 +209,12 @@ export function addTokenListener(
206
209
* in state and calls the exchange endpoint if not. We should first let the
207
210
* IndexedDB check have a chance to populate state if it can.
208
211
*
209
- * We want to call the listener if the cached token check returns something
210
- * but cachedTokenPromise handler already will notify all listeners on the
211
- * first fetch, and we don't want duplicate calls to the listener.
212
+ * Listener call isn't needed here because cachedTokenPromise will call any
213
+ * listeners that exist when it resolves.
212
214
*/
213
215
214
216
// state.cachedTokenPromise is always populated in `activate()`.
215
- void state . cachedTokenPromise ! . then ( ( ) => {
216
- if ( ! newState . tokenRefresher ) {
217
- const tokenRefresher = createTokenRefresher ( appCheck ) ;
218
- newState . tokenRefresher = tokenRefresher ;
219
- }
220
- // Create the refresher but don't start it if `isTokenAutoRefreshEnabled`
221
- // is not true.
222
- if (
223
- ! newState . tokenRefresher . isRunning ( ) &&
224
- state . isTokenAutoRefreshEnabled
225
- ) {
226
- newState . tokenRefresher . start ( ) ;
227
- }
228
- } ) ;
229
-
230
- setState ( app , newState ) ;
217
+ void state . cachedTokenPromise ! . then ( ( ) => initTokenRefresher ( appCheck ) ) ;
231
218
}
232
219
233
220
export function removeTokenListener (
@@ -253,6 +240,24 @@ export function removeTokenListener(
253
240
} ) ;
254
241
}
255
242
243
+ /**
244
+ * Logic to create and start refresher as needed.
245
+ */
246
+ function initTokenRefresher ( appCheck : AppCheckService ) : void {
247
+ const { app } = appCheck ;
248
+ const state = getState ( app ) ;
249
+ // Create the refresher but don't start it if `isTokenAutoRefreshEnabled`
250
+ // is not true.
251
+ let refresher : Refresher | undefined = state . tokenRefresher ;
252
+ if ( ! refresher ) {
253
+ refresher = createTokenRefresher ( appCheck ) ;
254
+ setState ( app , { ...state , tokenRefresher : refresher } ) ;
255
+ }
256
+ if ( ! refresher . isRunning ( ) && state . isTokenAutoRefreshEnabled ) {
257
+ refresher . start ( ) ;
258
+ }
259
+ }
260
+
256
261
function createTokenRefresher ( appCheck : AppCheckService ) : Refresher {
257
262
const { app } = appCheck ;
258
263
return new Refresher (
0 commit comments