72 lines
1.6 KiB
TypeScript
72 lines
1.6 KiB
TypeScript
import {
|
|
ApolloClient,
|
|
ApolloLink,
|
|
HttpLink,
|
|
InMemoryCache,
|
|
UriFunction,
|
|
} from '@apollo/client';
|
|
|
|
import { loggerLink } from '@/apollo/utils';
|
|
import {
|
|
AuthTokenPair,
|
|
RenewTokenDocument,
|
|
RenewTokenMutation,
|
|
RenewTokenMutationVariables,
|
|
} from '~/generated/graphql';
|
|
|
|
const logger = loggerLink(() => 'Twenty-Refresh');
|
|
|
|
/**
|
|
* Renew token mutation with custom apollo client
|
|
* @param uri string | UriFunction | undefined
|
|
* @param refreshToken string
|
|
* @returns RenewTokenMutation
|
|
*/
|
|
const renewTokenMutation = async (
|
|
uri: string | UriFunction | undefined,
|
|
refreshToken: string,
|
|
) => {
|
|
const httpLink = new HttpLink({ uri });
|
|
|
|
// Create new client to call refresh token graphql mutation
|
|
const client = new ApolloClient({
|
|
link: ApolloLink.from([logger, httpLink]),
|
|
cache: new InMemoryCache({}),
|
|
});
|
|
|
|
const { data, errors } = await client.mutate<
|
|
RenewTokenMutation,
|
|
RenewTokenMutationVariables
|
|
>({
|
|
mutation: RenewTokenDocument,
|
|
variables: {
|
|
refreshToken: refreshToken,
|
|
},
|
|
fetchPolicy: 'network-only',
|
|
});
|
|
|
|
if (errors || !data) {
|
|
throw new Error('Something went wrong during token renewal');
|
|
}
|
|
|
|
return data;
|
|
};
|
|
|
|
/**
|
|
* Renew token and update cookie storage
|
|
* @param uri string | UriFunction | undefined
|
|
* @returns TokenPair
|
|
*/
|
|
export const renewToken = async (
|
|
uri: string | UriFunction | undefined,
|
|
tokenPair: AuthTokenPair | undefined | null,
|
|
) => {
|
|
if (!tokenPair) {
|
|
throw new Error('Refresh token is not defined');
|
|
}
|
|
|
|
const data = await renewTokenMutation(uri, tokenPair.refreshToken.token);
|
|
|
|
return data.renewToken.tokens;
|
|
};
|