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