diff --git a/CHANGELOG.md b/CHANGELOG.md index e69de29bb..31025713e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -0,0 +1 @@ +- Fixes an emulator issue where snapshot.ref could not point to multiple databases (#1339). diff --git a/src/common/providers/database.ts b/src/common/providers/database.ts index e1da47c7d..43f977b53 100644 --- a/src/common/providers/database.ts +++ b/src/common/providers/database.ts @@ -50,10 +50,7 @@ export class DataSnapshot implements database.DataSnapshot { instance?: string ) { const config = firebaseConfig(); - if (app?.options?.databaseURL?.startsWith("http:")) { - // In this case we're dealing with an emulator - this.instance = app.options.databaseURL; - } else if (instance) { + if (instance) { // SDK always supplies instance, but user's unit tests may not this.instance = instance; } else if (app) { diff --git a/src/v2/providers/database.ts b/src/v2/providers/database.ts index a5ed34892..884c692fa 100644 --- a/src/v2/providers/database.ts +++ b/src/v2/providers/database.ts @@ -465,7 +465,7 @@ export function onChangedOperation( // wrap the handler const func = (raw: CloudEvent) => { const event = raw as RawRTDBCloudEvent; - const instanceUrl = `https://${event.instance}.${event.firebasedatabasehost}`; + const instanceUrl = getInstance(event); const params = makeParams(event, pathPattern, instancePattern) as unknown as ParamsOf; const databaseEvent = makeChangedDatabaseEvent(event, instanceUrl, params); return wrapTraceContext(handler)(databaseEvent); @@ -492,7 +492,7 @@ export function onOperation( // wrap the handler const func = (raw: CloudEvent) => { const event = raw as RawRTDBCloudEvent; - const instanceUrl = `https://${event.instance}.${event.firebasedatabasehost}`; + const instanceUrl = getInstance(event); const params = makeParams(event, pathPattern, instancePattern) as unknown as ParamsOf; const data = eventType === deletedEventType ? event.data.data : event.data.delta; const databaseEvent = makeDatabaseEvent(event, data, instanceUrl, params); @@ -505,3 +505,10 @@ export function onOperation( return func; } + +function getInstance(event: RawRTDBCloudEvent) { + const emuHost = process.env.FIREBASE_DATABASE_EMULATOR_HOST; + return emuHost + ? `http://${emuHost}/?ns=${event.instance}` + : `https://${event.instance}.${event.firebasedatabasehost}`; +}