Skip to content

Commit 8593fa0

Browse files
hsubox76maneesht
andauthored
Add Emulator Overlay (#8977) (#9031)
Co-authored-by: Maneesh Tewani <maneesht@users.noreply.github.com>
1 parent f8334ea commit 8593fa0

File tree

11 files changed

+238
-15
lines changed

11 files changed

+238
-15
lines changed

.changeset/three-singers-wonder.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
"@firebase/auth": patch
3+
"@firebase/firestore": patch
4+
"@firebase/util": patch
5+
"@firebase/database": patch
6+
"@firebase/storage": patch
7+
"@firebase/functions": patch
8+
---
9+
10+
Add Emulator Overlay

common/api-review/util.api.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,9 @@ export interface Subscribe<T> {
482482
// @public (undocumented)
483483
export type Unsubscribe = () => void;
484484

485+
// @public
486+
export function updateEmulatorBanner(name: string, isRunningEmulator: boolean): void;
487+
485488
// Warning: (ae-missing-release-tag) "validateArgCount" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
486489
//
487490
// @public

packages/auth/src/core/auth/emulator.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ import { Auth } from '../../model/public_types';
1818
import { AuthErrorCode } from '../errors';
1919
import { _assert } from '../util/assert';
2020
import { _castAuth } from './auth_impl';
21-
import { deepEqual, isCloudWorkstation, pingServer } from '@firebase/util';
21+
import {
22+
deepEqual,
23+
isCloudWorkstation,
24+
pingServer,
25+
updateEmulatorBanner
26+
} from '@firebase/util';
2227

2328
/**
2429
* Changes the {@link Auth} instance to communicate with the Firebase Auth Emulator, instead of production
@@ -97,13 +102,12 @@ export function connectAuthEmulator(
97102
authInternal.emulatorConfig = emulatorConfig;
98103
authInternal.settings.appVerificationDisabledForTesting = true;
99104

100-
if (!disableWarnings) {
101-
emitEmulatorWarning();
102-
}
103-
104-
// Workaround to get cookies in Firebase Studio
105105
if (isCloudWorkstation(host)) {
106+
updateEmulatorBanner('Auth', true);
107+
// Workaround to get cookies in Firebase Studio
106108
void pingServer(`${protocol}//${host}${portStr}`);
109+
} else if (!disableWarnings) {
110+
emitEmulatorWarning();
107111
}
108112
}
109113

packages/auth/src/platform_browser/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ import { browserSessionPersistence } from './persistence/session_storage';
3030
import { indexedDBLocalPersistence } from './persistence/indexed_db';
3131
import { browserPopupRedirectResolver } from './popup_redirect';
3232
import { Auth, User } from '../model/public_types';
33-
import { getDefaultEmulatorHost, getExperimentalSetting } from '@firebase/util';
33+
import {
34+
getDefaultEmulatorHost,
35+
getExperimentalSetting,
36+
updateEmulatorBanner
37+
} from '@firebase/util';
3438
import { _setExternalJSProvider } from './load_js';
3539
import { _createError } from '../core/util/assert';
3640
import { AuthErrorCode } from '../core/errors';
@@ -110,6 +114,8 @@ export function getAuth(app: FirebaseApp = getApp()): Auth {
110114
const authEmulatorHost = getDefaultEmulatorHost('auth');
111115
if (authEmulatorHost) {
112116
connectAuthEmulator(auth, `http://${authEmulatorHost}`);
117+
} else {
118+
updateEmulatorBanner('Auth', false);
113119
}
114120

115121
return auth;

packages/database/src/api/Database.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ import {
3131
EmulatorMockTokenOptions,
3232
getDefaultEmulatorHostnameAndPort,
3333
isCloudWorkstation,
34-
pingServer
34+
pingServer,
35+
updateEmulatorBanner
3536
} from '@firebase/util';
3637

3738
import { AppCheckTokenProvider } from '../core/AppCheckTokenProvider';
@@ -257,6 +258,10 @@ export class Database implements _FirebaseService {
257258
this.app.options['databaseAuthVariableOverride']
258259
);
259260
this._instanceStarted = true;
261+
updateEmulatorBanner(
262+
'Database',
263+
this._repo.repoInfo_.emulatorOptions !== null
264+
);
260265
}
261266
return this._repoInternal;
262267
}
@@ -393,6 +398,7 @@ export function connectDatabaseEmulator(
393398
// Workaround to get cookies in Firebase Studio
394399
if (isCloudWorkstation(host)) {
395400
void pingServer(host);
401+
updateEmulatorBanner('Database', true);
396402
}
397403

398404
// Modify the repo to apply emulator settings

packages/firestore/src/lite-api/database.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
EmulatorMockTokenOptions,
2929
getDefaultEmulatorHostnameAndPort,
3030
isCloudWorkstation,
31+
updateEmulatorBanner,
3132
pingServer
3233
} from '@firebase/util';
3334

@@ -142,6 +143,7 @@ export class Firestore implements FirestoreService {
142143

143144
_freezeSettings(): FirestoreSettingsImpl {
144145
this._settingsFrozen = true;
146+
updateEmulatorBanner('Firestore', this._settings.isUsingEmulator);
145147
return this._settings;
146148
}
147149

@@ -334,9 +336,7 @@ export function connectFirestoreEmulator(
334336
emulatorOptions: firestore._getEmulatorOptions()
335337
};
336338
const newHostSetting = `${host}:${port}`;
337-
if (useSsl) {
338-
void pingServer(`https://${newHostSetting}`);
339-
}
339+
340340
if (settings.host !== DEFAULT_HOST && settings.host !== newHostSetting) {
341341
logWarn(
342342
'Host has been set in both settings() and connectFirestoreEmulator(), emulator host ' +
@@ -357,6 +357,11 @@ export function connectFirestoreEmulator(
357357

358358
firestore._setSettings(newConfig);
359359

360+
if (useSsl) {
361+
void pingServer(`https://${newHostSetting}`);
362+
updateEmulatorBanner('Firestore', true);
363+
}
364+
360365
if (options.mockUserToken) {
361366
let token: string;
362367
let user: User;

packages/functions/src/api.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ import {
2929
} from './service';
3030
import {
3131
getModularInstance,
32-
getDefaultEmulatorHostnameAndPort
32+
getDefaultEmulatorHostnameAndPort,
33+
updateEmulatorBanner
3334
} from '@firebase/util';
3435

3536
export { FunctionsError } from './error';
@@ -47,6 +48,7 @@ export function getFunctions(
4748
app: FirebaseApp = getApp(),
4849
regionOrCustomDomain: string = DEFAULT_REGION
4950
): Functions {
51+
updateEmulatorBanner('Functions', false);
5052
// Dependencies
5153
const functionsProvider: Provider<'functions'> = _getProvider(
5254
getModularInstance(app),

packages/functions/src/service.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ import { Provider } from '@firebase/component';
3030
import { FirebaseAuthInternalName } from '@firebase/auth-interop-types';
3131
import { MessagingInternalComponentName } from '@firebase/messaging-interop-types';
3232
import { AppCheckInternalComponentName } from '@firebase/app-check-interop-types';
33-
import { isCloudWorkstation, pingServer } from '@firebase/util';
33+
import {
34+
isCloudWorkstation,
35+
pingServer,
36+
updateEmulatorBanner
37+
} from '@firebase/util';
3438

3539
export const DEFAULT_REGION = 'us-central1';
3640

@@ -182,6 +186,7 @@ export function connectFunctionsEmulator(
182186
// Workaround to get cookies in Firebase Studio
183187
if (useSsl) {
184188
void pingServer(functionsInstance.emulatorOrigin);
189+
updateEmulatorBanner('Functions', true);
185190
}
186191
}
187192

packages/storage/src/api.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ import { STORAGE_TYPE } from './constants';
5353
import {
5454
EmulatorMockTokenOptions,
5555
getModularInstance,
56-
getDefaultEmulatorHostnameAndPort
56+
getDefaultEmulatorHostnameAndPort,
57+
updateEmulatorBanner
5758
} from '@firebase/util';
5859
import { StringFormat } from './implementation/string';
5960

@@ -332,6 +333,7 @@ export function getStorage(
332333
bucketUrl?: string
333334
): FirebaseStorage {
334335
app = getModularInstance(app);
336+
updateEmulatorBanner('Storage', false);
335337
const storageProvider: Provider<'storage'> = _getProvider(app, STORAGE_TYPE);
336338
const storageInstance = storageProvider.getImmediate({
337339
identifier: bucketUrl

packages/storage/src/service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ import {
4646
createMockUserToken,
4747
EmulatorMockTokenOptions,
4848
isCloudWorkstation,
49-
pingServer
49+
pingServer,
50+
updateEmulatorBanner
5051
} from '@firebase/util';
5152
import { Connection, ConnectionType } from './implementation/connection';
5253

@@ -150,6 +151,7 @@ export function connectStorageEmulator(
150151
// Workaround to get cookies in Firebase Studio
151152
if (useSsl) {
152153
void pingServer(`https://${storage.host}`);
154+
updateEmulatorBanner('Storage', true);
153155
}
154156
storage._isUsingEmulator = true;
155157
storage._protocol = useSsl ? 'https' : 'http';

0 commit comments

Comments
 (0)