diff --git a/.changeset/nervous-ads-pretend.md b/.changeset/nervous-ads-pretend.md new file mode 100644 index 00000000000..b375717da3e --- /dev/null +++ b/.changeset/nervous-ads-pretend.md @@ -0,0 +1,5 @@ +--- +"@firebase/database": patch +--- + +Fixed issue where connectDatabaseToEmulator can be called twice during a hot reload diff --git a/packages/database/src/api/Database.ts b/packages/database/src/api/Database.ts index 6c367a87c44..f1a27492442 100644 --- a/packages/database/src/api/Database.ts +++ b/packages/database/src/api/Database.ts @@ -320,9 +320,11 @@ export function getDatabase( const db = _getProvider(app, 'database').getImmediate({ identifier: url }) as Database; - const emulator = getDefaultEmulatorHostnameAndPort('database'); - if (emulator) { - connectDatabaseEmulator(db, ...emulator); + if (!db._instanceStarted) { + const emulator = getDefaultEmulatorHostnameAndPort('database'); + if (emulator) { + connectDatabaseEmulator(db, ...emulator); + } } return db; } diff --git a/packages/database/test/exp/integration.test.ts b/packages/database/test/exp/integration.test.ts index 3be79d5c447..adf5094f222 100644 --- a/packages/database/test/exp/integration.test.ts +++ b/packages/database/test/exp/integration.test.ts @@ -77,6 +77,24 @@ describe('Database@exp Tests', () => { const db = getDatabase(defaultApp); expect(db).to.be.ok; }); + it("doesn't try to connect to emulator after database has already started", async () => { + const db = getDatabase(defaultApp); + const r = ref(db, '.info/connected'); + const deferred = new Deferred(); + onValue(r, snapshot => { + if (snapshot.val()) { + deferred.resolve(); + } + }); + await deferred.promise; + process.env.__FIREBASE_DEFAULTS__ = JSON.stringify({ + emulatorHosts: { + database: 'localhost:9000' + } + }); + expect(() => getDatabase(defaultApp)).to.not.throw(); + delete process.env.__FIREBASE_DEFAULTS__; + }); it('Can get database with custom URL', () => { const db = getDatabase(defaultApp, 'http://foo.bar.com');