All files / web/src/lib/vision/opencv loaderSimple.ts

0% Statements 0/94
0% Branches 0/1
0% Functions 0/1
0% Lines 0/94

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95                                                                                                                                                                                             
/**
 * Simplified OpenCV.js Loader - NO module-level caching
 * Testing if the caching variables are causing the freeze.
 */

import type { CV } from './types'

function isOpenCVReady(): boolean {
  if (typeof window === 'undefined') return false
  const cv = (window as unknown as { cv?: { imread?: unknown } }).cv
  return !!(cv && typeof cv.imread === 'function')
}

/**
 * Load OpenCV.js - simplified version without module-level state.
 */
export async function loadOpenCVSimple(): Promise<CV> {
  // If already loaded on window, return it
  if (isOpenCVReady()) {
    return (window as unknown as { cv: CV }).cv
  }

  // Load the script
  if (typeof window !== 'undefined') {
    const existingScript = document.querySelector('script[src="/opencv.js"]')

    if (!existingScript) {
      await new Promise<void>((resolve, reject) => {
        const script = document.createElement('script')
        script.src = '/opencv.js'
        script.async = true

        script.onload = () => {
          const checkReady = () => {
            if (isOpenCVReady()) {
              resolve()
            } else {
              const cv = (
                window as unknown as {
                  cv?: { onRuntimeInitialized?: () => void }
                }
              ).cv
              if (cv) {
                const previousCallback = cv.onRuntimeInitialized
                cv.onRuntimeInitialized = () => {
                  previousCallback?.()
                  resolve()
                }
              } else {
                reject(new Error('OpenCV.js loaded but cv not found'))
              }
            }
          }
          checkReady()
        }

        script.onerror = () => reject(new Error('Failed to load OpenCV.js'))
        document.head.appendChild(script)
      })
    } else {
      // Script exists, wait for it to be ready
      await new Promise<void>((resolve, reject) => {
        const maxWait = 30000
        const startTime = Date.now()

        const checkReady = () => {
          if (isOpenCVReady()) {
            resolve()
          } else if (Date.now() - startTime > maxWait) {
            reject(new Error('OpenCV.js loading timed out'))
          } else {
            const cv = (
              window as unknown as {
                cv?: { onRuntimeInitialized?: () => void }
              }
            ).cv
            if (cv) {
              const previousCallback = cv.onRuntimeInitialized
              cv.onRuntimeInitialized = () => {
                previousCallback?.()
                resolve()
              }
            } else {
              setTimeout(checkReady, 100)
            }
          }
        }
        checkReady()
      })
    }
  }

  return (window as unknown as { cv: CV }).cv
}