Skip to content

Commit 88113b6

Browse files
authored
fix: await AppSyncEvent WebSocket connection establishment (#14438)
2 parents f94a30b + a752cd6 commit 88113b6

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

packages/api-graphql/__tests__/AWSAppSyncEventProvider.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,64 @@ jest.mock('@aws-amplify/core', () => {
6060
});
6161

6262
describe('AppSyncEventProvider', () => {
63+
describe('connect', () => {
64+
let fakeWebSocketInterface: FakeWebSocketInterface;
65+
const loggerSpy: jest.SpyInstance = jest.spyOn(
66+
ConsoleLogger.prototype,
67+
'_log',
68+
);
69+
let provider: AWSAppSyncEventProvider;
70+
beforeEach(async () => {
71+
fakeWebSocketInterface = new FakeWebSocketInterface();
72+
provider = new AWSAppSyncEventProvider();
73+
74+
Object.defineProperty(provider, 'socketStatus', {
75+
value: constants.SOCKET_STATUS.CLOSED,
76+
});
77+
78+
jest.spyOn(provider as any, '_getNewWebSocket').mockImplementation(() => {
79+
fakeWebSocketInterface.newWebSocket();
80+
return fakeWebSocketInterface.webSocket as WebSocket;
81+
});
82+
})
83+
84+
afterEach(async () => {
85+
provider?.close();
86+
await fakeWebSocketInterface?.closeInterface();
87+
fakeWebSocketInterface?.teardown();
88+
loggerSpy.mockClear();
89+
});
90+
91+
test('socket status should be READY', async () => {
92+
93+
// Connect to the provider
94+
const connectPromise = provider.connect({
95+
appSyncGraphqlEndpoint: 'ws://localhost:8080',
96+
authenticationType: 'apiKey',
97+
apiKey: 'test-api-key',
98+
region: 'us-east-1'
99+
});
100+
101+
// Verify the socket status to be CONNECTING
102+
await new Promise(resolve => setTimeout(resolve, 1));
103+
expect((provider as any).socketStatus).toBe(constants.SOCKET_STATUS.CONNECTING);
104+
105+
// Trigger the websocket open event
106+
await fakeWebSocketInterface.readyForUse;
107+
await fakeWebSocketInterface.triggerOpen();
108+
109+
// Initiate handshake
110+
await fakeWebSocketInterface.sendDataMessage({
111+
type: MESSAGE_TYPES.GQL_CONNECTION_ACK
112+
});
113+
114+
// Wait for connection to complete
115+
await connectPromise;
116+
117+
// Verify the socket status
118+
expect((provider as any).socketStatus).toBe(constants.SOCKET_STATUS.READY);
119+
});
120+
});
63121
describe('subscribe()', () => {
64122
describe('returned observer', () => {
65123
describe('connection logic with mocked websocket', () => {

packages/api-graphql/src/Providers/AWSAppSyncEventsProvider/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export class AWSAppSyncEventProvider extends AWSWebSocketProvider {
6161
}
6262

6363
public async connect(options: AWSAppSyncEventProviderOptions) {
64-
super.connect(options);
64+
return super.connect(options);
6565
}
6666

6767
public subscribe(

0 commit comments

Comments
 (0)