From eee339cf692dc963e940374600adc2d5098c38f7 Mon Sep 17 00:00:00 2001 From: Ehsan Nasiri Date: Thu, 10 Feb 2022 14:29:34 -0600 Subject: [PATCH 1/5] Do not invoke the App Check token listener for the same token string. --- packages/firestore/src/api/credentials.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/firestore/src/api/credentials.ts b/packages/firestore/src/api/credentials.ts index b8277beb3ec..d25f78c5366 100644 --- a/packages/firestore/src/api/credentials.ts +++ b/packages/firestore/src/api/credentials.ts @@ -461,10 +461,9 @@ export class FirebaseAppCheckTokenProvider * we can unregister it. */ private tokenListener!: AppCheckTokenListener; - private forceRefresh = false; - private appCheck: FirebaseAppCheckInternal | null = null; + private latestToken: string | null = null; constructor( private appCheckProvider: Provider @@ -482,7 +481,18 @@ export class FirebaseAppCheckTokenProvider `Error getting App Check token; using placeholder token instead. Error: ${tokenResult.error.message}` ); } - return changeListener(tokenResult.token); + if (tokenResult.token !== this.latestToken) { + logDebug( + 'FirebaseAppCheckTokenProvider', + 'Received a new token.' + ); + return changeListener(tokenResult.token); + } + logDebug( + 'FirebaseAppCheckTokenProvider', + 'Received a token that is the same as the existing token.' + ); + return Promise.resolve(); }; this.tokenListener = (tokenResult: AppCheckTokenResult) => { @@ -534,6 +544,7 @@ export class FirebaseAppCheckTokenProvider typeof tokenResult.token === 'string', 'Invalid tokenResult returned from getToken():' + tokenResult ); + this.latestToken = tokenResult.token; return new AppCheckToken(tokenResult.token); } else { return null; From e2d84b07278f644de75b5b60023080bf004bfe36 Mon Sep 17 00:00:00 2001 From: Ehsan Nasiri Date: Thu, 10 Feb 2022 14:38:43 -0600 Subject: [PATCH 2/5] Fix formatting. --- packages/firestore/src/api/credentials.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/firestore/src/api/credentials.ts b/packages/firestore/src/api/credentials.ts index d25f78c5366..8156e66c954 100644 --- a/packages/firestore/src/api/credentials.ts +++ b/packages/firestore/src/api/credentials.ts @@ -482,10 +482,7 @@ export class FirebaseAppCheckTokenProvider ); } if (tokenResult.token !== this.latestToken) { - logDebug( - 'FirebaseAppCheckTokenProvider', - 'Received a new token.' - ); + logDebug('FirebaseAppCheckTokenProvider', 'Received a new token.'); return changeListener(tokenResult.token); } logDebug( From 9e126fba267d7663f5fb5886effd9e7a31b0b56f Mon Sep 17 00:00:00 2001 From: Ehsan Nasiri Date: Fri, 11 Feb 2022 11:41:40 -0600 Subject: [PATCH 3/5] Address comments. --- packages/firestore/src/api/credentials.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/firestore/src/api/credentials.ts b/packages/firestore/src/api/credentials.ts index 8156e66c954..05844534069 100644 --- a/packages/firestore/src/api/credentials.ts +++ b/packages/firestore/src/api/credentials.ts @@ -463,7 +463,7 @@ export class FirebaseAppCheckTokenProvider private tokenListener!: AppCheckTokenListener; private forceRefresh = false; private appCheck: FirebaseAppCheckInternal | null = null; - private latestToken: string | null = null; + private latestAppCheckToken: string | null = null; constructor( private appCheckProvider: Provider @@ -481,15 +481,17 @@ export class FirebaseAppCheckTokenProvider `Error getting App Check token; using placeholder token instead. Error: ${tokenResult.error.message}` ); } - if (tokenResult.token !== this.latestToken) { + if (tokenResult.token !== this.latestAppCheckToken) { logDebug('FirebaseAppCheckTokenProvider', 'Received a new token.'); + this.latestAppCheckToken = tokenResult.token; return changeListener(tokenResult.token); + } else { + logDebug( + 'FirebaseAppCheckTokenProvider', + 'Received a token that is the same as the existing token.' + ); + return Promise.resolve(); } - logDebug( - 'FirebaseAppCheckTokenProvider', - 'Received a token that is the same as the existing token.' - ); - return Promise.resolve(); }; this.tokenListener = (tokenResult: AppCheckTokenResult) => { @@ -541,7 +543,7 @@ export class FirebaseAppCheckTokenProvider typeof tokenResult.token === 'string', 'Invalid tokenResult returned from getToken():' + tokenResult ); - this.latestToken = tokenResult.token; + this.latestAppCheckToken = tokenResult.token; return new AppCheckToken(tokenResult.token); } else { return null; From 5d817644efe7273767470f0afce8b60df4eaac47 Mon Sep 17 00:00:00 2001 From: Ehsan Date: Fri, 11 Feb 2022 12:16:34 -0600 Subject: [PATCH 4/5] Create gold-hounds-begin.md --- .changeset/gold-hounds-begin.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/gold-hounds-begin.md diff --git a/.changeset/gold-hounds-begin.md b/.changeset/gold-hounds-begin.md new file mode 100644 index 00000000000..c341c1fcaec --- /dev/null +++ b/.changeset/gold-hounds-begin.md @@ -0,0 +1,5 @@ +--- +"@firebase/firestore": patch +--- + +Fixed a bug that caused Firestore streams to get restarted with the same App Check token. From 19d5c9c461f40fa560d83c41d6d0ad05bb462efc Mon Sep 17 00:00:00 2001 From: Ehsan Nasiri Date: Fri, 11 Feb 2022 13:33:46 -0600 Subject: [PATCH 5/5] Use fewer bytes for log messages. --- packages/firestore/src/api/credentials.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/firestore/src/api/credentials.ts b/packages/firestore/src/api/credentials.ts index 05844534069..215c6ae3d9f 100644 --- a/packages/firestore/src/api/credentials.ts +++ b/packages/firestore/src/api/credentials.ts @@ -481,17 +481,15 @@ export class FirebaseAppCheckTokenProvider `Error getting App Check token; using placeholder token instead. Error: ${tokenResult.error.message}` ); } - if (tokenResult.token !== this.latestAppCheckToken) { - logDebug('FirebaseAppCheckTokenProvider', 'Received a new token.'); - this.latestAppCheckToken = tokenResult.token; - return changeListener(tokenResult.token); - } else { - logDebug( - 'FirebaseAppCheckTokenProvider', - 'Received a token that is the same as the existing token.' - ); - return Promise.resolve(); - } + const tokenUpdated = tokenResult.token !== this.latestAppCheckToken; + this.latestAppCheckToken = tokenResult.token; + logDebug( + 'FirebaseAppCheckTokenProvider', + `Received ${tokenUpdated ? 'new' : 'existing'} token.` + ); + return tokenUpdated + ? changeListener(tokenResult.token) + : Promise.resolve(); }; this.tokenListener = (tokenResult: AppCheckTokenResult) => {