Skip to content

Commit cf2be75

Browse files
authored
Avoid auth trigger if we haven't yet received the initial user (#2310)
* Added a flag to guard against using null user before getting the actual user * fix typo * shorten comment lines * [AUTOMATED]: Prettier Code Styling
1 parent 34884f2 commit cf2be75

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

packages/firestore/src/api/credentials.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
135135

136136
/** Tracks the current User. */
137137
private currentUser: User = User.UNAUTHENTICATED;
138+
private receivedInitialUser: boolean = false;
138139

139140
/**
140141
* Counter used to detect if the token changed while a getToken request was
@@ -151,12 +152,12 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
151152
this.tokenListener = () => {
152153
this.tokenCounter++;
153154
this.currentUser = this.getUser();
155+
this.receivedInitialUser = true;
154156
if (this.changeListener) {
155157
this.changeListener(this.currentUser);
156158
}
157159
};
158160

159-
this.currentUser = this.getUser();
160161
this.tokenCounter = 0;
161162

162163
// Will fire at least once where we set this.currentUser
@@ -211,7 +212,9 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
211212
this.changeListener = changeListener;
212213

213214
// Fire the initial event
214-
changeListener(this.currentUser);
215+
if (this.receivedInitialUser) {
216+
changeListener(this.currentUser);
217+
}
215218
}
216219

217220
removeChangeListener(): void {
@@ -227,6 +230,10 @@ export class FirebaseCredentialsProvider implements CredentialsProvider {
227230
this.changeListener = null;
228231
}
229232

233+
// Auth.getUid() can return null even with a user logged in. It is because
234+
// getUid() is synchronous, but the auth code populating Uid is asynchronous.
235+
// This method should only be called in the AuthTokenListener callback
236+
// to guarantee to get the actual user.
230237
private getUser(): User {
231238
const currentUid = (this.app as _FirebaseApp).INTERNAL.getUid();
232239
assert(

0 commit comments

Comments
 (0)