{"version":3,"file":"timing.constants.mjs","sources":["../../src/config/timing.constants.ts"],"sourcesContent":["/**\n * @file Timing Constants\n * @description Centralized timing values to eliminate magic numbers.\n *\n * This module consolidates all timing-related constants used across the application:\n * - Query stale times and garbage collection times\n * - API request timeouts\n * - Authentication timing (token refresh, session timeout)\n * - UI timing (debounce, animations, toasts)\n * - Background task intervals\n *\n * USAGE:\n * ```typescript\n * import { TIMING } from '@/config';\n *\n * // Use in queries\n * staleTime: TIMING.QUERY.STALE.MEDIUM,\n *\n * // Use in debounce\n * useDebouncedValue(value, TIMING.UI.DEBOUNCE.INPUT);\n *\n * // Use in API calls\n * timeout: TIMING.API.TIMEOUT,\n * ```\n */\n\n// =============================================================================\n// Time Unit Helpers (for readability)\n// =============================================================================\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\n\n// =============================================================================\n// Query Timing\n// =============================================================================\n\n/**\n * React Query stale time configurations\n *\n * Stale time determines how long data is considered \"fresh\" before\n * React Query will refetch it in the background.\n */\nexport const QUERY_STALE_TIMES = {\n  /** Real-time data (30 seconds) - live dashboards, active sessions */\n  REALTIME: 30 * SECOND,\n\n  /** Frequently changing data (1 minute) - activity feeds, notifications */\n  SHORT: MINUTE,\n\n  /** Standard data (5 minutes) - lists, user data */\n  MEDIUM: 5 * MINUTE,\n\n  /** Slowly changing data (10 minutes) - reports, analytics */\n  LONG: 10 * MINUTE,\n\n  /** Reference data (30 minutes) - config, static lookups */\n  EXTENDED: 30 * MINUTE,\n\n  /** Static data (1 hour) - rarely changes */\n  STATIC: HOUR,\n} as const;\n\n/**\n * React Query garbage collection times\n *\n * GC time determines how long unused data is kept in cache before\n * being garbage collected.\n */\nexport const QUERY_GC_TIMES = {\n  /** Quick cleanup (5 minutes) */\n  SHORT: 5 * MINUTE,\n\n  /** Standard cleanup (30 minutes) */\n  MEDIUM: 30 * MINUTE,\n\n  /** Extended cache (1 hour) */\n  LONG: HOUR,\n} as const;\n\n// =============================================================================\n// API Timing\n// =============================================================================\n\n/**\n * API request configuration\n */\nexport const API_TIMING = {\n  /** Default request timeout (30 seconds) */\n  TIMEOUT: 30 * SECOND,\n\n  /** Long-running request timeout (2 minutes) - file uploads, reports */\n  TIMEOUT_LONG: 2 * MINUTE,\n\n  /** Short timeout for quick endpoints (10 seconds) */\n  TIMEOUT_SHORT: 10 * SECOND,\n\n  /** Very short timeout for health checks (5 seconds) */\n  TIMEOUT_HEALTH: 5 * SECOND,\n\n  /** Retry delays (exponential backoff base) */\n  RETRY_BASE_DELAY: SECOND,\n\n  /** Maximum retry delay */\n  RETRY_MAX_DELAY: 30 * SECOND,\n} as const;\n\n// =============================================================================\n// Authentication Timing\n// =============================================================================\n\n/**\n * Authentication-related timing\n */\nexport const AUTH_TIMING = {\n  /** Token refresh buffer (refresh 5 min before expiry) */\n  TOKEN_EXPIRY_BUFFER: 5 * MINUTE,\n\n  /** Session timeout (30 min inactivity) */\n  SESSION_TIMEOUT: 30 * MINUTE,\n\n  /** Account lockout duration after failed attempts */\n  LOCKOUT_DURATION: 15 * MINUTE,\n\n  /** Token refresh interval */\n  REFRESH_INTERVAL: 5 * MINUTE,\n\n  /** Redirect delay after logout */\n  LOGOUT_REDIRECT_DELAY: 1500,\n\n  /** Token validation check interval */\n  TOKEN_CHECK_INTERVAL: MINUTE,\n} as const;\n\n// =============================================================================\n// UI Timing\n// =============================================================================\n\n/**\n * UI interaction timing\n */\nexport const UI_TIMING = {\n  /** Debounce configurations */\n  DEBOUNCE: {\n    /** Fast debounce (100ms) - immediate feedback */\n    FAST: 100,\n\n    /** Input debounce (300ms) - search, filters */\n    INPUT: 300,\n\n    /** Form debounce (500ms) - form validation */\n    FORM: 500,\n\n    /** Resize debounce (150ms) - window resize */\n    RESIZE: 150,\n\n    /** Scroll debounce (100ms) - scroll handlers */\n    SCROLL: 100,\n  },\n\n  /** Throttle configurations */\n  THROTTLE: {\n    /** Fast throttle (100ms) */\n    FAST: 100,\n\n    /** Standard throttle (200ms) */\n    STANDARD: 200,\n\n    /** Scroll throttle (16ms - ~60fps) */\n    SCROLL: 16,\n  },\n\n  /** Animation durations */\n  ANIMATION: {\n    /** Instant (0ms) - no animation */\n    INSTANT: 0,\n\n    /** Fast animations (100ms) */\n    FAST: 100,\n\n    /** Standard animations (200ms) */\n    STANDARD: 200,\n\n    /** Slow animations (300ms) */\n    SLOW: 300,\n\n    /** Page transitions (400ms) */\n    PAGE: 400,\n\n    /** Modal transitions (250ms) */\n    MODAL: 250,\n  },\n\n  /** Toast/notification durations */\n  TOAST: {\n    /** Short toast (3 seconds) */\n    SHORT: 3 * SECOND,\n\n    /** Standard toast (5 seconds) */\n    STANDARD: 5 * SECOND,\n\n    /** Long toast (8 seconds) */\n    LONG: 8 * SECOND,\n\n    /** Error toast (10 seconds) - more time to read */\n    ERROR: 10 * SECOND,\n\n    /** Persistent (0 = manual dismiss) */\n    PERSISTENT: 0,\n  },\n\n  /** Loading state delays */\n  LOADING: {\n    /** Delay before showing spinner (prevents flash) */\n    SPINNER_DELAY: 200,\n\n    /** Minimum loading display time */\n    MIN_DISPLAY: 500,\n\n    /** Skeleton placeholder delay */\n    SKELETON_DELAY: 100,\n  },\n\n  /** Focus management */\n  FOCUS: {\n    /** Delay for focus trap initialization */\n    TRAP_DELAY: 50,\n\n    /** Delay for auto-focus */\n    AUTO_DELAY: 100,\n  },\n} as const;\n\n// =============================================================================\n// Polling & Background Tasks\n// =============================================================================\n\n/**\n * Background task timing\n */\nexport const BACKGROUND_TIMING = {\n  /** Polling intervals */\n  POLL: {\n    /** Fast polling (10 seconds) - real-time updates */\n    FAST: 10 * SECOND,\n\n    /** Standard polling (30 seconds) */\n    STANDARD: 30 * SECOND,\n\n    /** Slow polling (1 minute) */\n    SLOW: MINUTE,\n\n    /** Very slow polling (5 minutes) */\n    VERY_SLOW: 5 * MINUTE,\n  },\n\n  /** Auto-save interval */\n  AUTOSAVE: 30 * SECOND,\n\n  /** Heartbeat interval for connection keep-alive */\n  HEARTBEAT: 30 * SECOND,\n\n  /** Performance metrics flush interval */\n  METRICS_FLUSH: 30 * SECOND,\n\n  /** Cache cleanup interval */\n  CACHE_CLEANUP: 5 * MINUTE,\n\n  /** WebSocket ping interval */\n  WS_PING: 25 * SECOND,\n\n  /** SSE reconnection delay */\n  SSE_RECONNECT: 5 * SECOND,\n} as const;\n\n// =============================================================================\n// Retry Configuration\n// =============================================================================\n\n/**\n * Retry attempt configurations\n */\nexport const RETRY_CONFIG = {\n  /** Default retry attempts */\n  DEFAULT_ATTEMPTS: 3,\n\n  /** API retry attempts */\n  API_ATTEMPTS: 3,\n\n  /** Auth refresh retry attempts */\n  AUTH_ATTEMPTS: 2,\n\n  /** File upload retry attempts */\n  UPLOAD_ATTEMPTS: 2,\n\n  /** WebSocket reconnection attempts */\n  WEBSOCKET_ATTEMPTS: 5,\n\n  /** SSE reconnection attempts */\n  SSE_ATTEMPTS: 10,\n\n  /** Mutation retry attempts */\n  MUTATION_ATTEMPTS: 1,\n} as const;\n\n// =============================================================================\n// Rate Limiting\n// =============================================================================\n\n/**\n * Rate limiting configurations\n */\nexport const RATE_LIMIT = {\n  /** Maximum requests per minute for API calls */\n  API_REQUESTS_PER_MINUTE: 60,\n\n  /** Maximum search requests per second */\n  SEARCH_REQUESTS_PER_SECOND: 2,\n\n  /** Maximum file uploads per minute */\n  UPLOADS_PER_MINUTE: 10,\n\n  /** Cool-down after rate limit hit */\n  COOLDOWN: 60 * SECOND,\n} as const;\n\n// =============================================================================\n// Aggregated Export\n// =============================================================================\n\n/**\n * All timing constants aggregated for convenient access\n *\n * @example\n * ```typescript\n * import { TIMING } from '@/config';\n *\n * // Query timing\n * const staleTime = TIMING.QUERY.STALE.MEDIUM;\n *\n * // API timing\n * const timeout = TIMING.API.TIMEOUT;\n *\n * // UI timing\n * const debounce = TIMING.UI.DEBOUNCE.INPUT;\n * ```\n */\nexport const TIMING = {\n  QUERY: {\n    STALE: QUERY_STALE_TIMES,\n    GC: QUERY_GC_TIMES,\n  },\n  API: API_TIMING,\n  AUTH: AUTH_TIMING,\n  UI: UI_TIMING,\n  BACKGROUND: BACKGROUND_TIMING,\n  RETRY: RETRY_CONFIG,\n  RATE_LIMIT,\n} as const;\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\nexport type QueryStaleTime = (typeof QUERY_STALE_TIMES)[keyof typeof QUERY_STALE_TIMES];\nexport type QueryGcTime = (typeof QUERY_GC_TIMES)[keyof typeof QUERY_GC_TIMES];\nexport type ApiTimeout = (typeof API_TIMING)[keyof typeof API_TIMING];\nexport type ToastDuration = (typeof UI_TIMING.TOAST)[keyof typeof UI_TIMING.TOAST];\nexport type DebounceDuration = (typeof UI_TIMING.DEBOUNCE)[keyof typeof UI_TIMING.DEBOUNCE];\nexport type AnimationDuration = (typeof UI_TIMING.ANIMATION)[keyof typeof UI_TIMING.ANIMATION];\nexport type PollingInterval = (typeof BACKGROUND_TIMING.POLL)[keyof typeof BACKGROUND_TIMING.POLL];\nexport type RetryAttempts = (typeof RETRY_CONFIG)[keyof typeof RETRY_CONFIG];\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Convert milliseconds to a human-readable duration string\n *\n * @example\n * ```typescript\n * formatDuration(TIMING.QUERY.STALE.MEDIUM); // \"5 minutes\"\n * formatDuration(TIMING.API.TIMEOUT); // \"30 seconds\"\n * ```\n */\nexport function formatDuration(ms: number): string {\n  if (ms === 0) return 'instant';\n  if (ms < SECOND) return `${ms}ms`;\n  if (ms < MINUTE) return `${ms / SECOND} seconds`;\n  if (ms < HOUR) return `${ms / MINUTE} minutes`;\n  return `${ms / HOUR} hours`;\n}\n\n/**\n * Calculate exponential backoff delay\n *\n * @param attempt - Current attempt number (0-indexed)\n * @param baseDelay - Base delay in ms (default: API_TIMING.RETRY_BASE_DELAY)\n * @param maxDelay - Maximum delay in ms (default: API_TIMING.RETRY_MAX_DELAY)\n * @returns Delay in milliseconds\n *\n * @example\n * ```typescript\n * calculateBackoff(0); // 1000ms\n * calculateBackoff(1); // 2000ms\n * calculateBackoff(2); // 4000ms\n * calculateBackoff(3); // 8000ms\n * calculateBackoff(4); // 16000ms\n * calculateBackoff(5); // 30000ms (capped at max)\n * ```\n */\nexport function calculateBackoff(\n  attempt: number,\n  baseDelay: number = API_TIMING.RETRY_BASE_DELAY,\n  maxDelay: number = API_TIMING.RETRY_MAX_DELAY\n): number {\n  const delay = baseDelay * Math.pow(2, attempt);\n  return Math.min(delay, maxDelay);\n}\n\n/**\n * Calculate exponential backoff with jitter\n *\n * Adds random jitter to prevent thundering herd problem\n *\n * @param attempt - Current attempt number (0-indexed)\n * @param baseDelay - Base delay in ms\n * @param maxDelay - Maximum delay in ms\n * @returns Delay in milliseconds with jitter applied\n */\nexport function calculateBackoffWithJitter(\n  attempt: number,\n  baseDelay: number = API_TIMING.RETRY_BASE_DELAY,\n  maxDelay: number = API_TIMING.RETRY_MAX_DELAY\n): number {\n  const backoff = calculateBackoff(attempt, baseDelay, maxDelay);\n  // Add up to 25% random jitter\n  const jitter = backoff * 0.25 * Math.random();\n  return Math.floor(backoff + jitter);\n}\n"],"names":["QUERY_STALE_TIMES","QUERY_GC_TIMES","API_TIMING","AUTH_TIMING","UI_TIMING","BACKGROUND_TIMING","RETRY_CONFIG","RATE_LIMIT","TIMING","calculateBackoff","attempt","baseDelay","maxDelay","delay","calculateBackoffWithJitter","backoff","jitter"],"mappings":"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"}