Skip to content

Commit

Permalink
Fixed issue where multiple calls to connectDataConnectEmulator causes…
Browse files Browse the repository at this point in the history
… an exception (#8664)
  • Loading branch information
maneesht authored Dec 4, 2024
1 parent f05509e commit cb4309f
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/funny-weeks-attack.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@firebase/data-connect": patch
---

Fixed issue where multiple calls to connectDataConnectEmulator caused an exception
22 changes: 21 additions & 1 deletion packages/data-connect/src/api/DataConnect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,10 @@ export class DataConnect {

// @internal
enableEmulator(transportOptions: TransportOptions): void {
if (this._initialized) {
if (
this._initialized &&
!areTransportOptionsEqual(this._transportOptions, transportOptions)
) {
logError('enableEmulator called after initialization');
throw new DataConnectError(
Code.ALREADY_INITIALIZED,
Expand All @@ -191,6 +194,23 @@ export class DataConnect {
}
}

/**
* @internal
* @param transportOptions1
* @param transportOptions2
* @returns
*/
export function areTransportOptionsEqual(
transportOptions1: TransportOptions,
transportOptions2: TransportOptions
): boolean {
return (
transportOptions1.host === transportOptions2.host &&
transportOptions1.port === transportOptions2.port &&
transportOptions1.sslEnabled === transportOptions2.sslEnabled
);
}

/**
* Connect to the DataConnect Emulator
* @param dc Data Connect instance
Expand Down
80 changes: 80 additions & 0 deletions packages/data-connect/test/unit/transportoptions.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/**
* @license
* Copyright 2024 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 { expect } from 'chai';
import {
TransportOptions,
areTransportOptionsEqual,
connectDataConnectEmulator,
getDataConnect
} from '../../src/api/DataConnect';
import { app } from '../util';
import { queryRef } from '../../src';
describe('Transport Options', () => {
it('should return false if transport options are not equal', () => {
const transportOptions1: TransportOptions = {
host: 'h',
port: 1,
sslEnabled: false
};
const transportOptions2: TransportOptions = {
host: 'h2',
port: 2,
sslEnabled: false
};
expect(
areTransportOptionsEqual(transportOptions1, transportOptions2)
).to.eq(false);
});
it('should return true if transport options are equal', () => {
const transportOptions1: TransportOptions = {
host: 'h',
port: 1,
sslEnabled: false
};
const transportOptions2: TransportOptions = {
port: 1,
host: 'h',
sslEnabled: false
};
expect(
areTransportOptionsEqual(transportOptions1, transportOptions2)
).to.eq(true);
});
it('should throw if emulator is connected to with new transport options', () => {
const dc = getDataConnect(app, {
connector: 'c',
location: 'l',
service: 's'
});
expect(() => connectDataConnectEmulator(dc, 'h', 80, false)).to.not.throw();
queryRef(dc, 'query');
expect(() => connectDataConnectEmulator(dc, 'h2', 80, false)).to.throw(
'DataConnect instance already initialized!'
);
});
it('should not throw if emulator is connected to with the same transport options', () => {
const dc = getDataConnect(app, {
connector: 'c',
location: 'l',
service: 's'
});
expect(() => connectDataConnectEmulator(dc, 'h', 80, false)).to.not.throw();
queryRef(dc, 'query');
expect(() => connectDataConnectEmulator(dc, 'h', 80, false)).to.not.throw();
});
});

0 comments on commit cb4309f

Please # to comment.