Skip to content

Commit dd9acd0

Browse files
authored
Revert "Revert "Tomandersen/multi db"" -- and make api internal (#6554)
* Revert "Revert "Tomandersen/multi db (#6518)" (#6552)" This reverts commit 474025c. * Make multidb internal for now * Changeset * Delete change log
1 parent f355335 commit dd9acd0

File tree

16 files changed

+558
-113
lines changed

16 files changed

+558
-113
lines changed

common/api-review/firestore-lite.api.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,10 @@ export function getDoc<T>(reference: DocumentReference<T>): Promise<DocumentSnap
176176
export function getDocs<T>(query: Query<T>): Promise<QuerySnapshot<T>>;
177177

178178
// @public
179-
export function getFirestore(app?: FirebaseApp): Firestore;
179+
export function getFirestore(): Firestore;
180+
181+
// @public
182+
export function getFirestore(app: FirebaseApp): Firestore;
180183

181184
// @public
182185
export function increment(n: number): FieldValue;

common/api-review/firestore.api.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -228,13 +228,16 @@ export function getDocsFromCache<T>(query: Query<T>): Promise<QuerySnapshot<T>>;
228228
export function getDocsFromServer<T>(query: Query<T>): Promise<QuerySnapshot<T>>;
229229

230230
// @public
231-
export function getFirestore(app?: FirebaseApp): Firestore;
231+
export function getFirestore(): Firestore;
232+
233+
// @public
234+
export function getFirestore(app: FirebaseApp): Firestore;
232235

233236
// @public
234237
export function increment(n: number): FieldValue;
235238

236239
// @public
237-
export function initializeFirestore(app: FirebaseApp, settings: FirestoreSettings): Firestore;
240+
export function initializeFirestore(app: FirebaseApp, settings: FirestoreSettings, databaseId?: string): Firestore;
238241

239242
// @public
240243
export function limit(limit: number): QueryConstraint;

integration/firestore/firebase_export.ts

+17-11
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,25 @@ import {
2727

2828
let appCount = 0;
2929

30+
export function newTestApp(projectId: string, appName?: string): FirebaseApp {
31+
if (appName === undefined) {
32+
appName = 'test-app-' + appCount++;
33+
}
34+
return initializeApp(
35+
{
36+
apiKey: 'fake-api-key',
37+
projectId
38+
},
39+
appName
40+
);
41+
}
42+
3043
export function newTestFirestore(
31-
projectId: string,
32-
nameOrApp?: string | FirebaseApp,
33-
settings?: FirestoreSettings
44+
app: FirebaseApp,
45+
settings?: FirestoreSettings,
46+
dbName?: string
3447
): Firestore {
35-
if (nameOrApp === undefined) {
36-
nameOrApp = 'test-app-' + appCount++;
37-
}
38-
const app =
39-
typeof nameOrApp === 'string'
40-
? initializeApp({ apiKey: 'fake-api-key', projectId }, nameOrApp)
41-
: nameOrApp;
42-
return initializeFirestore(app, settings || {});
48+
return initializeFirestore(app, settings || {}, dbName);
4349
}
4450

4551
export * from '@firebase/firestore';

packages/firestore-compat/src/index.console.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ export class Firestore extends FirestoreCompat {
9191
super(
9292
databaseIdFromFirestoreDatabase(firestoreDatabase),
9393
new FirestoreExp(
94-
databaseIdFromFirestoreDatabase(firestoreDatabase),
9594
new _EmptyAuthCredentialsProvider(),
96-
new _EmptyAppCheckTokenProvider()
95+
new _EmptyAppCheckTokenProvider(),
96+
databaseIdFromFirestoreDatabase(firestoreDatabase)
9797
),
9898
new MemoryPersistenceProvider()
9999
);

packages/firestore/lite/register.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ import {
2727
LiteAppCheckTokenProvider,
2828
LiteAuthCredentialsProvider
2929
} from '../src/api/credentials';
30+
import { databaseIdFromApp } from '../src/core/database_info';
3031
import { setSDKVersion } from '../src/core/version';
3132
import { Firestore } from '../src/lite-api/database';
32-
import { FirestoreSettings } from '../src/lite-api/settings';
3333

3434
declare module '@firebase/component' {
3535
interface NameServiceMapping {
@@ -42,24 +42,25 @@ export function registerFirestore(): void {
4242
_registerComponent(
4343
new Component(
4444
'firestore/lite',
45-
(container, { options: settings }: { options?: FirestoreSettings }) => {
45+
(container, { instanceIdentifier: databaseId, options: settings }) => {
4646
const app = container.getProvider('app').getImmediate()!;
4747
const firestoreInstance = new Firestore(
48-
app,
4948
new LiteAuthCredentialsProvider(
5049
container.getProvider('auth-internal')
5150
),
5251
new LiteAppCheckTokenProvider(
5352
container.getProvider('app-check-internal')
54-
)
53+
),
54+
databaseIdFromApp(app, databaseId),
55+
app
5556
);
5657
if (settings) {
5758
firestoreInstance._setSettings(settings);
5859
}
5960
return firestoreInstance;
6061
},
6162
'PUBLIC' as ComponentType.PUBLIC
62-
)
63+
).setMultipleInstances(true)
6364
);
6465
// RUNTIME_ENV and BUILD_TARGET are replaced by real values during the compilation
6566
registerVersion('firestore-lite', version, '__RUNTIME_ENV__');

packages/firestore/src/api/database.ts

+74-15
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import {
3131
OfflineComponentProvider,
3232
OnlineComponentProvider
3333
} from '../core/component_provider';
34-
import { DatabaseId } from '../core/database_info';
34+
import { DatabaseId, DEFAULT_DATABASE_NAME } from '../core/database_info';
3535
import {
3636
FirestoreClient,
3737
firestoreClientDisableNetwork,
@@ -103,17 +103,18 @@ export class Firestore extends LiteFirestore {
103103

104104
/** @hideconstructor */
105105
constructor(
106-
databaseIdOrApp: DatabaseId | FirebaseApp,
107106
authCredentialsProvider: CredentialsProvider<User>,
108-
appCheckCredentialsProvider: CredentialsProvider<string>
107+
appCheckCredentialsProvider: CredentialsProvider<string>,
108+
databaseId: DatabaseId,
109+
app?: FirebaseApp
109110
) {
110111
super(
111-
databaseIdOrApp,
112112
authCredentialsProvider,
113-
appCheckCredentialsProvider
113+
appCheckCredentialsProvider,
114+
databaseId,
115+
app
114116
);
115-
this._persistenceKey =
116-
'name' in databaseIdOrApp ? databaseIdOrApp.name : '[DEFAULT]';
117+
this._persistenceKey = app?.name || '[DEFAULT]';
117118
}
118119

119120
_terminate(): Promise<void> {
@@ -135,17 +136,26 @@ export class Firestore extends LiteFirestore {
135136
* @param app - The {@link @firebase/app#FirebaseApp} with which the {@link Firestore} instance will
136137
* be associated.
137138
* @param settings - A settings object to configure the {@link Firestore} instance.
139+
* @param databaseId - The name of database.
138140
* @returns A newly initialized {@link Firestore} instance.
139141
*/
140142
export function initializeFirestore(
141143
app: FirebaseApp,
142-
settings: FirestoreSettings
144+
settings: FirestoreSettings,
145+
databaseId?: string
143146
): Firestore {
147+
if (!databaseId) {
148+
databaseId = DEFAULT_DATABASE_NAME;
149+
}
144150
const provider = _getProvider(app, 'firestore');
145151

146-
if (provider.isInitialized()) {
147-
const existingInstance = provider.getImmediate();
148-
const initialSettings = provider.getOptions() as FirestoreSettings;
152+
if (provider.isInitialized(databaseId)) {
153+
const existingInstance = provider.getImmediate({
154+
identifier: databaseId
155+
});
156+
const initialSettings = provider.getOptions(
157+
databaseId
158+
) as FirestoreSettings;
149159
if (deepEqual(initialSettings, settings)) {
150160
return existingInstance;
151161
} else {
@@ -170,20 +180,65 @@ export function initializeFirestore(
170180
);
171181
}
172182

173-
return provider.initialize({ options: settings });
183+
return provider.initialize({
184+
options: settings,
185+
instanceIdentifier: databaseId
186+
});
174187
}
175188

189+
/**
190+
* Returns the existing default {@link Firestore} instance that is associated with the
191+
* default {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new
192+
* instance with default settings.
193+
*
194+
* @returns The {@link Firestore} instance of the provided app.
195+
*/
196+
export function getFirestore(): Firestore;
197+
/**
198+
* Returns the existing default {@link Firestore} instance that is associated with the
199+
* provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new
200+
* instance with default settings.
201+
*
202+
* @param app - The {@link @firebase/app#FirebaseApp} instance that the returned {@link Firestore}
203+
* instance is associated with.
204+
* @returns The {@link Firestore} instance of the provided app.
205+
*/
206+
export function getFirestore(app: FirebaseApp): Firestore;
207+
/**
208+
* Returns the existing {@link Firestore} instance that is associated with the
209+
* default {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new
210+
* instance with default settings.
211+
*
212+
* @param databaseId - The name of database.
213+
* @returns The {@link Firestore} instance of the provided app.
214+
* @internal
215+
*/
216+
export function getFirestore(databaseId: string): Firestore;
176217
/**
177218
* Returns the existing {@link Firestore} instance that is associated with the
178219
* provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new
179220
* instance with default settings.
180221
*
181222
* @param app - The {@link @firebase/app#FirebaseApp} instance that the returned {@link Firestore}
182223
* instance is associated with.
224+
* @param databaseId - The name of database.
183225
* @returns The {@link Firestore} instance of the provided app.
226+
* @internal
184227
*/
185-
export function getFirestore(app: FirebaseApp = getApp()): Firestore {
186-
return _getProvider(app, 'firestore').getImmediate() as Firestore;
228+
export function getFirestore(app: FirebaseApp, databaseId: string): Firestore;
229+
export function getFirestore(
230+
appOrDatabaseId?: FirebaseApp | string,
231+
optionalDatabaseId?: string
232+
): Firestore {
233+
const app: FirebaseApp =
234+
typeof appOrDatabaseId === 'object' ? appOrDatabaseId : getApp();
235+
const databaseId =
236+
typeof appOrDatabaseId === 'string'
237+
? appOrDatabaseId
238+
: optionalDatabaseId || DEFAULT_DATABASE_NAME;
239+
return _getProvider(app, 'firestore').getImmediate({
240+
identifier: databaseId
241+
}) as Firestore;
187242
}
188243

189244
/**
@@ -498,7 +553,11 @@ export function disableNetwork(firestore: Firestore): Promise<void> {
498553
* terminated.
499554
*/
500555
export function terminate(firestore: Firestore): Promise<void> {
501-
_removeServiceInstance(firestore.app, 'firestore');
556+
_removeServiceInstance(
557+
firestore.app,
558+
'firestore',
559+
firestore._databaseId.database
560+
);
502561
return firestore._delete();
503562
}
504563

packages/firestore/src/core/database_info.ts

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import { FirebaseApp } from '@firebase/app';
2+
3+
import { Code, FirestoreError } from '../util/error';
4+
15
/**
26
* @license
37
* Copyright 2017 Google LLC
@@ -46,7 +50,7 @@ export class DatabaseInfo {
4650
}
4751

4852
/** The default database name for a project. */
49-
const DEFAULT_DATABASE_NAME = '(default)';
53+
export const DEFAULT_DATABASE_NAME = '(default)';
5054

5155
/**
5256
* Represents the database ID a Firestore client is associated with.
@@ -74,3 +78,17 @@ export class DatabaseId {
7478
);
7579
}
7680
}
81+
82+
export function databaseIdFromApp(
83+
app: FirebaseApp,
84+
database?: string
85+
): DatabaseId {
86+
if (!Object.prototype.hasOwnProperty.apply(app.options, ['projectId'])) {
87+
throw new FirestoreError(
88+
Code.INVALID_ARGUMENT,
89+
'"projectId" not provided in firebase.initializeApp.'
90+
);
91+
}
92+
93+
return new DatabaseId(app.options.projectId!, database);
94+
}

0 commit comments

Comments
 (0)