Files
Sankofa/src/lib/graphql/client.ts

75 lines
2.0 KiB
TypeScript

import { ApolloClient, InMemoryCache, split, HttpLink } from '@apollo/client'
import { getMainDefinition } from '@apollo/client/utilities'
import { GraphQLWsLink } from '@apollo/client/link/subscriptions'
import { createClient } from 'graphql-ws'
const httpLink = new HttpLink({
uri: process.env.NEXT_PUBLIC_GRAPHQL_URL || 'http://localhost:4000/graphql',
})
// WebSocket link for subscriptions (only in browser)
const wsLink =
typeof window !== 'undefined'
? new GraphQLWsLink(
createClient({
url: process.env.NEXT_PUBLIC_GRAPHQL_WS_URL || 'ws://localhost:4000/graphql',
connectionParams: () => {
// Add auth token if available
const token = localStorage.getItem('authToken')
return token ? { authorization: `Bearer ${token}` } : {}
},
})
)
: null
// Split link: use WebSocket for subscriptions, HTTP for queries/mutations
const splitLink =
typeof window !== 'undefined' && wsLink
? split(
({ query }) => {
const definition = getMainDefinition(query)
return (
definition.kind === 'OperationDefinition' &&
definition.operation === 'subscription'
)
},
wsLink,
httpLink
)
: httpLink
export const apolloClient = new ApolloClient({
link: splitLink,
cache: new InMemoryCache({
typePolicies: {
NetworkTopology: {
fields: {
nodes: {
merge(existing = [], incoming) {
return incoming
},
},
edges: {
merge(existing = [], incoming) {
return incoming
},
},
},
},
},
}),
defaultOptions: {
watchQuery: {
fetchPolicy: 'cache-and-network',
},
query: {
fetchPolicy: 'cache-first',
},
},
})
/** Used by `src/app/providers.tsx` (client Providers wrapper). */
export function getApolloClient() {
return apolloClient
}