export function withRequestLogic()

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);
}