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

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

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                                                                                                     
'use client'

/**
 * Wait for window.cv to be ready using a Promise.
 */
export async function waitForCv(timeoutMs: number = 10000): Promise<boolean> {
  console.log('[waitForCv] waitForCv called')

  if (typeof window === 'undefined') {
    console.log('[waitForCv] window is undefined')
    return false
  }

  // Check if already ready
  const cv = (window as unknown as { cv?: { imread?: unknown } }).cv
  if (cv && typeof cv.imread === 'function') {
    console.log('[waitForCv] already ready')
    return true
  }

  console.log('[waitForCv] not ready, starting to poll')

  // Poll until ready
  return new Promise<boolean>((resolve) => {
    const startTime = Date.now()
    let checkCount = 0

    const check = () => {
      checkCount++
      const cv = (window as unknown as { cv?: { imread?: unknown } }).cv
      const ready = !!(cv && typeof cv.imread === 'function')

      if (checkCount <= 5 || checkCount % 20 === 0) {
        console.log(`[waitForCv] check #${checkCount}, ready=${ready}`)
      }

      if (ready) {
        console.log(`[waitForCv] ready after ${checkCount} checks`)
        resolve(true)
      } else if (Date.now() - startTime > timeoutMs) {
        console.log('[waitForCv] timed out')
        resolve(false)
      } else {
        setTimeout(check, 100)
      }
    }

    check()
  })
}