From 228ebda3f051ccfe787614ebc9b2fd56a8cbf12a Mon Sep 17 00:00:00 2001 From: Nicole Yu Date: Mon, 28 Jul 2025 18:54:25 +1000 Subject: [PATCH 1/5] fix: move getDebugToken --- packages/app-check/src/internal-api.test.ts | 22 +++++++++++++++++++++ packages/app-check/src/internal-api.ts | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/app-check/src/internal-api.test.ts b/packages/app-check/src/internal-api.test.ts index 5d6b88f1c32..4574f8d119d 100644 --- a/packages/app-check/src/internal-api.test.ts +++ b/packages/app-check/src/internal-api.test.ts @@ -630,6 +630,28 @@ describe('internal api', () => { expect(token).to.deep.equal({ token: fakeRecaptchaAppCheckToken.token }); }); + it('exchanges debug token only once if debug mode with no cached token', async () => { + const exchangeTokenStub: SinonStub = stub( + client, + 'exchangeToken' + ).returns(Promise.resolve(fakeRecaptchaAppCheckToken)); + const debugState = getDebugState(); + debugState.enabled = true; + debugState.token = new Deferred(); + debugState.token.resolve('my-debug-token'); + const appCheck = initializeAppCheck(app, { + provider: new ReCaptchaV3Provider(FAKE_SITE_KEY) + }); + const appCheckServie = appCheck as AppCheckService; + const [token1, token2] = await Promise.all([getToken(appCheckServie),getToken(appCheckServie)]); + expect(exchangeTokenStub.args[0][0].body['debug_token']).to.equal( + 'my-debug-token' + ); + expect(token1).to.deep.equal({ token: fakeRecaptchaAppCheckToken.token }); + expect(token2).to.deep.equal({ token: fakeRecaptchaAppCheckToken.token }); + expect(exchangeTokenStub).to.be.calledOnce; + }); + it('throttles for a period less than 1d on 503', async () => { // More detailed check of exponential backoff in providers.test.ts const appCheck = initializeAppCheck(app, { diff --git a/packages/app-check/src/internal-api.ts b/packages/app-check/src/internal-api.ts index eddf043c843..158c723a057 100644 --- a/packages/app-check/src/internal-api.ts +++ b/packages/app-check/src/internal-api.ts @@ -118,10 +118,11 @@ export async function getToken( */ if (isDebugMode()) { try { + const debugToken = await getDebugToken(); // Avoid making another call to the exchange endpoint if one is in flight. if (!state.exchangeTokenPromise) { state.exchangeTokenPromise = exchangeToken( - getExchangeDebugTokenRequest(app, await getDebugToken()), + getExchangeDebugTokenRequest(app, debugToken), appCheck.heartbeatServiceProvider ).finally(() => { // Clear promise when settled - either resolved or rejected. From 67c5d6ebd8d1e3b22b690a2b4a9e6debfb29d071 Mon Sep 17 00:00:00 2001 From: Nicole Yu Date: Mon, 28 Jul 2025 20:32:30 +1000 Subject: [PATCH 2/5] update: changeset --- packages/app-check/.changeset/README.md | 8 ++++++++ packages/app-check/.changeset/chatty-laws-sleep.md | 5 +++++ packages/app-check/.changeset/config.json | 11 +++++++++++ 3 files changed, 24 insertions(+) create mode 100644 packages/app-check/.changeset/README.md create mode 100644 packages/app-check/.changeset/chatty-laws-sleep.md create mode 100644 packages/app-check/.changeset/config.json diff --git a/packages/app-check/.changeset/README.md b/packages/app-check/.changeset/README.md new file mode 100644 index 00000000000..e5b6d8d6a67 --- /dev/null +++ b/packages/app-check/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/packages/app-check/.changeset/chatty-laws-sleep.md b/packages/app-check/.changeset/chatty-laws-sleep.md new file mode 100644 index 00000000000..634ba952c67 --- /dev/null +++ b/packages/app-check/.changeset/chatty-laws-sleep.md @@ -0,0 +1,5 @@ +--- +'@firebase/app-check': patch +--- + +Prevent redundant exchangeToken calls in debug mode diff --git a/packages/app-check/.changeset/config.json b/packages/app-check/.changeset/config.json new file mode 100644 index 00000000000..6b372552ca5 --- /dev/null +++ b/packages/app-check/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.5/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} From 5f60f6ca546eab6ff77d191dbe9a0b16ffbf64b0 Mon Sep 17 00:00:00 2001 From: Nicole Yu Date: Mon, 28 Jul 2025 20:35:38 +1000 Subject: [PATCH 3/5] feat: remove unused files --- packages/app-check/.changeset/README.md | 8 -------- packages/app-check/.changeset/config.json | 11 ----------- 2 files changed, 19 deletions(-) delete mode 100644 packages/app-check/.changeset/README.md delete mode 100644 packages/app-check/.changeset/config.json diff --git a/packages/app-check/.changeset/README.md b/packages/app-check/.changeset/README.md deleted file mode 100644 index e5b6d8d6a67..00000000000 --- a/packages/app-check/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/packages/app-check/.changeset/config.json b/packages/app-check/.changeset/config.json deleted file mode 100644 index 6b372552ca5..00000000000 --- a/packages/app-check/.changeset/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@3.0.5/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "access": "restricted", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": [] -} From 0673675c5c2c793d2e3c64f4549a2c8aef9c0d09 Mon Sep 17 00:00:00 2001 From: Nicole Yu Date: Tue, 29 Jul 2025 09:20:13 +1000 Subject: [PATCH 4/5] fix: format --- packages/app-check/src/internal-api.test.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/app-check/src/internal-api.test.ts b/packages/app-check/src/internal-api.test.ts index 4574f8d119d..5dac6da19e0 100644 --- a/packages/app-check/src/internal-api.test.ts +++ b/packages/app-check/src/internal-api.test.ts @@ -630,7 +630,7 @@ describe('internal api', () => { expect(token).to.deep.equal({ token: fakeRecaptchaAppCheckToken.token }); }); - it('exchanges debug token only once if debug mode with no cached token', async () => { + it('exchanges debug token only once if debug mode with no cached token', async () => { const exchangeTokenStub: SinonStub = stub( client, 'exchangeToken' @@ -643,7 +643,10 @@ describe('internal api', () => { provider: new ReCaptchaV3Provider(FAKE_SITE_KEY) }); const appCheckServie = appCheck as AppCheckService; - const [token1, token2] = await Promise.all([getToken(appCheckServie),getToken(appCheckServie)]); + const [token1, token2] = await Promise.all([ + getToken(appCheckServie), + getToken(appCheckServie) + ]); expect(exchangeTokenStub.args[0][0].body['debug_token']).to.equal( 'my-debug-token' ); From 1d7e48d37f078818c8f5f98e27a6f1f92806bd94 Mon Sep 17 00:00:00 2001 From: Nicole Yu Date: Tue, 29 Jul 2025 09:22:06 +1000 Subject: [PATCH 5/5] fix: typo --- packages/app-check/src/internal-api.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/app-check/src/internal-api.test.ts b/packages/app-check/src/internal-api.test.ts index 5dac6da19e0..ce89430a15b 100644 --- a/packages/app-check/src/internal-api.test.ts +++ b/packages/app-check/src/internal-api.test.ts @@ -642,10 +642,10 @@ describe('internal api', () => { const appCheck = initializeAppCheck(app, { provider: new ReCaptchaV3Provider(FAKE_SITE_KEY) }); - const appCheckServie = appCheck as AppCheckService; + const appCheckService = appCheck as AppCheckService; const [token1, token2] = await Promise.all([ - getToken(appCheckServie), - getToken(appCheckServie) + getToken(appCheckService), + getToken(appCheckService) ]); expect(exchangeTokenStub.args[0][0].body['debug_token']).to.equal( 'my-debug-token'