sharetribe-flex-sdk
Version:
Sharetribe SDK for JavaScript
59 lines (49 loc) • 1.44 kB
JavaScript
import contextRunner from '../context_runner';
import SaveToken from './save_token';
import AddAuthTokenResponse from './add_auth_token_response';
/**
Retries with a fresh anon token.
`enter`: Save current `enterQueue` to `retryQueue` and save current `attempts` count
`error`: Try to fetch new anon token. If successful, save it to `ctx`
Changes to `ctx`:
- add `anonTokenRetry`
- add `authToken`
*/
export default class RetryWithAnonToken {
enter(enterCtx) {
const { enterQueue, anonTokenRetry: { attempts = 0 } = {} } = enterCtx;
return {
...enterCtx,
anonTokenRetry: {
retryQueue: [...enterQueue, new RetryWithAnonToken()],
attempts: attempts + 1,
},
};
}
error(errorCtx) {
const {
clientId,
tokenStore,
endpointInterceptors,
anonTokenRetry: { retryQueue, attempts },
} = errorCtx;
if (attempts > 1) {
return errorCtx;
}
if (errorCtx.res && errorCtx.res.status === 401) {
return contextRunner([
new SaveToken(),
new AddAuthTokenResponse(),
...endpointInterceptors.auth.token,
])({
params: {
client_id: clientId,
grant_type: 'client_credentials',
scope: 'public-read',
},
tokenStore,
}).then(({ authToken }) => ({ ...errorCtx, authToken, enterQueue: retryQueue, error: null }));
}
return errorCtx;
}
}