private _initializeWebSocketConnection()

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;
        }
      }
    });
  }