commerce/lib/spree/utils/tokens/ensure-fresh-user-access-token.ts
2024-05-21 20:00:11 +05:00

50 lines
1.6 KiB
TypeScript

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<void> => {
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;