Skip to content
10 changes: 7 additions & 3 deletions modules/server/src/network/gql.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import axios from 'axios';
import axios, { AxiosRequestConfig } from 'axios';
import { ASTNode, print } from 'graphql';

/**
Expand Down Expand Up @@ -28,17 +28,21 @@ export const fetchGql = ({
url,
gqlQuery,
variables,
options,
}: {
url: string;
gqlQuery: string;
variables?: Record<string, string>;
options?: { timeout: number };
}) => {
const options = {
const timeout = options?.timeout || 10000;
const axiosOptions: AxiosRequestConfig = {
url,
method: 'POST',
headers: { 'Content-Type': 'application/json' },
data: { query: gqlQuery, variables },
signal: AbortSignal.timeout(timeout),
};

return axios(options);
return axios(axiosOptions);
};
5 changes: 4 additions & 1 deletion modules/server/src/network/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,15 @@ import { fulfilledPromiseFilter, getAllTypes } from './util';
const fetchRemoteSchema = async (
config: NetworkAggregationConfigInput,
): Promise<GQLTypeQueryResponse | undefined> => {
const { graphqlUrl, documentType } = config;
const { graphqlUrl, documentType, timeout } = config;
try {
const response = await fetchGql({
url: graphqlUrl,
gqlQuery: gqlAggregationTypeQuery,
variables: { documentName: documentType },
options: {
timeout,
},
});

// axios response "data" field, graphql response "data" field
Expand Down
9 changes: 7 additions & 2 deletions modules/server/src/network/resolvers/aggregations.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { gql } from 'apollo-server-core';
import axios from 'axios';
import { DocumentNode } from 'graphql';
import { resolveAggregations } from '../aggregations';
import { fetchGql } from '../gql';
import { failure, isSuccess, success } from '../httpResponses';
import { GQLResponse, supportedAggregationQueries } from '../queries';
import { supportedAggregationQueries } from '../queries';
import { NetworkAggregation, NetworkAggregationConfig } from '../types';
import { ASTtoString, fulfilledPromiseFilter } from '../util';
import { ASTtoString } from '../util';
import { CONNECTION_STATUS, RemoteConnection } from './remoteConnections';

/**
Expand All @@ -29,6 +30,10 @@ const fetchData = async (query: NetworkQuery) => {
return success(responseData);
}
} catch (error) {
if (axios.isCancel(error)) {
return failure(CONNECTION_STATUS.ERROR, `Request cancelled: ${url}`);
}

const responseStatus = error.response.status;
if (responseStatus === 404) {
console.error(`Network failure: ${url}`);
Expand Down
3 changes: 3 additions & 0 deletions modules/server/src/network/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ export type NetworkAggregationConfigInput = {
documentType: string;
documentName: string;
displayName: string;
options: {
timeout: number;
};
};

export type NetworkFieldType<T> = {
Expand Down