From 7a26d3e72b317d00409352cbe75a0b284d82bbca Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Fri, 26 Jul 2019 18:44:32 -0700 Subject: [PATCH 01/12] omit access token exchange if talking to an emulator --- .../database/src/core/PersistentConnection.ts | 88 ++++++++++++------- packages/database/src/core/RepoManager.ts | 10 +-- 2 files changed, 55 insertions(+), 43 deletions(-) diff --git a/packages/database/src/core/PersistentConnection.ts b/packages/database/src/core/PersistentConnection.ts index 08f9261f8d4..447c0a98f9a 100644 --- a/packages/database/src/core/PersistentConnection.ts +++ b/packages/database/src/core/PersistentConnection.ts @@ -28,6 +28,7 @@ import { isMobileCordova, isReactNative, isNodeSdk } from '@firebase/util'; import { ServerActions } from './ServerActions'; import { AuthTokenProvider } from './AuthTokenProvider'; import { RepoInfo } from './RepoInfo'; +import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './RepoManager'; import { Query } from '../api/Query'; import { SDK_VERSION } from './version'; @@ -41,6 +42,8 @@ const SERVER_KILL_INTERRUPT_REASON = 'server_kill'; // If auth fails repeatedly, we'll assume something is wrong and log a warning / back off. const INVALID_AUTH_TOKEN_THRESHOLD = 3; +const FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST'; + interface ListenSpec { onComplete(s: string, p?: any): void; @@ -740,41 +743,58 @@ export class PersistentConnection extends ServerActions { const forceRefresh = this.forceTokenRefresh_; this.forceTokenRefresh_ = false; - // First fetch auth token, and establish connection after fetching the token was successful - this.authTokenProvider_ - .getToken(forceRefresh) - .then(function(result) { - if (!canceled) { - log('getToken() completed. Creating connection.'); - self.authToken_ = result && result.accessToken; - connection = new Connection( - connId, - self.repoInfo_, - onDataMessage, - onReady, - onDisconnect, - /* onKill= */ function(reason) { - warn(reason + ' (' + self.repoInfo_.toString() + ')'); - self.interrupt(SERVER_KILL_INTERRUPT_REASON); - }, - lastSessionId - ); - } else { - log('getToken() completed but was canceled'); - } - }) - .then(null, function(error) { - self.log_('Failed to get token: ' + error); - if (!canceled) { - if (CONSTANTS.NODE_ADMIN) { - // This may be a critical error for the Admin Node.js SDK, so log a warning. - // But getToken() may also just have temporarily failed, so we still want to - // continue retrying. - warn(error); + if (typeof process !== 'undefined' && process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR]) { + log('Connecting to a database emulator, ommitting access token requests.'); + self.authToken_ = "owner" + connection = new Connection( + connId, + self.repoInfo_, + onDataMessage, + onReady, + onDisconnect, + /* onKill= */ function(reason) { + warn(reason + ' (' + self.repoInfo_.toString() + ')'); + self.interrupt(SERVER_KILL_INTERRUPT_REASON); + }, + lastSessionId + ); + } else { + // First fetch auth token, and establish connection after fetching the token was successful + this.authTokenProvider_ + .getToken(forceRefresh) + .then(function(result) { + if (!canceled) { + log('getToken() completed. Creating connection.'); + self.authToken_ = result && result.accessToken; + connection = new Connection( + connId, + self.repoInfo_, + onDataMessage, + onReady, + onDisconnect, + /* onKill= */ function(reason) { + warn(reason + ' (' + self.repoInfo_.toString() + ')'); + self.interrupt(SERVER_KILL_INTERRUPT_REASON); + }, + lastSessionId + ); + } else { + log('getToken() completed but was canceled'); } - closeFn(); - } - }); + }) + .then(null, function(error) { + self.log_('Failed to get token: ' + error); + if (!canceled) { + if (CONSTANTS.NODE_ADMIN) { + // This may be a critical error for the Admin Node.js SDK, so log a warning. + // But getToken() may also just have temporarily failed, so we still want to + // continue retrying. + warn(error); + } + closeFn(); + } + }); + } } } diff --git a/packages/database/src/core/RepoManager.ts b/packages/database/src/core/RepoManager.ts index a9366c76a65..28100473355 100644 --- a/packages/database/src/core/RepoManager.ts +++ b/packages/database/src/core/RepoManager.ts @@ -28,15 +28,7 @@ import { RepoInfo } from './RepoInfo'; /** @const {string} */ const DATABASE_URL_OPTION = 'databaseURL'; -/** - * This variable is also defined in the firebase node.js admin SDK. Before - * modifying this definition, consult the definition in: - * - * https://github.com/firebase/firebase-admin-node - * - * and make sure the two are consistent. - */ -const FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST'; +export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST'; let _staticInstance: RepoManager; From 4e84beff2ef5246397cf812d806624ab111c144c Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Fri, 26 Jul 2019 18:45:51 -0700 Subject: [PATCH 02/12] [AUTOMATED]: Prettier Code Styling --- packages/database/src/core/PersistentConnection.ts | 11 ++++++++--- packages/database/src/core/RepoManager.ts | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/database/src/core/PersistentConnection.ts b/packages/database/src/core/PersistentConnection.ts index 447c0a98f9a..fd3ae03c2e7 100644 --- a/packages/database/src/core/PersistentConnection.ts +++ b/packages/database/src/core/PersistentConnection.ts @@ -743,9 +743,14 @@ export class PersistentConnection extends ServerActions { const forceRefresh = this.forceTokenRefresh_; this.forceTokenRefresh_ = false; - if (typeof process !== 'undefined' && process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR]) { - log('Connecting to a database emulator, ommitting access token requests.'); - self.authToken_ = "owner" + if ( + typeof process !== 'undefined' && + process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR] + ) { + log( + 'Connecting to a database emulator, ommitting access token requests.' + ); + self.authToken_ = 'owner'; connection = new Connection( connId, self.repoInfo_, diff --git a/packages/database/src/core/RepoManager.ts b/packages/database/src/core/RepoManager.ts index 28100473355..b73b46e0758 100644 --- a/packages/database/src/core/RepoManager.ts +++ b/packages/database/src/core/RepoManager.ts @@ -28,7 +28,8 @@ import { RepoInfo } from './RepoInfo'; /** @const {string} */ const DATABASE_URL_OPTION = 'databaseURL'; -export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST'; +export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = + 'FIREBASE_DATABASE_EMULATOR_HOST'; let _staticInstance: RepoManager; From 062baddf896362dde76965937f5f037be6e4e220 Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Wed, 31 Jul 2019 18:38:06 -0700 Subject: [PATCH 03/12] create TokenProvider interface and add EmulatorAuthTokenProvider --- .../database/src/core/AuthTokenProvider.ts | 16 +++- .../src/core/EmulatorAuthTokenProvider.ts | 44 +++++++++ .../database/src/core/PersistentConnection.ts | 96 +++++++------------ .../database/src/core/ReadonlyRestClient.ts | 6 +- packages/database/src/core/Repo.ts | 11 ++- 5 files changed, 107 insertions(+), 66 deletions(-) create mode 100644 packages/database/src/core/EmulatorAuthTokenProvider.ts diff --git a/packages/database/src/core/AuthTokenProvider.ts b/packages/database/src/core/AuthTokenProvider.ts index b8973d31c84..36482716d25 100644 --- a/packages/database/src/core/AuthTokenProvider.ts +++ b/packages/database/src/core/AuthTokenProvider.ts @@ -19,10 +19,24 @@ import { FirebaseApp } from '@firebase/app-types'; import { FirebaseAuthTokenData } from '@firebase/app-types/private'; import { log, warn } from './util/util'; +export interface TokenProvider { + /** + * @param {boolean} forceRefresh + * @return {!Promise} + */ + getToken(forceRefresh: boolean): Promise; + + addTokenChangeListener(listener: (token: string | null) => void); + + removeTokenChangeListener(listener: (token: string | null) => void); + + notifyForInvalidToken(); +} + /** * Abstraction around FirebaseApp's token fetching capabilities. */ -export class AuthTokenProvider { +export class AuthTokenProvider implements TokenProvider { /** * @param {!FirebaseApp} app_ */ diff --git a/packages/database/src/core/EmulatorAuthTokenProvider.ts b/packages/database/src/core/EmulatorAuthTokenProvider.ts new file mode 100644 index 00000000000..94df3e92299 --- /dev/null +++ b/packages/database/src/core/EmulatorAuthTokenProvider.ts @@ -0,0 +1,44 @@ +/** + * @license + * Copyright 2019 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { FirebaseApp } from '@firebase/app-types'; +import { FirebaseAuthTokenData } from '@firebase/app-types/private'; + +import { TokenProvider } from './AuthTokenProvider'; +import { log, warn } from './util/util'; + +class EmulatorAuthToken implements FirebaseAuthTokenData { + constructor(public accessToken: string) {}; +} + +export class EmulatorAuthTokenProvider implements TokenProvider { + constructor(private app_: FirebaseApp) {} + + getToken(forceRefresh: boolean): Promise { + return new Promise(() => new EmulatorAuthToken("owner")); + } + + addTokenChangeListener(listener: (token: string | null) => void) {} + + removeTokenChangeListener(listener: (token: string | null) => void) {} + + notifyForInvalidToken() { + let errorMessage = + 'Database emulator unexpectedly rejected fake "owner" credentials.'; + warn(errorMessage); + } +} diff --git a/packages/database/src/core/PersistentConnection.ts b/packages/database/src/core/PersistentConnection.ts index fd3ae03c2e7..d8cbc6c7812 100644 --- a/packages/database/src/core/PersistentConnection.ts +++ b/packages/database/src/core/PersistentConnection.ts @@ -26,7 +26,7 @@ import { isAdmin, isValidFormat } from '@firebase/util'; import { Connection } from '../realtime/Connection'; import { isMobileCordova, isReactNative, isNodeSdk } from '@firebase/util'; import { ServerActions } from './ServerActions'; -import { AuthTokenProvider } from './AuthTokenProvider'; +import { TokenProvider } from './AuthTokenProvider'; import { RepoInfo } from './RepoInfo'; import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './RepoManager'; import { Query } from '../api/Query'; @@ -42,8 +42,6 @@ const SERVER_KILL_INTERRUPT_REASON = 'server_kill'; // If auth fails repeatedly, we'll assume something is wrong and log a warning / back off. const INVALID_AUTH_TOKEN_THRESHOLD = 3; -const FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST'; - interface ListenSpec { onComplete(s: string, p?: any): void; @@ -136,7 +134,7 @@ export class PersistentConnection extends ServerActions { ) => void, private onConnectStatus_: (a: boolean) => void, private onServerInfoUpdate_: (a: any) => void, - private authTokenProvider_: AuthTokenProvider, + private authTokenProvider_: TokenProvider, private authOverride_?: Object | null ) { super(); @@ -743,63 +741,41 @@ export class PersistentConnection extends ServerActions { const forceRefresh = this.forceTokenRefresh_; this.forceTokenRefresh_ = false; - if ( - typeof process !== 'undefined' && - process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR] - ) { - log( - 'Connecting to a database emulator, ommitting access token requests.' - ); - self.authToken_ = 'owner'; - connection = new Connection( - connId, - self.repoInfo_, - onDataMessage, - onReady, - onDisconnect, - /* onKill= */ function(reason) { - warn(reason + ' (' + self.repoInfo_.toString() + ')'); - self.interrupt(SERVER_KILL_INTERRUPT_REASON); - }, - lastSessionId - ); - } else { - // First fetch auth token, and establish connection after fetching the token was successful - this.authTokenProvider_ - .getToken(forceRefresh) - .then(function(result) { - if (!canceled) { - log('getToken() completed. Creating connection.'); - self.authToken_ = result && result.accessToken; - connection = new Connection( - connId, - self.repoInfo_, - onDataMessage, - onReady, - onDisconnect, - /* onKill= */ function(reason) { - warn(reason + ' (' + self.repoInfo_.toString() + ')'); - self.interrupt(SERVER_KILL_INTERRUPT_REASON); - }, - lastSessionId - ); - } else { - log('getToken() completed but was canceled'); - } - }) - .then(null, function(error) { - self.log_('Failed to get token: ' + error); - if (!canceled) { - if (CONSTANTS.NODE_ADMIN) { - // This may be a critical error for the Admin Node.js SDK, so log a warning. - // But getToken() may also just have temporarily failed, so we still want to - // continue retrying. - warn(error); - } - closeFn(); + // First fetch auth token, and establish connection after fetching the token was successful + this.authTokenProvider_ + .getToken(forceRefresh) + .then(function(result) { + if (!canceled) { + log('getToken() completed. Creating connection.'); + self.authToken_ = result && result.accessToken; + connection = new Connection( + connId, + self.repoInfo_, + onDataMessage, + onReady, + onDisconnect, + /* onKill= */ function(reason) { + warn(reason + ' (' + self.repoInfo_.toString() + ')'); + self.interrupt(SERVER_KILL_INTERRUPT_REASON); + }, + lastSessionId + ); + } else { + log('getToken() completed but was canceled'); + } + }) + .then(null, function(error) { + self.log_('Failed to get token: ' + error); + if (!canceled) { + if (CONSTANTS.NODE_ADMIN) { + // This may be a critical error for the Admin Node.js SDK, so log a warning. + // But getToken() may also just have temporarily failed, so we still want to + // continue retrying. + warn(error); } - }); - } + closeFn(); + } + }); } } diff --git a/packages/database/src/core/ReadonlyRestClient.ts b/packages/database/src/core/ReadonlyRestClient.ts index ec7326e2670..dd4b266be78 100644 --- a/packages/database/src/core/ReadonlyRestClient.ts +++ b/packages/database/src/core/ReadonlyRestClient.ts @@ -22,7 +22,7 @@ import { safeGet } from '@firebase/util'; import { querystring } from '@firebase/util'; import { ServerActions } from './ServerActions'; import { RepoInfo } from './RepoInfo'; -import { AuthTokenProvider } from './AuthTokenProvider'; +import { TokenProvider } from './AuthTokenProvider'; import { Query } from '../api/Query'; /** @@ -67,7 +67,7 @@ export class ReadonlyRestClient extends ServerActions { /** * @param {!RepoInfo} repoInfo_ Data about the namespace we are connecting to * @param {function(string, *, boolean, ?number)} onDataUpdate_ A callback for new data from the server - * @param {AuthTokenProvider} authTokenProvider_ + * @param {TokenProvider} authTokenProvider_ * @implements {ServerActions} */ constructor( @@ -78,7 +78,7 @@ export class ReadonlyRestClient extends ServerActions { c: boolean, d: number | null ) => void, - private authTokenProvider_: AuthTokenProvider + private authTokenProvider_: TokenProvider ) { super(); } diff --git a/packages/database/src/core/Repo.ts b/packages/database/src/core/Repo.ts index 5db6e81d94b..7b6597a4a8b 100644 --- a/packages/database/src/core/Repo.ts +++ b/packages/database/src/core/Repo.ts @@ -28,7 +28,8 @@ import { SnapshotHolder } from './SnapshotHolder'; import { stringify } from '@firebase/util'; import { beingCrawled, each, exceptionGuard, warn, log } from './util/util'; import { map, isEmpty } from '@firebase/util'; -import { AuthTokenProvider } from './AuthTokenProvider'; +import { AuthTokenProvider, TokenProvider } from './AuthTokenProvider'; +import { EmulatorAuthTokenProvider } from './EmulatorAuthTokenProvider'; import { StatsManager } from './stats/StatsManager'; import { StatsReporter } from './stats/StatsReporter'; import { StatsListener } from './stats/StatsListener'; @@ -37,6 +38,7 @@ import { PersistentConnection } from './PersistentConnection'; import { ReadonlyRestClient } from './ReadonlyRestClient'; import { FirebaseApp } from '@firebase/app-types'; import { RepoInfo } from './RepoInfo'; +import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './RepoManager' import { Database } from '../api/Database'; import { ServerActions } from './ServerActions'; import { Query } from '../api/Query'; @@ -81,7 +83,12 @@ export class Repo { forceRestClient: boolean, public app: FirebaseApp ) { - const authTokenProvider = new AuthTokenProvider(app); + let authTokenProvider: TokenProvider; + if (typeof process !== 'undefined' && process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR]) { + authTokenProvider = new EmulatorAuthTokenProvider(app); + } else { + authTokenProvider = new AuthTokenProvider(app); + } this.stats_ = StatsManager.getCollection(repoInfo_); From af748b10b0ca07e61463bf555cc12c76e3e58e79 Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Wed, 31 Jul 2019 18:52:19 -0700 Subject: [PATCH 04/12] [AUTOMATED]: Prettier Code Styling --- .../src/core/EmulatorAuthTokenProvider.ts | 24 +++++++++---------- packages/database/src/core/Repo.ts | 7 ++++-- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/database/src/core/EmulatorAuthTokenProvider.ts b/packages/database/src/core/EmulatorAuthTokenProvider.ts index 94df3e92299..6292ba249b2 100644 --- a/packages/database/src/core/EmulatorAuthTokenProvider.ts +++ b/packages/database/src/core/EmulatorAuthTokenProvider.ts @@ -22,23 +22,23 @@ import { TokenProvider } from './AuthTokenProvider'; import { log, warn } from './util/util'; class EmulatorAuthToken implements FirebaseAuthTokenData { - constructor(public accessToken: string) {}; + constructor(public accessToken: string) {} } export class EmulatorAuthTokenProvider implements TokenProvider { - constructor(private app_: FirebaseApp) {} + constructor(private app_: FirebaseApp) {} - getToken(forceRefresh: boolean): Promise { - return new Promise(() => new EmulatorAuthToken("owner")); - } + getToken(forceRefresh: boolean): Promise { + return new Promise(() => new EmulatorAuthToken('owner')); + } - addTokenChangeListener(listener: (token: string | null) => void) {} + addTokenChangeListener(listener: (token: string | null) => void) {} - removeTokenChangeListener(listener: (token: string | null) => void) {} + removeTokenChangeListener(listener: (token: string | null) => void) {} - notifyForInvalidToken() { - let errorMessage = - 'Database emulator unexpectedly rejected fake "owner" credentials.'; - warn(errorMessage); - } + notifyForInvalidToken() { + let errorMessage = + 'Database emulator unexpectedly rejected fake "owner" credentials.'; + warn(errorMessage); + } } diff --git a/packages/database/src/core/Repo.ts b/packages/database/src/core/Repo.ts index 7b6597a4a8b..e1d64e9af5d 100644 --- a/packages/database/src/core/Repo.ts +++ b/packages/database/src/core/Repo.ts @@ -38,7 +38,7 @@ import { PersistentConnection } from './PersistentConnection'; import { ReadonlyRestClient } from './ReadonlyRestClient'; import { FirebaseApp } from '@firebase/app-types'; import { RepoInfo } from './RepoInfo'; -import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './RepoManager' +import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './RepoManager'; import { Database } from '../api/Database'; import { ServerActions } from './ServerActions'; import { Query } from '../api/Query'; @@ -84,7 +84,10 @@ export class Repo { public app: FirebaseApp ) { let authTokenProvider: TokenProvider; - if (typeof process !== 'undefined' && process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR]) { + if ( + typeof process !== 'undefined' && + process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR] + ) { authTokenProvider = new EmulatorAuthTokenProvider(app); } else { authTokenProvider = new AuthTokenProvider(app); From 20179b199cf0926c5363d863cc2b7408f814ef04 Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Thu, 1 Aug 2019 17:35:38 -0700 Subject: [PATCH 05/12] Update packages/database/src/core/EmulatorAuthTokenProvider.ts Co-Authored-By: Yuchen Shi --- packages/database/src/core/EmulatorAuthTokenProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/database/src/core/EmulatorAuthTokenProvider.ts b/packages/database/src/core/EmulatorAuthTokenProvider.ts index 6292ba249b2..8eaeca39577 100644 --- a/packages/database/src/core/EmulatorAuthTokenProvider.ts +++ b/packages/database/src/core/EmulatorAuthTokenProvider.ts @@ -29,7 +29,7 @@ export class EmulatorAuthTokenProvider implements TokenProvider { constructor(private app_: FirebaseApp) {} getToken(forceRefresh: boolean): Promise { - return new Promise(() => new EmulatorAuthToken('owner')); + return Promise.resolve(new EmulatorAuthToken('owner')); } addTokenChangeListener(listener: (token: string | null) => void) {} From 7f44e54419f5083e6fcf6a2888e777ba93829e0c Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Thu, 1 Aug 2019 19:05:10 -0700 Subject: [PATCH 06/12] break circular dependency by extracting env var constant --- packages/database/src/core/Constants.ts | 18 ++++++++++++++++++ .../database/src/core/PersistentConnection.ts | 1 - packages/database/src/core/Repo.ts | 2 +- packages/database/src/core/RepoManager.ts | 4 +--- 4 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 packages/database/src/core/Constants.ts diff --git a/packages/database/src/core/Constants.ts b/packages/database/src/core/Constants.ts new file mode 100644 index 00000000000..ef75ddc4622 --- /dev/null +++ b/packages/database/src/core/Constants.ts @@ -0,0 +1,18 @@ +/** + * @license + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST'; diff --git a/packages/database/src/core/PersistentConnection.ts b/packages/database/src/core/PersistentConnection.ts index d8cbc6c7812..d5aca4b27aa 100644 --- a/packages/database/src/core/PersistentConnection.ts +++ b/packages/database/src/core/PersistentConnection.ts @@ -28,7 +28,6 @@ import { isMobileCordova, isReactNative, isNodeSdk } from '@firebase/util'; import { ServerActions } from './ServerActions'; import { TokenProvider } from './AuthTokenProvider'; import { RepoInfo } from './RepoInfo'; -import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './RepoManager'; import { Query } from '../api/Query'; import { SDK_VERSION } from './version'; diff --git a/packages/database/src/core/Repo.ts b/packages/database/src/core/Repo.ts index e1d64e9af5d..0a7a62ea777 100644 --- a/packages/database/src/core/Repo.ts +++ b/packages/database/src/core/Repo.ts @@ -38,7 +38,7 @@ import { PersistentConnection } from './PersistentConnection'; import { ReadonlyRestClient } from './ReadonlyRestClient'; import { FirebaseApp } from '@firebase/app-types'; import { RepoInfo } from './RepoInfo'; -import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './RepoManager'; +import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './Constants'; import { Database } from '../api/Database'; import { ServerActions } from './ServerActions'; import { Query } from '../api/Query'; diff --git a/packages/database/src/core/RepoManager.ts b/packages/database/src/core/RepoManager.ts index b73b46e0758..ad4099ff71e 100644 --- a/packages/database/src/core/RepoManager.ts +++ b/packages/database/src/core/RepoManager.ts @@ -17,6 +17,7 @@ import { FirebaseApp } from '@firebase/app-types'; import { safeGet } from '@firebase/util'; +import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './Constants'; import { Repo } from './Repo'; import { fatal } from './util/util'; import { parseRepoInfo, parseURL } from './util/libs/parser'; @@ -28,9 +29,6 @@ import { RepoInfo } from './RepoInfo'; /** @const {string} */ const DATABASE_URL_OPTION = 'databaseURL'; -export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = - 'FIREBASE_DATABASE_EMULATOR_HOST'; - let _staticInstance: RepoManager; /** From ee0e5001eebf4bf46672d410c72fe5e6c8e980c9 Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Thu, 1 Aug 2019 19:06:51 -0700 Subject: [PATCH 07/12] [AUTOMATED]: Prettier Code Styling --- packages/database/src/core/Constants.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/database/src/core/Constants.ts b/packages/database/src/core/Constants.ts index ef75ddc4622..9f4709359dd 100644 --- a/packages/database/src/core/Constants.ts +++ b/packages/database/src/core/Constants.ts @@ -15,4 +15,5 @@ * limitations under the License. */ -export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST'; +export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = + 'FIREBASE_DATABASE_EMULATOR_HOST'; From 3ee664fdb8e54ad60a6352c02618bdeeb54424bb Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Tue, 6 Aug 2019 18:31:18 -0700 Subject: [PATCH 08/12] rename AuthTokenProvider -> FirebaseAuthTokenProvider etc. --- .../database/src/core/AuthTokenProvider.ts | 4 ++-- packages/database/src/core/Constants.ts | 19 ------------------- .../src/core/EmulatorAuthTokenProvider.ts | 4 ++-- .../database/src/core/PersistentConnection.ts | 4 ++-- .../database/src/core/ReadonlyRestClient.ts | 6 +++--- packages/database/src/core/Repo.ts | 9 ++++----- packages/database/src/core/RepoManager.ts | 3 +-- packages/database/src/core/util/util.ts | 11 +++++++++++ 8 files changed, 25 insertions(+), 35 deletions(-) delete mode 100644 packages/database/src/core/Constants.ts diff --git a/packages/database/src/core/AuthTokenProvider.ts b/packages/database/src/core/AuthTokenProvider.ts index 36482716d25..1ea9cdbb187 100644 --- a/packages/database/src/core/AuthTokenProvider.ts +++ b/packages/database/src/core/AuthTokenProvider.ts @@ -19,7 +19,7 @@ import { FirebaseApp } from '@firebase/app-types'; import { FirebaseAuthTokenData } from '@firebase/app-types/private'; import { log, warn } from './util/util'; -export interface TokenProvider { +export interface AuthTokenProvider { /** * @param {boolean} forceRefresh * @return {!Promise} @@ -36,7 +36,7 @@ export interface TokenProvider { /** * Abstraction around FirebaseApp's token fetching capabilities. */ -export class AuthTokenProvider implements TokenProvider { +export class FirebaseAuthTokenProvider implements AuthTokenProvider { /** * @param {!FirebaseApp} app_ */ diff --git a/packages/database/src/core/Constants.ts b/packages/database/src/core/Constants.ts deleted file mode 100644 index 9f4709359dd..00000000000 --- a/packages/database/src/core/Constants.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @license - * Copyright 2017 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = - 'FIREBASE_DATABASE_EMULATOR_HOST'; diff --git a/packages/database/src/core/EmulatorAuthTokenProvider.ts b/packages/database/src/core/EmulatorAuthTokenProvider.ts index 8eaeca39577..4e07be3bde0 100644 --- a/packages/database/src/core/EmulatorAuthTokenProvider.ts +++ b/packages/database/src/core/EmulatorAuthTokenProvider.ts @@ -18,14 +18,14 @@ import { FirebaseApp } from '@firebase/app-types'; import { FirebaseAuthTokenData } from '@firebase/app-types/private'; -import { TokenProvider } from './AuthTokenProvider'; +import { AuthTokenProvider } from './AuthTokenProvider'; import { log, warn } from './util/util'; class EmulatorAuthToken implements FirebaseAuthTokenData { constructor(public accessToken: string) {} } -export class EmulatorAuthTokenProvider implements TokenProvider { +export class EmulatorAuthTokenProvider implements AuthTokenProvider { constructor(private app_: FirebaseApp) {} getToken(forceRefresh: boolean): Promise { diff --git a/packages/database/src/core/PersistentConnection.ts b/packages/database/src/core/PersistentConnection.ts index d5aca4b27aa..08f9261f8d4 100644 --- a/packages/database/src/core/PersistentConnection.ts +++ b/packages/database/src/core/PersistentConnection.ts @@ -26,7 +26,7 @@ import { isAdmin, isValidFormat } from '@firebase/util'; import { Connection } from '../realtime/Connection'; import { isMobileCordova, isReactNative, isNodeSdk } from '@firebase/util'; import { ServerActions } from './ServerActions'; -import { TokenProvider } from './AuthTokenProvider'; +import { AuthTokenProvider } from './AuthTokenProvider'; import { RepoInfo } from './RepoInfo'; import { Query } from '../api/Query'; import { SDK_VERSION } from './version'; @@ -133,7 +133,7 @@ export class PersistentConnection extends ServerActions { ) => void, private onConnectStatus_: (a: boolean) => void, private onServerInfoUpdate_: (a: any) => void, - private authTokenProvider_: TokenProvider, + private authTokenProvider_: AuthTokenProvider, private authOverride_?: Object | null ) { super(); diff --git a/packages/database/src/core/ReadonlyRestClient.ts b/packages/database/src/core/ReadonlyRestClient.ts index dd4b266be78..2e4eb52631c 100644 --- a/packages/database/src/core/ReadonlyRestClient.ts +++ b/packages/database/src/core/ReadonlyRestClient.ts @@ -22,7 +22,7 @@ import { safeGet } from '@firebase/util'; import { querystring } from '@firebase/util'; import { ServerActions } from './ServerActions'; import { RepoInfo } from './RepoInfo'; -import { TokenProvider } from './AuthTokenProvider'; +import { FirebaseAuthTokenProvider, AuthTokenProvider } from './AuthTokenProvider'; import { Query } from '../api/Query'; /** @@ -67,7 +67,7 @@ export class ReadonlyRestClient extends ServerActions { /** * @param {!RepoInfo} repoInfo_ Data about the namespace we are connecting to * @param {function(string, *, boolean, ?number)} onDataUpdate_ A callback for new data from the server - * @param {TokenProvider} authTokenProvider_ + * @param {FirebaseAuthTokenProvider} authTokenProvider_ * @implements {ServerActions} */ constructor( @@ -78,7 +78,7 @@ export class ReadonlyRestClient extends ServerActions { c: boolean, d: number | null ) => void, - private authTokenProvider_: TokenProvider + private authTokenProvider_: AuthTokenProvider ) { super(); } diff --git a/packages/database/src/core/Repo.ts b/packages/database/src/core/Repo.ts index 0a7a62ea777..6c41e32f1ac 100644 --- a/packages/database/src/core/Repo.ts +++ b/packages/database/src/core/Repo.ts @@ -26,9 +26,9 @@ import { SparseSnapshotTree } from './SparseSnapshotTree'; import { SyncTree } from './SyncTree'; import { SnapshotHolder } from './SnapshotHolder'; import { stringify } from '@firebase/util'; -import { beingCrawled, each, exceptionGuard, warn, log } from './util/util'; +import { beingCrawled, each, exceptionGuard, warn, log, FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './util/util'; import { map, isEmpty } from '@firebase/util'; -import { AuthTokenProvider, TokenProvider } from './AuthTokenProvider'; +import { FirebaseAuthTokenProvider, AuthTokenProvider } from './AuthTokenProvider'; import { EmulatorAuthTokenProvider } from './EmulatorAuthTokenProvider'; import { StatsManager } from './stats/StatsManager'; import { StatsReporter } from './stats/StatsReporter'; @@ -38,7 +38,6 @@ import { PersistentConnection } from './PersistentConnection'; import { ReadonlyRestClient } from './ReadonlyRestClient'; import { FirebaseApp } from '@firebase/app-types'; import { RepoInfo } from './RepoInfo'; -import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './Constants'; import { Database } from '../api/Database'; import { ServerActions } from './ServerActions'; import { Query } from '../api/Query'; @@ -83,14 +82,14 @@ export class Repo { forceRestClient: boolean, public app: FirebaseApp ) { - let authTokenProvider: TokenProvider; + let authTokenProvider: AuthTokenProvider; if ( typeof process !== 'undefined' && process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR] ) { authTokenProvider = new EmulatorAuthTokenProvider(app); } else { - authTokenProvider = new AuthTokenProvider(app); + authTokenProvider = new FirebaseAuthTokenProvider(app); } this.stats_ = StatsManager.getCollection(repoInfo_); diff --git a/packages/database/src/core/RepoManager.ts b/packages/database/src/core/RepoManager.ts index ad4099ff71e..4ec58ba9600 100644 --- a/packages/database/src/core/RepoManager.ts +++ b/packages/database/src/core/RepoManager.ts @@ -17,9 +17,8 @@ import { FirebaseApp } from '@firebase/app-types'; import { safeGet } from '@firebase/util'; -import { FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './Constants'; import { Repo } from './Repo'; -import { fatal } from './util/util'; +import { fatal, FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './util/util'; import { parseRepoInfo, parseURL } from './util/libs/parser'; import { validateUrl } from './util/validation'; import './Repo_transaction'; diff --git a/packages/database/src/core/util/util.ts b/packages/database/src/core/util/util.ts index 8de443703f7..22f2296393a 100644 --- a/packages/database/src/core/util/util.ts +++ b/packages/database/src/core/util/util.ts @@ -31,6 +31,17 @@ import { Logger, LogLevel } from '@firebase/logger'; const logClient = new Logger('@firebase/database'); +/** + * Environment variable for enabling interaction with the Firebase Realtime Database + * emulator. If set, the module will present the endpoint with a fake "owner" credential + * (see EmulatorAuthTokenProvider) instead of one belonging to a real account. + * + * The expected format for this variable is ':'. The transfer protocol must be + * omitted and will default to 'http'. + */ +export const FIREBASE_DATABASE_EMULATOR_HOST_VAR = + 'FIREBASE_DATABASE_EMULATOR_HOST'; + /** * Returns a locally-unique ID (generated by just incrementing up from 0 each time its called). * @type {function(): number} Generated ID. From 4f9d2fd1ac6274b55a9930b539badcc9d20f4f19 Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Tue, 6 Aug 2019 18:32:04 -0700 Subject: [PATCH 09/12] [AUTOMATED]: Prettier Code Styling --- packages/database/src/core/ReadonlyRestClient.ts | 5 ++++- packages/database/src/core/Repo.ts | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/database/src/core/ReadonlyRestClient.ts b/packages/database/src/core/ReadonlyRestClient.ts index 2e4eb52631c..d16d4f0cfe6 100644 --- a/packages/database/src/core/ReadonlyRestClient.ts +++ b/packages/database/src/core/ReadonlyRestClient.ts @@ -22,7 +22,10 @@ import { safeGet } from '@firebase/util'; import { querystring } from '@firebase/util'; import { ServerActions } from './ServerActions'; import { RepoInfo } from './RepoInfo'; -import { FirebaseAuthTokenProvider, AuthTokenProvider } from './AuthTokenProvider'; +import { + FirebaseAuthTokenProvider, + AuthTokenProvider +} from './AuthTokenProvider'; import { Query } from '../api/Query'; /** diff --git a/packages/database/src/core/Repo.ts b/packages/database/src/core/Repo.ts index 6c41e32f1ac..c975c05bbbc 100644 --- a/packages/database/src/core/Repo.ts +++ b/packages/database/src/core/Repo.ts @@ -26,9 +26,19 @@ import { SparseSnapshotTree } from './SparseSnapshotTree'; import { SyncTree } from './SyncTree'; import { SnapshotHolder } from './SnapshotHolder'; import { stringify } from '@firebase/util'; -import { beingCrawled, each, exceptionGuard, warn, log, FIREBASE_DATABASE_EMULATOR_HOST_VAR } from './util/util'; +import { + beingCrawled, + each, + exceptionGuard, + warn, + log, + FIREBASE_DATABASE_EMULATOR_HOST_VAR +} from './util/util'; import { map, isEmpty } from '@firebase/util'; -import { FirebaseAuthTokenProvider, AuthTokenProvider } from './AuthTokenProvider'; +import { + FirebaseAuthTokenProvider, + AuthTokenProvider +} from './AuthTokenProvider'; import { EmulatorAuthTokenProvider } from './EmulatorAuthTokenProvider'; import { StatsManager } from './stats/StatsManager'; import { StatsReporter } from './stats/StatsReporter'; From d4bc5502a02c55f3a1bd7b1f5c2a5b0e0a70a064 Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Wed, 7 Aug 2019 14:51:37 -0700 Subject: [PATCH 10/12] fix ReadOnlyRestClient constructor comment --- packages/database/src/core/ReadonlyRestClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/database/src/core/ReadonlyRestClient.ts b/packages/database/src/core/ReadonlyRestClient.ts index d16d4f0cfe6..9f77511f271 100644 --- a/packages/database/src/core/ReadonlyRestClient.ts +++ b/packages/database/src/core/ReadonlyRestClient.ts @@ -70,7 +70,7 @@ export class ReadonlyRestClient extends ServerActions { /** * @param {!RepoInfo} repoInfo_ Data about the namespace we are connecting to * @param {function(string, *, boolean, ?number)} onDataUpdate_ A callback for new data from the server - * @param {FirebaseAuthTokenProvider} authTokenProvider_ + * @param {AuthTokenProvider} authTokenProvider_ * @implements {ServerActions} */ constructor( From 604e376d7b7236eb5fc858ee5e14e83b48708e55 Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Fri, 9 Aug 2019 11:35:49 -0700 Subject: [PATCH 11/12] poke travis CI --- packages/database/src/core/AuthTokenProvider.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/database/src/core/AuthTokenProvider.ts b/packages/database/src/core/AuthTokenProvider.ts index 1ea9cdbb187..b4db02f96c3 100644 --- a/packages/database/src/core/AuthTokenProvider.ts +++ b/packages/database/src/core/AuthTokenProvider.ts @@ -19,6 +19,9 @@ import { FirebaseApp } from '@firebase/app-types'; import { FirebaseAuthTokenData } from '@firebase/app-types/private'; import { log, warn } from './util/util'; +/** + * An interface for token fetchers. + */ export interface AuthTokenProvider { /** * @param {boolean} forceRefresh From 7d52306511a1a1628b2f9bd4061a58e860dc0c91 Mon Sep 17 00:00:00 2001 From: Jan Wyszynski Date: Fri, 9 Aug 2019 15:44:44 -0700 Subject: [PATCH 12/12] remove unnecessary js docs --- packages/database/src/core/AuthTokenProvider.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/database/src/core/AuthTokenProvider.ts b/packages/database/src/core/AuthTokenProvider.ts index b4db02f96c3..8a6d15efa7e 100644 --- a/packages/database/src/core/AuthTokenProvider.ts +++ b/packages/database/src/core/AuthTokenProvider.ts @@ -40,15 +40,8 @@ export interface AuthTokenProvider { * Abstraction around FirebaseApp's token fetching capabilities. */ export class FirebaseAuthTokenProvider implements AuthTokenProvider { - /** - * @param {!FirebaseApp} app_ - */ constructor(private app_: FirebaseApp) {} - /** - * @param {boolean} forceRefresh - * @return {!Promise} - */ getToken(forceRefresh: boolean): Promise { return this.app_['INTERNAL']['getToken'](forceRefresh).then( null,