in packages/sdk/src/FlagResolverClient.ts [312:348]
export function withRequestLogic(fetchBuilder: FetchBuilder, logger: Logger) {
const fetchResolve = new FetchBuilder()
// infinite retries without delay until aborted by timeout
.compose(next => async request => {
try {
const response = await next(request);
return response;
} catch (error) {
logger.error?.(`Confidence: ${error}`);
throw error;
}
})
.rejectNotOk()
.retry()
.rejectOn(response => retryCodes.has(response.status))
.rateLimit(1, { initialTokens: 3, maxTokens: 2 });
const fetchApply = new FetchBuilder()
.limitPending(1000)
.timeout(30 * TimeUnit.MINUTE)
.rejectNotOk()
.retry({ delay: 5 * TimeUnit.SECOND, backoff: 2, maxDelay: 5 * TimeUnit.MINUTE, jitter: 0.2 })
.rejectOn(response => retryCodes.has(response.status))
.rateLimit(2)
// update send-time before sending
.modifyRequest(({ method, body }) => {
if (method === 'POST' && body) {
body = JSON.stringify({ ...JSON.parse(body), sendTime: new Date().toISOString() });
return { body };
}
return {};
});
fetchBuilder
.route(url => url.endsWith('flags:resolve'), fetchResolve)
.route(url => url.endsWith('flags:apply'), fetchApply);
}