Skip to content

Commit 879d95a

Browse files
committed
Make a public class for the provider
1 parent 785a385 commit 879d95a

File tree

8 files changed

+56
-35
lines changed

8 files changed

+56
-35
lines changed

common/api-review/app-check-exp.api.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
```ts
66

77
import { FirebaseApp } from '@firebase/app-exp';
8+
import { Provider } from '@firebase/component';
9+
10+
// @internal
11+
export function _activate(app: FirebaseApp, provider: AppCheckProvider, platformLoggerProvider: Provider<'platform-logger'>, isTokenAutoRefreshEnabled?: boolean): void;
812

913
// @public
1014
export interface AppCheck {
@@ -41,6 +45,10 @@ export function initializeAppCheck(app: FirebaseApp | undefined, options: AppChe
4145
// @public
4246
export class ReCaptchaV3Provider implements AppCheckProvider {
4347
constructor(siteKey: string);
48+
// Warning: (ae-forgotten-export) The symbol "ReCaptchaV3ProviderImpl" needs to be exported by the entry point index.d.ts
49+
//
50+
// @internal (undocumented)
51+
_delegate: ReCaptchaV3ProviderImpl;
4452
getToken(): Promise<AppCheckToken>;
4553
}
4654

packages-exp/app-check-exp/src/api.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import {
3838
} from '@firebase/app-exp';
3939
import { Component, ComponentType } from '@firebase/component';
4040
import { AppCheckService } from './factory';
41-
import { ReCaptchaV3Provider } from './providers';
41+
import { ReCaptchaV3ProviderImpl } from './providers';
4242
import { PlatformLoggerService } from '@firebase/app-exp/dist/packages-exp/app-exp/src/types';
4343

4444
describe('api', () => {
@@ -76,11 +76,11 @@ describe('api', () => {
7676
describe('initializeAppCheck()', () => {
7777
it('can only be called once', () => {
7878
initializeAppCheck(app, {
79-
provider: new ReCaptchaV3Provider(FAKE_SITE_KEY)
79+
provider: new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY)
8080
});
8181
expect(() =>
8282
initializeAppCheck(app, {
83-
provider: new ReCaptchaV3Provider(FAKE_SITE_KEY)
83+
provider: new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY)
8484
})
8585
).to.throw(/appCheck\/already-initialized/);
8686
});
@@ -90,7 +90,7 @@ describe('api', () => {
9090
Promise.resolve({} as any)
9191
);
9292
initializeAppCheck(app, {
93-
provider: new ReCaptchaV3Provider(FAKE_SITE_KEY)
93+
provider: new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY)
9494
});
9595
expect(initReCAPTCHAStub).to.have.been.calledWithExactly(
9696
app,
@@ -119,7 +119,7 @@ describe('api', () => {
119119
expect(getState(app).activated).to.equal(false);
120120
activate(
121121
app,
122-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
122+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
123123
getFakePlatformLoggingProvider()
124124
);
125125
expect(getState(app).activated).to.equal(true);
@@ -129,7 +129,7 @@ describe('api', () => {
129129
app.automaticDataCollectionEnabled = false;
130130
activate(
131131
app,
132-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
132+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
133133
getFakePlatformLoggingProvider()
134134
);
135135
expect(getState(app).isTokenAutoRefreshEnabled).to.equal(false);
@@ -139,7 +139,7 @@ describe('api', () => {
139139
app.automaticDataCollectionEnabled = false;
140140
activate(
141141
app,
142-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
142+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
143143
getFakePlatformLoggingProvider(),
144144
true
145145
);

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,11 @@ export function _activate(
9797

9898
// initialize reCAPTCHA if siteKey is provided
9999
if (newState.provider instanceof ReCaptchaV3Provider) {
100+
const providerImpl = newState.provider._delegate;
101+
setState(app, { ...newState, provider: providerImpl });
100102
// These need to be injected for ReCaptchaV3Provider's getToken() to work.
101-
newState.provider.initialize(app, platformLoggerProvider);
102-
initializeRecaptcha(app, newState.provider.siteKey).catch(() => {
103+
providerImpl.initialize(app, platformLoggerProvider);
104+
initializeRecaptcha(app, providerImpl.siteKey).catch(() => {
103105
/* we don't care about the initialization result in activate() */
104106
});
105107
}

packages-exp/app-check-exp/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export { _AppCheckInternalComponentName };
2727

2828
export * from './api';
2929
export * from './public-types';
30-
export * from './providers';
30+
export { ReCaptchaV3Provider } from './providers';
3131

3232
const APP_CHECK_NAME: _AppCheckComponentName = 'app-check-exp';
3333
const APP_CHECK_NAME_INTERNAL: _AppCheckInternalComponentName =

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import * as storage from './storage';
4040
import { getState, clearState, setState, getDebugState } from './state';
4141
import { AppCheckTokenListener } from '../src/types';
4242
import { Deferred } from '@firebase/util';
43-
import { ReCaptchaV3Provider } from './providers';
43+
import { ReCaptchaV3ProviderImpl } from './providers';
4444

4545
const fakePlatformLoggingProvider = getFakePlatformLoggingProvider();
4646

@@ -89,7 +89,7 @@ describe('internal api', () => {
8989
it('uses reCAPTCHA token to exchange for AppCheck token if no customTokenProvider is provided', async () => {
9090
activate(
9191
app,
92-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
92+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
9393
fakePlatformLoggingProvider
9494
);
9595

@@ -115,7 +115,7 @@ describe('internal api', () => {
115115
const errorStub = stub(console, 'error');
116116
activate(
117117
app,
118-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
118+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
119119
fakePlatformLoggingProvider
120120
);
121121

@@ -142,7 +142,7 @@ describe('internal api', () => {
142142
it('notifies listeners using cached token', async () => {
143143
activate(
144144
app,
145-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
145+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
146146
fakePlatformLoggingProvider
147147
);
148148

@@ -171,7 +171,7 @@ describe('internal api', () => {
171171
it('notifies listeners using new token', async () => {
172172
activate(
173173
app,
174-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
174+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
175175
fakePlatformLoggingProvider
176176
);
177177

@@ -199,7 +199,7 @@ describe('internal api', () => {
199199
it('ignores listeners that throw', async () => {
200200
activate(
201201
app,
202-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
202+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
203203
fakePlatformLoggingProvider
204204
);
205205
stub(reCAPTCHA, 'getToken').returns(Promise.resolve(fakeRecaptchaToken));
@@ -225,7 +225,7 @@ describe('internal api', () => {
225225
const clock = useFakeTimers();
226226
activate(
227227
app,
228-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
228+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
229229
fakePlatformLoggingProvider
230230
);
231231

@@ -248,7 +248,7 @@ describe('internal api', () => {
248248
it('persists token to storage', async () => {
249249
activate(
250250
app,
251-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
251+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
252252
fakePlatformLoggingProvider
253253
);
254254

@@ -270,7 +270,7 @@ describe('internal api', () => {
270270
const clock = useFakeTimers();
271271
activate(
272272
app,
273-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
273+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
274274
fakePlatformLoggingProvider
275275
);
276276
setState(app, { ...getState(app), token: fakeRecaptchaAppCheckToken });
@@ -287,7 +287,7 @@ describe('internal api', () => {
287287
it('force to get new token when forceRefresh is true', async () => {
288288
activate(
289289
app,
290-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
290+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
291291
fakePlatformLoggingProvider
292292
);
293293
setState(app, { ...getState(app), token: fakeRecaptchaAppCheckToken });
@@ -315,7 +315,7 @@ describe('internal api', () => {
315315
debugState.token.resolve('my-debug-token');
316316
activate(
317317
app,
318-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
318+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
319319
fakePlatformLoggingProvider
320320
);
321321

@@ -373,7 +373,7 @@ describe('internal api', () => {
373373
const clock = useFakeTimers();
374374
activate(
375375
app,
376-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
376+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
377377
fakePlatformLoggingProvider
378378
);
379379
stub(storage, 'readTokenFromStorage').returns(
@@ -411,7 +411,7 @@ describe('internal api', () => {
411411

412412
activate(
413413
app,
414-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
414+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
415415
fakePlatformLoggingProvider
416416
);
417417
addTokenListener(app, fakePlatformLoggingProvider, fakeListener);
@@ -425,7 +425,7 @@ describe('internal api', () => {
425425

426426
activate(
427427
app,
428-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
428+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
429429
fakePlatformLoggingProvider
430430
);
431431
addTokenListener(app, fakePlatformLoggingProvider, () => {});

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { getDebugToken, isDebugMode } from './debug';
3232
import { base64, issuedAtTime } from '@firebase/util';
3333
import { logger } from './logger';
3434
import { Provider } from '@firebase/component';
35-
import { ReCaptchaV3Provider } from './providers';
35+
import { ReCaptchaV3ProviderImpl } from './providers';
3636

3737
// Initial hardcoded value agreed upon across platforms for initial launch.
3838
// Format left open for possible dynamic error values and other fields in the future.
@@ -106,7 +106,7 @@ export async function getToken(
106106
* request a new token
107107
*/
108108
try {
109-
if (state.provider instanceof ReCaptchaV3Provider) {
109+
if (state.provider instanceof ReCaptchaV3ProviderImpl) {
110110
token = await state.provider.getToken();
111111
} else if (state.provider) {
112112
// custom provider

packages-exp/app-check-exp/src/providers.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { FirebaseApp } from '@firebase/app-exp';
1919
import { Provider } from '@firebase/component';
2020
import { exchangeToken, getExchangeRecaptchaTokenRequest } from './client';
2121
import { AppCheckError, ERROR_FACTORY } from './errors';
22-
import { AppCheckProvider } from './public-types';
22+
import { AppCheckProvider, AppCheckToken } from './public-types';
2323
import { getToken as getReCAPTCHAToken } from './recaptcha';
2424
import { AppCheckTokenInternal } from './state';
2525

@@ -33,10 +33,24 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
3333
/**
3434
* @internal
3535
*/
36-
private _app?: FirebaseApp;
36+
_delegate: ReCaptchaV3ProviderImpl;
3737
/**
38-
* @internal
38+
* Create a ReCaptchaV3Provider instance.
39+
* @param siteKey - ReCAPTCHA V3 siteKey.
40+
*/
41+
constructor(siteKey: string) {
42+
this._delegate = new ReCaptchaV3ProviderImpl(siteKey);
43+
}
44+
/**
45+
* Returns an AppCheck token.
3946
*/
47+
getToken(): Promise<AppCheckToken> {
48+
return this._delegate.getToken();
49+
}
50+
}
51+
52+
export class ReCaptchaV3ProviderImpl implements AppCheckProvider {
53+
private _app?: FirebaseApp;
4054
private _platformLoggerProvider?: Provider<'platform-logger'>;
4155

4256
constructor(private _siteKey: string) {}
@@ -60,9 +74,6 @@ export class ReCaptchaV3Provider implements AppCheckProvider {
6074
);
6175
}
6276

63-
/**
64-
* @internal
65-
*/
6677
initialize(
6778
app: FirebaseApp,
6879
platformLoggerProvider: Provider<'platform-logger'>

packages-exp/app-check-exp/src/recaptcha.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import * as utils from './util';
3232
import { getState } from './state';
3333
import { Deferred } from '@firebase/util';
3434
import { _activate as activate } from './api';
35-
import { ReCaptchaV3Provider } from './providers';
35+
import { ReCaptchaV3ProviderImpl } from './providers';
3636

3737
describe('recaptcha', () => {
3838
let app: FirebaseApp;
@@ -103,7 +103,7 @@ describe('recaptcha', () => {
103103
self.grecaptcha = grecaptchaFake;
104104
activate(
105105
app,
106-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
106+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
107107
getFakePlatformLoggingProvider()
108108
);
109109
await getToken(app);
@@ -121,7 +121,7 @@ describe('recaptcha', () => {
121121
self.grecaptcha = grecaptchaFake;
122122
activate(
123123
app,
124-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
124+
new ReCaptchaV3ProviderImpl(FAKE_SITE_KEY),
125125
getFakePlatformLoggingProvider()
126126
);
127127
const token = await getToken(app);

0 commit comments

Comments
 (0)