Skip to content

Commit e963005

Browse files
authored
add FIREBASE_DATABASE_EMULATOR_HOST_VAR (#596)
* add FIREBASE_DATABASE_EMULATOR_HOST_VAR * add tests for new env variable * firebase/database minor version bump * firebase-js-sdk won't declare env var * add comment referencing definition in firebase-js-sdk * comment fix
1 parent cc67d08 commit e963005

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

src/database/database.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ import {Database} from '@firebase/database';
55

66
import * as validator from '../utils/validator';
77

8+
/**
9+
* This variable is redefined in the firebase-js-sdk. Before modifying this
10+
* definition, please consult the definition in firebase-js-sdk and ensure that
11+
* they are consistent.
12+
*
13+
* https://github.com/firebase/firebase-js-sdk
14+
*/
15+
export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST';
816

917
/**
1018
* Internals of a Database instance.
@@ -79,6 +87,10 @@ export class DatabaseService implements FirebaseServiceInterface {
7987
} else if (typeof this.appInternal.options.databaseURL !== 'undefined') {
8088
return this.appInternal.options.databaseURL;
8189
}
90+
const dbEmulatorUrl = process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR];
91+
if (dbEmulatorUrl) {
92+
return 'http://' + dbEmulatorUrl;
93+
}
8294
throw new FirebaseDatabaseError({
8395
code: 'invalid-argument',
8496
message: 'Can\'t determine Firebase Database URL.',

test/unit/firebase-app.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import {Database} from '@firebase/database';
4141
import {InstanceId} from '../../src/instance-id/instance-id';
4242
import {ProjectManagement} from '../../src/project-management/project-management';
4343
import { FirebaseAppError, AppErrorCodes } from '../../src/utils/error';
44+
import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from '../../src/database/database';
4445

4546
chai.should();
4647
chai.use(sinonChai);
@@ -434,12 +435,29 @@ describe('FirebaseApp', () => {
434435
});
435436

436437
it('should throw when databaseURL is not set', () => {
438+
delete process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR];
437439
const app = firebaseNamespace.initializeApp(mocks.appOptionsNoDatabaseUrl, mocks.appName);
438440
expect(() => {
439441
app.database();
440442
}).to.throw('Can\'t determine Firebase Database URL.');
441443
});
442444

445+
it('should use FIREBASE_DATABASE_EMULATOR_HOST when databaseURL not set', () => {
446+
const url = 'localhost.com:9000?ns=test';
447+
process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR] = url;
448+
const app = firebaseNamespace.initializeApp(mocks.appOptionsNoDatabaseUrl, mocks.appName);
449+
const db: Database = app.database();
450+
expect(db.ref().toString()).to.equal('http://localhost.com:9000/');
451+
});
452+
453+
it('should prefer databaseURL when FIREBASE_DATABASE_EMULATOR_HOST set', () => {
454+
const url = 'localhost.com:9000?ns=test';
455+
process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR] = url;
456+
const app = firebaseNamespace.initializeApp(mocks.appOptions, mocks.appName);
457+
const db: Database = app.database();
458+
expect(db.ref().toString()).to.equal('https://databasename.firebaseio.com/');
459+
});
460+
443461
it('should return a cached version of Database on subsequent calls', () => {
444462
const app = firebaseNamespace.initializeApp(mocks.appOptions, mocks.appName);
445463
const db1: Database = app.database();

test/unit/firebase.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import * as mocks from '../resources/mocks';
2929
import * as firebaseAdmin from '../../src/index';
3030
import {ApplicationDefaultCredential, CertCredential, RefreshTokenCredential} from '../../src/auth/credential';
3131

32+
import {FIREBASE_DATABASE_EMULATOR_HOST_VAR} from '../../src/database/database';
33+
3234
chai.should();
3335
chai.use(chaiAsPromised);
3436

@@ -168,6 +170,7 @@ describe('Firebase', () => {
168170
});
169171

170172
it('should throw given no databaseURL key when initializing the app', () => {
173+
delete process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR];
171174
firebaseAdmin.initializeApp(mocks.appOptionsNoDatabaseUrl);
172175

173176
expect(() => {

0 commit comments

Comments
 (0)