Skip to content

Commit af44d09

Browse files
committed
App Check heartbeat implementation
1 parent 5bb0fe0 commit af44d09

File tree

7 files changed

+31
-30
lines changed

7 files changed

+31
-30
lines changed

packages/app-check/src/client.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import '../test/setup';
1919
import { expect } from 'chai';
2020
import { stub, SinonStub, useFakeTimers } from 'sinon';
2121
import { FirebaseApp } from '@firebase/app';
22-
import { getFakeApp, getFakePlatformLoggingProvider } from '../test/util';
22+
import { getFakeApp, getFakeHeartbeatServiceProvider } from '../test/util';
2323
import {
2424
getExchangeRecaptchaV3TokenRequest,
2525
exchangeToken,
@@ -86,7 +86,7 @@ describe('client', () => {
8686

8787
const response = await exchangeToken(
8888
getExchangeRecaptchaV3TokenRequest(app, 'fake-custom-token'),
89-
getFakePlatformLoggingProvider('a/1.2.3 fire-app-check/2.3.4')
89+
getFakeHeartbeatServiceProvider('a/1.2.3 fire-app-check/2.3.4')
9090
);
9191

9292
expect(
@@ -114,7 +114,7 @@ describe('client', () => {
114114
try {
115115
await exchangeToken(
116116
getExchangeRecaptchaV3TokenRequest(app, 'fake-custom-token'),
117-
getFakePlatformLoggingProvider()
117+
getFakeHeartbeatServiceProvider()
118118
);
119119
} catch (e) {
120120
expect(e).instanceOf(FirebaseError);
@@ -143,7 +143,7 @@ describe('client', () => {
143143
try {
144144
await exchangeToken(
145145
getExchangeRecaptchaV3TokenRequest(app, 'fake-custom-token'),
146-
getFakePlatformLoggingProvider()
146+
getFakeHeartbeatServiceProvider()
147147
);
148148
} catch (e) {
149149
expect(e).instanceOf(FirebaseError);
@@ -171,7 +171,7 @@ describe('client', () => {
171171
try {
172172
await exchangeToken(
173173
getExchangeRecaptchaV3TokenRequest(app, 'fake-custom-token'),
174-
getFakePlatformLoggingProvider()
174+
getFakeHeartbeatServiceProvider()
175175
);
176176
} catch (e) {
177177
expect(e).instanceOf(FirebaseError);
@@ -205,7 +205,7 @@ describe('client', () => {
205205
try {
206206
await exchangeToken(
207207
getExchangeRecaptchaV3TokenRequest(app, 'fake-custom-token'),
208-
getFakePlatformLoggingProvider()
208+
getFakeHeartbeatServiceProvider()
209209
);
210210
} catch (e) {
211211
expect(e).instanceOf(FirebaseError);

packages/app-check/src/client.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,18 @@ interface AppCheckRequest {
4242

4343
export async function exchangeToken(
4444
{ url, body }: AppCheckRequest,
45-
platformLoggerProvider: Provider<'platform-logger'>
45+
heartbeatServiceProvider: Provider<'heartbeat'>
4646
): Promise<AppCheckTokenInternal> {
4747
const headers: HeadersInit = {
4848
'Content-Type': 'application/json'
4949
};
5050
// If platform logger exists, add the platform info string to the header.
51-
const platformLogger = platformLoggerProvider.getImmediate({
51+
const heartbeatService = heartbeatServiceProvider.getImmediate({
5252
optional: true
5353
});
54-
if (platformLogger) {
55-
headers['X-Firebase-Client'] = platformLogger.getPlatformInfoString();
54+
if (heartbeatService) {
55+
const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();
56+
headers['X-Firebase-Client'] = heartbeatsHeader;
5657
}
5758
const options: RequestInit = {
5859
method: 'POST',

packages/app-check/src/factory.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { getState } from './state';
3232
export class AppCheckService implements AppCheck, _FirebaseService {
3333
constructor(
3434
public app: FirebaseApp,
35-
public platformLoggerProvider: Provider<'platform-logger'>
35+
public heartbeatServiceProvider: Provider<'heartbeat'>
3636
) {}
3737
_delete(): Promise<void> {
3838
const { tokenObservers } = getState(this.app);
@@ -45,9 +45,9 @@ export class AppCheckService implements AppCheck, _FirebaseService {
4545

4646
export function factory(
4747
app: FirebaseApp,
48-
platformLoggerProvider: Provider<'platform-logger'>
48+
heartbeatServiceProvider: Provider<'heartbeat'>
4949
): AppCheckService {
50-
return new AppCheckService(app, platformLoggerProvider);
50+
return new AppCheckService(app, heartbeatServiceProvider);
5151
}
5252

5353
export function internalFactory(

packages/app-check/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ function registerAppCheck(): void {
4848
container => {
4949
// getImmediate for FirebaseApp will always succeed
5050
const app = container.getProvider('app').getImmediate();
51-
const platformLoggerProvider = container.getProvider('platform-logger');
52-
return factory(app, platformLoggerProvider);
51+
const heartbeatServiceProvider = container.getProvider('heartbeat');
52+
return factory(app, heartbeatServiceProvider);
5353
},
5454
ComponentType.PUBLIC
5555
)

packages/app-check/src/internal-api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export async function getToken(
102102
if (isDebugMode()) {
103103
const tokenFromDebugExchange: AppCheckTokenInternal = await exchangeToken(
104104
getExchangeDebugTokenRequest(app, await getDebugToken()),
105-
appCheck.platformLoggerProvider
105+
appCheck.heartbeatServiceProvider
106106
);
107107
// Write debug token to indexedDB.
108108
await writeTokenToStorage(app, tokenFromDebugExchange);

packages/app-check/src/providers.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import { AppCheckProvider, AppCheckTokenInternal } from './types';
4040
*/
4141
export class ReCaptchaV3Provider implements AppCheckProvider {
4242
private _app?: FirebaseApp;
43-
private _platformLoggerProvider?: Provider<'platform-logger'>;
43+
private _heartbeatServiceProvider?: Provider<'heartbeat'>;
4444
/**
4545
* Create a ReCaptchaV3Provider instance.
4646
* @param siteKey - ReCAPTCHA V3 siteKey.
@@ -53,7 +53,7 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
5353
*/
5454
async getToken(): Promise<AppCheckTokenInternal> {
5555
// Top-level `getToken()` has already checked that App Check is initialized
56-
// and therefore this._app and this._platformLoggerProvider are available.
56+
// and therefore this._app and this._heartbeatServiceProvider are available.
5757
const attestedClaimsToken = await getReCAPTCHAToken(this._app!).catch(
5858
_e => {
5959
// reCaptcha.execute() throws null which is not very descriptive.
@@ -62,7 +62,7 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
6262
);
6363
return exchangeToken(
6464
getExchangeRecaptchaV3TokenRequest(this._app!, attestedClaimsToken),
65-
this._platformLoggerProvider!
65+
this._heartbeatServiceProvider!
6666
);
6767
}
6868

@@ -71,7 +71,7 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
7171
*/
7272
initialize(app: FirebaseApp): void {
7373
this._app = app;
74-
this._platformLoggerProvider = _getProvider(app, 'platform-logger');
74+
this._heartbeatServiceProvider = _getProvider(app, 'heartbeat');
7575
initializeRecaptchaV3(app, this._siteKey).catch(() => {
7676
/* we don't care about the initialization result */
7777
});
@@ -97,7 +97,7 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
9797
*/
9898
export class ReCaptchaEnterpriseProvider implements AppCheckProvider {
9999
private _app?: FirebaseApp;
100-
private _platformLoggerProvider?: Provider<'platform-logger'>;
100+
private _heartbeatServiceProvider?: Provider<'heartbeat'>;
101101
/**
102102
* Create a ReCaptchaEnterpriseProvider instance.
103103
* @param siteKey - reCAPTCHA Enterprise score-based site key.
@@ -110,7 +110,7 @@ export class ReCaptchaEnterpriseProvider implements AppCheckProvider {
110110
*/
111111
async getToken(): Promise<AppCheckTokenInternal> {
112112
// Top-level `getToken()` has already checked that App Check is initialized
113-
// and therefore this._app and this._platformLoggerProvider are available.
113+
// and therefore this._app and this._heartbeatServiceProvider are available.
114114
const attestedClaimsToken = await getReCAPTCHAToken(this._app!).catch(
115115
_e => {
116116
// reCaptcha.execute() throws null which is not very descriptive.
@@ -122,7 +122,7 @@ export class ReCaptchaEnterpriseProvider implements AppCheckProvider {
122122
this._app!,
123123
attestedClaimsToken
124124
),
125-
this._platformLoggerProvider!
125+
this._heartbeatServiceProvider!
126126
);
127127
}
128128

@@ -131,7 +131,7 @@ export class ReCaptchaEnterpriseProvider implements AppCheckProvider {
131131
*/
132132
initialize(app: FirebaseApp): void {
133133
this._app = app;
134-
this._platformLoggerProvider = _getProvider(app, 'platform-logger');
134+
this._heartbeatServiceProvider = _getProvider(app, 'heartbeat');
135135
initializeRecaptchaEnterprise(app, this._siteKey).catch(() => {
136136
/* we don't care about the initialization result */
137137
});

packages/app-check/test/util.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ export function getFakeApp(overrides: Record<string, any> = {}): FirebaseApp {
5555
export function getFakeAppCheck(app: FirebaseApp): AppCheck {
5656
return {
5757
app,
58-
platformLoggerProvider: getFakePlatformLoggingProvider()
58+
heartbeatServiceProvider: getFakeHeartbeatServiceProvider()
5959
} as AppCheck;
6060
}
6161

6262
export function getFullApp(): FirebaseApp {
6363
const app = initializeApp(fakeConfig);
6464
_registerComponent(
6565
new Component(
66-
'platform-logger',
66+
'heartbeat',
6767
() => {
6868
return {} as any;
6969
},
@@ -92,19 +92,19 @@ export function getFakeCustomTokenProvider(): CustomProvider {
9292
});
9393
}
9494

95-
export function getFakePlatformLoggingProvider(
95+
export function getFakeHeartbeatServiceProvider(
9696
fakeLogString: string = 'a/1.2.3 b/2.3.4'
97-
): Provider<'platform-logger'> {
97+
): Provider<'heartbeat'> {
9898
const container = new ComponentContainer('test');
9999
container.addComponent(
100100
new Component(
101-
'platform-logger',
101+
'heartbeat',
102102
() => ({ getPlatformInfoString: () => fakeLogString }),
103103
ComponentType.PRIVATE
104104
)
105105
);
106106

107-
return container.getProvider('platform-logger');
107+
return container.getProvider('heartbeat');
108108
}
109109

110110
export function getFakeGreCAPTCHA(

0 commit comments

Comments
 (0)