Skip to content

Commit a2c6bea

Browse files
committed
Fixed issue where multiple calls to connectDataConnectEmulator throws an error
1 parent ffbf5a6 commit a2c6bea

File tree

5 files changed

+90
-7
lines changed

5 files changed

+90
-7
lines changed

packages/auth/src/platform_browser/strategies/popup.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,9 @@ class PopupOperation extends AbstractPopupRedirectOperation {
299299

300300
private pollUserCancellation(): void {
301301
const poll = (): void => {
302+
if(typeof window !== 'undefined' && this.authWindow?.window?.location.host !== window.location.host) {
303+
console.error('Unable to determine whether window was closed or not');
304+
}
302305
if (this.authWindow?.window?.closed) {
303306
// Make sure that there is sufficient time for whatever action to
304307
// complete. The window could have closed but the sign in network

packages/data-connect/src/api/DataConnect.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export class DataConnect {
179179

180180
// @internal
181181
enableEmulator(transportOptions: TransportOptions): void {
182-
if (this._initialized) {
182+
if (this._initialized && !areTransportOptionsEqual(this._transportOptions, transportOptions)) {
183183
logError('enableEmulator called after initialization');
184184
throw new DataConnectError(
185185
Code.ALREADY_INITIALIZED,
@@ -191,6 +191,11 @@ export class DataConnect {
191191
}
192192
}
193193

194+
// @internal
195+
export function areTransportOptionsEqual(transportOptions1: TransportOptions, transportOptions2: TransportOptions) {
196+
return JSON.stringify(transportOptions1) === JSON.stringify(transportOptions2);
197+
}
198+
194199
/**
195200
* Connect to the DataConnect Emulator
196201
* @param dc Data Connect instance

packages/data-connect/src/api/query.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,27 +104,39 @@ export function queryRef<Data, Variables>(
104104
queryName: string,
105105
variables: Variables
106106
): QueryRef<Data, Variables>;
107+
108+
export function queryRef<Data, Variables>(
109+
dcInstance: DataConnect,
110+
serializedRef: SerializedRef<Data, Variables>
111+
): QueryRef<Data, Variables>;
112+
107113
/**
108114
* Execute Query
109115
* @param dcInstance Data Connect instance to use.
110-
* @param queryName Query to execute
116+
* @param queryNameOrSerializedRef Query to execute
111117
* @param variables Variables to execute with
112118
* @param initialCache initial cache to use for client hydration
113119
* @returns `QueryRef`
114120
*/
115121
export function queryRef<Data, Variables>(
116122
dcInstance: DataConnect,
117-
queryName: string,
123+
queryNameOrSerializedRef: string | SerializedRef<Data, Variables>,
118124
variables?: Variables,
119125
initialCache?: QueryResult<Data, Variables>
120126
): QueryRef<Data, Variables> {
121127
dcInstance.setInitialized();
122-
dcInstance._queryManager.track(queryName, variables, initialCache);
128+
if(typeof queryNameOrSerializedRef === 'string') {
129+
dcInstance._queryManager.track(queryNameOrSerializedRef, variables, initialCache);
130+
} else {
131+
dcInstance._queryManager.track(queryNameOrSerializedRef.refInfo.name, queryNameOrSerializedRef.refInfo.variables, queryNameOrSerializedRef);
132+
}
133+
const vars = typeof queryNameOrSerializedRef !== 'string'? queryNameOrSerializedRef.refInfo.variables : variables;
134+
const name = typeof queryNameOrSerializedRef !== 'string'? queryNameOrSerializedRef.refInfo.name : queryNameOrSerializedRef;
123135
return {
124136
dataConnect: dcInstance,
125137
refType: QUERY_STR,
126-
name: queryName,
127-
variables: variables as Variables
138+
name,
139+
variables: vars
128140
};
129141
}
130142
/**

packages/data-connect/test/queries.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@ import {
3333
subscribe,
3434
terminate,
3535
SOURCE_CACHE,
36-
SOURCE_SERVER
36+
SOURCE_SERVER,
37+
toQueryRef
3738
} from '../src';
3839

3940
import { setupQueries } from './emulatorSeeder';
4041
import { getConnectionConfig, initDatabase, PROJECT_ID } from './util';
42+
import { serialize } from 'v8';
4143

4244
use(chaiAsPromised);
4345

@@ -136,6 +138,15 @@ describe('DataConnect Tests', async () => {
136138
expect(result.data).to.eq(queryResult.data);
137139
expect(result.source).to.eq(SOURCE_CACHE);
138140
});
141+
142+
it(`returns the result source as cache when data already exists`, async () => {
143+
const taskListQuery = queryRef<TaskListResponse>(dc, 'listPosts');
144+
const queryResult = await executeQuery(taskListQuery);
145+
const serializedRef = queryResult.toJSON();
146+
const newRef = queryRef(dc, serializedRef);
147+
expect(newRef.name).to.eq(serializedRef.refInfo.name);
148+
expect(newRef.variables).to.eq(serializedRef.refInfo.variables);
149+
});
139150
it(`returns the proper JSON when calling .toJSON()`, async () => {
140151
const taskListQuery = queryRef<TaskListResponse>(dc, 'listPosts');
141152
await executeQuery(taskListQuery);
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { expect } from 'chai';
2+
import { TransportOptions, areTransportOptionsEqual, connectDataConnectEmulator, getDataConnect} from '../../src/api/DataConnect';
3+
import { app } from '../util';
4+
import { queryRef } from '../../src';
5+
describe.only('Transport Options', () => {
6+
it('should return false if transport options are not equal', () => {
7+
const transportOptions1: TransportOptions = {
8+
host: 'h',
9+
port: 1,
10+
sslEnabled: false
11+
};
12+
const transportOptions2: TransportOptions = {
13+
host: 'h2',
14+
port: 2,
15+
sslEnabled: false
16+
};
17+
expect(areTransportOptionsEqual(transportOptions1, transportOptions2)).to.eq(false);
18+
});
19+
it('should return true if transport options are equal', () => {
20+
const transportOptions1: TransportOptions = {
21+
host: 'h',
22+
port: 1,
23+
sslEnabled: false
24+
};
25+
const transportOptions2: TransportOptions = {
26+
host: 'h',
27+
port: 1,
28+
sslEnabled: false
29+
};
30+
expect(areTransportOptionsEqual(transportOptions1, transportOptions2)).to.eq(true);
31+
});
32+
it.only('should throw if emulator is connected to with new transport options', () => {
33+
const dc = getDataConnect(app, {
34+
connector: 'c',
35+
location: 'l',
36+
service: 's'
37+
});
38+
expect(() => connectDataConnectEmulator(dc, 'h', 80, false)).to.not.throw();
39+
queryRef(dc, 'query');
40+
expect(() => connectDataConnectEmulator(dc, 'h2', 80, false)).to.throw('DataConnect instance already initialized!');
41+
});
42+
it.only('should not throw if emulator is connected to with the same transport options', () => {
43+
const dc = getDataConnect(app, {
44+
connector: 'c',
45+
location: 'l',
46+
service: 's'
47+
});
48+
expect(() => connectDataConnectEmulator(dc, 'h', 80, false)).to.not.throw();
49+
queryRef(dc, 'query');
50+
expect(() => connectDataConnectEmulator(dc, 'h', 80, false)).to.not.throw();
51+
});
52+
});

0 commit comments

Comments
 (0)