Skip to content

Commit 71075a5

Browse files
committed
App Check heartbeat implementation
1 parent 85eed92 commit 71075a5

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
@@ -106,7 +106,7 @@ export async function getToken(
106106
if (!state.exchangeTokenPromise) {
107107
state.exchangeTokenPromise = exchangeToken(
108108
getExchangeDebugTokenRequest(app, await getDebugToken()),
109-
appCheck.platformLoggerProvider
109+
appCheck.heartbeatServiceProvider
110110
).then(token => {
111111
state.exchangeTokenPromise = undefined;
112112
return token;

packages/app-check/src/providers.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import { getDurationString } from './util';
4646
*/
4747
export class ReCaptchaV3Provider implements AppCheckProvider {
4848
private _app?: FirebaseApp;
49-
private _platformLoggerProvider?: Provider<'platform-logger'>;
49+
private _heartbeatServiceProvider?: Provider<'heartbeat'>;
5050
/**
5151
* Throttle requests on certain error codes to prevent too many retries
5252
* in a short time.
@@ -66,7 +66,7 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
6666
throwIfThrottled(this._throttleData);
6767

6868
// Top-level `getToken()` has already checked that App Check is initialized
69-
// and therefore this._app and this._platformLoggerProvider are available.
69+
// and therefore this._app and this._heartbeatServiceProvider are available.
7070
const attestedClaimsToken = await getReCAPTCHAToken(this._app!).catch(
7171
_e => {
7272
// reCaptcha.execute() throws null which is not very descriptive.
@@ -77,7 +77,7 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
7777
try {
7878
result = await exchangeToken(
7979
getExchangeRecaptchaV3TokenRequest(this._app!, attestedClaimsToken),
80-
this._platformLoggerProvider!
80+
this._heartbeatServiceProvider!
8181
);
8282
} catch (e) {
8383
if ((e as FirebaseError).code === AppCheckError.FETCH_STATUS_ERROR) {
@@ -105,7 +105,7 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
105105
*/
106106
initialize(app: FirebaseApp): void {
107107
this._app = app;
108-
this._platformLoggerProvider = _getProvider(app, 'platform-logger');
108+
this._heartbeatServiceProvider = _getProvider(app, 'heartbeat');
109109
initializeRecaptchaV3(app, this._siteKey).catch(() => {
110110
/* we don't care about the initialization result */
111111
});
@@ -131,7 +131,7 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
131131
*/
132132
export class ReCaptchaEnterpriseProvider implements AppCheckProvider {
133133
private _app?: FirebaseApp;
134-
private _platformLoggerProvider?: Provider<'platform-logger'>;
134+
private _heartbeatServiceProvider?: Provider<'heartbeat'>;
135135
/**
136136
* Throttle requests on certain error codes to prevent too many retries
137137
* in a short time.
@@ -150,7 +150,7 @@ export class ReCaptchaEnterpriseProvider implements AppCheckProvider {
150150
async getToken(): Promise<AppCheckTokenInternal> {
151151
throwIfThrottled(this._throttleData);
152152
// Top-level `getToken()` has already checked that App Check is initialized
153-
// and therefore this._app and this._platformLoggerProvider are available.
153+
// and therefore this._app and this._heartbeatServiceProvider are available.
154154
const attestedClaimsToken = await getReCAPTCHAToken(this._app!).catch(
155155
_e => {
156156
// reCaptcha.execute() throws null which is not very descriptive.
@@ -164,7 +164,7 @@ export class ReCaptchaEnterpriseProvider implements AppCheckProvider {
164164
this._app!,
165165
attestedClaimsToken
166166
),
167-
this._platformLoggerProvider!
167+
this._heartbeatServiceProvider!
168168
);
169169
} catch (e) {
170170
if ((e as FirebaseError).code === AppCheckError.FETCH_STATUS_ERROR) {
@@ -192,7 +192,7 @@ export class ReCaptchaEnterpriseProvider implements AppCheckProvider {
192192
*/
193193
initialize(app: FirebaseApp): void {
194194
this._app = app;
195-
this._platformLoggerProvider = _getProvider(app, 'platform-logger');
195+
this._heartbeatServiceProvider = _getProvider(app, 'heartbeat');
196196
initializeRecaptchaEnterprise(app, this._siteKey).catch(() => {
197197
/* we don't care about the initialization result */
198198
});

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)