{"version":3,"file":"ProviderErrorBoundary.mjs","sources":["../../../src/lib/monitoring/ProviderErrorBoundary.tsx"],"sourcesContent":["/**\n * @file Provider Error Boundary\n * @description Enterprise-grade error boundaries for React providers/context\n * to prevent provider initialization failures from crashing the entire app\n */\n\nimport React, {\n  Component,\n  type ReactNode,\n  type ErrorInfo,\n  type ComponentType,\n} from 'react';\nimport { ErrorReporter } from './ErrorReporter';\nimport { normalizeError, getUserFriendlyMessage } from './errorTypes';\nimport type { AppError } from './errorTypes';\n\n/**\n * Provider error boundary configuration\n */\nexport interface ProviderErrorBoundaryConfig {\n  /** Provider name for error reporting */\n  providerName: string;\n  /** Custom fallback component */\n  fallback?: ReactNode | ((error: AppError, retry: () => void) => ReactNode);\n  /** Error callback */\n  onError?: (error: AppError, errorInfo: ErrorInfo) => void;\n  /** Whether this provider is critical (blocks app render) */\n  critical?: boolean;\n  /** Maximum auto-retry attempts */\n  maxRetries?: number;\n  /** Auto-retry delay in ms */\n  retryDelay?: number;\n  /** Fallback value for the provider context */\n  fallbackValue?: unknown;\n  /** Show error details in development */\n  showDetails?: boolean;\n}\n\n/**\n * Provider error boundary props\n */\nexport interface ProviderErrorBoundaryProps extends ProviderErrorBoundaryConfig {\n  children: ReactNode;\n}\n\n/**\n * Provider error boundary state\n */\ninterface ProviderErrorBoundaryState {\n  hasError: boolean;\n  error: AppError | null;\n  retryCount: number;\n  isRetrying: boolean;\n}\n\n/**\n * Default fallback for provider errors\n */\nfunction DefaultProviderFallback({\n  error,\n  providerName,\n  onRetry,\n  isRetrying,\n  retryCount,\n  maxRetries,\n  showDetails,\n}: {\n  error: AppError;\n  providerName: string;\n  onRetry: () => void;\n  isRetrying: boolean;\n  retryCount: number;\n  maxRetries: number;\n  showDetails?: boolean;\n}): React.ReactElement {\n  const canRetry = retryCount < maxRetries;\n\n  return (\n    <div\n      role=\"alert\"\n      style={{\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center',\n        minHeight: '100vh',\n        padding: '2rem',\n        textAlign: 'center',\n        backgroundColor: '#fef2f2',\n        fontFamily: 'system-ui, -apple-system, sans-serif',\n      }}\n    >\n      <div\n        style={{\n          maxWidth: '32rem',\n          padding: '2rem',\n          backgroundColor: 'white',\n          borderRadius: '0.5rem',\n          boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)',\n        }}\n      >\n        <h1\n          style={{\n            fontSize: '1.5rem',\n            fontWeight: 'bold',\n            color: '#dc2626',\n            marginBottom: '0.5rem',\n          }}\n        >\n          Initialization Error\n        </h1>\n\n        <p\n          style={{\n            fontSize: '0.875rem',\n            color: '#6b7280',\n            marginBottom: '1rem',\n          }}\n        >\n          The <strong>{providerName}</strong> failed to initialize.\n        </p>\n\n        <p\n          style={{\n            color: '#6b7280',\n            marginBottom: '1.5rem',\n          }}\n        >\n          {getUserFriendlyMessage(error)}\n        </p>\n\n        {showDetails && error.stack && (\n          <pre\n            style={{\n              textAlign: 'left',\n              fontSize: '0.75rem',\n              padding: '1rem',\n              backgroundColor: '#f3f4f6',\n              borderRadius: '0.25rem',\n              overflow: 'auto',\n              maxHeight: '12rem',\n              marginBottom: '1.5rem',\n            }}\n          >\n            {error.stack}\n          </pre>\n        )}\n\n        {retryCount > 0 && (\n          <p\n            style={{\n              fontSize: '0.75rem',\n              color: '#9ca3af',\n              marginBottom: '1rem',\n            }}\n          >\n            Retry attempts: {retryCount} / {maxRetries}\n          </p>\n        )}\n\n        <div style={{ display: 'flex', gap: '0.75rem', justifyContent: 'center' }}>\n          {canRetry && (\n            <button\n              onClick={onRetry}\n              disabled={isRetrying}\n              style={{\n                padding: '0.5rem 1rem',\n                backgroundColor: isRetrying ? '#9ca3af' : '#3b82f6',\n                color: 'white',\n                border: 'none',\n                borderRadius: '0.375rem',\n                cursor: isRetrying ? 'not-allowed' : 'pointer',\n                fontWeight: '500',\n              }}\n            >\n              {isRetrying ? 'Retrying...' : 'Try Again'}\n            </button>\n          )}\n\n          <button\n            onClick={() => window.location.reload()}\n            style={{\n              padding: '0.5rem 1rem',\n              backgroundColor: '#6b7280',\n              color: 'white',\n              border: 'none',\n              borderRadius: '0.375rem',\n              cursor: 'pointer',\n              fontWeight: '500',\n            }}\n          >\n            Reload Page\n          </button>\n        </div>\n\n        <p\n          style={{\n            fontSize: '0.75rem',\n            color: '#9ca3af',\n            marginTop: '1rem',\n          }}\n        >\n          Error ID: {error.id}\n        </p>\n      </div>\n    </div>\n  );\n}\n\n/**\n * Provider Error Boundary Component\n *\n * Wraps React providers/context to catch initialization errors\n * and prevent them from crashing the entire application.\n *\n * @example\n * ```tsx\n * <ProviderErrorBoundary providerName=\"AuthProvider\">\n *   <AuthProvider>\n *     {children}\n *   </AuthProvider>\n * </ProviderErrorBoundary>\n * ```\n */\nexport class ProviderErrorBoundary extends Component<\n  ProviderErrorBoundaryProps,\n  ProviderErrorBoundaryState\n> {\n  private retryTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n  constructor(props: ProviderErrorBoundaryProps) {\n    super(props);\n    this.state = {\n      hasError: false,\n      error: null,\n      retryCount: 0,\n      isRetrying: false,\n    };\n  }\n\n  static getDerivedStateFromError(error: Error): Partial<ProviderErrorBoundaryState> {\n    return {\n      hasError: true,\n      error: normalizeError(error),\n    };\n  }\n\n  override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n    const { providerName, onError, maxRetries = 3, retryDelay = 2000 } = this.props;\n    const appError = normalizeError(error);\n\n    // Report to error monitoring with provider context\n    ErrorReporter.reportError(error, {\n      component: providerName,\n      action: 'provider_initialization_error',\n      metadata: {\n        providerName,\n        componentStack: errorInfo.componentStack,\n        retryCount: this.state.retryCount,\n        isCritical: this.props.critical ?? true,\n      },\n    });\n\n    // Notify error callback\n    onError?.(appError, errorInfo);\n\n    // Attempt auto-retry if configured\n    if (this.state.retryCount < maxRetries) {\n      this.scheduleAutoRetry(retryDelay);\n    }\n  }\n\n  override componentWillUnmount(): void {\n    if (this.retryTimeoutId) {\n      clearTimeout(this.retryTimeoutId);\n    }\n  }\n\n  override render(): ReactNode {\n    const {\n      children,\n      providerName,\n      fallback,\n      maxRetries = 3,\n      showDetails,\n    } = this.props;\n    const { hasError, error, retryCount, isRetrying } = this.state;\n\n    if (hasError && error) {\n      if (typeof fallback === 'function') {\n        return fallback(error, this.handleRetry);\n      }\n\n      if (fallback !== undefined) {\n        return fallback;\n      }\n\n      return (\n        <DefaultProviderFallback\n          error={error}\n          providerName={providerName}\n          onRetry={this.handleRetry}\n          isRetrying={isRetrying}\n          retryCount={retryCount}\n          maxRetries={maxRetries}\n          showDetails={showDetails}\n        />\n      );\n    }\n\n    return children;\n  }\n\n  private scheduleAutoRetry(delay: number): void {\n    if (this.retryTimeoutId) {\n      clearTimeout(this.retryTimeoutId);\n    }\n\n    this.retryTimeoutId = setTimeout(() => {\n      this.handleRetry();\n    }, delay * Math.pow(1.5, this.state.retryCount)); // Exponential backoff\n  }\n\n  private handleRetry = (): void => {\n    this.setState((prev) => ({\n      hasError: false,\n      error: null,\n      retryCount: prev.retryCount + 1,\n      isRetrying: true,\n    }));\n\n    // Reset isRetrying after a short delay\n    setTimeout(() => {\n      this.setState({ isRetrying: false });\n    }, 100);\n  };\n}\n\n/**\n * HOC to wrap a provider component with error boundary\n *\n * @example\n * ```tsx\n * const SafeAuthProvider = withProviderErrorBoundary(AuthProvider, {\n *   providerName: 'AuthProvider',\n *   critical: true,\n * });\n * ```\n */\nexport function withProviderErrorBoundary<P extends object>(\n  ProviderComponent: ComponentType<P>,\n  config: ProviderErrorBoundaryConfig\n): ComponentType<P> {\n  const { displayName: componentDisplayName, name: componentName } = ProviderComponent;\n\n  let displayName = config.providerName;\n  if (!displayName) {\n    if (componentDisplayName != null && componentDisplayName !== '') {\n      displayName = componentDisplayName;\n    } else if (componentName != null && componentName !== '') {\n      displayName = componentName;\n    } else {\n      displayName = 'UnknownProvider';\n    }\n  }\n\n  function SafeProvider(props: P): React.ReactElement {\n    return (\n      <ProviderErrorBoundary {...config} providerName={displayName}>\n        <ProviderComponent {...props} />\n      </ProviderErrorBoundary>\n    );\n  }\n\n  SafeProvider.displayName = `withProviderErrorBoundary(${displayName})`;\n\n  return SafeProvider;\n}\n\n/**\n * Pre-configured provider boundaries for common providers\n */\nexport function AuthProviderBoundary({\n  children,\n  ...props\n}: Omit<ProviderErrorBoundaryProps, 'providerName'>): React.ReactElement {\n  return (\n    <ProviderErrorBoundary\n      providerName=\"AuthProvider\"\n      critical={true}\n      maxRetries={2}\n      {...props}\n    >\n      {children}\n    </ProviderErrorBoundary>\n  );\n}\n\nexport function ConfigProviderBoundary({\n  children,\n  ...props\n}: Omit<ProviderErrorBoundaryProps, 'providerName'>): React.ReactElement {\n  return (\n    <ProviderErrorBoundary\n      providerName=\"ConfigProvider\"\n      critical={true}\n      maxRetries={3}\n      {...props}\n    >\n      {children}\n    </ProviderErrorBoundary>\n  );\n}\n\nexport function RealtimeProviderBoundary({\n  children,\n  ...props\n}: Omit<ProviderErrorBoundaryProps, 'providerName'>): React.ReactElement {\n  return (\n    <ProviderErrorBoundary\n      providerName=\"RealtimeProvider\"\n      critical={false}\n      maxRetries={3}\n      {...props}\n    >\n      {children}\n    </ProviderErrorBoundary>\n  );\n}\n\nexport function SecurityProviderBoundary({\n  children,\n  ...props\n}: Omit<ProviderErrorBoundaryProps, 'providerName'>): React.ReactElement {\n  return (\n    <ProviderErrorBoundary\n      providerName=\"SecurityProvider\"\n      critical={true}\n      maxRetries={2}\n      {...props}\n    >\n      {children}\n    </ProviderErrorBoundary>\n  );\n}\n"],"names":["DefaultProviderFallback","error","providerName","onRetry","isRetrying","retryCount","maxRetries","showDetails","canRetry","jsx","jsxs","ProviderErrorBoundary","Component","props","normalizeError","errorInfo","onError","retryDelay","appError","ErrorReporter","children","fallback","hasError","delay","prev","withProviderErrorBoundary","ProviderComponent","config","componentDisplayName","componentName","displayName","SafeProvider","AuthProviderBoundary","ConfigProviderBoundary","RealtimeProviderBoundary","SecurityProviderBoundary"],"mappings":"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"}