{"version":3,"file":"StreamBoundary.mjs","sources":["../../../src/lib/streaming/StreamBoundary.tsx"],"sourcesContent":["/* @refresh reset */\n/**\n * @file Stream Boundary Component\n * @description React component that defines streaming boundaries for progressive HTML delivery.\n *\n * StreamBoundary is the primary building block for streaming architecture,\n * marking regions of the component tree for independent streaming with\n * configurable priority, placeholders, and lifecycle callbacks.\n *\n * @module streaming/StreamBoundary\n * @version 1.0.0\n * @author Harbor Framework Team\n *\n * @example\n * ```tsx\n * // Critical above-the-fold content\n * <StreamBoundary\n *   id=\"hero\"\n *   priority=\"critical\"\n *   placeholder={<HeroSkeleton />}\n * >\n *   <HeroSection />\n * </StreamBoundary>\n *\n * // Deferred below-the-fold content\n * <StreamBoundary\n *   id=\"comments\"\n *   priority=\"low\"\n *   deferMs={100}\n *   placeholder={<CommentsSkeleton />}\n * >\n *   <CommentsSection />\n * </StreamBoundary>\n * ```\n */\n\nimport type React from 'react';\nimport type { ReactNode } from 'react';\nimport { Suspense, useEffect, useId, useRef, useState, useCallback, useMemo, memo } from 'react';\n\nimport { useStreamContext, useOptionalStreamContext } from './StreamProvider';\n\nimport {\n  type StreamBoundaryProps,\n  type StreamConfig,\n  type StreamError,\n  StreamState,\n  StreamPriority,\n  StreamEventType,\n} from './types';\n\n// ============================================================================\n// Placeholder Components\n// ============================================================================\n\n/**\n * Default placeholder component for streaming boundaries.\n *\n * @description\n * A minimal placeholder with CSS animation that matches\n * the skeleton pattern used throughout the application.\n */\nfunction DefaultPlaceholder(): React.ReactElement {\n  return (\n    <div\n      className=\"stream-boundary-placeholder\"\n      role=\"status\"\n      aria-label=\"Loading content\"\n      style={{\n        minHeight: '100px',\n        background: 'linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%)',\n        backgroundSize: '200% 100%',\n        animation: 'stream-placeholder-shimmer 1.5s ease-in-out infinite',\n        borderRadius: '4px',\n      }}\n    >\n      <style>\n        {`\n          @keyframes stream-placeholder-shimmer {\n            0% { background-position: 200% 0; }\n            100% { background-position: -200% 0; }\n          }\n        `}\n      </style>\n      <span className=\"sr-only\">Loading...</span>\n    </div>\n  );\n}\n\n/**\n * Fallback component for non-streaming environments.\n *\n * @description\n * Renders when streaming is not supported, providing\n * a graceful degradation path.\n */\ninterface NonStreamingFallbackProps {\n  children: ReactNode;\n  fallback?: ReactNode;\n}\n\nfunction NonStreamingFallback({\n  children,\n  fallback,\n}: NonStreamingFallbackProps): React.ReactElement {\n  if (fallback != null) {\n    return <>{fallback}</>;\n  }\n\n  return <Suspense fallback={<DefaultPlaceholder />}>{children}</Suspense>;\n}\n\n// ============================================================================\n// Stream Boundary Wrapper\n// ============================================================================\n\n/**\n * Internal wrapper that handles the actual streaming logic.\n */\ninterface StreamBoundaryWrapperProps extends StreamBoundaryProps {\n  generatedId: string;\n}\n\nfunction StreamBoundaryWrapper({\n  generatedId,\n  id,\n  children,\n  priority = StreamPriority.Normal,\n  deferMs,\n  timeoutMs,\n  placeholder,\n  fallback,\n  ssr = true,\n  onStreamStart,\n  onStreamComplete,\n  onStreamError,\n  className,\n  testId,\n}: StreamBoundaryWrapperProps): React.ReactElement {\n  const boundaryId = id ?? generatedId;\n  const stream = useStreamContext();\n  const [state, setState] = useState<StreamState>(StreamState.Idle);\n  const [error, setError] = useState<StreamError | null>(null);\n  const isRegistered = useRef(false);\n  const mountedRef = useRef(true);\n\n  // Create stream configuration\n  const config = useMemo<StreamConfig>(\n    () => ({\n      priority: priority as StreamPriority,\n      deferMs,\n      timeoutMs,\n      placeholder,\n      fallback,\n      ssr,\n      onStreamStart: () => {\n        if (mountedRef.current) {\n          setState(StreamState.Streaming);\n          onStreamStart?.();\n        }\n      },\n      onStreamComplete: () => {\n        if (mountedRef.current) {\n          setState(StreamState.Completed);\n          onStreamComplete?.();\n        }\n      },\n      onStreamError: (err: StreamError) => {\n        if (mountedRef.current) {\n          setState(StreamState.Error);\n          setError(err);\n          onStreamError?.(err);\n        }\n      },\n      onStreamAbort: () => {\n        if (mountedRef.current) {\n          setState(StreamState.Aborted);\n        }\n      },\n    }),\n    [\n      priority,\n      deferMs,\n      timeoutMs,\n      placeholder,\n      fallback,\n      ssr,\n      onStreamStart,\n      onStreamComplete,\n      onStreamError,\n    ]\n  );\n\n  // Register boundary on mount\n  useEffect(() => {\n    mountedRef.current = true;\n\n    if (!isRegistered.current) {\n      try {\n        stream.registerBoundary(boundaryId, config);\n        isRegistered.current = true;\n\n        // Auto-start if not SSR\n        if (!stream.isSSR) {\n          stream.startStream(boundaryId);\n        }\n      } catch (err) {\n        console.error(`[StreamBoundary] Failed to register boundary \"${boundaryId}\":`, err);\n      }\n    }\n\n    // Subscribe to state changes\n    const unsubscribe = stream.subscribe((event) => {\n      if (event.boundaryId !== boundaryId || !mountedRef.current) return;\n\n      if (event.type === StreamEventType.StateChange) {\n        const payload = event.payload as { from: StreamState; to: StreamState };\n        setState(payload.to);\n      }\n    });\n\n    return () => {\n      mountedRef.current = false;\n      unsubscribe();\n      stream.unregisterBoundary(boundaryId);\n      isRegistered.current = false;\n    };\n  }, [boundaryId, config, stream]);\n\n  // Handle retry after error\n  const handleRetry = useCallback(() => {\n    setError(null);\n    setState(StreamState.Idle);\n    stream.startStream(boundaryId);\n  }, [boundaryId, stream]);\n\n  // ==========================================================================\n  // Render Logic\n  // ==========================================================================\n\n  // Error state\n  if (state === StreamState.Error && error) {\n    return (\n      <div\n        className={`stream-boundary stream-boundary--error ${className ?? ''}`}\n        data-testid={testId}\n        data-stream-id={boundaryId}\n        data-stream-state=\"error\"\n        role=\"alert\"\n      >\n        {fallback ?? (\n          <div className=\"stream-boundary-error\">\n            <p>Failed to load content: {error.message}</p>\n            {error.retryable && <button onClick={handleRetry}>Retry</button>}\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  // Streaming or pending - show placeholder\n  if (\n    state === StreamState.Idle ||\n    state === StreamState.Pending ||\n    state === StreamState.Streaming ||\n    state === StreamState.Paused\n  ) {\n    return (\n      <div\n        className={`stream-boundary stream-boundary--${state} ${className ?? ''}`}\n        data-testid={testId}\n        data-stream-id={boundaryId}\n        data-stream-state={state}\n        data-stream-priority={priority}\n      >\n        <Suspense fallback={placeholder ?? <DefaultPlaceholder />}>{children}</Suspense>\n      </div>\n    );\n  }\n\n  // Completed - render content\n  return (\n    <div\n      className={`stream-boundary stream-boundary--completed ${className ?? ''}`}\n      data-testid={testId}\n      data-stream-id={boundaryId}\n      data-stream-state=\"completed\"\n      data-stream-priority={priority}\n    >\n      {children}\n    </div>\n  );\n}\n\n// ============================================================================\n// Main Stream Boundary Component\n// ============================================================================\n\n/**\n * StreamBoundary Component\n *\n * @description\n * Defines a streaming boundary within the React component tree.\n * Content within a StreamBoundary can be streamed independently\n * from the rest of the page, enabling progressive HTML delivery.\n *\n * Key features:\n * - Priority-based streaming (critical, high, normal, low)\n * - Configurable defer timing for non-critical content\n * - Placeholder rendering during stream\n * - Fallback for non-streaming environments\n * - Integration with React Suspense\n * - Automatic cleanup on unmount\n *\n * Performance considerations:\n * - Use `priority=\"critical\"` for above-the-fold content\n * - Use `deferMs` to stagger non-critical content\n * - Provide appropriately-sized placeholders to prevent CLS\n * - Keep streaming boundaries reasonably sized\n *\n * @example\n * ```tsx\n * // Navigation - stream immediately\n * <StreamBoundary id=\"nav\" priority=\"critical\">\n *   <Navigation />\n * </StreamBoundary>\n *\n * // Hero section - high priority\n * <StreamBoundary\n *   id=\"hero\"\n *   priority=\"high\"\n *   placeholder={<HeroSkeleton />}\n *   onStreamComplete={() => analytics.track('hero_loaded')}\n * >\n *   <HeroSection />\n * </StreamBoundary>\n *\n * // Sidebar - normal priority, slightly deferred\n * <StreamBoundary\n *   id=\"sidebar\"\n *   priority=\"normal\"\n *   deferMs={50}\n *   placeholder={<SidebarSkeleton />}\n * >\n *   <Sidebar />\n * </StreamBoundary>\n *\n * // Footer - low priority, significantly deferred\n * <StreamBoundary\n *   id=\"footer\"\n *   priority=\"low\"\n *   deferMs={200}\n *   placeholder={<FooterSkeleton />}\n * >\n *   <Footer />\n * </StreamBoundary>\n * ```\n */\nfunction StreamBoundaryComponent({\n  id,\n  children,\n  priority = StreamPriority.Normal,\n  deferMs,\n  timeoutMs,\n  placeholder,\n  fallback,\n  ssr = true,\n  onStreamStart,\n  onStreamComplete,\n  onStreamError,\n  className,\n  testId,\n}: StreamBoundaryProps): React.ReactElement {\n  // Generate a stable ID if not provided\n  const generatedId = useId();\n  const boundaryId = id ?? `stream-${generatedId}`;\n\n  // Check for streaming context\n  const streamContext = useOptionalStreamContext();\n\n  // If no streaming context or not supported, use fallback mode\n  if (streamContext?.isStreamingSupported !== true) {\n    return (\n      <div\n        className={`stream-boundary stream-boundary--no-streaming ${className ?? ''}`}\n        data-testid={testId}\n        data-stream-id={boundaryId}\n        data-stream-state=\"no-streaming\"\n      >\n        <NonStreamingFallback fallback={fallback}>{children}</NonStreamingFallback>\n      </div>\n    );\n  }\n\n  return (\n    <StreamBoundaryWrapper\n      generatedId={generatedId}\n      id={id}\n      children={children}\n      priority={priority}\n      deferMs={deferMs}\n      timeoutMs={timeoutMs}\n      placeholder={placeholder}\n      fallback={fallback}\n      ssr={ssr}\n      onStreamStart={onStreamStart}\n      onStreamComplete={onStreamComplete}\n      onStreamError={onStreamError}\n      className={className}\n      testId={testId}\n    />\n  );\n}\n\n/**\n * Memoized StreamBoundary to prevent unnecessary re-renders.\n *\n * @description\n * The component is memoized with a custom comparison function\n * that checks for meaningful prop changes.\n */\nexport const StreamBoundary = memo(StreamBoundaryComponent, (prevProps, nextProps) => {\n  // Always re-render if children change\n  if (prevProps.children !== nextProps.children) return false;\n\n  // Check other significant props\n  return (\n    prevProps.id === nextProps.id &&\n    prevProps.priority === nextProps.priority &&\n    prevProps.deferMs === nextProps.deferMs &&\n    prevProps.timeoutMs === nextProps.timeoutMs &&\n    prevProps.placeholder === nextProps.placeholder &&\n    prevProps.fallback === nextProps.fallback &&\n    prevProps.ssr === nextProps.ssr &&\n    prevProps.className === nextProps.className\n  );\n});\n\nStreamBoundary.displayName = 'StreamBoundary';\n\n// ============================================================================\n// Specialized Stream Boundaries\n// ============================================================================\n\n/**\n * CriticalStreamBoundary - Pre-configured for critical content.\n *\n * @description\n * A specialized StreamBoundary with critical priority,\n * no defer, and SSR enabled by default.\n *\n * @example\n * ```tsx\n * <CriticalStreamBoundary id=\"nav\">\n *   <Navigation />\n * </CriticalStreamBoundary>\n * ```\n */\nexport function CriticalStreamBoundary({\n  priority = StreamPriority.Critical,\n  deferMs = 0,\n  ssr = true,\n  ...props\n}: StreamBoundaryProps): React.ReactElement {\n  return <StreamBoundary {...props} priority={priority} deferMs={deferMs} ssr={ssr} />;\n}\n\nCriticalStreamBoundary.displayName = 'CriticalStreamBoundary';\n\n/**\n * DeferredStreamBoundary - Pre-configured for deferred content.\n *\n * @description\n * A specialized StreamBoundary with low priority and\n * automatic deferral, ideal for below-the-fold content.\n *\n * @example\n * ```tsx\n * <DeferredStreamBoundary id=\"footer\" deferMs={500}>\n *   <Footer />\n * </DeferredStreamBoundary>\n * ```\n */\nexport function DeferredStreamBoundary({\n  priority = StreamPriority.Low,\n  deferMs = 100,\n  ...props\n}: StreamBoundaryProps): React.ReactElement {\n  return <StreamBoundary {...props} priority={priority} deferMs={deferMs} />;\n}\n\nDeferredStreamBoundary.displayName = 'DeferredStreamBoundary';\n\n/**\n * ConditionalStreamBoundary - Only streams when condition is met.\n *\n * @description\n * Renders children without streaming when condition is false,\n * enables streaming when condition becomes true.\n *\n * @example\n * ```tsx\n * <ConditionalStreamBoundary\n *   id=\"premium-content\"\n *   condition={user.isPremium}\n *   fallback={<UpgradePrompt />}\n * >\n *   <PremiumContent />\n * </ConditionalStreamBoundary>\n * ```\n */\nexport interface ConditionalStreamBoundaryProps extends StreamBoundaryProps {\n  /** Condition that must be true to enable streaming */\n  condition: boolean;\n}\n\nexport function ConditionalStreamBoundary({\n  condition,\n  children,\n  fallback,\n  ...props\n}: ConditionalStreamBoundaryProps): React.ReactElement {\n  if (!condition) {\n    return <>{fallback ?? children}</>;\n  }\n\n  return (\n    <StreamBoundary {...props} fallback={fallback}>\n      {children}\n    </StreamBoundary>\n  );\n}\n\nConditionalStreamBoundary.displayName = 'ConditionalStreamBoundary';\n\n// ============================================================================\n// Server-Side Helpers\n// ============================================================================\n\n/**\n * Creates script content for client-side boundary activation.\n *\n * @description\n * Generates inline JavaScript that will be executed on the client\n * to activate streaming for a boundary after SSR.\n *\n * @param boundaryId - The boundary ID to activate\n * @param nonce - Optional CSP nonce\n * @returns Script element content\n *\n * @example\n * ```tsx\n * // In SSR context\n * const activationScript = createBoundaryActivationScript('hero', nonce);\n * // Inject into HTML\n * ```\n */\n// eslint-disable-next-line react-refresh/only-export-components\nexport function createBoundaryActivationScript(boundaryId: string, nonce?: string): string {\n  const script = `\n    (function() {\n      if (window.__STREAM_BOUNDARIES__) {\n        window.__STREAM_BOUNDARIES__.activate('${boundaryId}');\n      }\n    })();\n  `.trim();\n\n  return nonce != null && nonce !== ''\n    ? `<script nonce=\"${nonce}\">${script}</script>`\n    : `<script>${script}</script>`;\n}\n\n/**\n * Creates HTML comment marker for stream boundary.\n *\n * @description\n * Used during SSR to mark stream boundary locations in HTML.\n * The client-side hydration process uses these markers to\n * identify and activate boundaries.\n *\n * @param boundaryId - The boundary ID\n * @param type - Marker type ('start' or 'end')\n * @returns HTML comment string\n */\n// eslint-disable-next-line react-refresh/only-export-components\nexport function createBoundaryMarker(boundaryId: string, type: 'start' | 'end'): string {\n  return `<!--stream:${type}:${boundaryId}-->`;\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { DefaultPlaceholder, NonStreamingFallback };\n"],"names":["DefaultPlaceholder","jsxs","jsx","NonStreamingFallback","children","fallback","Suspense","StreamBoundaryWrapper","generatedId","id","priority","StreamPriority","deferMs","timeoutMs","placeholder","ssr","onStreamStart","onStreamComplete","onStreamError","className","testId","boundaryId","stream","useStreamContext","state","setState","useState","StreamState","error","setError","isRegistered","useRef","mountedRef","config","useMemo","err","useEffect","unsubscribe","event","StreamEventType","payload","handleRetry","useCallback","StreamBoundaryComponent","useId","useOptionalStreamContext","StreamBoundary","memo","prevProps","nextProps","CriticalStreamBoundary","props","DeferredStreamBoundary","ConditionalStreamBoundary","condition","Fragment","createBoundaryActivationScript","nonce","script","createBoundaryMarker","type"],"mappings":"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"}