@@ -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' ;
3535import {
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 */
140142export 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 */
500555export 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
0 commit comments