commerce/packages/spree/utils/tokens/ensure-fresh-user-access-token.ts
2022-01-14 20:44:48 -05:00

52 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