Skip to content

Commit e4cd35c

Browse files
committed
implement auth explicit initialization
1 parent f16295a commit e4cd35c

File tree

8 files changed

+70
-15
lines changed

8 files changed

+70
-15
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { Name } from '@firebase/component';
1313
import { Provider } from '@firebase/component';
1414

1515
// @internal (undocumented)
16-
export function _addComponent(app: FirebaseApp, component: Component): void;
16+
export function _addComponent<T extends Name>(app: FirebaseApp, component: Component<T>): void;
1717

1818
// @internal (undocumented)
1919
export function _addOrOverwriteComponent(app: FirebaseApp, component: Component): void;
@@ -102,7 +102,7 @@ export function initializeApp(options: FirebaseOptions, config?: FirebaseAppConf
102102
export function onLog(logCallback: LogCallback | null, options?: LogOptions): void;
103103

104104
// @internal (undocumented)
105-
export function _registerComponent(component: Component): boolean;
105+
export function _registerComponent<T extends Name>(component: Component<T>): boolean;
106106

107107
// @public
108108
export function registerVersion(libraryKeyOrName: string, version: string, variant?: string): void;

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ export const _components = new Map<string, Component<any>>();
3939
*
4040
* @internal
4141
*/
42-
export function _addComponent(app: FirebaseApp, component: Component): void {
42+
export function _addComponent<T extends Name>(
43+
app: FirebaseApp,
44+
component: Component<T>
45+
): void {
4346
try {
4447
(app as FirebaseAppImpl).container.addComponent(component);
4548
} catch (e) {
@@ -68,7 +71,9 @@ export function _addOrOverwriteComponent(
6871
*
6972
* @internal
7073
*/
71-
export function _registerComponent(component: Component): boolean {
74+
export function _registerComponent<T extends Name>(
75+
component: Component<T>
76+
): boolean {
7277
const componentName = component.name;
7378
if (_components.has(componentName)) {
7479
logger.debug(

packages-exp/app-exp/src/platformLoggerService.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
Provider,
2222
Name
2323
} from '@firebase/component';
24-
import { PlatformLoggerService } from './types';
24+
import { PlatformLoggerService, VersionService } from './types';
2525

2626
export class PlatformLoggerServiceImpl implements PlatformLoggerService {
2727
constructor(private readonly container: ComponentContainer) {}
@@ -34,7 +34,7 @@ export class PlatformLoggerServiceImpl implements PlatformLoggerService {
3434
return providers
3535
.map(provider => {
3636
if (isVersionServiceProvider(provider)) {
37-
const service = provider.getImmediate();
37+
const service = provider.getImmediate() as VersionService;
3838
return `${service.library}/${service.version}`;
3939
} else {
4040
return null;
@@ -52,9 +52,7 @@ export class PlatformLoggerServiceImpl implements PlatformLoggerService {
5252
* provides VersionService. The provider is not necessarily a 'app-version'
5353
* provider.
5454
*/
55-
function isVersionServiceProvider(
56-
provider: Provider<Name>
57-
): provider is Provider<'app-version'> {
55+
function isVersionServiceProvider(provider: Provider<Name>): boolean {
5856
const component = provider.getComponent();
5957
return component?.type === ComponentType.VERSION;
6058
}

packages-exp/auth-exp/src/core/auth/register.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@
1717

1818
import { _registerComponent, registerVersion } from '@firebase/app-exp';
1919
import { Config, Dependencies } from '../../model/public_types';
20-
import { Component, ComponentType } from '@firebase/component';
20+
import {
21+
Component,
22+
ComponentType,
23+
InstantiationMode
24+
} from '@firebase/component';
2125

2226
import { version } from '../../../package.json';
2327
import { AuthErrorCode } from '../errors';
@@ -76,6 +80,23 @@ export function registerAuth(clientPlatform: ClientPlatform): void {
7680
},
7781
ComponentType.PUBLIC
7882
)
83+
/**
84+
* Auth can only be initialized by explicitly calling getAuth() or initializeAuth()
85+
* For why we do this, See https://docs.google.com/document/d/1vy9aI-fELpL2xlREoZt12o0JNw-JVNz4OwxYd9HcT0Y/edit?resourcekey=0-A714tRurcRonkj3lDuKVCw#heading=h.wcvc4xz0pwxf
86+
*/
87+
.setInstantiationMode(InstantiationMode.EXPLICIT)
88+
/**
89+
* Because all firebase products that depend on auth depend on auth-internal directly,
90+
* we need to initialize auth-internal after auth is initialized to make it available to other firebase products.
91+
*/
92+
.setInstanceCreatedCallback(
93+
(container, _instanceIdentifier, _instance) => {
94+
const authInternalProvider = container.getProvider(
95+
_ComponentName.AUTH_INTERNAL
96+
);
97+
authInternalProvider.initialize();
98+
}
99+
)
79100
);
80101

81102
_registerComponent(
@@ -88,7 +109,7 @@ export function registerAuth(clientPlatform: ClientPlatform): void {
88109
return (auth => new AuthInterop(auth))(auth);
89110
},
90111
ComponentType.PRIVATE
91-
)
112+
).setInstantiationMode(InstantiationMode.EXPLICIT)
92113
);
93114

94115
registerVersion(

packages/component/src/component.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ import {
1919
InstanceFactory,
2020
ComponentType,
2121
Dictionary,
22-
Name
22+
Name,
23+
onInstanceCreatedCallback
2324
} from './types';
2425

2526
/**
@@ -34,6 +35,8 @@ export class Component<T extends Name = Name> {
3435

3536
instantiationMode = InstantiationMode.LAZY;
3637

38+
onInstanceCreated: onInstanceCreatedCallback<T> | null = null;
39+
3740
/**
3841
*
3942
* @param name The public service name, e.g. app, auth, firestore, database
@@ -60,4 +63,9 @@ export class Component<T extends Name = Name> {
6063
this.serviceProps = props;
6164
return this;
6265
}
66+
67+
setInstanceCreatedCallback(callback: onInstanceCreatedCallback<T>): this {
68+
this.onInstanceCreated = callback;
69+
return this;
70+
}
6371
}

packages/component/src/component_container.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ export class ComponentContainer {
6666
*/
6767
getProvider<T extends Name>(name: T): Provider<T> {
6868
if (this.providers.has(name)) {
69-
return this.providers.get(name) as Provider<T>;
69+
return (this.providers.get(name) as unknown) as Provider<T>;
7070
}
7171

7272
// create a Provider for a service that hasn't registered with Firebase
7373
const provider = new Provider<T>(name, this);
74-
this.providers.set(name, provider);
74+
this.providers.set(name, (provider as unknown) as Provider<Name>);
7575

7676
return provider as Provider<T>;
7777
}

packages/component/src/provider.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,23 @@ export class Provider<T extends Name> {
267267
options
268268
});
269269
this.instances.set(instanceIdentifier, instance);
270+
271+
/**
272+
* Order is important
273+
* onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which
274+
* makes `isInitialized()` return true.
275+
*/
276+
if (this.component.onInstanceCreated) {
277+
try {
278+
this.component.onInstanceCreated(
279+
this.container,
280+
instanceIdentifier,
281+
instance
282+
);
283+
} catch {
284+
// ignore errors in the onInstanceCreatedCallback
285+
}
286+
}
270287
}
271288

272289
return instance || null;
@@ -293,6 +310,6 @@ function normalizeIdentifierForFactory(identifier: string): string | undefined {
293310
return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;
294311
}
295312

296-
function isComponentEager(component: Component<Name>): boolean {
313+
function isComponentEager<T extends Name>(component: Component<T>): boolean {
297314
return component.instantiationMode === InstantiationMode.EAGER;
298315
}

packages/component/src/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ export type InstanceFactory<T extends Name> = (
5757
options: InstanceFactoryOptions
5858
) => NameServiceMapping[T];
5959

60+
export type onInstanceCreatedCallback<T extends Name> = (
61+
container: ComponentContainer,
62+
instanceIdentifier: string,
63+
instance: NameServiceMapping[T]
64+
) => void;
65+
6066
export interface Dictionary {
6167
[key: string]: unknown;
6268
}

0 commit comments

Comments
 (0)