Skip to content

Commit 9ef36ac

Browse files
committed
Add CustomProvider public class
1 parent 89dc136 commit 9ef36ac

File tree

15 files changed

+253
-255
lines changed

15 files changed

+253
-255
lines changed

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

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
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;
128

139
// @public
1410
export interface AppCheck {
@@ -29,7 +25,7 @@ export interface AppCheckOptions {
2925

3026
// @public
3127
export interface AppCheckProvider {
32-
getToken(): Promise<AppCheckToken>;
28+
getToken: () => Promise<AppCheckToken>;
3329
}
3430

3531
// @public
@@ -39,18 +35,31 @@ export interface AppCheckToken {
3935
readonly token: string;
4036
}
4137

38+
// @public
39+
export class CustomProvider implements AppCheckProvider {
40+
constructor(_customProviderOptions: CustomProviderOptions);
41+
// @internal (undocumented)
42+
getToken(): Promise<AppCheckToken>;
43+
// @internal (undocumented)
44+
initialize(app: FirebaseApp): void;
45+
}
46+
47+
// @public
48+
export interface CustomProviderOptions {
49+
getToken(): Promise<AppCheckToken>;
50+
}
51+
4252
// @public
4353
export function initializeAppCheck(app: FirebaseApp | undefined, options: AppCheckOptions): AppCheck;
4454

4555
// @public
4656
export class ReCaptchaV3Provider implements AppCheckProvider {
47-
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;
57+
constructor(_siteKey: string);
58+
// @internal
5259
getToken(): Promise<AppCheckToken>;
53-
}
60+
// @internal (undocumented)
61+
initialize(app: FirebaseApp): void;
62+
}
5463

5564
// @public
5665
export function setTokenAutoRefreshEnabled(app: FirebaseApp, isTokenAutoRefreshEnabled: boolean): void;

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

Lines changed: 15 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -17,56 +17,23 @@
1717
import '../test/setup';
1818
import { expect } from 'chai';
1919
import { stub } from 'sinon';
20-
import {
21-
_activate as activate,
22-
setTokenAutoRefreshEnabled,
23-
initializeAppCheck
24-
} from './api';
20+
import { setTokenAutoRefreshEnabled, initializeAppCheck } from './api';
2521
import {
2622
FAKE_SITE_KEY,
23+
getFullApp,
2724
getFakeApp,
28-
getFakeCustomTokenProvider,
29-
getFakePlatformLoggingProvider
25+
getFakeCustomTokenProvider
3026
} from '../test/util';
3127
import { getState } from './state';
3228
import * as reCAPTCHA from './recaptcha';
33-
import {
34-
deleteApp,
35-
FirebaseApp,
36-
initializeApp,
37-
_registerComponent
38-
} from '@firebase/app-exp';
39-
import { Component, ComponentType } from '@firebase/component';
40-
import { AppCheckService } from './factory';
29+
import { deleteApp, FirebaseApp } from '@firebase/app-exp';
4130
import { ReCaptchaV3Provider } from './providers';
42-
import { PlatformLoggerService } from '@firebase/app-exp/dist/packages-exp/app-exp/src/types';
4331

4432
describe('api', () => {
4533
let app: FirebaseApp;
4634

4735
beforeEach(() => {
48-
app = initializeApp(
49-
{ apiKey: 'fdsa', appId: 'fdsafg' },
50-
'initializeAppCheckTests'
51-
);
52-
_registerComponent(
53-
new Component(
54-
'platform-logger',
55-
() => {
56-
return {} as PlatformLoggerService;
57-
},
58-
ComponentType.PUBLIC
59-
)
60-
);
61-
_registerComponent(
62-
new Component(
63-
'app-check-exp',
64-
() => {
65-
return {} as AppCheckService;
66-
},
67-
ComponentType.PUBLIC
68-
)
69-
);
36+
app = getFullApp();
7037
});
7138

7239
afterEach(() => {
@@ -107,42 +74,29 @@ describe('api', () => {
10774
expect(getState(app).provider).to.equal(fakeCustomTokenProvider);
10875
expect(initReCAPTCHAStub).to.have.not.been.called;
10976
});
110-
});
111-
describe('activate()', () => {
112-
let app: FirebaseApp;
113-
114-
beforeEach(() => {
115-
app = getFakeApp();
116-
});
11777

11878
it('sets activated to true', () => {
11979
expect(getState(app).activated).to.equal(false);
120-
activate(
121-
app,
122-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
123-
getFakePlatformLoggingProvider()
124-
);
80+
initializeAppCheck(app, {
81+
provider: new ReCaptchaV3Provider(FAKE_SITE_KEY)
82+
});
12583
expect(getState(app).activated).to.equal(true);
12684
});
12785

12886
it('isTokenAutoRefreshEnabled value defaults to global setting', () => {
12987
app.automaticDataCollectionEnabled = false;
130-
activate(
131-
app,
132-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
133-
getFakePlatformLoggingProvider()
134-
);
88+
initializeAppCheck(app, {
89+
provider: new ReCaptchaV3Provider(FAKE_SITE_KEY)
90+
});
13591
expect(getState(app).isTokenAutoRefreshEnabled).to.equal(false);
13692
});
13793

13894
it('sets isTokenAutoRefreshEnabled correctly, overriding global setting', () => {
13995
app.automaticDataCollectionEnabled = false;
140-
activate(
141-
app,
142-
new ReCaptchaV3Provider(FAKE_SITE_KEY),
143-
getFakePlatformLoggingProvider(),
144-
true
145-
);
96+
initializeAppCheck(app, {
97+
provider: new ReCaptchaV3Provider(FAKE_SITE_KEY),
98+
isTokenAutoRefreshEnabled: true
99+
});
146100
expect(getState(app).isTokenAutoRefreshEnabled).to.equal(true);
147101
});
148102
});

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

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,13 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { AppCheck, AppCheckOptions, AppCheckProvider } from './public-types';
18+
import { AppCheck, AppCheckOptions } from './public-types';
1919
import { ERROR_FACTORY, AppCheckError } from './errors';
20-
import { initialize as initializeRecaptcha } from './recaptcha';
2120
import { getState, setState, AppCheckState } from './state';
2221
import { FirebaseApp, getApp, _getProvider } from '@firebase/app-exp';
2322
import { getModularInstance } from '@firebase/util';
2423
import { AppCheckService } from './factory';
25-
import { ReCaptchaV3Provider } from './providers';
26-
import { Provider } from '@firebase/component';
24+
import { AppCheckProviderInternal } from './types';
2725

2826
declare module '@firebase/component' {
2927
interface NameServiceMapping {
@@ -43,7 +41,6 @@ export function initializeAppCheck(
4341
): AppCheck {
4442
app = getModularInstance(app);
4543
const provider = _getProvider(app, 'app-check-exp');
46-
const platformLoggerProvider = _getProvider(app, 'platform-logger');
4744

4845
if (provider.isInitialized()) {
4946
throw ERROR_FACTORY.create(AppCheckError.ALREADY_INITIALIZED, {
@@ -54,8 +51,7 @@ export function initializeAppCheck(
5451
const appCheck = provider.initialize({ options });
5552
_activate(
5653
app,
57-
options.provider,
58-
platformLoggerProvider,
54+
options.provider as AppCheckProviderInternal,
5955
options.isTokenAutoRefreshEnabled
6056
);
6157

@@ -74,10 +70,9 @@ export function initializeAppCheck(
7470
*
7571
* @internal
7672
*/
77-
export function _activate(
73+
function _activate(
7874
app: FirebaseApp,
79-
provider: AppCheckProvider,
80-
platformLoggerProvider: Provider<'platform-logger'>,
75+
provider: AppCheckProviderInternal,
8176
isTokenAutoRefreshEnabled?: boolean
8277
): void {
8378
const state = getState(app);
@@ -95,17 +90,9 @@ export function _activate(
9590

9691
setState(app, newState);
9792

98-
// initialize reCAPTCHA if siteKey is provided
99-
if (newState.provider instanceof ReCaptchaV3Provider) {
100-
const providerImpl = newState.provider._delegate;
101-
setState(app, { ...newState, provider: providerImpl });
102-
// These need to be injected for ReCaptchaV3Provider's getToken() to work.
103-
providerImpl.initialize(app, platformLoggerProvider);
104-
initializeRecaptcha(app, providerImpl.siteKey).catch(() => {
105-
/* we don't care about the initialization result in activate() */
106-
});
107-
}
93+
(newState.provider as AppCheckProviderInternal).initialize(app);
10894
}
95+
10996
/**
11097
* Set whether App Check will automatically refresh tokens as needed.
11198
*

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {
2323
import { FirebaseApp } from '@firebase/app-exp';
2424
import { ERROR_FACTORY, AppCheckError } from './errors';
2525
import { Provider } from '@firebase/component';
26-
import { AppCheckTokenInternal } from './state';
26+
import { AppCheckTokenInternal } from './types';
2727

2828
/**
2929
* Response JSON returned from AppCheck server endpoint.

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 { ReCaptchaV3Provider } from './providers';
30+
export { ReCaptchaV3Provider, CustomProvider } 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/indexeddb.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import { FirebaseApp } from '@firebase/app-exp';
1919
import { ERROR_FACTORY, AppCheckError } from './errors';
20-
import { AppCheckTokenInternal } from './state';
20+
import { AppCheckTokenInternal } from './types';
2121
const DB_NAME = 'firebase-app-check-database';
2222
const DB_VERSION = 1;
2323
const STORE_NAME = 'firebase-app-check-store';

0 commit comments

Comments
 (0)