in packages/aws-appsync-subscription-link/src/realtime-subscription-handshake-link.ts [345:408]
private _initializeWebSocketConnection({
appSyncGraphqlEndpoint,
authenticationType,
apiKey,
region,
credentials,
token
}): Promise<void> {
if (this.socketStatus === SOCKET_STATUS.READY) {
return;
}
return new Promise(async (res, rej) => {
this.promiseArray.push({ res, rej });
if (this.socketStatus === SOCKET_STATUS.CLOSED) {
try {
this.socketStatus = SOCKET_STATUS.CONNECTING;
// Creating websocket url with required query strings
const discoverableEndpoint = AppSyncRealTimeSubscriptionHandshakeLink._discoverAppSyncRealTimeEndpoint(
this.url
);
const payloadString = "{}";
const headerString = JSON.stringify(
await this._awsRealTimeHeaderBasedAuth({
authenticationType,
payload: payloadString,
canonicalUri: "/connect",
apiKey,
appSyncGraphqlEndpoint,
region,
credentials,
token,
graphql_headers: () => {}
})
);
const headerQs = Buffer.from(headerString).toString("base64");
const payloadQs = Buffer.from(payloadString).toString("base64");
const awsRealTimeUrl = `${discoverableEndpoint}?header=${headerQs}&payload=${payloadQs}`;
await this._initializeRetryableHandshake({ awsRealTimeUrl });
this.promiseArray.forEach(({ res }) => {
logger("Notifying connection successful");
res();
});
this.socketStatus = SOCKET_STATUS.READY;
this.promiseArray = [];
} catch (err) {
this.promiseArray.forEach(({ rej }) => rej(err));
this.promiseArray = [];
if (
this.awsRealTimeSocket &&
this.awsRealTimeSocket.readyState === WebSocket.OPEN
) {
this.awsRealTimeSocket.close(3001);
}
this.awsRealTimeSocket = null;
this.socketStatus = SOCKET_STATUS.CLOSED;
}
}
});
}