From 0b9d9eaf6e3300ea6ad977a1ded4acead0906f83 Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Wed, 11 Aug 2021 14:28:06 -0700 Subject: [PATCH 1/5] Make initializeFirestore() idempotent --- packages/firestore/src/exp/database.ts | 29 ++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/firestore/src/exp/database.ts b/packages/firestore/src/exp/database.ts index a5511a3856b..a4faa5e3970 100644 --- a/packages/firestore/src/exp/database.ts +++ b/packages/firestore/src/exp/database.ts @@ -128,10 +128,31 @@ export function initializeFirestore( const provider = _getProvider(app, 'firestore-exp'); if (provider.isInitialized()) { - throw new FirestoreError( - Code.FAILED_PRECONDITION, - 'Firestore can only be initialized once per app.' - ); + const existingInstance = provider.getImmediate(); + const initialOptions = provider.getOptions() as FirestoreSettings; + // Every option can currently be compared shallowly. + // We could currently do a deepEqual() on `settings` but if we add + // a new option to `FirestoreSettings` that needs a custom + // comparison, it should be coded separately. This makes it less + // likely to be missed. + const shallowOptionsKeys: Array = [ + 'cacheSizeBytes', + 'experimentalAutoDetectLongPolling', + 'experimentalForceLongPolling', + 'host', + 'ignoreUndefinedProperties', + 'ssl' + ]; + if ( + shallowOptionsKeys.every(key => initialOptions[key] === settings[key]) + ) { + return existingInstance; + } else { + throw new FirestoreError( + Code.FAILED_PRECONDITION, + 'Firestore can only be initialized once per app.' + ); + } } if ( From aa38c9252ac9ffdee1de364b1d1cf435206793df Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Wed, 11 Aug 2021 14:31:40 -0700 Subject: [PATCH 2/5] Update error message --- packages/firestore/src/exp/database.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/firestore/src/exp/database.ts b/packages/firestore/src/exp/database.ts index a4faa5e3970..11a5869d7b4 100644 --- a/packages/firestore/src/exp/database.ts +++ b/packages/firestore/src/exp/database.ts @@ -150,7 +150,10 @@ export function initializeFirestore( } else { throw new FirestoreError( Code.FAILED_PRECONDITION, - 'Firestore can only be initialized once per app.' + 'initializeFirestore() has already been called with ' + + 'different options. To avoid this error, call initializeFirestore() with the ' + + 'same options as when it was originally called, or call getFirestore() to return the' + + ' already initialized instance.' ); } } From bfbc873336f52de6188ddbfe9afc1a727ae4443d Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Wed, 11 Aug 2021 15:59:52 -0700 Subject: [PATCH 3/5] Use deepEqual() --- packages/firestore/src/exp/database.ts | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/packages/firestore/src/exp/database.ts b/packages/firestore/src/exp/database.ts index 11a5869d7b4..81584fba3e6 100644 --- a/packages/firestore/src/exp/database.ts +++ b/packages/firestore/src/exp/database.ts @@ -24,6 +24,7 @@ import { } from '@firebase/app-exp'; import { FirebaseAuthInternalName } from '@firebase/auth-interop-types'; import { Provider } from '@firebase/component'; +import { deepEqual } from '../../../util/dist'; import { IndexedDbOfflineComponentProvider, @@ -129,23 +130,8 @@ export function initializeFirestore( if (provider.isInitialized()) { const existingInstance = provider.getImmediate(); - const initialOptions = provider.getOptions() as FirestoreSettings; - // Every option can currently be compared shallowly. - // We could currently do a deepEqual() on `settings` but if we add - // a new option to `FirestoreSettings` that needs a custom - // comparison, it should be coded separately. This makes it less - // likely to be missed. - const shallowOptionsKeys: Array = [ - 'cacheSizeBytes', - 'experimentalAutoDetectLongPolling', - 'experimentalForceLongPolling', - 'host', - 'ignoreUndefinedProperties', - 'ssl' - ]; - if ( - shallowOptionsKeys.every(key => initialOptions[key] === settings[key]) - ) { + const initialSettings = provider.getOptions() as FirestoreSettings; + if (deepEqual(initialSettings, settings)) { return existingInstance; } else { throw new FirestoreError( From be287564dc5315fc1e57058c8271bbd2ec822531 Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Wed, 11 Aug 2021 16:45:25 -0700 Subject: [PATCH 4/5] Lint fix --- packages/firestore/src/exp/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firestore/src/exp/database.ts b/packages/firestore/src/exp/database.ts index 81584fba3e6..4a904edd29e 100644 --- a/packages/firestore/src/exp/database.ts +++ b/packages/firestore/src/exp/database.ts @@ -24,8 +24,8 @@ import { } from '@firebase/app-exp'; import { FirebaseAuthInternalName } from '@firebase/auth-interop-types'; import { Provider } from '@firebase/component'; -import { deepEqual } from '../../../util/dist'; +import { deepEqual } from '../../../util/dist'; import { IndexedDbOfflineComponentProvider, MultiTabOfflineComponentProvider, From 9c35ff73dcce3b1fd9f25a07d5fa47ceb78959f4 Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Wed, 11 Aug 2021 17:19:00 -0700 Subject: [PATCH 5/5] Fix util import --- packages/firestore/src/exp/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firestore/src/exp/database.ts b/packages/firestore/src/exp/database.ts index 4a904edd29e..9b29a79c254 100644 --- a/packages/firestore/src/exp/database.ts +++ b/packages/firestore/src/exp/database.ts @@ -24,8 +24,8 @@ import { } from '@firebase/app-exp'; import { FirebaseAuthInternalName } from '@firebase/auth-interop-types'; import { Provider } from '@firebase/component'; +import { deepEqual } from '@firebase/util'; -import { deepEqual } from '../../../util/dist'; import { IndexedDbOfflineComponentProvider, MultiTabOfflineComponentProvider,