// want to wrap one ocv obj, importing async type const OPENCV_URL = 'libs/opencv.js' window.cvgo = false window.cvloading = false window.cvresolvers = [] function loadOpenCv() { return new Promise((resolve, reject) => { console.log('CVLOAD: begin', window.cvgo, window.cvloading, window.cvresolvers.length) if (window.cvgo && !window.cvloading && cv) { console.log('CVLOAD: here already') resolve() } else if (window.cvloading) { console.log('CVLOAD: already loading, adding to resolve') window.cvresolvers.push(resolve) } else { console.log('CVLOAD: loading cv, ok') window.cvloading = true let script = document.createElement('script') script.setAttribute('async', '') script.setAttribute('type', 'text/javascript') script.addEventListener('load', () => { // ocv drops 'cv' in to toplevel documeeeent yikes // let's see if we can just stash this local copy, // and shell it out ... console.log('CVLOAD: loaded') window.cvgo = true window.cvloading = false resolve() if(window.cvresolvers.length > 0){ for(let res of window.cvresolvers){ res() } } }) script.addEventListener('error', (err) => { console.error('CVLOAD: failed to load script', err) reject(err) }) script.src = OPENCV_URL let node = document.getElementsByTagName('script')[0] node.parentNode.insertBefore(script, node) } }) } function getWebcam(w, h) { return new Promise((resolve, reject) => { let video = document.createElement('video') video.width = w video.height = h navigator.mediaDevices.getUserMedia({ video: true, audio: false }).then((stream) => { video.srcObject = stream video.play() resolve(video) }).catch((err) => { console.error('cannot get webcam', err) reject(err) }) }) } export { loadOpenCv, getWebcam }