seg-cam 1.3.0 → 1.5.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/README.md CHANGED
@@ -11,6 +11,7 @@ An easy-to-use drop-in library that wraps around TensorFlow.js BodyPix. Using it
11
11
  - **CSP Compliant**: No external CDNs or `importScripts` used at runtime.
12
12
  - **Highly Configurable**: Control architecture, thresholds, and target body parts.
13
13
  - **React Ready**: Optimized for React with a simple component and hook API.
14
+ - **Mobile Optimized**: WebGL memory management hardened specifically for iOS Safari (WKWebView) and Android WebView contexts.
14
15
 
15
16
  ---
16
17
 
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var Se=Object.create;var V=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames,he=Object.getOwnPropertySymbols,Ne=Object.getPrototypeOf,Ee=Object.prototype.hasOwnProperty,He=Object.prototype.propertyIsEnumerable;var Te=(e,r,t)=>r in e?V(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,be=(e,r)=>{for(var t in r||(r={}))Ee.call(r,t)&&Te(e,t,r[t]);if(he)for(var t of he(r))He.call(r,t)&&Te(e,t,r[t]);return e};var Je=(e,r)=>{for(var t in r)V(e,t,{get:r[t],enumerable:!0})},De=(e,r,t,E)=>{if(r&&typeof r=="object"||typeof r=="function")for(let c of Ae(r))!Ee.call(e,c)&&c!==t&&V(e,c,{get:()=>r[c],enumerable:!(E=Oe(r,c))||E.enumerable});return e};var Pe=(e,r,t)=>(t=e!=null?Se(Ne(e)):{},De(r||!e||!e.__esModule?V(t,"default",{value:e,enumerable:!0}):t,e)),Ue=e=>De(V({},"__esModule",{value:!0}),e);var B=(e,r,t)=>new Promise((E,c)=>{var S=f=>{try{I(t.next(f))}catch(k){c(k)}},R=f=>{try{I(t.throw(f))}catch(k){c(k)}},I=f=>f.done?E(f.value):Promise.resolve(f.value).then(S,R);I((t=t.apply(e,r)).next())});var je={};Je(je,{DEFAULT_CONFIG:()=>l,JerseyDetector:()=>me,useJerseyWorker:()=>te});module.exports=Ue(je);var s=require("react");var h=require("react");var y=null,x=!1,G=null,fe=0,de=null,D=new Map,Le=0,re=new Map;function te(e,r){let t=(0,h.useRef)(!1),[E,c]=(0,h.useState)(!1),[S,R]=(0,h.useState)(null),I=(0,h.useRef)(!0),f=(0,h.useRef)(!1),k=(0,h.useRef)(`instance_${Math.random().toString(36).substr(2,9)}`),O=(0,h.useRef)(0);(0,h.useEffect)(()=>{var C;if(!e)return;I.current=!0,O.current++;let v=O.current,M=k.current,A=(C=re.get(M))!=null?C:0;return v>A&&(fe++,re.set(M,v)),B(null,null,function*(){var m;if(!y||!Fe(de,e)){y&&(y.terminate(),y=null,x=!1,console.log("[v0 useJerseyWorker] Worker terminated because of change in config"));try{f.current=(m=e.verbose)!=null?m:f.current;let g=r||"/jersey-detector-worker.js";y=new Worker(g),de=e,x=!1,G=null,c(!1),R(null),y.onmessage=d=>{let a=d.data;switch(a.type){case"ready":x=!0,c(!0),f.current&&console.log("[v0 useJerseyWorker] Worker Ready",{device:a.device,dtype:a.dtype,config:a.config});break;case"loading_progress":f.current&&console.log(`[v0 useJerseyWorker] Loaded ${a.progress}% of ${a.file}`);break;case"debug":f.current&&console.log(a.debug_message);break;case"error":let b=a.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",b),x=!1,G=b,c(!1),R(b);break;case"detect_response":if(a.requestId&&D.has(a.requestId)){let W=D.get(a.requestId);W&&(W.resolve(a),D.delete(a.requestId))}else if(D.size>0){let W=D.entries().next();if(!W.done){let[ne,p]=W.value;p.resolve(a),D.delete(ne)}}break}},y.onerror=d=>{let a=d.message||"Worker initialization error";console.error("[useJerseyWorker] Worker error:",a),x=!1,G=a,c(!1),R(a)},y.postMessage({type:"init",config:e})}catch(g){let d=(g==null?void 0:g.message)||String(g);console.error("[useJerseyWorker] Failed to create worker:",d),c(!1),R(d)}}else c(x),R(G)}),()=>{I.current=!1;let m=k.current,g=re.get(m),d=O.current;g===d&&(fe--,re.delete(m),fe<=0&&y&&(y.terminate(),y=null,x=!1,G=null,de=null,D.clear()))}},[]);let Y=(0,h.useCallback)((v,M,A=.5,P=!0,C)=>B(null,null,function*(){if(!y||!x)throw new Error("Worker not ready");if(t.current)return null;let m=`req_${++Le}_${Date.now()}`;return new Promise((g,d)=>{D.set(m,{resolve:g,reject:d});try{t.current=!0,y.postMessage({type:"detect",requestId:m,dimensions:M,bitmap:v,threshold:A,includeSegmentedImages:P,lastJerseyCount:C},[v])}catch(a){D.delete(m);let b=`Failed to send detect: ${a==null?void 0:a.message}`;d(new Error(b))}finally{t.current=!1}setTimeout(()=>{D.has(m)&&(D.delete(m),d(new Error("Detection timeout")))},1e4)})}),[E]);return{isReady:E,workerReady:E,lastError:S,detect:Y}}function Fe(e,r){return e?JSON.stringify(e)===JSON.stringify(r):!1}var l={TASK:"image-segmentation",MODEL:"BodyPix",BODYPIX_ARCHITECTURE:"MobileNetV1",BODYPIX_MULTIPLIER:.75,BODYPIX_QUANT_BYTES:2,BODYPIX_STRIDE:16,MULTI_SEGMENTATION:!0,SEGMENT_BODY_PARTS:!0,BACKGROUND_SHADE:0,SHIRT_SHADE:170,DETECTION_THRESHOLD:.5,TARGET_PART_ID:12,IMAGES_TO_RETURN:"mask",VERBOSE:!1,MIN_DETECTION_AREA:1e4};var Re=Pe(require("p-limit"));var Ie=require("react/jsx-runtime"),me=(0,s.forwardRef)(({videoRef:e,onWorkerReady:r,onWorkerError:t,onStatsUpdate:E,onSegmentedImage:c,task:S=l.TASK,model:R=l.MODEL,verbose:I=l.VERBOSE,bodyPixArchitecture:f=l.BODYPIX_ARCHITECTURE,bodyPixMultiplier:k=l.BODYPIX_MULTIPLIER,bodyPixQuantBytes:O=l.BODYPIX_QUANT_BYTES,bodyPixStride:Y=l.BODYPIX_STRIDE,multiSegmentation:v=l.MULTI_SEGMENTATION,segmentBodyParts:M=l.SEGMENT_BODY_PARTS,backgroundShade:A=l.BACKGROUND_SHADE,shirtShade:P=l.SHIRT_SHADE,threshold:C=l.DETECTION_THRESHOLD,targetPartId:m=l.TARGET_PART_ID,imagesToReturn:g=l.IMAGES_TO_RETURN,minDetectionArea:d=l.MIN_DETECTION_AREA,throttleMs:a=1e3,onImageSegmentedLimit:b=2,workerUrl:W,className:ne,style:p},ke)=>{let q=(0,s.useRef)(null),oe=(0,s.useRef)(null),U=(0,s.useRef)(null),X=(0,s.useRef)(!1),L=(0,s.useRef)(null),se=(0,s.useRef)(!1),$=(0,s.useRef)([]),we=(0,s.useRef)(null),F=(0,s.useRef)(!1),z=(0,s.useRef)(void 0);z.current=t;let K=(0,s.useRef)({jerseyCount:0,confidence:0,fps:0,processingTime:0}),ae=(0,s.useRef)(0),ie=(0,s.useMemo)(()=>(0,Re.default)(b),[b]),Q=(0,s.useMemo)(()=>({task:S,model:R,verbose:I,bodyPixArchitecture:f,bodyPixMultiplier:k,bodyPixQuantBytes:O,bodyPixStride:Y,multiSegmentation:v,segmentBodyParts:M,backgroundShade:A,shirtShade:P,threshold:C,targetPartId:m,imagesToReturn:g,minDetectionArea:d,mirror:(p==null?void 0:p.transform)==="scaleX(-1)"||typeof(p==null?void 0:p.transform)=="string"&&p.transform.includes("scaleX(-1)")}),[S,R,I,f,k,O,Y,v,M,A,P,C,m,g,d,p==null?void 0:p.transform]),ve=()=>{var n,i;return{width:((n=e.current)==null?void 0:n.videoWidth)||0,height:((i=e.current)==null?void 0:i.videoHeight)||0}},{isReady:N,workerReady:_,lastError:j,detect:Ce}=te(Q,W);(0,s.useEffect)(()=>{_&&console.log("[JerseyDetector] Worker Ready with config:",Q),r==null||r(_)},[_,r,Q]),(0,s.useEffect)(()=>{var n;j&&(F.current=!0,(n=z.current)==null||n.call(z,j))},[j]);let _e=(0,s.useCallback)((n,i)=>{if(ie.activeCount>=b){n.forEach(o=>{var u;return(u=o==null?void 0:o.close)==null?void 0:u.call(o)}),console.warn(`[JerseyDetector] Dropped new segmented images \u2014 max ${b} classifications running`);return}ie(()=>B(null,null,function*(){try{c==null||c(n,i)}catch(o){console.error("[JerseyDetector] Classification error:",o)}finally{n.forEach(o=>{var u;return(u=o==null?void 0:o.close)==null?void 0:u.call(o)})}}))},[c,b,ie]),xe=()=>B(null,null,function*(){var H,ce,ge;let n=e.current,i=q.current;if(F.current||!N||!_||!n||!i||se.current||n.readyState<2||n.paused||n.ended||n.videoWidth===0||n.videoHeight===0)return;!U.current&&!oe.current&&(U.current=i.getContext("bitmaprenderer"),X.current=!!U.current,X.current||(oe.current=i.getContext("2d")));let o=oe.current;if(!X.current&&!o||i.width<=0||i.height<=0)return;let u=null,w=null;try{se.current=!0;let Z=n.videoWidth,ue=n.videoHeight;we.current={width:Z,height:ue},u=yield createImageBitmap(n);let Me=ve(),le=Date.now(),We=le-ae.current>a,Be=K.current.jerseyCount,T=yield Ce(u,Me,C,We,Be);if((T==null?void 0:T.type)==="detect_response"){if(g!=="none"&&((i.width!==Z||i.height!==ue)&&(i.width=Z,i.height=ue),T.bitmap)){let J=T.bitmap;X.current&&U.current?U.current.transferFromImageBitmap(J):(o&&o.drawImage(J,0,0),J.close())}$.current.push(Date.now()),$.current=$.current.filter(J=>Date.now()-J<1e3);let ee={jerseyCount:((H=T.stats)==null?void 0:H.jerseyCount)||0,confidence:((ce=T.stats)==null?void 0:ce.confidence)||0,fps:$.current.length,processingTime:((ge=T.stats)==null?void 0:ge.processingTime)||0},pe=K.current;K.current=ee;let ye=le-ae.current>a||ee.jerseyCount!==pe.jerseyCount||ee.confidence!==pe.confidence;ye&&E&&(E(ee),ae.current=le),ye&&T.segmentedImages&&T.segmentedImages.length>0&&c&&_e(T.segmentedImages,T.bboxes)}}catch(Z){F.current=!0}finally{u==null||u.close(),se.current=!1}});return(0,s.useImperativeHandle)(ke,()=>({get isReady(){return N},get lastError(){return j},get stats(){return K.current},capture:(n="image/jpeg",i=.92)=>{let o=e.current,u=q.current;if(!o||o.videoWidth<=0||o.videoHeight<=0)throw new Error("Video not ready for capture");let w=document.createElement("canvas");w.width=o.videoWidth,w.height=o.videoHeight;let H=w.getContext("2d");if(!H)throw new Error("Failed to get context for capture canvas");let ce=Q.mirror;return H.drawImage(o,0,0,w.width,w.height),u&&u.width>0&&u.height>0&&H.drawImage(u,0,0,w.width,w.height),w.toDataURL(n,i)}}),[N,j,_]),(0,s.useEffect)(()=>{if(!_||!N||F.current)return;let n=e.current,i=q.current;if(!n||!i||n.videoWidth===0||n.videoHeight===0){let u=setTimeout(()=>{L.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(u)}(i.width!==n.videoWidth||i.height!==n.videoHeight)&&(i.width=n.videoWidth,i.height=n.videoHeight);let o=()=>B(null,null,function*(){!_||!N||F.current||(yield xe(),L.current=requestAnimationFrame(o))});return L.current=requestAnimationFrame(o),()=>{L.current&&cancelAnimationFrame(L.current)}},[_,N]),(0,Ie.jsx)("canvas",{ref:q,className:`absolute inset-0 pointer-events-none ${ne||""}`,style:be({zIndex:10,width:"100%",height:"100%"},p)})});me.displayName="JerseyDetector";0&&(module.exports={DEFAULT_CONFIG,JerseyDetector,useJerseyWorker});
1
+ "use strict";var Se=Object.create;var Y=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames,ye=Object.getOwnPropertySymbols,Ne=Object.getPrototypeOf,Ee=Object.prototype.hasOwnProperty,He=Object.prototype.propertyIsEnumerable;var De=(e,r,t)=>r in e?Y(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,Re=(e,r)=>{for(var t in r||(r={}))Ee.call(r,t)&&De(e,t,r[t]);if(ye)for(var t of ye(r))He.call(r,t)&&De(e,t,r[t]);return e};var Je=(e,r)=>{for(var t in r)Y(e,t,{get:r[t],enumerable:!0})},Ie=(e,r,t,y)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of Ae(r))!Ee.call(e,a)&&a!==t&&Y(e,a,{get:()=>r[a],enumerable:!(y=Oe(r,a))||y.enumerable});return e};var Pe=(e,r,t)=>(t=e!=null?Se(Ne(e)):{},Ie(r||!e||!e.__esModule?Y(t,"default",{value:e,enumerable:!0}):t,e)),je=e=>Ie(Y({},"__esModule",{value:!0}),e);var S=(e,r,t)=>new Promise((y,a)=>{var O=h=>{try{k(t.next(h))}catch(v){a(v)}},R=h=>{try{k(t.throw(h))}catch(v){a(v)}},k=h=>h.done?y(h.value):Promise.resolve(h.value).then(O,R);k((t=t.apply(e,r)).next())});var Le={};Je(Le,{DEFAULT_CONFIG:()=>m,JerseyDetector:()=>ge,useJerseyWorker:()=>se});module.exports=je(Le);var s=require("react");var p=require("react");var f=null,_=!1,q=null,de=0,ne=null,E=new Map,Ue=0,oe=new Map;function se(e,r){let t=(0,p.useRef)(!1),[y,a]=(0,p.useState)(!1),[O,R]=(0,p.useState)(null),k=(0,p.useRef)(!0),h=(0,p.useRef)(!1),v=(0,p.useRef)(`instance_${Math.random().toString(36).substr(2,9)}`),A=(0,p.useRef)(0),[U,X]=(0,p.useState)(0);(0,p.useEffect)(()=>{var M;if(!e)return;k.current=!0,A.current++;let I=A.current,b=v.current,N=(M=oe.get(b))!=null?M:0;return I>N&&(de++,oe.set(b,I)),S(null,null,function*(){var T;if(!f||!Ve(ne,e)){f&&(f.terminate(),f=null,_=!1,console.log("[v0 useJerseyWorker] Worker terminated because of change in config or watchdog"));try{h.current=(T=e.verbose)!=null?T:h.current;let d=r||"/jersey-detector-worker.js";f=new Worker(d),ne=e,_=!1,q=null,a(!1),R(null),f.onmessage=w=>{let u=w.data;switch(u.type){case"ready":_=!0,a(!0);break;case"debug":h.current&&console.log(u.debug_message);break;case"error":let l=u.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",l),_=!1,q=l,a(!1),R(l);break;case"detect_response":if(u.requestId&&E.has(u.requestId)){let W=E.get(u.requestId);W==null||W.resolve(u),E.delete(u.requestId)}break}},f.onerror=w=>{let u=w.message||"Worker initialization error";_=!1,q=u,a(!1),R(u)},f.postMessage({type:"init",config:e})}catch(d){a(!1),R((d==null?void 0:d.message)||String(d))}}else a(_),R(q)}),()=>{k.current=!1;let T=v.current,d=oe.get(T),w=A.current;d===w&&(de--,oe.delete(T),de<=0&&f&&(f.terminate(),f=null,_=!1,q=null,ne=null,E.clear()))}},[e,r,U]);let x=(0,p.useRef)(0);(0,p.useEffect)(()=>{if(!f)return;let I=setInterval(()=>{E.size>0?x.current>=3&&(console.error("[v0 useJerseyWorker] Watchdog: Worker appears hung after 3 consecutive timeouts. Restarting..."),x.current=0,f&&(f.terminate(),f=null,_=!1,ne=null,a(!1),X(b=>b+1))):x.current=0},2e3);return()=>clearInterval(I)},[y,U]);let z=(0,p.useCallback)((I,b,N=.5,H=!0,M)=>S(null,null,function*(){if(!f||!_)return null;if(t.current||E.size>0)return h.current,null;let T=`req_${++Ue}_${Date.now()}`;return new Promise((d,w)=>{let u=setTimeout(()=>{if(E.has(T)){x.current++;let g=E.get(T);g==null||g.reject(new Error("Detection timeout")),E.delete(T),t.current=!1}},5e3),l=g=>{x.current=0,clearTimeout(u),t.current=!1,d(g)},W=g=>{clearTimeout(u),t.current=!1,w(g)};E.set(T,{resolve:l,reject:W});try{t.current=!0,f.postMessage({type:"detect",requestId:T,dimensions:b,bitmap:I,threshold:N,includeSegmentedImages:H,lastJerseyCount:M},[I])}catch(g){clearTimeout(u),E.delete(T),t.current=!1,w(new Error(`Failed to send detect: ${g==null?void 0:g.message}`))}})}),[y]);return{isReady:y,workerReady:y,lastError:O,detect:z}}function Ve(e,r){return e?JSON.stringify(e)===JSON.stringify(r):!1}var m={TASK:"image-segmentation",MODEL:"BodyPix",BODYPIX_ARCHITECTURE:"MobileNetV1",BODYPIX_MULTIPLIER:.75,BODYPIX_QUANT_BYTES:2,BODYPIX_STRIDE:16,MULTI_SEGMENTATION:!0,SEGMENT_BODY_PARTS:!0,BACKGROUND_SHADE:0,SHIRT_SHADE:170,DETECTION_THRESHOLD:.5,TARGET_PART_ID:12,IMAGES_TO_RETURN:"mask",VERBOSE:!1,MIN_DETECTION_AREA:1e4};var be=Pe(require("p-limit"));var we=require("react/jsx-runtime"),ge=(0,s.forwardRef)(({videoRef:e,onWorkerReady:r,onWorkerError:t,onStatsUpdate:y,onSegmentedImage:a,task:O=m.TASK,model:R=m.MODEL,verbose:k=m.VERBOSE,bodyPixArchitecture:h=m.BODYPIX_ARCHITECTURE,bodyPixMultiplier:v=m.BODYPIX_MULTIPLIER,bodyPixQuantBytes:A=m.BODYPIX_QUANT_BYTES,bodyPixStride:U=m.BODYPIX_STRIDE,multiSegmentation:X=m.MULTI_SEGMENTATION,segmentBodyParts:x=m.SEGMENT_BODY_PARTS,backgroundShade:z=m.BACKGROUND_SHADE,shirtShade:I=m.SHIRT_SHADE,threshold:b=m.DETECTION_THRESHOLD,targetPartId:N=m.TARGET_PART_ID,imagesToReturn:H=m.IMAGES_TO_RETURN,minDetectionArea:M=m.MIN_DETECTION_AREA,throttleMs:T=1e3,onImageSegmentedLimit:d=2,workerUrl:w,className:u,style:l},W)=>{let g=(0,s.useRef)(null),ae=(0,s.useRef)(null),V=(0,s.useRef)(null),$=(0,s.useRef)(!1),L=(0,s.useRef)(null),ie=(0,s.useRef)(!1),K=(0,s.useRef)([]),ke=(0,s.useRef)(null),Q=(0,s.useRef)(!1),Z=(0,s.useRef)(void 0);Z.current=t;let ee=(0,s.useRef)({jerseyCount:0,confidence:0,fps:0,processingTime:0}),ce=(0,s.useRef)(0),ue=(0,s.useMemo)(()=>(0,be.default)(d),[d]),re=(0,s.useMemo)(()=>({task:O,model:R,verbose:k,bodyPixArchitecture:h,bodyPixMultiplier:v,bodyPixQuantBytes:A,bodyPixStride:U,multiSegmentation:X,segmentBodyParts:x,backgroundShade:z,shirtShade:I,threshold:b,targetPartId:N,imagesToReturn:H,minDetectionArea:M,mirror:(l==null?void 0:l.transform)==="scaleX(-1)"||typeof(l==null?void 0:l.transform)=="string"&&l.transform.includes("scaleX(-1)")}),[O,R,k,h,v,A,U,X,x,z,I,b,N,H,M,l==null?void 0:l.transform]),ve=()=>{var n,i;return{width:((n=e.current)==null?void 0:n.videoWidth)||0,height:((i=e.current)==null?void 0:i.videoHeight)||0}},{isReady:J,workerReady:B,lastError:F,detect:Ce}=se(re,w);(0,s.useEffect)(()=>{B&&(console.log("[JerseyDetector] Worker Ready with config:",re),Q.current=!1),r==null||r(B)},[B,r,re]),(0,s.useEffect)(()=>{var n;F&&((n=Z.current)==null||n.call(Z,F))},[F]);let _e=(0,s.useCallback)((n,i)=>{if(ue.activeCount>=d){n.forEach(o=>{var c;return(c=o==null?void 0:o.close)==null?void 0:c.call(o)}),console.warn(`[JerseyDetector] Dropped new segmented images \u2014 max ${d} classifications running`);return}ue(()=>S(null,null,function*(){try{a==null||a(n,i)}catch(o){console.error("[JerseyDetector] Classification error:",o)}finally{n.forEach(o=>{var c;return(c=o==null?void 0:o.close)==null?void 0:c.call(o)})}}))},[a,d,ue]),xe=()=>S(null,null,function*(){var P,le,pe;let n=e.current,i=g.current;if(Q.current||!J||!B||!n||!i||ie.current||n.readyState<2||n.paused||n.ended||n.videoWidth===0||n.videoHeight===0)return;!V.current&&!ae.current&&(V.current=i.getContext("bitmaprenderer"),$.current=!!V.current,$.current||(ae.current=i.getContext("2d")));let o=ae.current;if(!$.current&&!o||i.width<=0||i.height<=0)return;let c=null,C=null;try{ie.current=!0;let G=n.videoWidth,fe=n.videoHeight;ke.current={width:G,height:fe},c=yield createImageBitmap(n);let Be=ve(),me=Date.now(),Me=me-ce.current>T,We=ee.current.jerseyCount,D=yield Ce(c,Be,b,Me,We);if((D==null?void 0:D.type)==="detect_response"){if(H!=="none"&&((i.width!==G||i.height!==fe)&&(i.width=G,i.height=fe),D.bitmap)){let j=D.bitmap;$.current&&V.current?V.current.transferFromImageBitmap(j):(o&&o.drawImage(j,0,0),j.close())}K.current.push(Date.now()),K.current=K.current.filter(j=>Date.now()-j<1e3);let te={jerseyCount:((P=D.stats)==null?void 0:P.jerseyCount)||0,confidence:((le=D.stats)==null?void 0:le.confidence)||0,fps:K.current.length,processingTime:((pe=D.stats)==null?void 0:pe.processingTime)||0},he=ee.current;ee.current=te;let Te=me-ce.current>T||te.jerseyCount!==he.jerseyCount||te.confidence!==he.confidence;Te&&y&&(y(te),ce.current=me),Te&&D.segmentedImages&&D.segmentedImages.length>0&&a&&_e(D.segmentedImages,D.bboxes)}}catch(G){console.warn("[JerseyDetector] Detection error (skipping frame):",G)}finally{c==null||c.close(),ie.current=!1}});return(0,s.useImperativeHandle)(W,()=>({get isReady(){return J},get lastError(){return F},get stats(){return ee.current},capture:(n="image/jpeg",i=.92)=>{let o=e.current,c=g.current;if(!o||o.videoWidth<=0||o.videoHeight<=0)throw new Error("Video not ready for capture");let C=document.createElement("canvas");C.width=o.videoWidth,C.height=o.videoHeight;let P=C.getContext("2d");if(!P)throw new Error("Failed to get context for capture canvas");let le=re.mirror;return P.drawImage(o,0,0,C.width,C.height),c&&c.width>0&&c.height>0&&P.drawImage(c,0,0,C.width,C.height),C.toDataURL(n,i)}}),[J,F,B]),(0,s.useEffect)(()=>{if(!B||!J||Q.current)return;let n=e.current,i=g.current;if(!n||!i||n.videoWidth===0||n.videoHeight===0){let c=setTimeout(()=>{L.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(c)}(i.width!==n.videoWidth||i.height!==n.videoHeight)&&(i.width=n.videoWidth,i.height=n.videoHeight);let o=()=>S(null,null,function*(){!B||!J||Q.current||(yield xe(),L.current=requestAnimationFrame(o))});return L.current=requestAnimationFrame(o),()=>{L.current&&cancelAnimationFrame(L.current)}},[B,J]),(0,we.jsx)("canvas",{ref:g,className:`absolute inset-0 pointer-events-none ${u||""}`,style:Re({zIndex:10,width:"100%",height:"100%"},l)})});ge.displayName="JerseyDetector";0&&(module.exports={DEFAULT_CONFIG,JerseyDetector,useJerseyWorker});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var We=Object.defineProperty;var ye=Object.getOwnPropertySymbols;var Be=Object.prototype.hasOwnProperty,Se=Object.prototype.propertyIsEnumerable;var he=(n,s,a)=>s in n?We(n,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):n[s]=a,Te=(n,s)=>{for(var a in s||(s={}))Be.call(s,a)&&he(n,a,s[a]);if(ye)for(var a of ye(s))Se.call(s,a)&&he(n,a,s[a]);return n};var W=(n,s,a)=>new Promise((k,l)=>{var B=c=>{try{D(a.next(c))}catch(R){l(R)}},b=c=>{try{D(a.throw(c))}catch(R){l(R)}},D=c=>c.done?k(c.value):Promise.resolve(c.value).then(B,b);D((a=a.apply(n,s)).next())});import{forwardRef as Je,useImperativeHandle as Pe,useRef as h,useEffect as de,useMemo as be,useCallback as Ue}from"react";import{useEffect as Oe,useState as Ee,useCallback as Ae,useRef as j}from"react";var p=null,_=!1,V=null,ue=0,le=null,E=new Map,Ne=0,ee=new Map;function fe(n,s){let a=j(!1),[k,l]=Ee(!1),[B,b]=Ee(null),D=j(!0),c=j(!1),R=j(`instance_${Math.random().toString(36).substr(2,9)}`),S=j(0);Oe(()=>{var v;if(!n)return;D.current=!0,S.current++;let w=S.current,x=R.current,O=(v=ee.get(x))!=null?v:0;return w>O&&(ue++,ee.set(x,w)),W(null,null,function*(){var d;if(!p||!He(le,n)){p&&(p.terminate(),p=null,_=!1,console.log("[v0 useJerseyWorker] Worker terminated because of change in config"));try{c.current=(d=n.verbose)!=null?d:c.current;let m=s||"/jersey-detector-worker.js";p=new Worker(m),le=n,_=!1,V=null,l(!1),b(null),p.onmessage=f=>{let t=f.data;switch(t.type){case"ready":_=!0,l(!0),c.current&&console.log("[v0 useJerseyWorker] Worker Ready",{device:t.device,dtype:t.dtype,config:t.config});break;case"loading_progress":c.current&&console.log(`[v0 useJerseyWorker] Loaded ${t.progress}% of ${t.file}`);break;case"debug":c.current&&console.log(t.debug_message);break;case"error":let T=t.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",T),_=!1,V=T,l(!1),b(T);break;case"detect_response":if(t.requestId&&E.has(t.requestId)){let M=E.get(t.requestId);M&&(M.resolve(t),E.delete(t.requestId))}else if(E.size>0){let M=E.entries().next();if(!M.done){let[re,g]=M.value;g.resolve(t),E.delete(re)}}break}},p.onerror=f=>{let t=f.message||"Worker initialization error";console.error("[useJerseyWorker] Worker error:",t),_=!1,V=t,l(!1),b(t)},p.postMessage({type:"init",config:n})}catch(m){let f=(m==null?void 0:m.message)||String(m);console.error("[useJerseyWorker] Failed to create worker:",f),l(!1),b(f)}}else l(_),b(V)}),()=>{D.current=!1;let d=R.current,m=ee.get(d),f=S.current;m===f&&(ue--,ee.delete(d),ue<=0&&p&&(p.terminate(),p=null,_=!1,V=null,le=null,E.clear()))}},[]);let G=Ae((w,x,O=.5,J=!0,v)=>W(null,null,function*(){if(!p||!_)throw new Error("Worker not ready");if(a.current)return null;let d=`req_${++Ne}_${Date.now()}`;return new Promise((m,f)=>{E.set(d,{resolve:m,reject:f});try{a.current=!0,p.postMessage({type:"detect",requestId:d,dimensions:x,bitmap:w,threshold:O,includeSegmentedImages:J,lastJerseyCount:v},[w])}catch(t){E.delete(d);let T=`Failed to send detect: ${t==null?void 0:t.message}`;f(new Error(T))}finally{a.current=!1}setTimeout(()=>{E.has(d)&&(E.delete(d),f(new Error("Detection timeout")))},1e4)})}),[k]);return{isReady:k,workerReady:k,lastError:B,detect:G}}function He(n,s){return n?JSON.stringify(n)===JSON.stringify(s):!1}var u={TASK:"image-segmentation",MODEL:"BodyPix",BODYPIX_ARCHITECTURE:"MobileNetV1",BODYPIX_MULTIPLIER:.75,BODYPIX_QUANT_BYTES:2,BODYPIX_STRIDE:16,MULTI_SEGMENTATION:!0,SEGMENT_BODY_PARTS:!0,BACKGROUND_SHADE:0,SHIRT_SHADE:170,DETECTION_THRESHOLD:.5,TARGET_PART_ID:12,IMAGES_TO_RETURN:"mask",VERBOSE:!1,MIN_DETECTION_AREA:1e4};import Le from"p-limit";import{jsx as Fe}from"react/jsx-runtime";var De=Je(({videoRef:n,onWorkerReady:s,onWorkerError:a,onStatsUpdate:k,onSegmentedImage:l,task:B=u.TASK,model:b=u.MODEL,verbose:D=u.VERBOSE,bodyPixArchitecture:c=u.BODYPIX_ARCHITECTURE,bodyPixMultiplier:R=u.BODYPIX_MULTIPLIER,bodyPixQuantBytes:S=u.BODYPIX_QUANT_BYTES,bodyPixStride:G=u.BODYPIX_STRIDE,multiSegmentation:w=u.MULTI_SEGMENTATION,segmentBodyParts:x=u.SEGMENT_BODY_PARTS,backgroundShade:O=u.BACKGROUND_SHADE,shirtShade:J=u.SHIRT_SHADE,threshold:v=u.DETECTION_THRESHOLD,targetPartId:d=u.TARGET_PART_ID,imagesToReturn:m=u.IMAGES_TO_RETURN,minDetectionArea:f=u.MIN_DETECTION_AREA,throttleMs:t=1e3,onImageSegmentedLimit:T=2,workerUrl:M,className:re,style:g},Re)=>{let Y=h(null),te=h(null),P=h(null),q=h(!1),U=h(null),ne=h(!1),X=h([]),Ie=h(null),L=h(!1),$=h(void 0);$.current=a;let z=h({jerseyCount:0,confidence:0,fps:0,processingTime:0}),oe=h(0),se=be(()=>Le(T),[T]),K=be(()=>({task:B,model:b,verbose:D,bodyPixArchitecture:c,bodyPixMultiplier:R,bodyPixQuantBytes:S,bodyPixStride:G,multiSegmentation:w,segmentBodyParts:x,backgroundShade:O,shirtShade:J,threshold:v,targetPartId:d,imagesToReturn:m,minDetectionArea:f,mirror:(g==null?void 0:g.transform)==="scaleX(-1)"||typeof(g==null?void 0:g.transform)=="string"&&g.transform.includes("scaleX(-1)")}),[B,b,D,c,R,S,G,w,x,O,J,v,d,m,f,g==null?void 0:g.transform]),ke=()=>{var e,o;return{width:((e=n.current)==null?void 0:e.videoWidth)||0,height:((o=n.current)==null?void 0:o.videoHeight)||0}},{isReady:A,workerReady:C,lastError:F,detect:we}=fe(K,M);de(()=>{C&&console.log("[JerseyDetector] Worker Ready with config:",K),s==null||s(C)},[C,s,K]),de(()=>{var e;F&&(L.current=!0,(e=$.current)==null||e.call($,F))},[F]);let ve=Ue((e,o)=>{if(se.activeCount>=T){e.forEach(r=>{var i;return(i=r==null?void 0:r.close)==null?void 0:i.call(r)}),console.warn(`[JerseyDetector] Dropped new segmented images \u2014 max ${T} classifications running`);return}se(()=>W(null,null,function*(){try{l==null||l(e,o)}catch(r){console.error("[JerseyDetector] Classification error:",r)}finally{e.forEach(r=>{var i;return(i=r==null?void 0:r.close)==null?void 0:i.call(r)})}}))},[l,T,se]),Ce=()=>W(null,null,function*(){var N,ae,me;let e=n.current,o=Y.current;if(L.current||!A||!C||!e||!o||ne.current||e.readyState<2||e.paused||e.ended||e.videoWidth===0||e.videoHeight===0)return;!P.current&&!te.current&&(P.current=o.getContext("bitmaprenderer"),q.current=!!P.current,q.current||(te.current=o.getContext("2d")));let r=te.current;if(!q.current&&!r||o.width<=0||o.height<=0)return;let i=null,I=null;try{ne.current=!0;let Q=e.videoWidth,ie=e.videoHeight;Ie.current={width:Q,height:ie},i=yield createImageBitmap(e);let _e=ke(),ce=Date.now(),xe=ce-oe.current>t,Me=z.current.jerseyCount,y=yield we(i,_e,v,xe,Me);if((y==null?void 0:y.type)==="detect_response"){if(m!=="none"&&((o.width!==Q||o.height!==ie)&&(o.width=Q,o.height=ie),y.bitmap)){let H=y.bitmap;q.current&&P.current?P.current.transferFromImageBitmap(H):(r&&r.drawImage(H,0,0),H.close())}X.current.push(Date.now()),X.current=X.current.filter(H=>Date.now()-H<1e3);let Z={jerseyCount:((N=y.stats)==null?void 0:N.jerseyCount)||0,confidence:((ae=y.stats)==null?void 0:ae.confidence)||0,fps:X.current.length,processingTime:((me=y.stats)==null?void 0:me.processingTime)||0},ge=z.current;z.current=Z;let pe=ce-oe.current>t||Z.jerseyCount!==ge.jerseyCount||Z.confidence!==ge.confidence;pe&&k&&(k(Z),oe.current=ce),pe&&y.segmentedImages&&y.segmentedImages.length>0&&l&&ve(y.segmentedImages,y.bboxes)}}catch(Q){L.current=!0}finally{i==null||i.close(),ne.current=!1}});return Pe(Re,()=>({get isReady(){return A},get lastError(){return F},get stats(){return z.current},capture:(e="image/jpeg",o=.92)=>{let r=n.current,i=Y.current;if(!r||r.videoWidth<=0||r.videoHeight<=0)throw new Error("Video not ready for capture");let I=document.createElement("canvas");I.width=r.videoWidth,I.height=r.videoHeight;let N=I.getContext("2d");if(!N)throw new Error("Failed to get context for capture canvas");let ae=K.mirror;return N.drawImage(r,0,0,I.width,I.height),i&&i.width>0&&i.height>0&&N.drawImage(i,0,0,I.width,I.height),I.toDataURL(e,o)}}),[A,F,C]),de(()=>{if(!C||!A||L.current)return;let e=n.current,o=Y.current;if(!e||!o||e.videoWidth===0||e.videoHeight===0){let i=setTimeout(()=>{U.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(i)}(o.width!==e.videoWidth||o.height!==e.videoHeight)&&(o.width=e.videoWidth,o.height=e.videoHeight);let r=()=>W(null,null,function*(){!C||!A||L.current||(yield Ce(),U.current=requestAnimationFrame(r))});return U.current=requestAnimationFrame(r),()=>{U.current&&cancelAnimationFrame(U.current)}},[C,A]),Fe("canvas",{ref:Y,className:`absolute inset-0 pointer-events-none ${re||""}`,style:Te({zIndex:10,width:"100%",height:"100%"},g)})});De.displayName="JerseyDetector";export{u as DEFAULT_CONFIG,De as JerseyDetector,fe as useJerseyWorker};
1
+ var We=Object.defineProperty;var ye=Object.getOwnPropertySymbols;var Se=Object.prototype.hasOwnProperty,Oe=Object.prototype.propertyIsEnumerable;var De=(t,o,n)=>o in t?We(t,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[o]=n,Ee=(t,o)=>{for(var n in o||(o={}))Se.call(o,n)&&De(t,n,o[n]);if(ye)for(var n of ye(o))Oe.call(o,n)&&De(t,n,o[n]);return t};var W=(t,o,n)=>new Promise((b,l)=>{var S=g=>{try{w(n.next(g))}catch(k){l(k)}},D=g=>{try{w(n.throw(g))}catch(k){l(k)}},w=g=>g.done?b(g.value):Promise.resolve(g.value).then(S,D);w((n=n.apply(t,o)).next())});import{forwardRef as Je,useImperativeHandle as Pe,useRef as T,useEffect as ge,useMemo as Ie,useCallback as je}from"react";import{useEffect as Re,useState as fe,useCallback as Ae,useRef as j}from"react";var u=null,C=!1,Y=null,me=0,te=null,y=new Map,Ne=0,ne=new Map;function de(t,o){let n=j(!1),[b,l]=fe(!1),[S,D]=fe(null),w=j(!0),g=j(!1),k=j(`instance_${Math.random().toString(36).substr(2,9)}`),O=j(0),[U,q]=fe(0);Re(()=>{var B;if(!t)return;w.current=!0,O.current++;let E=O.current,R=k.current,A=(B=ne.get(R))!=null?B:0;return E>A&&(me++,ne.set(R,E)),W(null,null,function*(){var p;if(!u||!He(te,t)){u&&(u.terminate(),u=null,C=!1,console.log("[v0 useJerseyWorker] Worker terminated because of change in config or watchdog"));try{g.current=(p=t.verbose)!=null?p:g.current;let f=o||"/jersey-detector-worker.js";u=new Worker(f),te=t,C=!1,Y=null,l(!1),D(null),u.onmessage=I=>{let i=I.data;switch(i.type){case"ready":C=!0,l(!0);break;case"debug":g.current&&console.log(i.debug_message);break;case"error":let c=i.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",c),C=!1,Y=c,l(!1),D(c);break;case"detect_response":if(i.requestId&&y.has(i.requestId)){let M=y.get(i.requestId);M==null||M.resolve(i),y.delete(i.requestId)}break}},u.onerror=I=>{let i=I.message||"Worker initialization error";C=!1,Y=i,l(!1),D(i)},u.postMessage({type:"init",config:t})}catch(f){l(!1),D((f==null?void 0:f.message)||String(f))}}else l(C),D(Y)}),()=>{w.current=!1;let p=k.current,f=ne.get(p),I=O.current;f===I&&(me--,ne.delete(p),me<=0&&u&&(u.terminate(),u=null,C=!1,Y=null,te=null,y.clear()))}},[t,o,U]);let _=j(0);Re(()=>{if(!u)return;let E=setInterval(()=>{y.size>0?_.current>=3&&(console.error("[v0 useJerseyWorker] Watchdog: Worker appears hung after 3 consecutive timeouts. Restarting..."),_.current=0,u&&(u.terminate(),u=null,C=!1,te=null,l(!1),q(R=>R+1))):_.current=0},2e3);return()=>clearInterval(E)},[b,U]);let X=Ae((E,R,A=.5,N=!0,B)=>W(null,null,function*(){if(!u||!C)return null;if(n.current||y.size>0)return g.current,null;let p=`req_${++Ne}_${Date.now()}`;return new Promise((f,I)=>{let i=setTimeout(()=>{if(y.has(p)){_.current++;let m=y.get(p);m==null||m.reject(new Error("Detection timeout")),y.delete(p),n.current=!1}},5e3),c=m=>{_.current=0,clearTimeout(i),n.current=!1,f(m)},M=m=>{clearTimeout(i),n.current=!1,I(m)};y.set(p,{resolve:c,reject:M});try{n.current=!0,u.postMessage({type:"detect",requestId:p,dimensions:R,bitmap:E,threshold:A,includeSegmentedImages:N,lastJerseyCount:B},[E])}catch(m){clearTimeout(i),y.delete(p),n.current=!1,I(new Error(`Failed to send detect: ${m==null?void 0:m.message}`))}})}),[b]);return{isReady:b,workerReady:b,lastError:S,detect:X}}function He(t,o){return t?JSON.stringify(t)===JSON.stringify(o):!1}var d={TASK:"image-segmentation",MODEL:"BodyPix",BODYPIX_ARCHITECTURE:"MobileNetV1",BODYPIX_MULTIPLIER:.75,BODYPIX_QUANT_BYTES:2,BODYPIX_STRIDE:16,MULTI_SEGMENTATION:!0,SEGMENT_BODY_PARTS:!0,BACKGROUND_SHADE:0,SHIRT_SHADE:170,DETECTION_THRESHOLD:.5,TARGET_PART_ID:12,IMAGES_TO_RETURN:"mask",VERBOSE:!1,MIN_DETECTION_AREA:1e4};import Ue from"p-limit";import{jsx as Ve}from"react/jsx-runtime";var be=Je(({videoRef:t,onWorkerReady:o,onWorkerError:n,onStatsUpdate:b,onSegmentedImage:l,task:S=d.TASK,model:D=d.MODEL,verbose:w=d.VERBOSE,bodyPixArchitecture:g=d.BODYPIX_ARCHITECTURE,bodyPixMultiplier:k=d.BODYPIX_MULTIPLIER,bodyPixQuantBytes:O=d.BODYPIX_QUANT_BYTES,bodyPixStride:U=d.BODYPIX_STRIDE,multiSegmentation:q=d.MULTI_SEGMENTATION,segmentBodyParts:_=d.SEGMENT_BODY_PARTS,backgroundShade:X=d.BACKGROUND_SHADE,shirtShade:E=d.SHIRT_SHADE,threshold:R=d.DETECTION_THRESHOLD,targetPartId:A=d.TARGET_PART_ID,imagesToReturn:N=d.IMAGES_TO_RETURN,minDetectionArea:B=d.MIN_DETECTION_AREA,throttleMs:p=1e3,onImageSegmentedLimit:f=2,workerUrl:I,className:i,style:c},M)=>{let m=T(null),oe=T(null),V=T(null),z=T(!1),L=T(null),se=T(!1),$=T([]),we=T(null),K=T(!1),Q=T(void 0);Q.current=n;let Z=T({jerseyCount:0,confidence:0,fps:0,processingTime:0}),ae=T(0),ie=Ie(()=>Ue(f),[f]),ee=Ie(()=>({task:S,model:D,verbose:w,bodyPixArchitecture:g,bodyPixMultiplier:k,bodyPixQuantBytes:O,bodyPixStride:U,multiSegmentation:q,segmentBodyParts:_,backgroundShade:X,shirtShade:E,threshold:R,targetPartId:A,imagesToReturn:N,minDetectionArea:B,mirror:(c==null?void 0:c.transform)==="scaleX(-1)"||typeof(c==null?void 0:c.transform)=="string"&&c.transform.includes("scaleX(-1)")}),[S,D,w,g,k,O,U,q,_,X,E,R,A,N,B,c==null?void 0:c.transform]),ke=()=>{var e,s;return{width:((e=t.current)==null?void 0:e.videoWidth)||0,height:((s=t.current)==null?void 0:s.videoHeight)||0}},{isReady:H,workerReady:x,lastError:F,detect:ve}=de(ee,I);ge(()=>{x&&(console.log("[JerseyDetector] Worker Ready with config:",ee),K.current=!1),o==null||o(x)},[x,o,ee]),ge(()=>{var e;F&&((e=Q.current)==null||e.call(Q,F))},[F]);let Ce=je((e,s)=>{if(ie.activeCount>=f){e.forEach(r=>{var a;return(a=r==null?void 0:r.close)==null?void 0:a.call(r)}),console.warn(`[JerseyDetector] Dropped new segmented images \u2014 max ${f} classifications running`);return}ie(()=>W(null,null,function*(){try{l==null||l(e,s)}catch(r){console.error("[JerseyDetector] Classification error:",r)}finally{e.forEach(r=>{var a;return(a=r==null?void 0:r.close)==null?void 0:a.call(r)})}}))},[l,f,ie]),_e=()=>W(null,null,function*(){var J,ce,pe;let e=t.current,s=m.current;if(K.current||!H||!x||!e||!s||se.current||e.readyState<2||e.paused||e.ended||e.videoWidth===0||e.videoHeight===0)return;!V.current&&!oe.current&&(V.current=s.getContext("bitmaprenderer"),z.current=!!V.current,z.current||(oe.current=s.getContext("2d")));let r=oe.current;if(!z.current&&!r||s.width<=0||s.height<=0)return;let a=null,v=null;try{se.current=!0;let G=e.videoWidth,ue=e.videoHeight;we.current={width:G,height:ue},a=yield createImageBitmap(e);let xe=ke(),le=Date.now(),Be=le-ae.current>p,Me=Z.current.jerseyCount,h=yield ve(a,xe,R,Be,Me);if((h==null?void 0:h.type)==="detect_response"){if(N!=="none"&&((s.width!==G||s.height!==ue)&&(s.width=G,s.height=ue),h.bitmap)){let P=h.bitmap;z.current&&V.current?V.current.transferFromImageBitmap(P):(r&&r.drawImage(P,0,0),P.close())}$.current.push(Date.now()),$.current=$.current.filter(P=>Date.now()-P<1e3);let re={jerseyCount:((J=h.stats)==null?void 0:J.jerseyCount)||0,confidence:((ce=h.stats)==null?void 0:ce.confidence)||0,fps:$.current.length,processingTime:((pe=h.stats)==null?void 0:pe.processingTime)||0},he=Z.current;Z.current=re;let Te=le-ae.current>p||re.jerseyCount!==he.jerseyCount||re.confidence!==he.confidence;Te&&b&&(b(re),ae.current=le),Te&&h.segmentedImages&&h.segmentedImages.length>0&&l&&Ce(h.segmentedImages,h.bboxes)}}catch(G){console.warn("[JerseyDetector] Detection error (skipping frame):",G)}finally{a==null||a.close(),se.current=!1}});return Pe(M,()=>({get isReady(){return H},get lastError(){return F},get stats(){return Z.current},capture:(e="image/jpeg",s=.92)=>{let r=t.current,a=m.current;if(!r||r.videoWidth<=0||r.videoHeight<=0)throw new Error("Video not ready for capture");let v=document.createElement("canvas");v.width=r.videoWidth,v.height=r.videoHeight;let J=v.getContext("2d");if(!J)throw new Error("Failed to get context for capture canvas");let ce=ee.mirror;return J.drawImage(r,0,0,v.width,v.height),a&&a.width>0&&a.height>0&&J.drawImage(a,0,0,v.width,v.height),v.toDataURL(e,s)}}),[H,F,x]),ge(()=>{if(!x||!H||K.current)return;let e=t.current,s=m.current;if(!e||!s||e.videoWidth===0||e.videoHeight===0){let a=setTimeout(()=>{L.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(a)}(s.width!==e.videoWidth||s.height!==e.videoHeight)&&(s.width=e.videoWidth,s.height=e.videoHeight);let r=()=>W(null,null,function*(){!x||!H||K.current||(yield _e(),L.current=requestAnimationFrame(r))});return L.current=requestAnimationFrame(r),()=>{L.current&&cancelAnimationFrame(L.current)}},[x,H]),Ve("canvas",{ref:m,className:`absolute inset-0 pointer-events-none ${i||""}`,style:Ee({zIndex:10,width:"100%",height:"100%"},c)})});be.displayName="JerseyDetector";export{d as DEFAULT_CONFIG,be as JerseyDetector,de as useJerseyWorker};