import { SpreeSdkResponseWithRawResponse } from '../../types'; import type { Client } from '@spree/storefront-api-v2-sdk'; import type { IOAuthToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token'; import getSpreeSdkMethodFromEndpointPath from '../get-spree-sdk-method-from-endpoint-path'; import { ensureUserTokenResponse, removeUserTokenResponse, setUserTokenResponse } from './user-token-response'; import AccessTokenError from '../../errors/AccessTokenError'; /** * If the user has a saved access token, make sure it's not expired * If it is expired, attempt to refresh it. */ const ensureFreshUserAccessToken = async (client: Client): Promise => { const userTokenResponse = ensureUserTokenResponse(); if (!userTokenResponse) { // There's no user token or it has an invalid format. return; } const isAccessTokenExpired = (userTokenResponse.created_at + userTokenResponse.expires_in) * 1000 < Date.now(); if (!isAccessTokenExpired) { return; } const spreeRefreshAccessTokenSdkMethod = getSpreeSdkMethodFromEndpointPath< Client, SpreeSdkResponseWithRawResponse & IOAuthToken >(client, 'authentication.refreshToken'); const spreeRefreshAccessTokenResponse = await spreeRefreshAccessTokenSdkMethod({ refresh_token: userTokenResponse.refresh_token }); if (spreeRefreshAccessTokenResponse.isFail()) { removeUserTokenResponse(); throw new AccessTokenError('Could not refresh access token.'); } setUserTokenResponse(spreeRefreshAccessTokenResponse.success()); }; export default ensureFreshUserAccessToken;