function createSubscriptionHandshakeLink()

in packages/aws-appsync-subscription-link/src/index.ts [20:75]


function createSubscriptionHandshakeLink(
  url: string,
  resultsFetcherLink?: ApolloLink
): ApolloLink;
function createSubscriptionHandshakeLink(
  infoOrUrl: UrlInfo | string,
  theResultsFetcherLink?: ApolloLink
) {
  let resultsFetcherLink: ApolloLink, subscriptionLinks: ApolloLink;

  if (typeof infoOrUrl === "string") {
    resultsFetcherLink =
      theResultsFetcherLink || createHttpLink({ uri: infoOrUrl });
    subscriptionLinks = ApolloLink.from([
      new NonTerminatingLink("controlMessages", {
        link: new ApolloLink(
          (operation, _forward) =>
            new Observable<any>(observer => {
              const {
                variables: { [CONTROL_EVENTS_KEY]: controlEvents, ...variables }
              } = operation;

              if (typeof controlEvents !== "undefined") {
                operation.variables = variables;
              }

              observer.next({ [CONTROL_EVENTS_KEY]: controlEvents });

              return () => {};
            })
        )
      }),
      new NonTerminatingLink("subsInfo", { link: resultsFetcherLink }),
      new SubscriptionHandshakeLink("subsInfo")
    ]);
  } else {
    const { url } = infoOrUrl;
    resultsFetcherLink = theResultsFetcherLink || createHttpLink({ uri: url });
    subscriptionLinks = new AppSyncRealTimeSubscriptionHandshakeLink(infoOrUrl);
  }

  return ApolloLink.split(
    operation => {
      const { query } = operation;
      const { kind, operation: graphqlOperation } = getMainDefinition(
        query
      ) as OperationDefinitionNode;
      const isSubscription =
        kind === "OperationDefinition" && graphqlOperation === "subscription";

      return isSubscription;
    },
    subscriptionLinks,
    resultsFetcherLink
  );
}