From 3399b282b3d1677863c508036dc6d21621d284b2 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 7 Apr 2022 15:40:45 -0700 Subject: [PATCH 01/16] Implemented forceWebSockets() and forceLongPolling() --- common/api-review/database.api.md | 6 ++++++ packages/database/src/api.standalone.ts | 2 ++ packages/database/src/api/Database.ts | 18 ++++++++++++++++++ packages/database/test/transport.test.ts | 20 ++++++++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 packages/database/test/transport.test.ts diff --git a/common/api-review/database.api.md b/common/api-review/database.api.md index 4d461adfea9..dcf73c73714 100644 --- a/common/api-review/database.api.md +++ b/common/api-review/database.api.md @@ -64,6 +64,12 @@ export function equalTo(value: number | string | boolean | null, key?: string): // @public export type EventType = 'value' | 'child_added' | 'child_changed' | 'child_moved' | 'child_removed'; +// @public +export function forceLongPolling(): void; + +// @public +export function forceWebSockets(): void; + // @public export function get(query: Query): Promise; diff --git a/packages/database/src/api.standalone.ts b/packages/database/src/api.standalone.ts index bd15260bb5f..876ec67c441 100644 --- a/packages/database/src/api.standalone.ts +++ b/packages/database/src/api.standalone.ts @@ -22,6 +22,8 @@ export { enableLogging, goOffline, goOnline, + forceWebSockets, + forceLongPolling, connectDatabaseEmulator } from './api/Database'; export { diff --git a/packages/database/src/api/Database.ts b/packages/database/src/api/Database.ts index 3b89056a4ad..78fd969571e 100644 --- a/packages/database/src/api/Database.ts +++ b/packages/database/src/api/Database.ts @@ -46,6 +46,8 @@ import { enableLogging as enableLoggingImpl } from '../core/util/util'; import { validateUrl } from '../core/util/validation'; +import { BrowserPollConnection } from '../realtime/BrowserPollConnection'; +import { WebSocketConnection } from '../realtime/WebSocketConnection'; import { ReferenceImpl } from './Reference_impl'; @@ -271,6 +273,22 @@ export class Database implements _FirebaseService { } } +/** + * Force the use of websockets instead of longPolling. + * + */ +export function forceWebSockets() { + BrowserPollConnection.forceDisallow(); +} + +/** + * Force the use of longPolling instead of websockets. This will be ignored if websocket protocol is used in databaseURL. + */ +export function forceLongPolling() { + WebSocketConnection.forceDisallow(); + BrowserPollConnection.forceAllow(); +} + /** * Returns the instance of the Realtime Database SDK that is associated * with the provided {@link @firebase/app#FirebaseApp}. Initializes a new instance with diff --git a/packages/database/test/transport.test.ts b/packages/database/test/transport.test.ts new file mode 100644 index 00000000000..a74f8afc7a5 --- /dev/null +++ b/packages/database/test/transport.test.ts @@ -0,0 +1,20 @@ +import { CONSTANTS } from '@firebase/util'; +import { expect } from 'chai'; + +import { forceLongPolling, forceWebSockets } from '../src'; +import { BrowserPollConnection } from '../src/realtime/BrowserPollConnection'; +import { WebSocketConnection } from '../src/realtime/WebSocketConnection'; + +describe('Force Transport', () => { + xit('should enable websockets and disable longPolling', () => { + forceWebSockets(); + expect(WebSocketConnection.isAvailable()).to.equal(true); + expect(BrowserPollConnection.isAvailable()).to.equal(false); + }); + it('should enable longPolling and disable websockets', () => { + CONSTANTS.NODE_CLIENT = false; + forceLongPolling(); + expect(WebSocketConnection.isAvailable()).to.equal(false); + expect(BrowserPollConnection.isAvailable()).to.equal(true); + }); +}); From 8d0526b0778fd4dac1c34132d70d9f855c5aadb0 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 7 Apr 2022 16:27:34 -0700 Subject: [PATCH 02/16] Removed xit --- packages/database/test/transport.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/database/test/transport.test.ts b/packages/database/test/transport.test.ts index a74f8afc7a5..262b22c3d89 100644 --- a/packages/database/test/transport.test.ts +++ b/packages/database/test/transport.test.ts @@ -6,7 +6,7 @@ import { BrowserPollConnection } from '../src/realtime/BrowserPollConnection'; import { WebSocketConnection } from '../src/realtime/WebSocketConnection'; describe('Force Transport', () => { - xit('should enable websockets and disable longPolling', () => { + it('should enable websockets and disable longPolling', () => { forceWebSockets(); expect(WebSocketConnection.isAvailable()).to.equal(true); expect(BrowserPollConnection.isAvailable()).to.equal(false); From 932f30938ed103b8165978ecbe93263be6dc5ab1 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Fri, 8 Apr 2022 15:53:50 -0700 Subject: [PATCH 03/16] Added license --- packages/database/test/transport.test.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/database/test/transport.test.ts b/packages/database/test/transport.test.ts index 262b22c3d89..fd5beabbef6 100644 --- a/packages/database/test/transport.test.ts +++ b/packages/database/test/transport.test.ts @@ -1,3 +1,20 @@ +/** + * @license + * Copyright 2022 Google LLC + * + * 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 { CONSTANTS } from '@firebase/util'; import { expect } from 'chai'; From 30ad72fa3eda80fffc9c06505fc6b4eb2489b9a2 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 21 Apr 2022 14:55:48 -0700 Subject: [PATCH 04/16] Included APIs to database-compat --- packages/database-compat/src/api/Database.ts | 6 +++++- packages/database/src/api/Database.ts | 20 ++++++++++++++++--- .../database/src/realtime/TransportManager.ts | 8 ++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/database-compat/src/api/Database.ts b/packages/database-compat/src/api/Database.ts index b2877fc4cfa..27b6ec931f5 100644 --- a/packages/database-compat/src/api/Database.ts +++ b/packages/database-compat/src/api/Database.ts @@ -19,6 +19,8 @@ import { FirebaseApp } from '@firebase/app-types'; import { FirebaseService } from '@firebase/app-types/private'; import { + forceLongPolling, + forceWebSockets, goOnline, connectDatabaseEmulator, goOffline, @@ -51,7 +53,9 @@ export class Database implements FirebaseService, Compat { constructor(readonly _delegate: ModularDatabase, readonly app: FirebaseApp) {} INTERNAL = { - delete: () => this._delegate._delete() + delete: () => this._delegate._delete(), + forceWebSockets, + forceLongPolling, }; /** diff --git a/packages/database/src/api/Database.ts b/packages/database/src/api/Database.ts index 84cd3ef8ac9..af494360f9c 100644 --- a/packages/database/src/api/Database.ts +++ b/packages/database/src/api/Database.ts @@ -42,11 +42,13 @@ import { parseRepoInfo } from '../core/util/libs/parser'; import { newEmptyPath, pathIsEmpty } from '../core/util/Path'; import { fatal, + warn, log, enableLogging as enableLoggingImpl } from '../core/util/util'; import { validateUrl } from '../core/util/validation'; import { BrowserPollConnection } from '../realtime/BrowserPollConnection'; +import { TransportManager } from '../realtime/TransportManager'; import { WebSocketConnection } from '../realtime/WebSocketConnection'; import { ReferenceImpl } from './Reference_impl'; @@ -278,15 +280,27 @@ export class Database implements _FirebaseService { * */ export function forceWebSockets() { - BrowserPollConnection.forceDisallow(); + if(TransportManager.IS_INITIALIZED) { + warn( + 'Transport has already been initialized. Please call this function before calling ref or setting up a listener' + ); + } else { + BrowserPollConnection.forceDisallow(); + } } /** * Force the use of longPolling instead of websockets. This will be ignored if websocket protocol is used in databaseURL. */ export function forceLongPolling() { - WebSocketConnection.forceDisallow(); - BrowserPollConnection.forceAllow(); + if(TransportManager.IS_INITIALIZED) { + warn( + 'Transport has already been initialized. Please call this function before calling ref or setting up a listener' + ); + } else { + WebSocketConnection.forceDisallow(); + BrowserPollConnection.forceAllow(); + } } /** diff --git a/packages/database/src/realtime/TransportManager.ts b/packages/database/src/realtime/TransportManager.ts index 36d732fb840..e409bcbfa78 100644 --- a/packages/database/src/realtime/TransportManager.ts +++ b/packages/database/src/realtime/TransportManager.ts @@ -32,10 +32,16 @@ import { WebSocketConnection } from './WebSocketConnection'; export class TransportManager { private transports_: TransportConstructor[]; + private static transportInitialized = false; + static get ALL_TRANSPORTS() { return [BrowserPollConnection, WebSocketConnection]; } + static get IS_INITIALIZED() { + return this.transportInitialized; + } + /** * @param repoInfo - Metadata around the namespace we're connecting to */ @@ -68,7 +74,9 @@ export class TransportManager { transports.push(transport); } } + TransportManager.transportInitialized = true; } + console.log(this.transports_); } /** From 7b0c2c595401b2ba474c596249f53852028e8d3e Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 21 Apr 2022 14:58:51 -0700 Subject: [PATCH 05/16] Removed console log --- packages/database/src/realtime/TransportManager.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/database/src/realtime/TransportManager.ts b/packages/database/src/realtime/TransportManager.ts index e409bcbfa78..37f99f6f3d9 100644 --- a/packages/database/src/realtime/TransportManager.ts +++ b/packages/database/src/realtime/TransportManager.ts @@ -76,7 +76,6 @@ export class TransportManager { } TransportManager.transportInitialized = true; } - console.log(this.transports_); } /** From f9bdf590a81477b4546fa803801c162166367bef Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 21 Apr 2022 15:49:53 -0700 Subject: [PATCH 06/16] Updated tests --- packages/database/src/api/Database.ts | 13 ++++----- .../src/realtime/BrowserPollConnection.ts | 4 +-- .../database/src/realtime/TransportManager.ts | 6 ++--- packages/database/test/transport.test.ts | 27 ++++++++++++++++++- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/packages/database/src/api/Database.ts b/packages/database/src/api/Database.ts index af494360f9c..367bec7ee30 100644 --- a/packages/database/src/api/Database.ts +++ b/packages/database/src/api/Database.ts @@ -42,7 +42,6 @@ import { parseRepoInfo } from '../core/util/libs/parser'; import { newEmptyPath, pathIsEmpty } from '../core/util/Path'; import { fatal, - warn, log, enableLogging as enableLoggingImpl } from '../core/util/util'; @@ -281,12 +280,11 @@ export class Database implements _FirebaseService { */ export function forceWebSockets() { if(TransportManager.IS_INITIALIZED) { - warn( + fatal( 'Transport has already been initialized. Please call this function before calling ref or setting up a listener' ); - } else { - BrowserPollConnection.forceDisallow(); } + BrowserPollConnection.forceDisallow(); } /** @@ -294,13 +292,12 @@ export function forceWebSockets() { */ export function forceLongPolling() { if(TransportManager.IS_INITIALIZED) { - warn( + fatal( 'Transport has already been initialized. Please call this function before calling ref or setting up a listener' ); - } else { - WebSocketConnection.forceDisallow(); - BrowserPollConnection.forceAllow(); } + WebSocketConnection.forceDisallow(); + BrowserPollConnection.forceAllow(); } /** diff --git a/packages/database/src/realtime/BrowserPollConnection.ts b/packages/database/src/realtime/BrowserPollConnection.ts index 9f2340417b5..a0b3815b4d7 100644 --- a/packages/database/src/realtime/BrowserPollConnection.ts +++ b/packages/database/src/realtime/BrowserPollConnection.ts @@ -248,7 +248,7 @@ export class BrowserPollConnection implements Transport { this.addDisconnectPingFrame(this.id, this.password); } - private static forceAllow_: boolean; + static forceAllow_: boolean; /** * Forces long polling to be considered as a potential transport @@ -257,7 +257,7 @@ export class BrowserPollConnection implements Transport { BrowserPollConnection.forceAllow_ = true; } - private static forceDisallow_: boolean; + static forceDisallow_: boolean; /** * Forces longpolling to not be considered as a potential transport diff --git a/packages/database/src/realtime/TransportManager.ts b/packages/database/src/realtime/TransportManager.ts index 37f99f6f3d9..35cb53872d9 100644 --- a/packages/database/src/realtime/TransportManager.ts +++ b/packages/database/src/realtime/TransportManager.ts @@ -32,14 +32,14 @@ import { WebSocketConnection } from './WebSocketConnection'; export class TransportManager { private transports_: TransportConstructor[]; - private static transportInitialized = false; + static transportInitialized_ = false; static get ALL_TRANSPORTS() { return [BrowserPollConnection, WebSocketConnection]; } static get IS_INITIALIZED() { - return this.transportInitialized; + return this.transportInitialized_; } /** @@ -74,7 +74,7 @@ export class TransportManager { transports.push(transport); } } - TransportManager.transportInitialized = true; + TransportManager.transportInitialized_ = true; } } diff --git a/packages/database/test/transport.test.ts b/packages/database/test/transport.test.ts index fd5beabbef6..2d81dad2d94 100644 --- a/packages/database/test/transport.test.ts +++ b/packages/database/test/transport.test.ts @@ -20,18 +20,43 @@ import { expect } from 'chai'; import { forceLongPolling, forceWebSockets } from '../src'; import { BrowserPollConnection } from '../src/realtime/BrowserPollConnection'; +import { TransportManager } from '../src/realtime/TransportManager'; import { WebSocketConnection } from '../src/realtime/WebSocketConnection'; +const transportInitError = 'Transport has already been initialized. Please call this function before calling ref or setting up a listener'; describe('Force Transport', () => { + const oldNodeValue = CONSTANTS.NODE_CLIENT; + beforeEach(() => { + CONSTANTS.NODE_CLIENT = false; + }); + afterEach(() => { + // Resetting to old values + TransportManager.transportInitialized_ = false; + CONSTANTS.NODE_CLIENT = oldNodeValue; + BrowserPollConnection.forceAllow_ = false; + BrowserPollConnection.forceDisallow_ = true; + WebSocketConnection.forceDisallow_ = false; + }); it('should enable websockets and disable longPolling', () => { forceWebSockets(); expect(WebSocketConnection.isAvailable()).to.equal(true); expect(BrowserPollConnection.isAvailable()).to.equal(false); }); + it('should throw an error when calling forceWebsockets() if TransportManager has already been initialized', () => { + TransportManager.transportInitialized_ = true; + expect(forceWebSockets).to.throw(transportInitError); + expect(WebSocketConnection.isAvailable()).to.equal(true); + expect(BrowserPollConnection.isAvailable()).to.equal(false); + }); it('should enable longPolling and disable websockets', () => { - CONSTANTS.NODE_CLIENT = false; forceLongPolling(); expect(WebSocketConnection.isAvailable()).to.equal(false); expect(BrowserPollConnection.isAvailable()).to.equal(true); }); + it('should throw an error when calling forceLongPolling() if TransportManager has already been initialized', () => { + TransportManager.transportInitialized_ = true; + expect(forceLongPolling).to.throw(transportInitError); + expect(WebSocketConnection.isAvailable()).to.equal(true); + expect(BrowserPollConnection.isAvailable()).to.equal(false); + }); }); From 8c1249b3860e8532cabfcc59c96a4c3a269295e1 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 21 Apr 2022 16:08:22 -0700 Subject: [PATCH 07/16] Fixed formatting --- packages/database-compat/src/api/Database.ts | 2 +- packages/database/src/api/Database.ts | 20 ++++++++++---------- packages/database/test/transport.test.ts | 5 +++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/database-compat/src/api/Database.ts b/packages/database-compat/src/api/Database.ts index 27b6ec931f5..48682dc8b5c 100644 --- a/packages/database-compat/src/api/Database.ts +++ b/packages/database-compat/src/api/Database.ts @@ -55,7 +55,7 @@ export class Database implements FirebaseService, Compat { INTERNAL = { delete: () => this._delegate._delete(), forceWebSockets, - forceLongPolling, + forceLongPolling }; /** diff --git a/packages/database/src/api/Database.ts b/packages/database/src/api/Database.ts index 367bec7ee30..4effee5137a 100644 --- a/packages/database/src/api/Database.ts +++ b/packages/database/src/api/Database.ts @@ -274,16 +274,20 @@ export class Database implements _FirebaseService { } } +function checkTransportInit() { + if (TransportManager.IS_INITIALIZED) { + fatal( + 'Transport has already been initialized. Please call this function before calling ref or setting up a listener' + ); + } +} + /** * Force the use of websockets instead of longPolling. * */ export function forceWebSockets() { - if(TransportManager.IS_INITIALIZED) { - fatal( - 'Transport has already been initialized. Please call this function before calling ref or setting up a listener' - ); - } + checkTransportInit(); BrowserPollConnection.forceDisallow(); } @@ -291,11 +295,7 @@ export function forceWebSockets() { * Force the use of longPolling instead of websockets. This will be ignored if websocket protocol is used in databaseURL. */ export function forceLongPolling() { - if(TransportManager.IS_INITIALIZED) { - fatal( - 'Transport has already been initialized. Please call this function before calling ref or setting up a listener' - ); - } + checkTransportInit(); WebSocketConnection.forceDisallow(); BrowserPollConnection.forceAllow(); } diff --git a/packages/database/test/transport.test.ts b/packages/database/test/transport.test.ts index 2d81dad2d94..22df919ffdc 100644 --- a/packages/database/test/transport.test.ts +++ b/packages/database/test/transport.test.ts @@ -23,11 +23,12 @@ import { BrowserPollConnection } from '../src/realtime/BrowserPollConnection'; import { TransportManager } from '../src/realtime/TransportManager'; import { WebSocketConnection } from '../src/realtime/WebSocketConnection'; -const transportInitError = 'Transport has already been initialized. Please call this function before calling ref or setting up a listener'; +const transportInitError = + 'Transport has already been initialized. Please call this function before calling ref or setting up a listener'; describe('Force Transport', () => { const oldNodeValue = CONSTANTS.NODE_CLIENT; beforeEach(() => { - CONSTANTS.NODE_CLIENT = false; + CONSTANTS.NODE_CLIENT = false; }); afterEach(() => { // Resetting to old values From 6b8fce9043782986f0ab46f03d209eb1e16bd827 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 21 Apr 2022 17:35:07 -0700 Subject: [PATCH 08/16] Create lucky-items-wave.md --- .changeset/lucky-items-wave.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/lucky-items-wave.md diff --git a/.changeset/lucky-items-wave.md b/.changeset/lucky-items-wave.md new file mode 100644 index 00000000000..137cbd5ab29 --- /dev/null +++ b/.changeset/lucky-items-wave.md @@ -0,0 +1,6 @@ +--- +"@firebase/database-compat": patch +"@firebase/database": patch +--- + +Add forceWebSockets() and forceLongPolling() From 1521d5daf8fa65940aa557b17d84870a3641b1d6 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Tue, 26 Apr 2022 14:52:06 -0700 Subject: [PATCH 09/16] Updated tests --- packages/database/src/api/Database.ts | 3 ++- packages/database/src/realtime/TransportManager.ts | 8 ++++---- packages/database/test/transport.test.ts | 10 +++++----- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/database/src/api/Database.ts b/packages/database/src/api/Database.ts index 4effee5137a..2958757ed86 100644 --- a/packages/database/src/api/Database.ts +++ b/packages/database/src/api/Database.ts @@ -274,8 +274,9 @@ export class Database implements _FirebaseService { } } + function checkTransportInit() { - if (TransportManager.IS_INITIALIZED) { + if (TransportManager.IS_TRANSPORT_INITIALIZED) { fatal( 'Transport has already been initialized. Please call this function before calling ref or setting up a listener' ); diff --git a/packages/database/src/realtime/TransportManager.ts b/packages/database/src/realtime/TransportManager.ts index 35cb53872d9..804780a0d3e 100644 --- a/packages/database/src/realtime/TransportManager.ts +++ b/packages/database/src/realtime/TransportManager.ts @@ -32,14 +32,14 @@ import { WebSocketConnection } from './WebSocketConnection'; export class TransportManager { private transports_: TransportConstructor[]; - static transportInitialized_ = false; + static globalTransportInitialized_ = false; static get ALL_TRANSPORTS() { return [BrowserPollConnection, WebSocketConnection]; } - static get IS_INITIALIZED() { - return this.transportInitialized_; + static get IS_TRANSPORT_INITIALIZED() { + return this.globalTransportInitialized_; } /** @@ -74,7 +74,7 @@ export class TransportManager { transports.push(transport); } } - TransportManager.transportInitialized_ = true; + TransportManager.globalTransportInitialized_ = true; } } diff --git a/packages/database/test/transport.test.ts b/packages/database/test/transport.test.ts index 22df919ffdc..c082d1539b6 100644 --- a/packages/database/test/transport.test.ts +++ b/packages/database/test/transport.test.ts @@ -32,30 +32,30 @@ describe('Force Transport', () => { }); afterEach(() => { // Resetting to old values - TransportManager.transportInitialized_ = false; + TransportManager.globalTransportInitialized_ = false; CONSTANTS.NODE_CLIENT = oldNodeValue; BrowserPollConnection.forceAllow_ = false; BrowserPollConnection.forceDisallow_ = true; WebSocketConnection.forceDisallow_ = false; }); it('should enable websockets and disable longPolling', () => { - forceWebSockets(); + expect(forceWebSockets).to.not.throw(); expect(WebSocketConnection.isAvailable()).to.equal(true); expect(BrowserPollConnection.isAvailable()).to.equal(false); }); it('should throw an error when calling forceWebsockets() if TransportManager has already been initialized', () => { - TransportManager.transportInitialized_ = true; + TransportManager.globalTransportInitialized_ = true; expect(forceWebSockets).to.throw(transportInitError); expect(WebSocketConnection.isAvailable()).to.equal(true); expect(BrowserPollConnection.isAvailable()).to.equal(false); }); it('should enable longPolling and disable websockets', () => { - forceLongPolling(); + expect(forceLongPolling).to.not.throw(); expect(WebSocketConnection.isAvailable()).to.equal(false); expect(BrowserPollConnection.isAvailable()).to.equal(true); }); it('should throw an error when calling forceLongPolling() if TransportManager has already been initialized', () => { - TransportManager.transportInitialized_ = true; + TransportManager.globalTransportInitialized_ = true; expect(forceLongPolling).to.throw(transportInitError); expect(WebSocketConnection.isAvailable()).to.equal(true); expect(BrowserPollConnection.isAvailable()).to.equal(false); From 1a29c8577736caa6d9bb5c636efbc4a52a1cb711 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Tue, 26 Apr 2022 14:57:48 -0700 Subject: [PATCH 10/16] Fixed formatting --- packages/database/src/api/Database.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/database/src/api/Database.ts b/packages/database/src/api/Database.ts index 2958757ed86..ce8ec716cb9 100644 --- a/packages/database/src/api/Database.ts +++ b/packages/database/src/api/Database.ts @@ -274,7 +274,6 @@ export class Database implements _FirebaseService { } } - function checkTransportInit() { if (TransportManager.IS_TRANSPORT_INITIALIZED) { fatal( From 6b44914c86d6a87d4b8d4cbe742258cd453544d9 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Tue, 26 Apr 2022 15:09:53 -0700 Subject: [PATCH 11/16] Addresed comments --- packages/database/src/realtime/TransportManager.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/database/src/realtime/TransportManager.ts b/packages/database/src/realtime/TransportManager.ts index 804780a0d3e..960ab4c94db 100644 --- a/packages/database/src/realtime/TransportManager.ts +++ b/packages/database/src/realtime/TransportManager.ts @@ -32,12 +32,14 @@ import { WebSocketConnection } from './WebSocketConnection'; export class TransportManager { private transports_: TransportConstructor[]; + // Keeps track of whether the TransportManager has already chosen a transport to use static globalTransportInitialized_ = false; static get ALL_TRANSPORTS() { return [BrowserPollConnection, WebSocketConnection]; } + // Returns whether transport has been selected. static get IS_TRANSPORT_INITIALIZED() { return this.globalTransportInitialized_; } From 3d5ba4805b309c8c0df646803e718c1df864f840 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Tue, 26 Apr 2022 15:11:40 -0700 Subject: [PATCH 12/16] Clarified comment --- packages/database/src/realtime/TransportManager.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/database/src/realtime/TransportManager.ts b/packages/database/src/realtime/TransportManager.ts index 960ab4c94db..aa2815f89cf 100644 --- a/packages/database/src/realtime/TransportManager.ts +++ b/packages/database/src/realtime/TransportManager.ts @@ -39,7 +39,10 @@ export class TransportManager { return [BrowserPollConnection, WebSocketConnection]; } - // Returns whether transport has been selected. + /** + * Returns whether transport has been selected to ensure WebSocketConnection or BrowserPollConnection are not called after + * TransportManager has already set up transports_ + */ static get IS_TRANSPORT_INITIALIZED() { return this.globalTransportInitialized_; } From af113119642be51d2251141cd5c1c6d0170e05b0 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Wed, 27 Apr 2022 09:21:26 -0700 Subject: [PATCH 13/16] Fixed formattign --- packages/database/src/api/Database.ts | 1 - packages/database/src/realtime/TransportManager.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/database/src/api/Database.ts b/packages/database/src/api/Database.ts index ce8ec716cb9..4dd0008ea47 100644 --- a/packages/database/src/api/Database.ts +++ b/packages/database/src/api/Database.ts @@ -284,7 +284,6 @@ function checkTransportInit() { /** * Force the use of websockets instead of longPolling. - * */ export function forceWebSockets() { checkTransportInit(); diff --git a/packages/database/src/realtime/TransportManager.ts b/packages/database/src/realtime/TransportManager.ts index aa2815f89cf..b2357161283 100644 --- a/packages/database/src/realtime/TransportManager.ts +++ b/packages/database/src/realtime/TransportManager.ts @@ -40,7 +40,7 @@ export class TransportManager { } /** - * Returns whether transport has been selected to ensure WebSocketConnection or BrowserPollConnection are not called after + * Returns whether transport has been selected to ensure WebSocketConnection or BrowserPollConnection are not called after * TransportManager has already set up transports_ */ static get IS_TRANSPORT_INITIALIZED() { From 1e1ccd3708b0cb1b4a7a0ccb2727ed6a038e05f8 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Wed, 27 Apr 2022 14:38:14 -0700 Subject: [PATCH 14/16] Used warning instead of throwing error --- packages/database/src/api/Database.ts | 3 ++- packages/database/test/transport.test.ts | 29 ++++++++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/database/src/api/Database.ts b/packages/database/src/api/Database.ts index 4dd0008ea47..840e1be5aff 100644 --- a/packages/database/src/api/Database.ts +++ b/packages/database/src/api/Database.ts @@ -41,6 +41,7 @@ import { RepoInfo } from '../core/RepoInfo'; import { parseRepoInfo } from '../core/util/libs/parser'; import { newEmptyPath, pathIsEmpty } from '../core/util/Path'; import { + warn, fatal, log, enableLogging as enableLoggingImpl @@ -276,7 +277,7 @@ export class Database implements _FirebaseService { function checkTransportInit() { if (TransportManager.IS_TRANSPORT_INITIALIZED) { - fatal( + warn( 'Transport has already been initialized. Please call this function before calling ref or setting up a listener' ); } diff --git a/packages/database/test/transport.test.ts b/packages/database/test/transport.test.ts index c082d1539b6..a7cd9f6894a 100644 --- a/packages/database/test/transport.test.ts +++ b/packages/database/test/transport.test.ts @@ -15,20 +15,30 @@ * limitations under the License. */ + + import { CONSTANTS } from '@firebase/util'; -import { expect } from 'chai'; +import { expect, use } from 'chai'; +import { createSandbox, SinonSandbox, SinonSpy } from 'sinon'; +import sinonChai from 'sinon-chai'; import { forceLongPolling, forceWebSockets } from '../src'; +import * as Util from '../src/core/util/util'; import { BrowserPollConnection } from '../src/realtime/BrowserPollConnection'; import { TransportManager } from '../src/realtime/TransportManager'; import { WebSocketConnection } from '../src/realtime/WebSocketConnection'; +use(sinonChai); const transportInitError = 'Transport has already been initialized. Please call this function before calling ref or setting up a listener'; describe('Force Transport', () => { const oldNodeValue = CONSTANTS.NODE_CLIENT; + let mySandbox: SinonSandbox; + let spyWarn: SinonSpy; beforeEach(() => { CONSTANTS.NODE_CLIENT = false; + mySandbox = createSandbox(); + spyWarn = mySandbox.spy(Util, 'warn'); }); afterEach(() => { // Resetting to old values @@ -37,27 +47,32 @@ describe('Force Transport', () => { BrowserPollConnection.forceAllow_ = false; BrowserPollConnection.forceDisallow_ = true; WebSocketConnection.forceDisallow_ = false; + mySandbox.restore(); }); it('should enable websockets and disable longPolling', () => { - expect(forceWebSockets).to.not.throw(); + forceWebSockets(); + expect(spyWarn.called).to.equal(false); expect(WebSocketConnection.isAvailable()).to.equal(true); expect(BrowserPollConnection.isAvailable()).to.equal(false); }); it('should throw an error when calling forceWebsockets() if TransportManager has already been initialized', () => { TransportManager.globalTransportInitialized_ = true; - expect(forceWebSockets).to.throw(transportInitError); + forceWebSockets(); + expect(spyWarn).to.have.been.calledWith(transportInitError); expect(WebSocketConnection.isAvailable()).to.equal(true); expect(BrowserPollConnection.isAvailable()).to.equal(false); }); it('should enable longPolling and disable websockets', () => { - expect(forceLongPolling).to.not.throw(); + forceLongPolling(); + expect(spyWarn.called).to.equal(false); expect(WebSocketConnection.isAvailable()).to.equal(false); expect(BrowserPollConnection.isAvailable()).to.equal(true); }); it('should throw an error when calling forceLongPolling() if TransportManager has already been initialized', () => { TransportManager.globalTransportInitialized_ = true; - expect(forceLongPolling).to.throw(transportInitError); - expect(WebSocketConnection.isAvailable()).to.equal(true); - expect(BrowserPollConnection.isAvailable()).to.equal(false); + forceLongPolling(); + expect(spyWarn).to.have.been.calledWith(transportInitError); + expect(WebSocketConnection.isAvailable()).to.equal(false); + expect(BrowserPollConnection.isAvailable()).to.equal(true); }); }); From 43fb0ce107ca9b573fbd8e3577ff763d74b14747 Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Wed, 27 Apr 2022 14:41:38 -0700 Subject: [PATCH 15/16] Fixed formatting --- packages/database/test/transport.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/database/test/transport.test.ts b/packages/database/test/transport.test.ts index a7cd9f6894a..4f4407bf3f2 100644 --- a/packages/database/test/transport.test.ts +++ b/packages/database/test/transport.test.ts @@ -15,8 +15,6 @@ * limitations under the License. */ - - import { CONSTANTS } from '@firebase/util'; import { expect, use } from 'chai'; import { createSandbox, SinonSandbox, SinonSpy } from 'sinon'; From 2e31c5770b8d5b7377db33b257903491c98f7a9f Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Thu, 5 May 2022 09:33:49 -0700 Subject: [PATCH 16/16] Addressed comments --- .changeset/lucky-items-wave.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/lucky-items-wave.md b/.changeset/lucky-items-wave.md index 137cbd5ab29..2c9b274c569 100644 --- a/.changeset/lucky-items-wave.md +++ b/.changeset/lucky-items-wave.md @@ -1,6 +1,6 @@ --- -"@firebase/database-compat": patch -"@firebase/database": patch +"@firebase/database-compat": minor +"@firebase/database": minor --- -Add forceWebSockets() and forceLongPolling() +Add `forceWebSockets()` and `forceLongPolling()`