122 lines
3.3 KiB
JavaScript
122 lines
3.3 KiB
JavaScript
import { ApolloClient, ApolloLink, InMemoryCache } from "@apollo/client";
|
|
import { setContext } from "@apollo/client/link/context";
|
|
import { onError } from "@apollo/client/link/error";
|
|
import { HttpLink } from "@apollo/client/link/http"; //"apollo-link-http";
|
|
import { RetryLink } from "@apollo/client/link/retry";
|
|
import apolloLogger from "apollo-link-logger";
|
|
import { SentryLink } from "apollo-link-sentry";
|
|
import { auth } from "../firebase/firebase.utils";
|
|
|
|
const errorLink = onError(({ graphQLErrors, networkError, operation, forward }) => {
|
|
if (graphQLErrors)
|
|
graphQLErrors.forEach(({ message, locations, path }) =>
|
|
console.log(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`)
|
|
);
|
|
if (networkError) console.log(`[Network error]: ${JSON.stringify(networkError)}`);
|
|
console.log(operation.getContext());
|
|
});
|
|
|
|
const httpLink = new HttpLink({
|
|
uri: import.meta.env.VITE_APP_GRAPHQL_ENDPOINT
|
|
});
|
|
|
|
// const wsLink = new WebSocketLink({
|
|
// uri: import.meta.env.VITE_APP_GRAPHQL_ENDPOINT_WS,
|
|
// options: {
|
|
// lazy: true,
|
|
// reconnect: true,
|
|
// connectionParams: async () => {
|
|
// const token = auth.currentUser && (await auth.currentUser.getIdToken(true));
|
|
// if (token) {
|
|
// return {
|
|
// headers: {
|
|
// authorization: token ? `Bearer ${token}` : ""
|
|
// }
|
|
// };
|
|
// }
|
|
// }
|
|
// }
|
|
// });
|
|
|
|
// const subscriptionMiddleware = {
|
|
// applyMiddleware: async (options, next) => {
|
|
// options.authToken = auth.currentUser && (await auth.currentUser.getIdToken(true));
|
|
// next();
|
|
// }
|
|
// };
|
|
// wsLink.subscriptionClient.use([subscriptionMiddleware]);
|
|
|
|
// const link = new HttpLink.split(
|
|
// // split based on operation type
|
|
// ({ query }) => {
|
|
// const definition = getMainDefinition(query);
|
|
// // console.log(
|
|
// // "##Intercepted GQL Transaction : " +
|
|
// // definition.operation +
|
|
// // "|" +
|
|
// // definition.name.value +
|
|
// // "##",
|
|
// // query
|
|
// // );
|
|
// return definition.kind === "OperationDefinition" && definition.operation === "subscription";
|
|
// },
|
|
// wsLink,
|
|
// httpLink
|
|
// );
|
|
|
|
const authLink = setContext((_, { headers }) => {
|
|
return (
|
|
auth.currentUser &&
|
|
auth.currentUser.getIdToken().then((token) => {
|
|
if (token) {
|
|
return {
|
|
headers: {
|
|
...headers,
|
|
authorization: token ? `Bearer ${token}` : ""
|
|
}
|
|
};
|
|
} else {
|
|
console.log("We have no authorization header.");
|
|
return { headers };
|
|
}
|
|
})
|
|
);
|
|
});
|
|
|
|
const retryLink = new RetryLink({
|
|
delay: {
|
|
initial: 500,
|
|
max: 5,
|
|
jitter: true
|
|
},
|
|
attempts: {
|
|
max: 5,
|
|
retryIf: (error, _operation) => !!error
|
|
}
|
|
});
|
|
|
|
const sentryLink = new SentryLink();
|
|
|
|
const middlewares = [];
|
|
if (import.meta.env.DEV) {
|
|
middlewares.push(apolloLogger);
|
|
}
|
|
|
|
middlewares.push(sentryLink.concat(retryLink.concat(errorLink.concat(authLink.concat(httpLink)))));
|
|
|
|
const cache = new InMemoryCache({});
|
|
|
|
export default new ApolloClient({
|
|
link: ApolloLink.from(middlewares),
|
|
cache,
|
|
connectToDevTools: process.env.NODE_ENV !== "production",
|
|
defaultOptions: {
|
|
query: {
|
|
fetchPolicy: "network-only"
|
|
},
|
|
watchQuery: {
|
|
fetchPolicy: "network-only"
|
|
}
|
|
}
|
|
});
|