@@ -147,10 +147,10 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
147
147
private receivedInitialUser : boolean = false ;
148
148
149
149
/**
150
- * Counter used to detect if the token changed while a getToken request was
151
- * outstanding .
150
+ * The last token received either via the token listener or the getToken()
151
+ * API .
152
152
*/
153
- private tokenCounter = 0 ;
153
+ private lastToken : OAuthToken | null = null ;
154
154
155
155
/** The listener registered with setChangeListener(). */
156
156
private changeListener : CredentialChangeListener | null = null ;
@@ -160,17 +160,15 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
160
160
private auth : FirebaseAuthInternal | null ;
161
161
162
162
constructor ( authProvider : Provider < FirebaseAuthInternalName > ) {
163
- this . tokenListener = ( ) => {
164
- this . tokenCounter ++ ;
163
+ this . tokenListener = token => {
165
164
this . currentUser = this . getUser ( ) ;
165
+ this . lastToken = token ? new OAuthToken ( token , this . currentUser ) : null ;
166
166
this . receivedInitialUser = true ;
167
167
if ( this . changeListener ) {
168
168
this . changeListener ( this . currentUser ) ;
169
169
}
170
170
} ;
171
171
172
- this . tokenCounter = 0 ;
173
-
174
172
this . auth = authProvider . getImmediate ( { optional : true } ) ;
175
173
176
174
if ( this . auth ) {
@@ -199,38 +197,35 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
199
197
'getToken cannot be called after listener removed.'
200
198
) ;
201
199
202
- // Take note of the current value of the tokenCounter so that this method
203
- // can fail (with an ABORTED error) if there is a token change while the
204
- // request is outstanding.
205
- const initialTokenCounter = this . tokenCounter ;
206
200
const forceRefresh = this . forceRefresh ;
207
201
this . forceRefresh = false ;
208
202
209
203
if ( ! this . auth ) {
210
204
return Promise . resolve ( null ) ;
211
205
}
212
206
207
+ this . lastToken = null ;
213
208
return this . auth . getToken ( forceRefresh ) . then ( tokenData => {
214
- // Cancel the request since the token changed while the request was
215
- // outstanding so the response is potentially for a previous user (which
216
- // user, we can't be sure).
217
- if ( this . tokenCounter !== initialTokenCounter ) {
209
+ if ( this . lastToken ) {
210
+ // If we received a new token while this callback was pending (via
211
+ // `this.tokenListener`), use the new token instead of the one received
212
+ // via `getToken()`.
218
213
logDebug (
219
214
'FirebaseCredentialsProvider' ,
220
- 'getToken aborted due to token change.'
215
+ 'Re-using token from token listener.'
216
+ ) ;
217
+ } else if ( tokenData ) {
218
+ hardAssert (
219
+ typeof tokenData . accessToken === 'string' ,
220
+ 'Invalid tokenData returned from getToken():' + tokenData
221
+ ) ;
222
+ this . lastToken = new OAuthToken (
223
+ tokenData . accessToken ,
224
+ this . currentUser
221
225
) ;
222
- return this . getToken ( ) ;
223
- } else {
224
- if ( tokenData ) {
225
- hardAssert (
226
- typeof tokenData . accessToken === 'string' ,
227
- 'Invalid tokenData returned from getToken():' + tokenData
228
- ) ;
229
- return new OAuthToken ( tokenData . accessToken , this . currentUser ) ;
230
- } else {
231
- return null ;
232
- }
233
226
}
227
+
228
+ return this . lastToken ;
234
229
} ) ;
235
230
}
236
231
0 commit comments