{"version":3,"file":"safe-operations.mjs","sources":["../../../src/lib/utils/safe-operations.ts"],"sourcesContent":["/**\n * @file Safe Operations\n * @description Enterprise-grade utilities for safe JSON parsing, operation timeouts,\n * and defensive coding patterns to prevent blocking and crashes\n */\n\nimport type React from 'react';\nimport { TimeoutError } from './resilience';\n\n/**\n * Result type for operations that can fail\n */\nexport type SafeResult<T, E = Error> = { success: true; data: T } | { success: false; error: E };\n\n/**\n * JSON parse error\n */\nexport class JSONParseError extends Error {\n  readonly isJSONParseError = true;\n  readonly originalValue: string;\n\n  constructor(message: string, originalValue: string) {\n    super(message);\n    this.name = 'JSONParseError';\n    this.originalValue = originalValue.substring(0, 100); // Truncate for safety\n  }\n}\n\n/**\n * Operation timeout error\n */\nexport class OperationTimeoutError extends TimeoutError {\n  readonly operationName: string;\n  readonly timeoutMs: number;\n\n  constructor(operationName: string, timeoutMs: number) {\n    super(`Operation '${operationName}' timed out after ${timeoutMs}ms`);\n    this.name = 'OperationTimeoutError';\n    this.operationName = operationName;\n    this.timeoutMs = timeoutMs;\n  }\n}\n\n// ============================================================================\n// Safe JSON Parsing\n// ============================================================================\n\n/**\n * Safely parse JSON with a fallback value\n *\n * @param value - The JSON string to parse\n * @param fallback - The fallback value if parsing fails\n * @returns The parsed value or fallback\n *\n * @example\n * ```typescript\n * const config = safeJSONParse(configString, { theme: 'light' });\n * ```\n */\nexport function safeJSONParse<T>(value: string, fallback: T): T {\n  try {\n    return JSON.parse(value) as T;\n  } catch {\n    return fallback;\n  }\n}\n\n/**\n * Parse JSON with detailed error information\n *\n * @param value - The JSON string to parse\n * @returns A SafeResult with parsed data or error\n *\n * @example\n * ```typescript\n * const result = parseJSONSafe<Config>(configString);\n * if (result.success) {\n *   useConfig(result.data);\n * } else {\n *   logError(result.error);\n * }\n * ```\n */\nexport function parseJSONSafe<T>(value: string): SafeResult<T, JSONParseError> {\n  try {\n    const data = JSON.parse(value) as T;\n    return { success: true, data };\n  } catch (error) {\n    const message = error instanceof Error ? error.message : 'Unknown parse error';\n    return {\n      success: false,\n      error: new JSONParseError(message, value),\n    };\n  }\n}\n\n/**\n * Parse JSON with validation\n *\n * @param value - The JSON string to parse\n * @param validator - A function to validate the parsed result\n * @param fallback - Optional fallback value if parsing or validation fails\n * @returns The validated parsed value, fallback, or throws\n *\n * @example\n * ```typescript\n * const config = parseJSONWithValidation(\n *   configString,\n *   (data): data is Config => 'theme' in data,\n *   defaultConfig\n * );\n * ```\n */\nexport function parseJSONWithValidation<T>(\n  value: string,\n  validator: (data: unknown) => data is T,\n  fallback?: T\n): T {\n  try {\n    const parsed = JSON.parse(value) as unknown;\n    if (validator(parsed)) {\n      return parsed;\n    }\n    if (fallback !== undefined) {\n      return fallback;\n    }\n    throw new JSONParseError('Parsed value failed validation', value);\n  } catch (error) {\n    if (fallback !== undefined) {\n      return fallback;\n    }\n    if (error instanceof JSONParseError) {\n      throw error;\n    }\n    throw new JSONParseError(error instanceof Error ? error.message : 'Unknown parse error', value);\n  }\n}\n\n/**\n * Stringify JSON safely with fallback\n *\n * @param value - The value to stringify\n * @param fallback - The fallback string if stringification fails\n * @returns The JSON string or fallback\n */\nexport function safeJSONStringify(value: unknown, fallback = '{}'): string {\n  try {\n    return JSON.stringify(value);\n  } catch {\n    return fallback;\n  }\n}\n\n// ============================================================================\n// Operation Timeouts\n// ============================================================================\n\n/**\n * Execute an async operation with timeout\n *\n * @param operation - The async operation to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param operationName - Name of the operation for error messages\n * @returns The operation result\n * @throws OperationTimeoutError if the operation times out\n *\n * @example\n * ```typescript\n * const data = await withOperationTimeout(\n *   () => fetchData(),\n *   5000,\n *   'fetchData'\n * );\n * ```\n */\nexport async function withOperationTimeout<T>(\n  operation: () => Promise<T>,\n  timeoutMs: number,\n  operationName = 'operation'\n): Promise<T> {\n  let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n  const timeoutPromise = new Promise<never>((_, reject) => {\n    timeoutId = setTimeout(() => {\n      reject(new OperationTimeoutError(operationName, timeoutMs));\n    }, timeoutMs);\n  });\n\n  try {\n\n    return await Promise.race([operation(), timeoutPromise]);\n  } finally {\n    if (timeoutId !== null) {\n      clearTimeout(timeoutId);\n    }\n  }\n}\n\n/**\n * Execute an async operation with timeout and fallback\n *\n * @param operation - The async operation to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param fallback - Fallback value if operation times out\n * @param operationName - Name of the operation for logging\n * @returns The operation result or fallback\n *\n * @example\n * ```typescript\n * const config = await withTimeoutFallback(\n *   () => fetchRemoteConfig(),\n *   5000,\n *   defaultConfig,\n *   'fetchRemoteConfig'\n * );\n * ```\n */\nexport async function withTimeoutFallback<T>(\n  operation: () => Promise<T>,\n  timeoutMs: number,\n  fallback: T,\n  operationName = 'operation'\n): Promise<T> {\n  try {\n    return await withOperationTimeout(operation, timeoutMs, operationName);\n  } catch (error) {\n    if (error instanceof OperationTimeoutError) {\n      console.warn(`[${operationName}] Timed out after ${timeoutMs}ms, using fallback`);\n      return fallback;\n    }\n    throw error;\n  }\n}\n\n/**\n * Execute a sync operation with timeout using a promise wrapper\n * Note: This doesn't actually interrupt the sync operation,\n * but provides timeout behavior for tracking purposes\n *\n * @param operation - The sync operation to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param operationName - Name of the operation\n */\nexport async function withSyncTimeout<T>(\n  operation: () => T,\n  timeoutMs: number,\n  operationName = 'operation'\n): Promise<T> {\n  return await withOperationTimeout(async () => operation(), timeoutMs, operationName);\n}\n\n// ============================================================================\n// Safe Storage Operations\n// ============================================================================\n\n/**\n * Safely get item from localStorage with fallback\n *\n * @param key - The storage key\n * @param fallback - The fallback value if retrieval fails\n * @returns The stored value or fallback\n */\nexport function safeLocalStorageGet<T>(key: string, fallback: T): T {\n  try {\n    if (typeof localStorage === 'undefined') {\n      return fallback;\n    }\n    const item = localStorage.getItem(key);\n    if (item === null) {\n      return fallback;\n    }\n    return safeJSONParse(item, fallback);\n  } catch {\n    // localStorage can throw in private browsing mode or when disabled\n    return fallback;\n  }\n}\n\n/**\n * Safely set item in localStorage\n *\n * @param key - The storage key\n * @param value - The value to store\n * @returns true if successful, false otherwise\n */\nexport function safeLocalStorageSet(key: string, value: unknown): boolean {\n  try {\n    if (typeof localStorage === 'undefined') {\n      return false;\n    }\n    localStorage.setItem(key, safeJSONStringify(value));\n    return true;\n  } catch (error) {\n    // Handle QuotaExceededError and other storage errors\n    if (error instanceof DOMException && error.name === 'QuotaExceededError') {\n      console.warn('[Storage] Quota exceeded for key:', key);\n    }\n    return false;\n  }\n}\n\n/**\n * Safely remove item from localStorage\n *\n * @param key - The storage key\n * @returns true if successful, false otherwise\n */\nexport function safeLocalStorageRemove(key: string): boolean {\n  try {\n    if (typeof localStorage === 'undefined') {\n      return false;\n    }\n    localStorage.removeItem(key);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Safely get item from sessionStorage with fallback\n */\nexport function safeSessionStorageGet<T>(key: string, fallback: T): T {\n  try {\n    if (typeof sessionStorage === 'undefined') {\n      return fallback;\n    }\n    const item = sessionStorage.getItem(key);\n    if (item === null) {\n      return fallback;\n    }\n    return safeJSONParse(item, fallback);\n  } catch {\n    return fallback;\n  }\n}\n\n/**\n * Safely set item in sessionStorage\n */\nexport function safeSessionStorageSet(key: string, value: unknown): boolean {\n  try {\n    if (typeof sessionStorage === 'undefined') {\n      return false;\n    }\n    sessionStorage.setItem(key, safeJSONStringify(value));\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n// ============================================================================\n// Safe Property Access\n// ============================================================================\n\n/**\n * Safely access a nested property with fallback\n *\n * @param obj - The object to access\n * @param path - The property path (e.g., 'user.profile.name')\n * @param fallback - The fallback value if access fails\n * @returns The property value or fallback\n *\n * @example\n * ```typescript\n * const name = safeGet(user, 'profile.name', 'Anonymous');\n * ```\n */\nexport function safeGet<T>(obj: unknown, path: string, fallback: T): T {\n  try {\n    const keys = path.split('.');\n    let current: unknown = obj;\n\n    for (const key of keys) {\n      if (current === null || current === undefined) {\n        return fallback;\n      }\n      current = (current as Record<string, unknown>)[key];\n    }\n\n    return current !== undefined ? (current as T) : fallback;\n  } catch {\n    return fallback;\n  }\n}\n\n// ============================================================================\n// Safe Function Execution\n// ============================================================================\n\n/**\n * Execute a function safely, catching any errors\n *\n * @param fn - The function to execute\n * @param fallback - The fallback value if execution fails\n * @param onError - Optional error handler\n * @returns The function result or fallback\n */\nexport function safeExecute<T>(fn: () => T, fallback: T, onError?: (error: unknown) => void): T {\n  try {\n    return fn();\n  } catch (error) {\n    onError?.(error);\n    return fallback;\n  }\n}\n\n/**\n * Execute an async function safely, catching any errors\n *\n * @param fn - The async function to execute\n * @param fallback - The fallback value if execution fails\n * @param onError - Optional error handler\n * @returns The function result or fallback\n */\nexport async function safeExecuteAsync<T>(\n  fn: () => Promise<T>,\n  fallback: T,\n  onError?: (error: unknown) => void\n): Promise<T> {\n  try {\n    return await fn();\n  } catch (error) {\n    onError?.(error);\n    return fallback;\n  }\n}\n\n// ============================================================================\n// Promise Utilities\n// ============================================================================\n\n/**\n * Execute multiple promises and collect results with errors\n * This is a wrapper around Promise.allSettled with better typing\n *\n * @param promises - Array of promises to execute\n * @returns Object with successful results and errors\n *\n * @example\n * ```typescript\n * const { results, errors } = await safePromiseAll([\n *   fetchUser(),\n *   fetchPosts(),\n *   fetchComments(),\n * ]);\n * ```\n */\nexport async function safePromiseAll<T>(promises: Promise<T>[]): Promise<{\n  results: T[];\n  errors: { index: number; error: unknown }[];\n  allSucceeded: boolean;\n}> {\n  const settled = await Promise.allSettled(promises);\n\n  const results: T[] = [];\n  const errors: { index: number; error: unknown }[] = [];\n\n  settled.forEach((result, index) => {\n    if (result.status === 'fulfilled') {\n      results.push(result.value);\n    } else {\n      errors.push({ index, error: result.reason });\n    }\n  });\n\n  return {\n    results,\n    errors,\n    allSucceeded: errors.length === 0,\n  };\n}\n\n/**\n * Execute multiple named promises and collect results with errors\n *\n * @param namedPromises - Object with named promises\n * @returns Object with results, errors, and success status\n *\n * @example\n * ```typescript\n * const { results, errors } = await safePromiseAllNamed({\n *   user: fetchUser(),\n *   posts: fetchPosts(),\n *   comments: fetchComments(),\n * });\n *\n * if (results.user) {\n *   // User was fetched successfully\n * }\n * ```\n */\nexport async function safePromiseAllNamed<T extends Record<string, Promise<unknown>>>(\n  namedPromises: T\n): Promise<{\n  results: { [K in keyof T]?: Awaited<T[K]> };\n  errors: { [K in keyof T]?: unknown };\n  allSucceeded: boolean;\n}> {\n  const keys = Object.keys(namedPromises) as (keyof T)[];\n  const promises = keys.map((key) => namedPromises[key]);\n\n  const settled = await Promise.allSettled(promises);\n\n  const results: { [K in keyof T]?: Awaited<T[K]> } = {};\n  const errors: { [K in keyof T]?: unknown } = {};\n\n  settled.forEach((result, index) => {\n    const key = keys[index];\n    if (key !== undefined) {\n      if (result.status === 'fulfilled') {\n        results[key] = result.value as Awaited<T[typeof key]>;\n      } else {\n        errors[key] = result.reason as unknown;\n      }\n    }\n  });\n\n  return {\n    results,\n    errors,\n    allSucceeded: Object.keys(errors).length === 0,\n  };\n}\n\n// ============================================================================\n// Event Handler Safety\n// ============================================================================\n\n/**\n * Create a safe event handler that catches errors\n *\n * @param handler - The event handler function\n * @param onError - Optional error handler\n * @returns A wrapped handler that catches errors\n *\n * @example\n * ```typescript\n * <button onClick={createSafeHandler(handleClick, reportError)}>\n *   Click me\n * </button>\n * ```\n */\nexport function createSafeHandler<E extends Event>(\n  handler: (event: E) => void | Promise<void>,\n  onError?: (error: unknown, event: E) => void\n): (event: E) => void {\n  return (event: E) => {\n    try {\n      const result = handler(event);\n      if (result instanceof Promise) {\n        result.catch((error) => {\n          onError?.(error, event);\n        });\n      }\n    } catch (error) {\n      onError?.(error, event);\n    }\n  };\n}\n\n/**\n * Create a safe React event handler\n */\nexport function createSafeReactHandler<E extends React.SyntheticEvent>(\n  handler: (event: E) => void | Promise<void>,\n  onError?: (error: unknown, event: E) => void\n): (event: E) => void {\n  return (event: E) => {\n    try {\n      const result = handler(event);\n      if (result instanceof Promise) {\n        result.catch((error) => {\n          onError?.(error, event);\n        });\n      }\n    } catch (error) {\n      onError?.(error, event);\n    }\n  };\n}\n"],"names":["JSONParseError","message","originalValue","OperationTimeoutError","TimeoutError","operationName","timeoutMs","safeJSONParse","value","fallback","parseJSONSafe","error","parseJSONWithValidation","validator","parsed","safeJSONStringify","withOperationTimeout","operation","timeoutId","timeoutPromise","_","reject","withTimeoutFallback","withSyncTimeout","safeLocalStorageGet","key","item","safeLocalStorageSet","safeLocalStorageRemove","safeSessionStorageGet","safeSessionStorageSet","safeGet","obj","path","keys","current","safeExecute","fn","onError","safeExecuteAsync","safePromiseAll","promises","settled","results","errors","result","index","safePromiseAllNamed","namedPromises","createSafeHandler","handler","event","createSafeReactHandler"],"mappings":"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"}