All files / src/sdk retry.ts

63.63% Statements 7/11
50% Branches 1/2
75% Functions 3/4
63.63% Lines 7/11

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40      17x                           17x 17x             2x 2x         2x   2x            
import type { RetryConfig } from '../types/index.js';
 
/** Default retry configuration */
export const DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {
  maxRetries: 3,
  initialDelayMs: 1000,
  backoffMultiplier: 2,
  maxDelayMs: 30000,
};
 
/**
 * Calculate delay for a retry attempt using exponential backoff.
 */
export function calculateRetryDelay(
  attempt: number,
  config: Required<RetryConfig>
): number {
  const delay = config.initialDelayMs * Math.pow(config.backoffMultiplier, attempt);
  return Math.min(delay, config.maxDelayMs);
}
 
/**
 * Sleep for a specified duration, respecting abort signal.
 */
export async function sleep(ms: number, abortSignal?: AbortSignal): Promise<void> {
  return new Promise((resolve, reject) => {
    Iif (abortSignal?.aborted) {
      reject(new Error('Aborted'));
      return;
    }
 
    const timeout = setTimeout(resolve, ms);
 
    abortSignal?.addEventListener('abort', () => {
      clearTimeout(timeout);
      reject(new Error('Aborted'));
    }, { once: true });
  });
}