@computekit/react 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +603 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +370 -6
- package/dist/index.d.ts +370 -6
- package/dist/index.js +602 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +1306 -20
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ComputeKit React Bindings\n * React hooks and utilities for ComputeKit\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n createContext,\n useContext,\n type ReactNode,\n} from 'react';\n\nimport {\n ComputeKit,\n type ComputeKitOptions,\n type ComputeOptions,\n type ComputeProgress,\n type PoolStats,\n} from '@computekit/core';\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst ComputeKitContext = createContext<ComputeKit | null>(null);\n\n/**\n * Props for ComputeKitProvider\n */\nexport interface ComputeKitProviderProps {\n /** ComputeKit options */\n options?: ComputeKitOptions;\n /** Custom ComputeKit instance */\n instance?: ComputeKit;\n /** Children */\n children: ReactNode;\n}\n\n/**\n * Provider component for ComputeKit\n *\n * @example\n * ```tsx\n * import { ComputeKitProvider } from '@computekit/react';\n *\n * function App() {\n * return (\n * <ComputeKitProvider options={{ maxWorkers: 4 }}>\n * <MyApp />\n * </ComputeKitProvider>\n * );\n * }\n * ```\n */\nexport function ComputeKitProvider({\n options,\n instance,\n children,\n}: ComputeKitProviderProps): React.ReactElement {\n const kit = useMemo(() => {\n return instance ?? new ComputeKit(options);\n }, [instance, options]);\n\n useEffect(() => {\n return () => {\n // Only terminate if we created the instance\n if (!instance) {\n kit.terminate();\n }\n };\n }, [kit, instance]);\n\n return <ComputeKitContext.Provider value={kit}>{children}</ComputeKitContext.Provider>;\n}\n\n/**\n * Get the ComputeKit instance from context\n */\nexport function useComputeKit(): ComputeKit {\n const kit = useContext(ComputeKitContext);\n if (!kit) {\n throw new Error('useComputeKit must be used within a ComputeKitProvider');\n }\n return kit;\n}\n\n// ============================================================================\n// useCompute Hook\n// ============================================================================\n\n/**\n * Status of a compute operation\n */\nexport type ComputeStatus = 'idle' | 'running' | 'success' | 'error' | 'cancelled';\n\n/**\n * State returned by useCompute\n */\nexport interface UseComputeState<T> {\n /** The computed result */\n data: T | null;\n /** Loading state */\n loading: boolean;\n /** Error if computation failed */\n error: Error | null;\n /** Progress information */\n progress: ComputeProgress | null;\n /** Current status of the computation */\n status: ComputeStatus;\n}\n\n/**\n * Actions returned by useCompute\n */\nexport interface UseComputeActions<TInput> {\n /** Execute the compute function */\n run: (input: TInput, options?: ComputeOptions) => Promise<void>;\n /** Reset the state */\n reset: () => void;\n /** Cancel ongoing computation */\n cancel: () => void;\n}\n\n/**\n * Return type for useCompute\n */\nexport type UseComputeReturn<TInput, TOutput> = UseComputeState<TOutput> &\n UseComputeActions<TInput>;\n\n/**\n * Options for useCompute hook\n */\nexport interface UseComputeOptions extends ComputeOptions {\n /** Automatically run on mount with initial input */\n autoRun?: boolean;\n /** Initial input for autoRun */\n initialInput?: unknown;\n /** Reset state on new run */\n resetOnRun?: boolean;\n}\n\n/**\n * Hook for running compute functions\n *\n * @example\n * ```tsx\n * function FibonacciCalculator() {\n * const { data, loading, error, run } = useCompute<number, number>('fibonacci');\n *\n * return (\n * <div>\n * <button onClick={() => run(50)} disabled={loading}>\n * Calculate Fibonacci(50)\n * </button>\n * {loading && <p>Computing...</p>}\n * {error && <p>Error: {error.message}</p>}\n * {data !== null && <p>Result: {data}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useCompute<TInput = unknown, TOutput = unknown>(\n functionName: string,\n options: UseComputeOptions = {}\n): UseComputeReturn<TInput, TOutput> {\n const kit = useComputeKit();\n const abortControllerRef = useRef<AbortController | null>(null);\n const cancelledRef = useRef(false);\n\n const [state, setState] = useState<UseComputeState<TOutput>>({\n data: null,\n loading: false,\n error: null,\n progress: null,\n status: 'idle',\n });\n\n const reset = useCallback(() => {\n cancelledRef.current = false;\n setState({\n data: null,\n loading: false,\n error: null,\n progress: null,\n status: 'idle',\n });\n }, []);\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n cancelledRef.current = true;\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n setState((prev) => ({\n ...prev,\n loading: false,\n status: 'cancelled',\n }));\n }\n }, []);\n\n const run = useCallback(\n async (input: TInput, runOptions?: ComputeOptions) => {\n // Cancel any ongoing computation\n cancel();\n cancelledRef.current = false;\n\n // Create new abort controller\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n // Reset state if configured\n if (options.resetOnRun !== false) {\n setState((prev) => ({\n ...prev,\n loading: true,\n error: null,\n progress: null,\n status: 'running',\n }));\n } else {\n setState((prev) => ({ ...prev, loading: true, status: 'running' }));\n }\n\n try {\n const result = await kit.run<TInput, TOutput>(functionName, input, {\n ...options,\n ...runOptions,\n signal: runOptions?.signal ?? abortController.signal,\n onProgress: (progress) => {\n setState((prev) => ({ ...prev, progress }));\n options.onProgress?.(progress);\n runOptions?.onProgress?.(progress);\n },\n });\n\n if (!abortController.signal.aborted) {\n setState({\n data: result,\n loading: false,\n error: null,\n progress: null,\n status: 'success',\n });\n }\n } catch (err) {\n if (!abortController.signal.aborted && !cancelledRef.current) {\n setState({\n data: null,\n loading: false,\n error: err instanceof Error ? err : new Error(String(err)),\n progress: null,\n status: 'error',\n });\n }\n }\n },\n [kit, functionName, options, cancel]\n );\n\n // Auto-run on mount if configured\n useEffect(() => {\n if (options.autoRun && options.initialInput !== undefined) {\n run(options.initialInput as TInput);\n }\n // Only run on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cancel();\n };\n }, [cancel]);\n\n return {\n ...state,\n run,\n reset,\n cancel,\n };\n}\n\n// ============================================================================\n// useComputeCallback Hook\n// ============================================================================\n\n/**\n * Hook that returns a memoized async function for compute operations\n *\n * @example\n * ```tsx\n * function Calculator() {\n * const calculate = useComputeCallback<number[], number>('sum');\n *\n * const handleClick = async () => {\n * const result = await calculate([1, 2, 3, 4, 5]);\n * console.log(result);\n * };\n *\n * return <button onClick={handleClick}>Calculate Sum</button>;\n * }\n * ```\n */\nexport function useComputeCallback<TInput = unknown, TOutput = unknown>(\n functionName: string,\n options?: ComputeOptions\n): (input: TInput, runOptions?: ComputeOptions) => Promise<TOutput> {\n const kit = useComputeKit();\n\n return useCallback(\n (input: TInput, runOptions?: ComputeOptions) => {\n return kit.run<TInput, TOutput>(functionName, input, {\n ...options,\n ...runOptions,\n });\n },\n [kit, functionName, options]\n );\n}\n\n// ============================================================================\n// useComputeFunction Hook\n// ============================================================================\n\n/**\n * Hook to register and use a compute function\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { run, loading, data } = useComputeFunction(\n * 'myFunction',\n * (input: number) => input * 2\n * );\n *\n * return (\n * <button onClick={() => run(5)} disabled={loading}>\n * {loading ? 'Computing...' : `Result: ${data}`}\n * </button>\n * );\n * }\n * ```\n */\nexport function useComputeFunction<TInput = unknown, TOutput = unknown>(\n name: string,\n fn: (input: TInput) => TOutput | Promise<TOutput>,\n options?: UseComputeOptions\n): UseComputeReturn<TInput, TOutput> {\n const kit = useComputeKit();\n\n // Register function on mount\n useEffect(() => {\n kit.register(name, fn);\n }, [kit, name, fn]);\n\n return useCompute<TInput, TOutput>(name, options);\n}\n\n// ============================================================================\n// usePoolStats Hook\n// ============================================================================\n\n/**\n * Hook to get worker pool statistics\n *\n * @example\n * ```tsx\n * function PoolMonitor() {\n * const stats = usePoolStats(1000); // Update every second\n *\n * return (\n * <div>\n * <p>Active Workers: {stats.activeWorkers}</p>\n * <p>Queue Length: {stats.queueLength}</p>\n * <p>Tasks Completed: {stats.tasksCompleted}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePoolStats(refreshInterval: number = 0): PoolStats {\n const kit = useComputeKit();\n const [stats, setStats] = useState<PoolStats>(() => kit.getStats());\n\n useEffect(() => {\n // For one-time fetch (refreshInterval <= 0), we rely on the initial state\n if (refreshInterval <= 0) {\n return;\n }\n\n const interval = setInterval(() => {\n setStats(kit.getStats());\n }, refreshInterval);\n\n return () => clearInterval(interval);\n }, [kit, refreshInterval]);\n\n return stats;\n}\n\n// ============================================================================\n// useWasmSupport Hook\n// ============================================================================\n\n/**\n * Hook to check WASM support\n */\nexport function useWasmSupport(): boolean {\n const kit = useComputeKit();\n return kit.isWasmSupported();\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport type {\n ComputeKitOptions,\n ComputeOptions,\n ComputeProgress,\n PoolStats,\n} from '@computekit/core';\n\nexport { ComputeKit } from '@computekit/core';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ComputeKit React Bindings\n * React hooks and utilities for ComputeKit\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n createContext,\n useContext,\n type ReactNode,\n} from 'react';\n\nimport {\n ComputeKit,\n type ComputeKitOptions,\n type ComputeOptions,\n type ComputeProgress,\n type PoolStats,\n type ComputeFunctionRegistry,\n type RegisteredFunctionName,\n type FunctionInput,\n type FunctionOutput,\n type ComputeFn,\n} from '@computekit/core';\n\n// ============================================================================\n// Pipeline Types (defined here for React, also exported from @computekit/core)\n// ============================================================================\n\n/** Status of a pipeline stage */\nexport type StageStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped';\n\n/** Detailed information about a single pipeline stage */\nexport interface StageInfo<TInput = unknown, TOutput = unknown> {\n /** Unique identifier for the stage */\n id: string;\n /** Display name for the stage */\n name: string;\n /** Name of the registered compute function to execute */\n functionName: string;\n /** Current status of this stage */\n status: StageStatus;\n /** Input data for this stage (set when stage starts) */\n input?: TInput;\n /** Output data from this stage (set when stage completes) */\n output?: TOutput;\n /** Error if stage failed */\n error?: Error;\n /** Start timestamp (ms since epoch) */\n startedAt?: number;\n /** End timestamp (ms since epoch) */\n completedAt?: number;\n /** Duration in milliseconds */\n duration?: number;\n /** Progress within this stage (0-100) */\n progress?: number;\n /** Number of retry attempts */\n retryCount: number;\n /** Compute options specific to this stage */\n options?: ComputeOptions;\n}\n\n/** Configuration for a pipeline stage */\nexport interface StageConfig<TInput = unknown, TOutput = unknown> {\n /** Unique identifier for the stage */\n id: string;\n /** Display name for the stage */\n name: string;\n /** Name of the registered compute function */\n functionName: string;\n /** Transform input before passing to compute function */\n transformInput?: (input: TInput, previousResults: unknown[]) => unknown;\n /** Transform output after compute function returns */\n transformOutput?: (output: unknown) => TOutput;\n /** Whether to skip this stage based on previous results */\n shouldSkip?: (input: TInput, previousResults: unknown[]) => boolean;\n /** Maximum retry attempts on failure (default: 0) */\n maxRetries?: number;\n /** Delay between retries in ms (default: 1000) */\n retryDelay?: number;\n /** Compute options for this stage */\n options?: ComputeOptions;\n}\n\n/** Overall pipeline status */\nexport type PipelineStatus =\n | 'idle' // Not started\n | 'running' // Currently executing\n | 'paused' // Paused mid-execution\n | 'completed' // All stages completed successfully\n | 'failed' // A stage failed (and wasn't recovered)\n | 'cancelled'; // User cancelled\n\n/** Metrics for pipeline debugging and reporting */\nexport interface PipelineMetrics {\n /** Total stages in pipeline */\n totalStages: number;\n /** Number of completed stages */\n completedStages: number;\n /** Number of failed stages */\n failedStages: number;\n /** Number of skipped stages */\n skippedStages: number;\n /** Total retry attempts across all stages */\n totalRetries: number;\n /** Slowest stage info */\n slowestStage: { id: string; name: string; duration: number } | null;\n /** Fastest stage info */\n fastestStage: { id: string; name: string; duration: number } | null;\n /** Average stage duration */\n averageStageDuration: number;\n /** Timestamp of each stage transition for timeline view */\n timeline: Array<{\n stageId: string;\n stageName: string;\n event: 'started' | 'completed' | 'failed' | 'skipped' | 'retry';\n timestamp: number;\n duration?: number;\n error?: string;\n }>;\n}\n\n/** Comprehensive pipeline state for debugging */\nexport interface PipelineState<TInput = unknown, TOutput = unknown> {\n /** Overall pipeline status */\n status: PipelineStatus;\n /** All stage information */\n stages: StageInfo[];\n /** Index of currently executing stage (-1 if not running) */\n currentStageIndex: number;\n /** Current stage info (convenience) */\n currentStage: StageInfo | null;\n /** Overall progress percentage (0-100) */\n progress: number;\n /** Final output from the last stage */\n output: TOutput | null;\n /** Initial input that started the pipeline */\n input: TInput | null;\n /** Error that caused pipeline failure */\n error: Error | null;\n /** Pipeline start timestamp */\n startedAt: number | null;\n /** Pipeline completion timestamp */\n completedAt: number | null;\n /** Total duration in milliseconds */\n totalDuration: number | null;\n /** Results from each completed stage */\n stageResults: unknown[];\n /** Execution metrics for debugging */\n metrics: PipelineMetrics;\n}\n\n/** Result of a single item in parallel batch */\nexport interface BatchItemResult<TOutput = unknown> {\n /** Index of the item in original array */\n index: number;\n /** Whether this item succeeded */\n success: boolean;\n /** Result if successful */\n data?: TOutput;\n /** Error if failed */\n error?: Error;\n /** Duration in ms */\n duration: number;\n}\n\n/** Aggregate result of parallel batch processing */\nexport interface ParallelBatchResult<TOutput = unknown> {\n /** All individual results */\n results: BatchItemResult<TOutput>[];\n /** Successfully processed items */\n successful: TOutput[];\n /** Failed items with their errors */\n failed: Array<{ index: number; error: Error }>;\n /** Total duration */\n totalDuration: number;\n /** Success rate (0-1) */\n successRate: number;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst ComputeKitContext = createContext<ComputeKit | null>(null);\n\n/**\n * Props for ComputeKitProvider\n */\nexport interface ComputeKitProviderProps {\n /** ComputeKit options */\n options?: ComputeKitOptions;\n /** Custom ComputeKit instance */\n instance?: ComputeKit;\n /** Children */\n children: ReactNode;\n}\n\n/**\n * Provider component for ComputeKit\n *\n * @example\n * ```tsx\n * import { ComputeKitProvider } from '@computekit/react';\n *\n * function App() {\n * return (\n * <ComputeKitProvider options={{ maxWorkers: 4 }}>\n * <MyApp />\n * </ComputeKitProvider>\n * );\n * }\n * ```\n */\nexport function ComputeKitProvider({\n options,\n instance,\n children,\n}: ComputeKitProviderProps): React.ReactElement {\n const kit = useMemo(() => {\n return instance ?? new ComputeKit(options);\n }, [instance, options]);\n\n useEffect(() => {\n return () => {\n // Only terminate if we created the instance\n if (!instance) {\n kit.terminate();\n }\n };\n }, [kit, instance]);\n\n return <ComputeKitContext.Provider value={kit}>{children}</ComputeKitContext.Provider>;\n}\n\n/**\n * Get the ComputeKit instance from context\n */\nexport function useComputeKit(): ComputeKit {\n const kit = useContext(ComputeKitContext);\n if (!kit) {\n throw new Error('useComputeKit must be used within a ComputeKitProvider');\n }\n return kit;\n}\n\n// ============================================================================\n// useCompute Hook\n// ============================================================================\n\n/**\n * Status of a compute operation\n */\nexport type ComputeStatus = 'idle' | 'running' | 'success' | 'error' | 'cancelled';\n\n/**\n * State returned by useCompute\n */\nexport interface UseComputeState<T> {\n /** The computed result */\n data: T | null;\n /** Loading state */\n loading: boolean;\n /** Error if computation failed */\n error: Error | null;\n /** Progress information */\n progress: ComputeProgress | null;\n /** Current status of the computation */\n status: ComputeStatus;\n}\n\n/**\n * Actions returned by useCompute\n */\nexport interface UseComputeActions<TInput> {\n /** Execute the compute function */\n run: (input: TInput, options?: ComputeOptions) => Promise<void>;\n /** Reset the state */\n reset: () => void;\n /** Cancel ongoing computation */\n cancel: () => void;\n}\n\n/**\n * Return type for useCompute\n */\nexport type UseComputeReturn<TInput, TOutput> = UseComputeState<TOutput> &\n UseComputeActions<TInput>;\n\n/**\n * Options for useCompute hook\n */\nexport interface UseComputeOptions extends ComputeOptions {\n /** Automatically run on mount with initial input */\n autoRun?: boolean;\n /** Initial input for autoRun */\n initialInput?: unknown;\n /** Reset state on new run */\n resetOnRun?: boolean;\n}\n\n/**\n * Hook for running compute functions\n *\n * @example\n * ```tsx\n * // Basic usage with explicit types\n * function FibonacciCalculator() {\n * const { data, loading, error, run } = useCompute<number, number>('fibonacci');\n *\n * return (\n * <div>\n * <button onClick={() => run(50)} disabled={loading}>\n * Calculate Fibonacci(50)\n * </button>\n * {loading && <p>Computing...</p>}\n * {error && <p>Error: {error.message}</p>}\n * {data !== null && <p>Result: {data}</p>}\n * </div>\n * );\n * }\n *\n * // With typed registry (extend ComputeFunctionRegistry for autocomplete)\n * // declare module '@computekit/core' {\n * // interface ComputeFunctionRegistry {\n * // fibonacci: { input: number; output: number };\n * // }\n * // }\n * // const { data, run } = useCompute('fibonacci'); // Types are inferred!\n * ```\n */\nexport function useCompute<\n TName extends RegisteredFunctionName,\n TInput = FunctionInput<TName extends string ? TName : never>,\n TOutput = FunctionOutput<TName extends string ? TName : never>,\n>(\n functionName: TName,\n options: UseComputeOptions = {}\n): UseComputeReturn<\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TInput,\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput\n> {\n type ActualInput = TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TInput;\n type ActualOutput = TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput;\n\n const kit = useComputeKit();\n const abortControllerRef = useRef<AbortController | null>(null);\n const cancelledRef = useRef(false);\n\n const [state, setState] = useState<UseComputeState<ActualOutput>>({\n data: null,\n loading: false,\n error: null,\n progress: null,\n status: 'idle',\n });\n\n const reset = useCallback(() => {\n cancelledRef.current = false;\n setState({\n data: null,\n loading: false,\n error: null,\n progress: null,\n status: 'idle',\n });\n }, []);\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n cancelledRef.current = true;\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n setState((prev) => ({\n ...prev,\n loading: false,\n status: 'cancelled',\n }));\n }\n }, []);\n\n const run = useCallback(\n async (input: ActualInput, runOptions?: ComputeOptions) => {\n // Cancel any ongoing computation\n cancel();\n cancelledRef.current = false;\n\n // Create new abort controller\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n // Reset state if configured\n if (options.resetOnRun !== false) {\n setState((prev) => ({\n ...prev,\n loading: true,\n error: null,\n progress: null,\n status: 'running',\n }));\n } else {\n setState((prev) => ({ ...prev, loading: true, status: 'running' }));\n }\n\n try {\n const result = (await kit.run(functionName, input, {\n ...options,\n ...runOptions,\n signal: runOptions?.signal ?? abortController.signal,\n onProgress: (progress) => {\n setState((prev) => ({ ...prev, progress }));\n options.onProgress?.(progress);\n runOptions?.onProgress?.(progress);\n },\n })) as ActualOutput;\n\n if (!abortController.signal.aborted) {\n setState({\n data: result,\n loading: false,\n error: null,\n progress: null,\n status: 'success',\n });\n }\n } catch (err) {\n if (!abortController.signal.aborted && !cancelledRef.current) {\n setState({\n data: null,\n loading: false,\n error: err instanceof Error ? err : new Error(String(err)),\n progress: null,\n status: 'error',\n });\n }\n }\n },\n [kit, functionName, options, cancel]\n );\n\n // Auto-run on mount if configured\n useEffect(() => {\n if (options.autoRun && options.initialInput !== undefined) {\n run(options.initialInput as ActualInput);\n }\n // Only run on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cancel();\n };\n }, [cancel]);\n\n return {\n ...state,\n run,\n reset,\n cancel,\n } as UseComputeReturn<ActualInput, ActualOutput>;\n}\n\n// ============================================================================\n// useComputeCallback Hook\n// ============================================================================\n\n/**\n * Hook that returns a memoized async function for compute operations\n *\n * @example\n * ```tsx\n * // Basic usage with explicit types\n * function Calculator() {\n * const calculate = useComputeCallback<number[], number>('sum');\n *\n * const handleClick = async () => {\n * const result = await calculate([1, 2, 3, 4, 5]);\n * console.log(result);\n * };\n *\n * return <button onClick={handleClick}>Calculate Sum</button>;\n * }\n *\n * // With typed registry - types are inferred!\n * // const calculate = useComputeCallback('sum');\n * ```\n */\nexport function useComputeCallback<\n TName extends RegisteredFunctionName,\n TInput = FunctionInput<TName extends string ? TName : never>,\n TOutput = FunctionOutput<TName extends string ? TName : never>,\n>(\n functionName: TName,\n options?: ComputeOptions\n): (\n input: TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TInput,\n runOptions?: ComputeOptions\n) => Promise<\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput\n> {\n type ActualInput = TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TInput;\n type ActualOutput = TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput;\n\n const kit = useComputeKit();\n\n return useCallback(\n (input: ActualInput, runOptions?: ComputeOptions): Promise<ActualOutput> => {\n return kit.run(functionName, input, {\n ...options,\n ...runOptions,\n }) as Promise<ActualOutput>;\n },\n [kit, functionName, options]\n );\n}\n\n// ============================================================================\n// useComputeFunction Hook\n// ============================================================================\n\n/**\n * Hook to register and use a compute function\n *\n * @example\n * ```tsx\n * // Basic usage\n * function MyComponent() {\n * const { run, loading, data } = useComputeFunction(\n * 'myFunction',\n * (input: number) => input * 2\n * );\n *\n * return (\n * <button onClick={() => run(5)} disabled={loading}>\n * {loading ? 'Computing...' : `Result: ${data}`}\n * </button>\n * );\n * }\n *\n * // With typed registry - provides autocomplete and type safety\n * // declare module '@computekit/core' {\n * // interface ComputeFunctionRegistry {\n * // myFunction: { input: number; output: number };\n * // }\n * // }\n * ```\n */\nexport function useComputeFunction<\n TName extends RegisteredFunctionName,\n TInput = FunctionInput<TName extends string ? TName : never>,\n TOutput = FunctionOutput<TName extends string ? TName : never>,\n>(\n name: TName,\n fn: TName extends keyof ComputeFunctionRegistry\n ? ComputeFn<\n ComputeFunctionRegistry[TName]['input'],\n ComputeFunctionRegistry[TName]['output']\n >\n : ComputeFn<TInput, TOutput>,\n options?: UseComputeOptions\n): UseComputeReturn<\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TInput,\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput\n> {\n const kit = useComputeKit();\n\n // Register function on mount\n useEffect(() => {\n kit.register(name, fn);\n }, [kit, name, fn]);\n\n return useCompute(name, options);\n}\n\n// ============================================================================\n// usePoolStats Hook\n// ============================================================================\n\n/**\n * Hook to get worker pool statistics\n *\n * @example\n * ```tsx\n * function PoolMonitor() {\n * const stats = usePoolStats(1000); // Update every second\n *\n * return (\n * <div>\n * <p>Active Workers: {stats.activeWorkers}</p>\n * <p>Queue Length: {stats.queueLength}</p>\n * <p>Tasks Completed: {stats.tasksCompleted}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePoolStats(refreshInterval: number = 0): PoolStats {\n const kit = useComputeKit();\n const [stats, setStats] = useState<PoolStats>(() => kit.getStats());\n\n useEffect(() => {\n // For one-time fetch (refreshInterval <= 0), we rely on the initial state\n if (refreshInterval <= 0) {\n return;\n }\n\n const interval = setInterval(() => {\n setStats(kit.getStats());\n }, refreshInterval);\n\n return () => clearInterval(interval);\n }, [kit, refreshInterval]);\n\n return stats;\n}\n\n// ============================================================================\n// useWasmSupport Hook\n// ============================================================================\n\n/**\n * Hook to check WASM support\n */\nexport function useWasmSupport(): boolean {\n const kit = useComputeKit();\n return kit.isWasmSupported();\n}\n\n// ============================================================================\n// usePipeline Hook - Multi-stage Processing\n// ============================================================================\n\n/**\n * Options for usePipeline hook\n */\nexport interface UsePipelineOptions {\n /** Stop pipeline on first stage failure (default: true) */\n stopOnError?: boolean;\n /** Global timeout for entire pipeline in ms */\n timeout?: number;\n /** Enable detailed timeline tracking (default: true) */\n trackTimeline?: boolean;\n /** Called when pipeline state changes */\n onStateChange?: (state: PipelineState) => void;\n /** Called when a stage starts */\n onStageStart?: (stage: StageInfo) => void;\n /** Called when a stage completes */\n onStageComplete?: (stage: StageInfo) => void;\n /** Called when a stage fails */\n onStageError?: (stage: StageInfo, error: Error) => void;\n /** Called when a stage is retried */\n onStageRetry?: (stage: StageInfo, attempt: number) => void;\n /** Automatically run pipeline on mount */\n autoRun?: boolean;\n /** Initial input for autoRun */\n initialInput?: unknown;\n}\n\n/**\n * Actions returned by usePipeline\n */\nexport interface UsePipelineActions<TInput> {\n /** Start the pipeline with input */\n run: (input: TInput) => Promise<void>;\n /** Cancel the running pipeline */\n cancel: () => void;\n /** Reset pipeline to initial state */\n reset: () => void;\n /** Pause the pipeline (if supported) */\n pause: () => void;\n /** Resume a paused pipeline */\n resume: () => void;\n /** Retry failed stages */\n retry: () => Promise<void>;\n /** Get a formatted report of the pipeline execution */\n getReport: () => PipelineReport;\n}\n\n/**\n * Formatted report for debugging\n */\nexport interface PipelineReport {\n /** Human-readable summary */\n summary: string;\n /** Detailed stage-by-stage breakdown */\n stageDetails: Array<{\n name: string;\n status: StageStatus;\n duration: string;\n error?: string;\n }>;\n /** Timeline of events */\n timeline: string[];\n /** Performance insights */\n insights: string[];\n /** Raw metrics */\n metrics: PipelineMetrics;\n}\n\n/**\n * Return type for usePipeline\n */\nexport type UsePipelineReturn<TInput, TOutput> = PipelineState<TInput, TOutput> &\n UsePipelineActions<TInput> & {\n /** Whether pipeline is currently running */\n isRunning: boolean;\n /** Whether pipeline completed successfully */\n isComplete: boolean;\n /** Whether pipeline has failed */\n isFailed: boolean;\n /** Quick access to check if a specific stage is done */\n isStageComplete: (stageId: string) => boolean;\n /** Get a specific stage by ID */\n getStage: (stageId: string) => StageInfo | undefined;\n };\n\n/**\n * Create initial pipeline state\n */\nfunction createInitialPipelineState<TInput, TOutput>(\n stages: StageConfig[]\n): PipelineState<TInput, TOutput> {\n return {\n status: 'idle',\n stages: stages.map((config) => ({\n id: config.id,\n name: config.name,\n functionName: config.functionName,\n status: 'pending' as StageStatus,\n retryCount: 0,\n options: config.options,\n })),\n currentStageIndex: -1,\n currentStage: null,\n progress: 0,\n output: null,\n input: null,\n error: null,\n startedAt: null,\n completedAt: null,\n totalDuration: null,\n stageResults: [],\n metrics: {\n totalStages: stages.length,\n completedStages: 0,\n failedStages: 0,\n skippedStages: 0,\n totalRetries: 0,\n slowestStage: null,\n fastestStage: null,\n averageStageDuration: 0,\n timeline: [],\n },\n };\n}\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;\n return `${(ms / 60000).toFixed(2)}min`;\n}\n\n/**\n * Hook for multi-stage pipeline processing\n *\n * Provides comprehensive debugging, progress tracking, and error handling\n * for complex multi-stage compute workflows.\n *\n * @example\n * ```tsx\n * function FileProcessor() {\n * const pipeline = usePipeline<string[], ProcessedFiles>([\n * { id: 'download', name: 'Download Files', functionName: 'downloadFiles' },\n * { id: 'process', name: 'Process Files', functionName: 'processFiles' },\n * { id: 'compress', name: 'Compress Output', functionName: 'compressFiles' },\n * ]);\n *\n * return (\n * <div>\n * <button onClick={() => pipeline.run(urls)} disabled={pipeline.isRunning}>\n * Start Processing\n * </button>\n *\n * <div>Status: {pipeline.status}</div>\n * <div>Progress: {pipeline.progress.toFixed(0)}%</div>\n *\n * {pipeline.currentStage && (\n * <div>Current: {pipeline.currentStage.name}</div>\n * )}\n *\n * {pipeline.stages.map(stage => (\n * <div key={stage.id}>\n * {stage.name}: {stage.status}\n * {stage.duration && ` (${stage.duration}ms)`}\n * </div>\n * ))}\n *\n * {pipeline.isFailed && (\n * <button onClick={pipeline.retry}>Retry Failed</button>\n * )}\n *\n * {pipeline.isComplete && (\n * <pre>{JSON.stringify(pipeline.getReport(), null, 2)}</pre>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePipeline<TInput = unknown, TOutput = unknown>(\n stageConfigs: StageConfig[],\n options: UsePipelineOptions = {}\n): UsePipelineReturn<TInput, TOutput> {\n const kit = useComputeKit();\n const abortControllerRef = useRef<AbortController | null>(null);\n const pausedRef = useRef(false);\n const resumePromiseRef = useRef<{\n resolve: () => void;\n reject: (err: Error) => void;\n } | null>(null);\n\n const [state, setState] = useState<PipelineState<TInput, TOutput>>(() =>\n createInitialPipelineState<TInput, TOutput>(stageConfigs)\n );\n\n // Memoize stage configs to prevent unnecessary re-renders\n const stages = useMemo(() => stageConfigs, [stageConfigs]);\n\n /**\n * Add event to timeline\n */\n const addTimelineEvent = useCallback(\n (\n stageId: string,\n stageName: string,\n event: 'started' | 'completed' | 'failed' | 'skipped' | 'retry',\n duration?: number,\n error?: string\n ) => {\n if (options.trackTimeline === false) return;\n\n setState((prev) => ({\n ...prev,\n metrics: {\n ...prev.metrics,\n timeline: [\n ...prev.metrics.timeline,\n {\n stageId,\n stageName,\n event,\n timestamp: Date.now(),\n duration,\n error,\n },\n ],\n },\n }));\n },\n [options.trackTimeline]\n );\n\n /**\n * Update metrics after stage completion\n */\n const updateMetrics = useCallback(\n (_completedStage: StageInfo, allStages: StageInfo[]) => {\n const completedStages = allStages.filter((s) => s.status === 'completed');\n const durations = completedStages\n .filter((s) => s.duration !== undefined)\n .map((s) => ({ id: s.id, name: s.name, duration: s.duration! }));\n\n const slowest = durations.length\n ? durations.reduce((a, b) => (a.duration > b.duration ? a : b))\n : null;\n const fastest = durations.length\n ? durations.reduce((a, b) => (a.duration < b.duration ? a : b))\n : null;\n const avgDuration = durations.length\n ? durations.reduce((sum, d) => sum + d.duration, 0) / durations.length\n : 0;\n\n return {\n totalStages: allStages.length,\n completedStages: completedStages.length,\n failedStages: allStages.filter((s) => s.status === 'failed').length,\n skippedStages: allStages.filter((s) => s.status === 'skipped').length,\n totalRetries: allStages.reduce((sum, s) => sum + s.retryCount, 0),\n slowestStage: slowest,\n fastestStage: fastest,\n averageStageDuration: avgDuration,\n };\n },\n []\n );\n\n /**\n * Execute a single stage with retries\n */\n const executeStage = useCallback(\n async (\n stageConfig: StageConfig,\n stageIndex: number,\n input: unknown,\n previousResults: unknown[],\n signal: AbortSignal\n ): Promise<{ success: boolean; output?: unknown; error?: Error }> => {\n const maxRetries = stageConfig.maxRetries ?? 0;\n const retryDelay = stageConfig.retryDelay ?? 1000;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // Check for abort\n if (signal.aborted) {\n return { success: false, error: new Error('Pipeline cancelled') };\n }\n\n // Check for pause\n if (pausedRef.current) {\n await new Promise<void>((resolve, reject) => {\n resumePromiseRef.current = { resolve, reject };\n });\n }\n\n // Check if should skip\n if (stageConfig.shouldSkip?.(input as never, previousResults)) {\n setState((prev) => {\n const newStages = [...prev.stages];\n newStages[stageIndex] = {\n ...newStages[stageIndex],\n status: 'skipped',\n };\n return {\n ...prev,\n stages: newStages,\n };\n });\n addTimelineEvent(stageConfig.id, stageConfig.name, 'skipped');\n options.onStageComplete?.(state.stages[stageIndex]);\n return { success: true, output: previousResults[previousResults.length - 1] };\n }\n\n // Transform input if needed\n const transformedInput = stageConfig.transformInput\n ? stageConfig.transformInput(input as never, previousResults)\n : input;\n\n const startTime = performance.now();\n\n // Update stage to running\n setState((prev) => {\n const newStages = [...prev.stages];\n newStages[stageIndex] = {\n ...newStages[stageIndex],\n status: 'running',\n input: transformedInput,\n startedAt: Date.now(),\n retryCount: attempt,\n };\n return {\n ...prev,\n stages: newStages,\n currentStageIndex: stageIndex,\n currentStage: newStages[stageIndex],\n };\n });\n\n if (attempt === 0) {\n addTimelineEvent(stageConfig.id, stageConfig.name, 'started');\n options.onStageStart?.(state.stages[stageIndex]);\n } else {\n addTimelineEvent(stageConfig.id, stageConfig.name, 'retry');\n options.onStageRetry?.(state.stages[stageIndex], attempt);\n }\n\n try {\n const result = await kit.run(stageConfig.functionName, transformedInput, {\n ...stageConfig.options,\n signal,\n onProgress: (progress) => {\n setState((prev) => {\n const newStages = [...prev.stages];\n newStages[stageIndex] = {\n ...newStages[stageIndex],\n progress: progress.percent,\n };\n // Calculate overall progress\n const stageProgress = progress.percent / 100;\n const overallProgress =\n ((stageIndex + stageProgress) / stages.length) * 100;\n return {\n ...prev,\n stages: newStages,\n progress: overallProgress,\n };\n });\n },\n });\n\n const duration = performance.now() - startTime;\n\n // Transform output if needed\n const transformedOutput = stageConfig.transformOutput\n ? stageConfig.transformOutput(result)\n : result;\n\n // Update stage to completed\n setState((prev) => {\n const newStages = [...prev.stages];\n newStages[stageIndex] = {\n ...newStages[stageIndex],\n status: 'completed',\n output: transformedOutput,\n completedAt: Date.now(),\n duration,\n progress: 100,\n };\n\n const newMetrics = {\n ...prev.metrics,\n ...updateMetrics(newStages[stageIndex], newStages),\n };\n\n return {\n ...prev,\n stages: newStages,\n metrics: newMetrics,\n progress: ((stageIndex + 1) / stages.length) * 100,\n };\n });\n\n addTimelineEvent(stageConfig.id, stageConfig.name, 'completed', duration);\n options.onStageComplete?.(state.stages[stageIndex]);\n\n return { success: true, output: transformedOutput };\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n if (attempt < maxRetries) {\n // Wait before retry\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n continue;\n }\n\n // Final failure\n const duration = performance.now() - startTime;\n\n setState((prev) => {\n const newStages = [...prev.stages];\n newStages[stageIndex] = {\n ...newStages[stageIndex],\n status: 'failed',\n error: lastError,\n completedAt: Date.now(),\n duration,\n };\n return {\n ...prev,\n stages: newStages,\n metrics: {\n ...prev.metrics,\n failedStages: prev.metrics.failedStages + 1,\n },\n };\n });\n\n addTimelineEvent(\n stageConfig.id,\n stageConfig.name,\n 'failed',\n duration,\n lastError.message\n );\n options.onStageError?.(state.stages[stageIndex], lastError);\n\n return { success: false, error: lastError };\n }\n }\n\n return { success: false, error: lastError };\n },\n [kit, stages, state.stages, addTimelineEvent, updateMetrics, options]\n );\n\n /**\n * Run the pipeline\n */\n const run = useCallback(\n async (input: TInput): Promise<void> => {\n // Cancel any existing run\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n pausedRef.current = false;\n\n const startTime = Date.now();\n\n // Reset state\n setState(() => ({\n ...createInitialPipelineState<TInput, TOutput>(stages),\n status: 'running',\n input,\n startedAt: startTime,\n }));\n\n const stageResults: unknown[] = [];\n let currentInput: unknown = input;\n let finalError: Error | null = null;\n\n for (let i = 0; i < stages.length; i++) {\n if (abortController.signal.aborted) {\n setState((prev) => ({\n ...prev,\n status: 'cancelled',\n completedAt: Date.now(),\n totalDuration: Date.now() - startTime,\n }));\n return;\n }\n\n const result = await executeStage(\n stages[i],\n i,\n currentInput,\n stageResults,\n abortController.signal\n );\n\n if (!result.success) {\n finalError = result.error ?? new Error('Stage failed');\n\n if (options.stopOnError !== false) {\n setState((prev) => ({\n ...prev,\n status: 'failed',\n error: finalError,\n stageResults,\n completedAt: Date.now(),\n totalDuration: Date.now() - startTime,\n }));\n return;\n }\n }\n\n if (result.output !== undefined) {\n stageResults.push(result.output);\n currentInput = result.output;\n }\n }\n\n // Pipeline completed\n setState((prev) => ({\n ...prev,\n status: finalError ? 'failed' : 'completed',\n output: (currentInput as TOutput) ?? null,\n error: finalError,\n stageResults,\n completedAt: Date.now(),\n totalDuration: Date.now() - startTime,\n currentStageIndex: -1,\n currentStage: null,\n progress: 100,\n }));\n\n options.onStateChange?.(state);\n },\n [stages, executeStage, options, state]\n );\n\n /**\n * Cancel the pipeline\n */\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n if (resumePromiseRef.current) {\n resumePromiseRef.current.reject(new Error('Pipeline cancelled'));\n resumePromiseRef.current = null;\n }\n setState((prev) => ({\n ...prev,\n status: 'cancelled',\n completedAt: Date.now(),\n totalDuration: prev.startedAt ? Date.now() - prev.startedAt : null,\n }));\n }, []);\n\n /**\n * Reset the pipeline\n */\n const reset = useCallback(() => {\n cancel();\n setState(createInitialPipelineState<TInput, TOutput>(stages));\n }, [cancel, stages]);\n\n /**\n * Pause the pipeline\n */\n const pause = useCallback(() => {\n pausedRef.current = true;\n setState((prev) => ({\n ...prev,\n status: 'paused',\n }));\n }, []);\n\n /**\n * Resume the pipeline\n */\n const resume = useCallback(() => {\n pausedRef.current = false;\n if (resumePromiseRef.current) {\n resumePromiseRef.current.resolve();\n resumePromiseRef.current = null;\n }\n setState((prev) => ({\n ...prev,\n status: 'running',\n }));\n }, []);\n\n /**\n * Retry failed stages\n */\n const retry = useCallback(async (): Promise<void> => {\n if (state.status !== 'failed' || !state.input) return;\n\n // Find first failed stage\n const failedIndex = state.stages.findIndex((s) => s.status === 'failed');\n if (failedIndex === -1) return;\n\n // Get input for failed stage (output of previous stage or original input)\n const retryInput =\n failedIndex === 0 ? state.input : state.stageResults[failedIndex - 1];\n\n // Create new abort controller\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setState((prev) => ({\n ...prev,\n status: 'running',\n error: null,\n }));\n\n const stageResults = [...state.stageResults.slice(0, failedIndex)];\n let currentInput = retryInput;\n\n for (let i = failedIndex; i < stages.length; i++) {\n if (abortController.signal.aborted) {\n setState((prev) => ({ ...prev, status: 'cancelled' }));\n return;\n }\n\n const result = await executeStage(\n stages[i],\n i,\n currentInput,\n stageResults,\n abortController.signal\n );\n\n if (!result.success) {\n setState((prev) => ({\n ...prev,\n status: 'failed',\n error: result.error ?? new Error('Stage failed'),\n stageResults,\n }));\n return;\n }\n\n if (result.output !== undefined) {\n stageResults.push(result.output);\n currentInput = result.output;\n }\n }\n\n setState((prev) => ({\n ...prev,\n status: 'completed',\n output: currentInput as TOutput,\n stageResults,\n completedAt: Date.now(),\n totalDuration: prev.startedAt ? Date.now() - prev.startedAt : null,\n progress: 100,\n }));\n }, [state, stages, executeStage]);\n\n /**\n * Generate execution report\n */\n const getReport = useCallback((): PipelineReport => {\n const stageDetails = state.stages.map((stage) => ({\n name: stage.name,\n status: stage.status,\n duration: stage.duration ? formatDuration(stage.duration) : '-',\n error: stage.error?.message,\n }));\n\n const timeline = state.metrics.timeline.map((event) => {\n const time = new Date(event.timestamp).toISOString().split('T')[1].split('.')[0];\n const duration = event.duration ? ` (${formatDuration(event.duration)})` : '';\n const error = event.error ? ` - ${event.error}` : '';\n return `[${time}] ${event.stageName}: ${event.event}${duration}${error}`;\n });\n\n const insights: string[] = [];\n\n if (state.metrics.slowestStage) {\n insights.push(\n `Slowest stage: ${state.metrics.slowestStage.name} (${formatDuration(\n state.metrics.slowestStage.duration\n )})`\n );\n }\n\n if (state.metrics.fastestStage) {\n insights.push(\n `Fastest stage: ${state.metrics.fastestStage.name} (${formatDuration(\n state.metrics.fastestStage.duration\n )})`\n );\n }\n\n if (state.metrics.totalRetries > 0) {\n insights.push(`Total retries: ${state.metrics.totalRetries}`);\n }\n\n if (state.metrics.averageStageDuration > 0) {\n insights.push(\n `Average stage duration: ${formatDuration(state.metrics.averageStageDuration)}`\n );\n }\n\n const successRate =\n state.metrics.totalStages > 0\n ? (state.metrics.completedStages / state.metrics.totalStages) * 100\n : 0;\n\n const summary = [\n `Pipeline Status: ${state.status.toUpperCase()}`,\n `Stages: ${state.metrics.completedStages}/${state.metrics.totalStages} completed`,\n `Success Rate: ${successRate.toFixed(0)}%`,\n state.totalDuration ? `Total Duration: ${formatDuration(state.totalDuration)}` : '',\n state.error ? `Error: ${state.error.message}` : '',\n ]\n .filter(Boolean)\n .join('\\n');\n\n return {\n summary,\n stageDetails,\n timeline,\n insights,\n metrics: state.metrics,\n };\n }, [state]);\n\n /**\n * Check if a stage is complete\n */\n const isStageComplete = useCallback(\n (stageId: string): boolean => {\n const stage = state.stages.find((s) => s.id === stageId);\n return stage?.status === 'completed';\n },\n [state.stages]\n );\n\n /**\n * Get a stage by ID\n */\n const getStage = useCallback(\n (stageId: string): StageInfo | undefined => {\n return state.stages.find((s) => s.id === stageId);\n },\n [state.stages]\n );\n\n // Auto-run on mount if configured\n useEffect(() => {\n if (options.autoRun && options.initialInput !== undefined) {\n run(options.initialInput as TInput);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cancel();\n };\n }, [cancel]);\n\n return {\n ...state,\n run,\n cancel,\n reset,\n pause,\n resume,\n retry,\n getReport,\n isRunning: state.status === 'running',\n isComplete: state.status === 'completed',\n isFailed: state.status === 'failed',\n isStageComplete,\n getStage,\n };\n}\n\n// ============================================================================\n// useParallelBatch Hook - Parallel Processing Within Stages\n// ============================================================================\n\n/**\n * Result type for useParallelBatch\n */\nexport interface UseParallelBatchReturn<TItem, TOutput> {\n /** Execute batch processing */\n run: (items: TItem[]) => Promise<ParallelBatchResult<TOutput>>;\n /** Current batch result */\n result: ParallelBatchResult<TOutput> | null;\n /** Loading state */\n loading: boolean;\n /** Current progress (0-100) */\n progress: number;\n /** Number of completed items */\n completedCount: number;\n /** Total items in current batch */\n totalCount: number;\n /** Cancel batch processing */\n cancel: () => void;\n /** Reset state */\n reset: () => void;\n}\n\n/**\n * Hook for parallel batch processing\n *\n * Useful for processing multiple items in parallel within a pipeline stage.\n *\n * @example\n * ```tsx\n * // Basic usage with explicit types\n * function BatchProcessor() {\n * const batch = useParallelBatch<string, ProcessedFile>('processFile', {\n * concurrency: 4\n * });\n *\n * return (\n * <div>\n * <button\n * onClick={() => batch.run(fileUrls)}\n * disabled={batch.loading}\n * >\n * Process {fileUrls.length} Files\n * </button>\n *\n * {batch.loading && (\n * <div>\n * Processing: {batch.completedCount}/{batch.totalCount}\n * ({batch.progress.toFixed(0)}%)\n * </div>\n * )}\n *\n * {batch.result && (\n * <div>\n * Success: {batch.result.successful.length}\n * Failed: {batch.result.failed.length}\n * </div>\n * )}\n * </div>\n * );\n * }\n *\n * // With typed registry - types are inferred!\n * // const batch = useParallelBatch('processFile');\n * ```\n */\nexport function useParallelBatch<\n TName extends RegisteredFunctionName,\n TItem = FunctionInput<TName extends string ? TName : never>,\n TOutput = FunctionOutput<TName extends string ? TName : never>,\n>(\n functionName: TName,\n options: {\n concurrency?: number;\n computeOptions?: ComputeOptions;\n } = {}\n): UseParallelBatchReturn<\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TItem,\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput\n> {\n type ActualItem = TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TItem;\n type ActualOutput = TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput;\n\n const kit = useComputeKit();\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const [state, setState] = useState<{\n result: ParallelBatchResult<ActualOutput> | null;\n loading: boolean;\n progress: number;\n completedCount: number;\n totalCount: number;\n }>({\n result: null,\n loading: false,\n progress: 0,\n completedCount: 0,\n totalCount: 0,\n });\n\n const run = useCallback(\n async (items: ActualItem[]): Promise<ParallelBatchResult<ActualOutput>> => {\n // Cancel any existing batch\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setState({\n result: null,\n loading: true,\n progress: 0,\n completedCount: 0,\n totalCount: items.length,\n });\n\n const startTime = performance.now();\n const results: BatchItemResult<ActualOutput>[] = [];\n const concurrency = options.concurrency ?? items.length;\n\n // Process in batches based on concurrency\n for (let i = 0; i < items.length; i += concurrency) {\n if (abortController.signal.aborted) {\n break;\n }\n\n const batch = items.slice(i, i + concurrency);\n const batchPromises = batch.map(async (item, batchIndex) => {\n const index = i + batchIndex;\n const itemStart = performance.now();\n\n try {\n const data = (await kit.run(functionName, item, {\n ...options.computeOptions,\n signal: abortController.signal,\n })) as ActualOutput;\n\n const itemResult: BatchItemResult<ActualOutput> = {\n index,\n success: true,\n data,\n duration: performance.now() - itemStart,\n };\n\n return itemResult;\n } catch (err) {\n const itemResult: BatchItemResult<ActualOutput> = {\n index,\n success: false,\n error: err instanceof Error ? err : new Error(String(err)),\n duration: performance.now() - itemStart,\n };\n\n return itemResult;\n }\n });\n\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n\n // Update progress\n const completed = results.length;\n setState((prev) => ({\n ...prev,\n completedCount: completed,\n progress: (completed / items.length) * 100,\n }));\n }\n\n const totalDuration = performance.now() - startTime;\n const successful = results\n .filter((r) => r.success && r.data !== undefined)\n .map((r) => r.data as ActualOutput);\n const failed = results\n .filter((r) => !r.success)\n .map((r) => ({ index: r.index, error: r.error! }));\n\n const finalResult: ParallelBatchResult<ActualOutput> = {\n results,\n successful,\n failed,\n totalDuration,\n successRate: successful.length / items.length,\n };\n\n setState({\n result: finalResult,\n loading: false,\n progress: 100,\n completedCount: items.length,\n totalCount: items.length,\n });\n\n return finalResult;\n },\n [kit, functionName, options.concurrency, options.computeOptions]\n );\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setState((prev) => ({\n ...prev,\n loading: false,\n }));\n }, []);\n\n const reset = useCallback(() => {\n cancel();\n setState({\n result: null,\n loading: false,\n progress: 0,\n completedCount: 0,\n totalCount: 0,\n });\n }, [cancel]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cancel();\n };\n }, [cancel]);\n\n return {\n ...state,\n run,\n cancel,\n reset,\n } as UseParallelBatchReturn<ActualItem, ActualOutput>;\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport type {\n ComputeKitOptions,\n ComputeOptions,\n ComputeProgress,\n PoolStats,\n // Typed registry exports\n ComputeFunctionRegistry,\n RegisteredFunctionName,\n FunctionInput,\n FunctionOutput,\n ComputeFn,\n InferComputeFn,\n DefineFunction,\n HasRegisteredFunctions,\n} from '@computekit/core';\n\nexport { ComputeKit } from '@computekit/core';\n\n// Pipeline types are exported from interface declarations above\n"]}
|