{"version":3,"sources":["../lib/index.ts","../lib/PDFViewer.tsx","../lib/utils/isPasswordProtected.ts","../lib/usePDFViewer.ts","../lib/utils/validatePDFBuffer.ts","../lib/utils/errorTypes.ts"],"sourcesContent":["import PDFViewer from './PDFViewer';\r\nimport { usePDFViewer } from './usePDFViewer';\r\n\r\n// Export types\r\nexport type { PDFViewerInstance, PDFViewerHookReturn } from './usePDFViewer';\r\nexport type { PDFError, PDFErrorType } from './utils/errorTypes';\r\nexport type { PDFViewerRef } from './PDFViewer';\r\n\r\n// Re-export enums from PDFViewer\r\nexport { ZoomMode, Rotation } from './PDFViewer';\r\n\r\nexport { PDFViewer, usePDFViewer };","import { EmbedPDF } from \"@embedpdf/core/react\";\r\n// import { FilePicker } from \"@embedpdf/plugin-loader/react\";\r\nimport {\r\n  Viewport,\r\n  ViewportPluginPackage,\r\n} from \"@embedpdf/plugin-viewport/react\";\r\nimport {\r\n  Scroller,\r\n  ScrollPluginPackage,\r\n  ScrollStrategy,\r\n} from \"@embedpdf/plugin-scroll/react\";\r\nimport {\r\n  RenderLayer,\r\n  RenderPluginPackage,\r\n} from \"@embedpdf/plugin-render/react\";\r\nimport { SelectionLayer } from \"@embedpdf/plugin-selection/react\";\r\nimport { SearchLayer } from \"@embedpdf/plugin-search/react\";\r\nimport {\r\n  InteractionManagerPluginPackage,\r\n  PagePointerProvider,\r\n} from \"@embedpdf/plugin-interaction-manager/react\";\r\nimport { useZoom, ZoomMode, ZoomPluginPackage } from \"@embedpdf/plugin-zoom/react\";\r\nimport { useSearch } from \"@embedpdf/plugin-search/react\";\r\nimport { useScroll } from \"@embedpdf/plugin-scroll/react\";\r\nimport { useRotate, Rotate, RotatePluginPackage } from \"@embedpdf/plugin-rotate/react\";\r\nimport { Rotation } from \"@embedpdf/models\";\r\n\r\n// Re-export for consuming apps\r\nexport { ZoomMode, Rotation };\r\nexport type { SearchState } from \"@embedpdf/plugin-search\";\r\nexport type { SearchResult, SearchAllPagesResult, MatchFlag } from \"@embedpdf/models\";\r\n\r\n// Import types for internal use\r\nimport type { SearchAllPagesResult } from \"@embedpdf/models\";\r\nimport type { SearchState } from \"@embedpdf/plugin-search\";\r\n\r\nimport {\r\n  useEffect,\r\n  useImperativeHandle,\r\n  forwardRef,\r\n  useMemo,\r\n  useCallback,\r\n  type ReactElement,\r\n  useState,\r\n} from \"react\";\r\nimport isPasswordProtected from \"./utils/isPasswordProtected\";\r\nimport { usePdfiumEngine } from \"@embedpdf/engines/react\";\r\nimport { createPluginRegistration } from \"@embedpdf/core\";\r\nimport { LoaderPluginPackage } from \"@embedpdf/plugin-loader\";\r\nimport { SelectionPluginPackage } from \"@embedpdf/plugin-selection\";\r\nimport { SearchPluginPackage } from \"@embedpdf/plugin-search\";\r\n\r\ninterface PDFViewerProps {\r\n  pdfBuffer?: ArrayBuffer | null | undefined;\r\n  onPasswordRequest?: (fileName?: string) => Promise<string | null>;\r\n}\r\n\r\nexport interface PDFViewerRef {\r\n  zoom: {\r\n    zoomIn: () => void;\r\n    zoomOut: () => void;\r\n    setZoom: (level: number) => void;\r\n    resetZoom: () => void;\r\n    getZoom: () => number | ZoomMode;\r\n    fitToWidth: () => void;\r\n    fitToPage: () => void;\r\n  };\r\n  navigation: {\r\n    goToPage: (page: number) => void;\r\n    getCurrentPage: () => number;\r\n    getTotalPages: () => number;\r\n    nextPage: () => void;\r\n    previousPage: () => void;\r\n    goToFirstPage: () => void;\r\n    goToLastPage: () => void;\r\n  };\r\n  selection: {\r\n    clearSelection: () => void;\r\n    getSelectedText: () => string;\r\n  };\r\n  search: {\r\n    searchText: (keyword: string) => Promise<SearchAllPagesResult | null>;\r\n    nextResult: () => number;\r\n    previousResult: () => number;\r\n    goToResult: (index: number) => number;\r\n    stopSearch: () => void;\r\n    startSearch: () => void;\r\n    getSearchState: () => SearchState | null;\r\n    setShowAllResults: (show: boolean) => void;\r\n  };\r\n  document: {\r\n    isReady: () => boolean;\r\n    isLoading: () => boolean;\r\n    hasPassword: () => boolean;\r\n    getDocumentInfo: () => {\r\n      currentPage: number;\r\n      totalPages: number;\r\n      zoomLevel: number | ZoomMode;\r\n      hasActiveSearch: boolean;\r\n    };\r\n  };\r\n  scroll: {\r\n    scrollToPage: (options: { pageNumber: number; pageCoordinates?: { x: number; y: number }; center?: boolean }) => void;\r\n  };\r\n  rotate: {\r\n    rotateForward: () => void;\r\n    rotateBackward: () => void;\r\n    setRotation: (rotation: Rotation) => void;\r\n    getRotation: () => Rotation;\r\n  };\r\n}\r\n\r\n// Internal component that has access to plugin hooks\r\nconst PDFContent = forwardRef<PDFViewerRef, { isReady: boolean; isLoading: boolean; hasPassword: boolean }>(({ isReady, isLoading, hasPassword }, ref) => {\r\n  const zoom = useZoom();\r\n  const search = useSearch();\r\n  const scroll = useScroll();\r\n  const rotate = useRotate();\r\n  // TODO: Add other plugin hooks when available\r\n  // const scroll = useScroll();\r\n  // const selection = useSelection();\r\n\r\n  useImperativeHandle(ref, () => ({\r\n    zoom: {\r\n      zoomIn: () => {\r\n        if (zoom.provides) {\r\n          zoom.provides.zoomIn();\r\n        }\r\n      },\r\n      zoomOut: () => {\r\n        if (zoom.provides) {\r\n          zoom.provides.zoomOut();\r\n        }\r\n      },\r\n      setZoom: (level: number) => {\r\n        if (zoom.provides) {\r\n          zoom.provides.requestZoom(level);\r\n        }\r\n      },\r\n      resetZoom: () => {\r\n        if (zoom.provides) {\r\n          zoom.provides.requestZoom(ZoomMode.FitPage);\r\n        }\r\n      },\r\n      fitToWidth: () => {\r\n        if (zoom.provides) {\r\n          zoom.provides.requestZoom(ZoomMode.FitWidth);\r\n        }\r\n      },\r\n      fitToPage: () => {\r\n        if (zoom.provides) {\r\n          zoom.provides.requestZoom(ZoomMode.FitPage);\r\n        }\r\n      },\r\n      getZoom: () => zoom.state?.zoomLevel || 1.0,\r\n    },\r\n    navigation: {\r\n      goToPage: (page: number) => {\r\n        if (scroll.provides) {\r\n          scroll.provides.scrollToPage({ pageNumber: page });\r\n        }\r\n      },\r\n      getCurrentPage: () => {\r\n        if (scroll.state) {\r\n          return scroll.state.currentPage || 1; // Use currentPage property\r\n        }\r\n        return 1;\r\n      },\r\n      getTotalPages: () => {\r\n        if (scroll.state) {\r\n          return scroll.state.totalPages || 1;\r\n        }\r\n        return 1;\r\n      },\r\n      nextPage: () => {\r\n        const currentPage = scroll.state?.currentPage || 1;\r\n        const totalPages = scroll.state?.totalPages || 1;\r\n        if (currentPage < totalPages && scroll.provides) {\r\n          scroll.provides.scrollToPage({ pageNumber: currentPage + 1 });\r\n        }\r\n      },\r\n      previousPage: () => {\r\n        const currentPage = scroll.state?.currentPage || 1;\r\n        if (currentPage > 1 && scroll.provides) {\r\n          scroll.provides.scrollToPage({ pageNumber: currentPage - 1 });\r\n        }\r\n      },\r\n      goToFirstPage: () => {\r\n        if (scroll.provides) {\r\n          scroll.provides.scrollToPage({ pageNumber: 1 });\r\n        }\r\n      },\r\n      goToLastPage: () => {\r\n        const totalPages = scroll.state?.totalPages || 1;\r\n        if (scroll.provides) {\r\n          scroll.provides.scrollToPage({ pageNumber: totalPages });\r\n        }\r\n      },\r\n    },\r\n    selection: {\r\n      clearSelection: () => {\r\n        // TODO: Implement when selection plugin hook is available\r\n        console.warn('clearSelection not yet implemented');\r\n      },\r\n      getSelectedText: () => {\r\n        // TODO: Implement when selection plugin hook is available\r\n        console.warn('getSelectedText not yet implemented');\r\n        return '';\r\n      },\r\n    },\r\n    search: {\r\n      searchText: async (keyword: string) => {\r\n        if (search.provides) {\r\n          const task = search.provides.searchAllPages(keyword);\r\n          return task.toPromise();\r\n        }\r\n        return null;\r\n      },\r\n      nextResult: () => {\r\n        if (search.provides) {\r\n          return search.provides.nextResult();\r\n        }\r\n        return -1;\r\n      },\r\n      previousResult: () => {\r\n        if (search.provides) {\r\n          return search.provides.previousResult();\r\n        }\r\n        return -1;\r\n      },\r\n      goToResult: (index: number) => {\r\n        if (search.provides) {\r\n          return search.provides.goToResult(index);\r\n        }\r\n        return -1;\r\n      },\r\n      stopSearch: () => {\r\n        if (search.provides) {\r\n          search.provides.stopSearch();\r\n        }\r\n      },\r\n      startSearch: () => {\r\n        if (search.provides) {\r\n          search.provides.startSearch();\r\n        }\r\n      },\r\n      getSearchState: () => {\r\n        if (search.provides) {\r\n          return search.provides.getState();\r\n        }\r\n        return null;\r\n      },\r\n      setShowAllResults: (show: boolean) => {\r\n        if (search.provides) {\r\n          search.provides.setShowAllResults(show);\r\n        }\r\n      },\r\n    },\r\n    document: {\r\n      isReady: () => isReady,\r\n      isLoading: () => isLoading,\r\n      hasPassword: () => hasPassword,\r\n      getDocumentInfo: () => ({\r\n        currentPage: scroll.state?.currentPage || 1,\r\n        totalPages: scroll.state?.totalPages || 1,\r\n        zoomLevel: zoom.state?.zoomLevel || 1.0,\r\n        hasActiveSearch: Boolean(search.state),\r\n      }),\r\n    },\r\n    scroll: {\r\n      scrollToPage: (options: { pageNumber: number; pageCoordinates?: { x: number; y: number }; center?: boolean }) => {\r\n        if (scroll.provides) {\r\n          scroll.provides.scrollToPage(options);\r\n        }\r\n      },\r\n    },\r\n    rotate: {\r\n      rotateForward: () => {\r\n        if (rotate.provides) {\r\n          rotate.provides.rotateForward();\r\n        }\r\n      },\r\n      rotateBackward: () => {\r\n        if (rotate.provides) {\r\n          rotate.provides.rotateBackward();\r\n        }\r\n      },\r\n      setRotation: (rotation: Rotation) => {\r\n        if (rotate.provides) {\r\n          rotate.provides.setRotation(rotation);\r\n        }\r\n      },\r\n      getRotation: () => {\r\n        if (rotate.provides) {\r\n          return rotate.provides.getRotation();\r\n        }\r\n        return Rotation.Degree0;\r\n      },\r\n    },\r\n  }), [zoom, search, scroll, rotate, isReady, isLoading, hasPassword]);\r\n\r\n  const renderPage = useCallback(({\r\n    pageIndex,\r\n    scale,\r\n    width,\r\n    height,\r\n    document,\r\n    rotation,\r\n  }: any) => {\r\n    // Swap width and height for 90° and 270° rotations\r\n    const isRotated90or270 = rotation === 1 || rotation === 3;\r\n    const containerWidth = isRotated90or270 ? height : width;\r\n    const containerHeight = isRotated90or270 ? width : height;\r\n\r\n    return (\r\n      <div\r\n        key={document?.id}\r\n        style={{\r\n          width: containerWidth,\r\n          height: containerHeight,\r\n          position: \"relative\",\r\n          backgroundColor: \"white\",\r\n          userSelect: \"none\",\r\n          WebkitUserSelect: \"none\",\r\n        }}\r\n        draggable={false}\r\n      >\r\n        <Rotate pageSize={{ width, height }}>\r\n          <PagePointerProvider\r\n            pageIndex={pageIndex}\r\n            pageWidth={width}\r\n            pageHeight={height}\r\n            rotation={rotation || 0}\r\n            scale={scale}\r\n          >\r\n            <RenderLayer\r\n              pageIndex={pageIndex}\r\n              scale={scale}\r\n              style={{ pointerEvents: \"none\" }}\r\n            />\r\n            <SearchLayer\r\n              pageIndex={pageIndex}\r\n              scale={scale}\r\n              style={{ pointerEvents: \"none\" }}\r\n            />\r\n            <SelectionLayer pageIndex={pageIndex} scale={scale} />\r\n          </PagePointerProvider>\r\n        </Rotate>\r\n      </div>\r\n    );\r\n  }, []);\r\n\r\n  return (\r\n    <Viewport\r\n      style={{\r\n        width: \"100%\",\r\n        height: \"100%\",\r\n        flexGrow: 1,\r\n        backgroundColor: \"#eeee\",\r\n        overflow: \"auto\",\r\n      }}\r\n    >\r\n      <Scroller renderPage={renderPage} />\r\n    </Viewport>\r\n  );\r\n});\r\n\r\nconst PDFViewer = forwardRef<PDFViewerRef, PDFViewerProps>(function PDFViewer(\r\n  { pdfBuffer, onPasswordRequest },\r\n  ref\r\n): ReactElement | null {\r\n  const {\r\n    engine,\r\n    isLoading: engineLoading,\r\n    error: engineError,\r\n  } = usePdfiumEngine();\r\n\r\n  const [password, setPassword] = useState(\"\");\r\n  const [isPasswordChecked, setIsPasswordChecked] = useState(false);\r\n  const [isReady, setIsReady] = useState(false);\r\n\r\n  const plugins = useMemo(() => {\r\n    if (!pdfBuffer || !isReady) return [];\r\n    return [\r\n      createPluginRegistration(LoaderPluginPackage, {\r\n        loadingOptions: {\r\n          type: \"buffer\",\r\n          pdfFile: {\r\n            id: `pdf-${Date.now()}`,\r\n            content: pdfBuffer,\r\n          },\r\n          options: {\r\n            password: password || \"\",\r\n          },\r\n        },\r\n      }),\r\n      createPluginRegistration(ViewportPluginPackage, {\r\n        viewportGap: 10,\r\n      }),\r\n      createPluginRegistration(ScrollPluginPackage, {\r\n        strategy: ScrollStrategy.Vertical,\r\n      }),\r\n      createPluginRegistration(InteractionManagerPluginPackage),\r\n      createPluginRegistration(ZoomPluginPackage, {\r\n        defaultZoomLevel: 1.0,\r\n        minZoom: 0.2,\r\n        maxZoom: 5.0,\r\n      }),\r\n      createPluginRegistration(RenderPluginPackage),\r\n      createPluginRegistration(RotatePluginPackage),\r\n      createPluginRegistration(SelectionPluginPackage),\r\n      createPluginRegistration(SearchPluginPackage),\r\n    ];\r\n  }, [pdfBuffer, password, isReady, engine]);\r\n\r\n  useEffect(() => {\r\n    const ready =\r\n      engineLoading === false &&\r\n      engineError === null &&\r\n      isPasswordChecked &&\r\n      pdfBuffer instanceof ArrayBuffer;\r\n\r\n    setIsReady(ready);\r\n  }, [engineLoading, engineError, pdfBuffer, isPasswordChecked]);\r\n\r\n  useEffect(() => {\r\n    if (!pdfBuffer) {\r\n      return;\r\n    }\r\n\r\n    if (isPasswordProtected(pdfBuffer)) {\r\n      async function requestPassword() {\r\n        let password: string | null = null;\r\n        if (onPasswordRequest) {\r\n          password = await onPasswordRequest();\r\n        }\r\n        if (password) {\r\n          setPassword(password);\r\n        }\r\n        setIsPasswordChecked(true);\r\n      }\r\n\r\n      if (onPasswordRequest) {\r\n        requestPassword();\r\n      }\r\n    } else {\r\n      setIsPasswordChecked(true);\r\n    }\r\n  }, [pdfBuffer]);\r\n\r\n  if (!isReady || !engine) {\r\n    return null;\r\n  }\r\n\r\n  return (\r\n    <EmbedPDF engine={engine} plugins={plugins}>\r\n      <PDFContent\r\n        ref={ref}\r\n        isReady={isReady}\r\n        isLoading={engineLoading}\r\n        hasPassword={Boolean(password) || isPasswordProtected(pdfBuffer || new ArrayBuffer(0))}\r\n      />\r\n    </EmbedPDF>\r\n  );\r\n});\r\n\r\nexport default PDFViewer;\r\n","export default function isPasswordProtected(pdfBuffer: ArrayBuffer): boolean {\r\n    const uint8Array = new Uint8Array(pdfBuffer);\r\n    const searchPattern = '/Encrypt';\r\n    const searchBytes = new TextEncoder().encode(searchPattern);\r\n\r\n    for (let i = 0; i <= uint8Array.length - searchBytes.length; i++) {\r\n        let match = true;\r\n\r\n        for (let j = 0; j < searchBytes.length; j++) {\r\n            if (uint8Array[i + j] !== searchBytes[j]) {\r\n                match = false;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (match) {\r\n            return true;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}","import { useState, useEffect, useMemo, useRef, useCallback } from 'react';\r\nimport { usePdfiumEngine } from \"@embedpdf/engines/react\";\r\nimport { createPluginRegistration } from '@embedpdf/core';\r\nimport { LoaderPluginPackage } from \"@embedpdf/plugin-loader\";\r\nimport { ViewportPluginPackage } from \"@embedpdf/plugin-viewport\";\r\nimport { ScrollPluginPackage, ScrollStrategy } from \"@embedpdf/plugin-scroll\";\r\nimport { RenderPluginPackage } from \"@embedpdf/plugin-render\";\r\nimport { SelectionPluginPackage } from \"@embedpdf/plugin-selection\";\r\nimport { InteractionManagerPluginPackage } from \"@embedpdf/plugin-interaction-manager\";\r\nimport { ZoomPluginPackage } from \"@embedpdf/plugin-zoom\";\r\nimport isPasswordProtected from \"./utils/isPasswordProtected\";\r\nimport { validatePDFBuffer } from \"./utils/validatePDFBuffer\";\r\nimport { type PDFError, PDFErrorType, createPDFError } from \"./utils/errorTypes\";\r\n\r\ninterface PDFViewerOptions {\r\n    pdfBuffer?: ArrayBuffer | null | undefined;\r\n    password?: string;\r\n}\r\n\r\nexport interface PDFViewerInstance {\r\n    setPassword: (password: string) => void;\r\n    zoomIn: () => void;\r\n    zoomOut: () => void;\r\n    requestZoom: (level: number) => void;\r\n    getCurrentPage: () => number | null;\r\n    setPage: (page: number) => void;\r\n    getTotalPages: () => number | null;\r\n    setPasswordChecked: (checked: boolean) => void;\r\n    setIsPasswordChecked: (checked: boolean) => void;\r\n}\r\n\r\nexport interface PDFViewerHookReturn {\r\n    engine: any;\r\n    plugins: any[];\r\n    isLoading: boolean;\r\n    error: PDFError | null;\r\n    isReady: boolean;\r\n    instance: PDFViewerInstance;\r\n}\r\n\r\nexport function usePDFViewer({ pdfBuffer, password: initialPassword }: PDFViewerOptions): PDFViewerHookReturn {\r\n    const { engine, isLoading: engineLoading, error: engineError } = usePdfiumEngine();\r\n    const [error, setError] = useState<PDFError | null>(null);\r\n    const [isReady, setIsReady] = useState(false);\r\n    const [password, setPassword] = useState(initialPassword || \"\");\r\n    const [isPasswordChecked, setIsPasswordChecked] = useState(false);\r\n\r\n    const isLoading = engineLoading;\r\n\r\n    // Reset states when pdfBuffer changes\r\n    useEffect(() => {\r\n        if (pdfBuffer) {\r\n            setError(null);\r\n            setIsReady(false);\r\n            setIsPasswordChecked(false);\r\n        }\r\n    }, [pdfBuffer]);\r\n\r\n    // Handle engine errors\r\n    useEffect(() => {\r\n        console.log('[PDF Engine Error]: ', engineError);\r\n\r\n        if (engineError) {\r\n            setError(createPDFError(\r\n                PDFErrorType.ENGINE,\r\n                `PDFium engine error: ${engineError.message || engineError}`,\r\n                engineError\r\n            ));\r\n        }\r\n    }, [engineError]);\r\n\r\n    // Validate PDF buffer and wait for password check\r\n    useEffect(() => {\r\n        if (!pdfBuffer || !isPasswordChecked) {\r\n            setIsReady(false);\r\n            return;\r\n        }\r\n\r\n        const validation = validatePDFBuffer(pdfBuffer);\r\n        if (!validation.isValid) {\r\n            setError(createPDFError(\r\n                PDFErrorType.VALIDATION,\r\n                validation.error || \"Invalid PDF buffer\"\r\n            ));\r\n            setIsReady(false);\r\n            return;\r\n        }\r\n\r\n        // PDF is valid and password has been checked by component\r\n        setIsReady(true);\r\n    }, [pdfBuffer, password, isPasswordChecked]);\r\n\r\n    const plugins = useMemo(() => {\r\n        if (!pdfBuffer || !isReady) return [];\r\n\r\n        return [\r\n            createPluginRegistration(LoaderPluginPackage, {\r\n                loadingOptions: {\r\n                    type: \"buffer\",\r\n                    pdfFile: {\r\n                        id: `pdf-${Date.now()}`,\r\n                        content: pdfBuffer,\r\n                    },\r\n                    options: {\r\n                        password: password || \"\",\r\n                    },\r\n                },\r\n            }),\r\n            createPluginRegistration(ViewportPluginPackage, {\r\n                viewportGap: 10,\r\n            }),\r\n            createPluginRegistration(ScrollPluginPackage, {\r\n                strategy: ScrollStrategy.Vertical,\r\n            }),\r\n            createPluginRegistration(InteractionManagerPluginPackage),\r\n            createPluginRegistration(ZoomPluginPackage, {\r\n                defaultZoomLevel: 1.0,\r\n                minZoom: 0.2,\r\n                maxZoom: 5.0,\r\n            }),\r\n            createPluginRegistration(RenderPluginPackage),\r\n            createPluginRegistration(SelectionPluginPackage),\r\n        ];\r\n    }, [pdfBuffer, password, isReady]);\r\n\r\n    const instance: PDFViewerInstance = useMemo(() => ({\r\n        setPassword: (newPassword: string) => {\r\n            setPassword(newPassword);\r\n        },\r\n        setPasswordChecked: (checked: boolean) => {\r\n            setIsPasswordChecked(checked);\r\n        },\r\n        setIsPasswordChecked: (checked: boolean) => {\r\n            setIsPasswordChecked(checked);\r\n        },\r\n        zoomIn: () => {\r\n            // Will be implemented via component bridge\r\n        },\r\n        zoomOut: () => {\r\n            // Will be implemented via component bridge\r\n        },\r\n        requestZoom: (level: number) => {\r\n            // Will be implemented via component bridge\r\n        },\r\n        getCurrentPage: () => {\r\n            // TODO: Implement get current page\r\n            return null;\r\n        },\r\n        setPage: (page: number) => {\r\n            // TODO: Implement set page functionality\r\n        },\r\n        getTotalPages: () => {\r\n            // TODO: Implement get total pages\r\n            return null;\r\n        }\r\n    }), []);\r\n\r\n    return {\r\n        engine,\r\n        plugins,\r\n        isLoading,\r\n        error,\r\n        isReady,\r\n        instance\r\n    };\r\n}","interface ValidationResult {\n    isValid: boolean;\n    error?: string;\n}\n\nexport function validatePDFBuffer(pdfBuffer: ArrayBuffer | null | undefined): ValidationResult {\n    if (!pdfBuffer) {\n        return {\n            isValid: false,\n            error: \"PDF buffer is null or undefined\"\n        };\n    }\n\n    if (!(pdfBuffer instanceof ArrayBuffer)) {\n        return {\n            isValid: false,\n            error: \"Invalid PDF buffer: Buffer is not an ArrayBuffer\"\n        };\n    }\n\n    if (pdfBuffer.byteLength === 0) {\n        return {\n            isValid: false,\n            error: \"Invalid PDF buffer: Buffer is empty\"\n        };\n    }\n\n    // Check for PDF signature\n    const uint8Array = new Uint8Array(pdfBuffer.slice(0, 4));\n    const pdfSignature = String.fromCharCode(...uint8Array);\n    \n    if (!pdfSignature.startsWith('%PDF')) {\n        return {\n            isValid: false,\n            error: \"Invalid PDF file: Missing PDF signature\"\n        };\n    }\n\n    return {\n        isValid: true\n    };\n}","export enum PDFErrorType {\n    ENGINE = 'ENGINE',\n    VALIDATION = 'VALIDATION',\n    LOADING = 'LOADING'\n}\n\nexport interface PDFError {\n    type: PDFErrorType;\n    message: string;\n    originalError?: any;\n}\n\nexport function createPDFError(type: PDFErrorType, message: string, originalError?: any): PDFError {\n    return {\n        type,\n        message,\n        originalError\n    };\n}"],"mappings":"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","names":["import_react","import_react","PDFViewer","password","import_react","import_core","import_plugin_loader","import_plugin_selection"]}