seg-cam 1.2.0 → 1.3.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/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var We=Object.create;var V=Object.defineProperty;var xe=Object.getOwnPropertyDescriptor;var Be=Object.getOwnPropertyNames,ge=Object.getOwnPropertySymbols,Se=Object.getPrototypeOf,ye=Object.prototype.hasOwnProperty,Oe=Object.prototype.propertyIsEnumerable;var pe=(e,r,t)=>r in e?V(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,he=(e,r)=>{for(var t in r||(r={}))ye.call(r,t)&&pe(e,t,r[t]);if(ge)for(var t of ge(r))Oe.call(r,t)&&pe(e,t,r[t]);return e};var Ae=(e,r)=>{for(var t in r)V(e,t,{get:r[t],enumerable:!0})},Te=(e,r,t,E)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of Be(r))!ye.call(e,a)&&a!==t&&V(e,a,{get:()=>r[a],enumerable:!(E=xe(r,a))||E.enumerable});return e};var Ne=(e,r,t)=>(t=e!=null?We(Se(e)):{},Te(r||!e||!e.__esModule?V(t,"default",{value:e,enumerable:!0}):t,e)),Je=e=>Te(V({},"__esModule",{value:!0}),e);var B=(e,r,t)=>new Promise((E,a)=>{var S=d=>{try{I(t.next(d))}catch(R){a(R)}},k=d=>{try{I(t.throw(d))}catch(R){a(R)}},I=d=>d.done?E(d.value):Promise.resolve(d.value).then(S,k);I((t=t.apply(e,r)).next())});var Ue={};Ae(Ue,{DEFAULT_CONFIG:()=>l,JerseyDetector:()=>le,useJerseyWorker:()=>re});module.exports=Je(Ue);var i=require("react");var h=require("react");var y=null,M=!1,G=null,ce=0,ue=null,b=new Map,He=0,ee=new Map;function re(e,r){let t=(0,h.useRef)(!1),[E,a]=(0,h.useState)(!1),[S,k]=(0,h.useState)(null),I=(0,h.useRef)(!0),d=(0,h.useRef)(!1),R=(0,h.useRef)(`instance_${Math.random().toString(36).substr(2,9)}`),O=(0,h.useRef)(0);(0,h.useEffect)(()=>{var _;if(!e)return;I.current=!0,O.current++;let v=O.current,W=R.current,A=(_=ee.get(W))!=null?_:0;return v>A&&(ce++,ee.set(W,v)),B(null,null,function*(){var m;if(!y||!Pe(ue,e)){y&&(y.terminate(),y=null,M=!1,console.log("[v0 useJerseyWorker] Worker terminated because of change in config"));try{d.current=(m=e.verbose)!=null?m:d.current;let g=r||"/jersey-detector-worker.js";y=new Worker(g),ue=e,M=!1,G=null,a(!1),k(null),y.onmessage=f=>{let s=f.data;switch(s.type){case"ready":M=!0,a(!0),d.current&&console.log("[v0 useJerseyWorker] Worker Ready",{device:s.device,dtype:s.dtype,config:s.config});break;case"loading_progress":d.current&&console.log(`[v0 useJerseyWorker] Loaded ${s.progress}% of ${s.file}`);break;case"debug":d.current&&console.log(s.debug_message);break;case"error":let D=s.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",D),M=!1,G=D,a(!1),k(D);break;case"detect_response":if(s.requestId&&b.has(s.requestId)){let x=b.get(s.requestId);x&&(x.resolve(s),b.delete(s.requestId))}else if(b.size>0){let x=b.entries().next();if(!x.done){let[te,p]=x.value;p.resolve(s),b.delete(te)}}break}},y.onerror=f=>{let s=f.message||"Worker initialization error";console.error("[useJerseyWorker] Worker error:",s),M=!1,G=s,a(!1),k(s)},y.postMessage({type:"init",config:e})}catch(g){let f=(g==null?void 0:g.message)||String(g);console.error("[useJerseyWorker] Failed to create worker:",f),a(!1),k(f)}}else a(M),k(G)}),()=>{I.current=!1;let m=R.current,g=ee.get(m),f=O.current;g===f&&(ce--,ee.delete(m),ce<=0&&y&&(y.terminate(),y=null,M=!1,G=null,ue=null,b.clear()))}},[]);let Y=(0,h.useCallback)((v,W,A=.5,P=!0,_)=>B(null,null,function*(){if(!y||!M)throw new Error("Worker not ready");if(t.current)return null;let m=`req_${++He}_${Date.now()}`;return new Promise((g,f)=>{b.set(m,{resolve:g,reject:f});try{t.current=!0,y.postMessage({type:"detect",requestId:m,dimensions:W,bitmap:v,threshold:A,includeSegmentedImages:P,lastJerseyCount:_},[v])}catch(s){b.delete(m);let D=`Failed to send detect: ${s==null?void 0:s.message}`;f(new Error(D))}finally{t.current=!1}setTimeout(()=>{b.has(m)&&(b.delete(m),f(new Error("Detection timeout")))},1e4)})}),[E]);return{isReady:E,workerReady:E,lastError:S,detect:Y}}function Pe(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 Ee=Ne(require("p-limit"));var De=require("react/jsx-runtime"),le=(0,i.forwardRef)(({videoRef:e,onWorkerReady:r,onWorkerError:t,onStatsUpdate:E,onSegmentedImage:a,task:S=l.TASK,model:k=l.MODEL,verbose:I=l.VERBOSE,bodyPixArchitecture:d=l.BODYPIX_ARCHITECTURE,bodyPixMultiplier:R=l.BODYPIX_MULTIPLIER,bodyPixQuantBytes:O=l.BODYPIX_QUANT_BYTES,bodyPixStride:Y=l.BODYPIX_STRIDE,multiSegmentation:v=l.MULTI_SEGMENTATION,segmentBodyParts:W=l.SEGMENT_BODY_PARTS,backgroundShade:A=l.BACKGROUND_SHADE,shirtShade:P=l.SHIRT_SHADE,threshold:_=l.DETECTION_THRESHOLD,targetPartId:m=l.TARGET_PART_ID,imagesToReturn:g=l.IMAGES_TO_RETURN,minDetectionArea:f=l.MIN_DETECTION_AREA,throttleMs:s=1e3,onImageSegmentedLimit:D=2,workerUrl:x,className:te,style:p},be)=>{let q=(0,i.useRef)(null),U=(0,i.useRef)(null),ne=(0,i.useRef)(!1),X=(0,i.useRef)([]),ke=(0,i.useRef)(null),L=(0,i.useRef)(!1),$=(0,i.useRef)(void 0);$.current=t;let z=(0,i.useRef)({jerseyCount:0,confidence:0,fps:0,processingTime:0}),oe=(0,i.useRef)(0),se=(0,i.useMemo)(()=>(0,Ee.default)(D),[D]),K=(0,i.useMemo)(()=>({task:S,model:k,verbose:I,bodyPixArchitecture:d,bodyPixMultiplier:R,bodyPixQuantBytes:O,bodyPixStride:Y,multiSegmentation:v,segmentBodyParts:W,backgroundShade:A,shirtShade:P,threshold:_,targetPartId:m,imagesToReturn:g,minDetectionArea:f,mirror:(p==null?void 0:p.transform)==="scaleX(-1)"||typeof(p==null?void 0:p.transform)=="string"&&p.transform.includes("scaleX(-1)")}),[S,k,I,d,R,O,Y,v,W,A,P,_,m,g,f,p==null?void 0:p.transform]),Ie=()=>{var n,c;return{width:((n=e.current)==null?void 0:n.videoWidth)||0,height:((c=e.current)==null?void 0:c.videoHeight)||0}},{isReady:N,workerReady:C,lastError:j,detect:Re}=re(K,x);(0,i.useEffect)(()=>{C&&console.log("[JerseyDetector] Worker Ready with config:",K),r==null||r(C)},[C,r,K]),(0,i.useEffect)(()=>{var n;j&&(L.current=!0,(n=$.current)==null||n.call($,j))},[j]);let we=(0,i.useCallback)((n,c)=>{if(se.activeCount>=D){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 ${D} classifications running`);return}se(()=>B(null,null,function*(){try{a==null||a(n,c)}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)})}}))},[a,D,se]),ve=()=>B(null,null,function*(){var J,ie,de;let n=e.current,c=q.current;if(L.current||!N||!C||!n||!c||ne.current||n.readyState<2||n.paused||n.ended||n.videoWidth===0||n.videoHeight===0)return;let o=c.getContext("2d");if(!o||c.width<=0||c.height<=0)return;let u=null,w=null;try{ne.current=!0;let F=n.videoWidth,Q=n.videoHeight;ke.current={width:F,height:Q},u=yield createImageBitmap(n);let _e=Ie(),ae=Date.now(),Ce=ae-oe.current>s,Me=z.current.jerseyCount,T=yield Re(u,_e,_,Ce,Me);if((T==null?void 0:T.type)==="detect_response"){if(g!=="none"&&((c.width!==F||c.height!==Q)&&(c.width=F,c.height=Q),o.clearRect(0,0,F,Q),T.bitmap)){let H=T.bitmap;o.drawImage(H,0,0),console.log(`[JerseyDetector] Bitmap created with dims ${H.width}x${H.height}`),H.close()}X.current.push(Date.now()),X.current=X.current.filter(H=>Date.now()-H<1e3);let Z={jerseyCount:((J=T.stats)==null?void 0:J.jerseyCount)||0,confidence:((ie=T.stats)==null?void 0:ie.confidence)||0,fps:X.current.length,processingTime:((de=T.stats)==null?void 0:de.processingTime)||0},fe=z.current;z.current=Z;let me=ae-oe.current>s||Z.jerseyCount!==fe.jerseyCount||Z.confidence!==fe.confidence;me&&E&&(E(Z),oe.current=ae),me&&T.segmentedImages&&T.segmentedImages.length>0&&a&&we(T.segmentedImages,T.bboxes)}}catch(F){L.current=!0}finally{u==null||u.close(),ne.current=!1}});return(0,i.useImperativeHandle)(be,()=>({get isReady(){return N},get lastError(){return j},get stats(){return z.current},capture:(n="image/jpeg",c=.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 J=w.getContext("2d");if(!J)throw new Error("Failed to get context for capture canvas");let ie=K.mirror;return J.drawImage(o,0,0,w.width,w.height),u&&u.width>0&&u.height>0&&J.drawImage(u,0,0,w.width,w.height),w.toDataURL(n,c)}}),[N,j,C]),(0,i.useEffect)(()=>{if(!C||!N||L.current)return;let n=e.current,c=q.current;if(!n||!c||n.videoWidth===0||n.videoHeight===0){let u=setTimeout(()=>{U.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(u)}(c.width!==n.videoWidth||c.height!==n.videoHeight)&&(c.width=n.videoWidth,c.height=n.videoHeight);let o=()=>B(null,null,function*(){!C||!N||L.current||(yield ve(),U.current=requestAnimationFrame(o))});return U.current=requestAnimationFrame(o),()=>{U.current&&cancelAnimationFrame(U.current)}},[C,N]),(0,De.jsx)("canvas",{ref:q,className:`absolute inset-0 pointer-events-none ${te||""}`,style:he({zIndex:10,width:"100%",height:"100%"},p)})});le.displayName="JerseyDetector";0&&(module.exports={DEFAULT_CONFIG,JerseyDetector,useJerseyWorker});
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});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var Ce=Object.defineProperty;var me=Object.getOwnPropertySymbols;var Me=Object.prototype.hasOwnProperty,We=Object.prototype.propertyIsEnumerable;var ge=(n,o,s)=>o in n?Ce(n,o,{enumerable:!0,configurable:!0,writable:!0,value:s}):n[o]=s,pe=(n,o)=>{for(var s in o||(o={}))Me.call(o,s)&&ge(n,s,o[s]);if(me)for(var s of me(o))We.call(o,s)&&ge(n,s,o[s]);return n};var x=(n,o,s)=>new Promise((R,l)=>{var B=c=>{try{D(s.next(c))}catch(b){l(b)}},E=c=>{try{D(s.throw(c))}catch(b){l(b)}},D=c=>c.done?R(c.value):Promise.resolve(c.value).then(B,E);D((s=s.apply(n,o)).next())});import{forwardRef as Ae,useImperativeHandle as Ne,useRef as I,useEffect as ue,useMemo as he,useCallback as Je}from"react";import{useEffect as xe,useState as ye,useCallback as Be,useRef as F}from"react";var p=null,C=!1,V=null,ie=0,ae=null,T=new Map,Se=0,Z=new Map;function ce(n,o){let s=F(!1),[R,l]=ye(!1),[B,E]=ye(null),D=F(!0),c=F(!1),b=F(`instance_${Math.random().toString(36).substr(2,9)}`),S=F(0);xe(()=>{var v;if(!n)return;D.current=!0,S.current++;let w=S.current,M=b.current,O=(v=Z.get(M))!=null?v:0;return w>O&&(ie++,Z.set(M,w)),x(null,null,function*(){var f;if(!p||!Oe(ae,n)){p&&(p.terminate(),p=null,C=!1,console.log("[v0 useJerseyWorker] Worker terminated because of change in config"));try{c.current=(f=n.verbose)!=null?f:c.current;let m=o||"/jersey-detector-worker.js";p=new Worker(m),ae=n,C=!1,V=null,l(!1),E(null),p.onmessage=d=>{let t=d.data;switch(t.type){case"ready":C=!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 h=t.error_message||"Unknown worker error";console.error("[v0 useJerseyWorker] Worker sent error message:",h),C=!1,V=h,l(!1),E(h);break;case"detect_response":if(t.requestId&&T.has(t.requestId)){let W=T.get(t.requestId);W&&(W.resolve(t),T.delete(t.requestId))}else if(T.size>0){let W=T.entries().next();if(!W.done){let[ee,g]=W.value;g.resolve(t),T.delete(ee)}}break}},p.onerror=d=>{let t=d.message||"Worker initialization error";console.error("[useJerseyWorker] Worker error:",t),C=!1,V=t,l(!1),E(t)},p.postMessage({type:"init",config:n})}catch(m){let d=(m==null?void 0:m.message)||String(m);console.error("[useJerseyWorker] Failed to create worker:",d),l(!1),E(d)}}else l(C),E(V)}),()=>{D.current=!1;let f=b.current,m=Z.get(f),d=S.current;m===d&&(ie--,Z.delete(f),ie<=0&&p&&(p.terminate(),p=null,C=!1,V=null,ae=null,T.clear()))}},[]);let G=Be((w,M,O=.5,H=!0,v)=>x(null,null,function*(){if(!p||!C)throw new Error("Worker not ready");if(s.current)return null;let f=`req_${++Se}_${Date.now()}`;return new Promise((m,d)=>{T.set(f,{resolve:m,reject:d});try{s.current=!0,p.postMessage({type:"detect",requestId:f,dimensions:M,bitmap:w,threshold:O,includeSegmentedImages:H,lastJerseyCount:v},[w])}catch(t){T.delete(f);let h=`Failed to send detect: ${t==null?void 0:t.message}`;d(new Error(h))}finally{s.current=!1}setTimeout(()=>{T.has(f)&&(T.delete(f),d(new Error("Detection timeout")))},1e4)})}),[R]);return{isReady:R,workerReady:R,lastError:B,detect:G}}function Oe(n,o){return n?JSON.stringify(n)===JSON.stringify(o):!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 He from"p-limit";import{jsx as Pe}from"react/jsx-runtime";var Te=Ae(({videoRef:n,onWorkerReady:o,onWorkerError:s,onStatsUpdate:R,onSegmentedImage:l,task:B=u.TASK,model:E=u.MODEL,verbose:D=u.VERBOSE,bodyPixArchitecture:c=u.BODYPIX_ARCHITECTURE,bodyPixMultiplier:b=u.BODYPIX_MULTIPLIER,bodyPixQuantBytes:S=u.BODYPIX_QUANT_BYTES,bodyPixStride:G=u.BODYPIX_STRIDE,multiSegmentation:w=u.MULTI_SEGMENTATION,segmentBodyParts:M=u.SEGMENT_BODY_PARTS,backgroundShade:O=u.BACKGROUND_SHADE,shirtShade:H=u.SHIRT_SHADE,threshold:v=u.DETECTION_THRESHOLD,targetPartId:f=u.TARGET_PART_ID,imagesToReturn:m=u.IMAGES_TO_RETURN,minDetectionArea:d=u.MIN_DETECTION_AREA,throttleMs:t=1e3,onImageSegmentedLimit:h=2,workerUrl:W,className:ee,style:g},Ee)=>{let Y=I(null),P=I(null),re=I(!1),q=I([]),De=I(null),U=I(!1),X=I(void 0);X.current=s;let $=I({jerseyCount:0,confidence:0,fps:0,processingTime:0}),te=I(0),ne=he(()=>He(h),[h]),z=he(()=>({task:B,model:E,verbose:D,bodyPixArchitecture:c,bodyPixMultiplier:b,bodyPixQuantBytes:S,bodyPixStride:G,multiSegmentation:w,segmentBodyParts:M,backgroundShade:O,shirtShade:H,threshold:v,targetPartId:f,imagesToReturn:m,minDetectionArea:d,mirror:(g==null?void 0:g.transform)==="scaleX(-1)"||typeof(g==null?void 0:g.transform)=="string"&&g.transform.includes("scaleX(-1)")}),[B,E,D,c,b,S,G,w,M,O,H,v,f,m,d,g==null?void 0:g.transform]),be=()=>{var e,i;return{width:((e=n.current)==null?void 0:e.videoWidth)||0,height:((i=n.current)==null?void 0:i.videoHeight)||0}},{isReady:A,workerReady:_,lastError:L,detect:ke}=ce(z,W);ue(()=>{_&&console.log("[JerseyDetector] Worker Ready with config:",z),o==null||o(_)},[_,o,z]),ue(()=>{var e;L&&(U.current=!0,(e=X.current)==null||e.call(X,L))},[L]);let Ie=Je((e,i)=>{if(ne.activeCount>=h){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 ${h} classifications running`);return}ne(()=>x(null,null,function*(){try{l==null||l(e,i)}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,h,ne]),Re=()=>x(null,null,function*(){var N,oe,le;let e=n.current,i=Y.current;if(U.current||!A||!_||!e||!i||re.current||e.readyState<2||e.paused||e.ended||e.videoWidth===0||e.videoHeight===0)return;let r=i.getContext("2d");if(!r||i.width<=0||i.height<=0)return;let a=null,k=null;try{re.current=!0;let j=e.videoWidth,K=e.videoHeight;De.current={width:j,height:K},a=yield createImageBitmap(e);let we=be(),se=Date.now(),ve=se-te.current>t,_e=$.current.jerseyCount,y=yield ke(a,we,v,ve,_e);if((y==null?void 0:y.type)==="detect_response"){if(m!=="none"&&((i.width!==j||i.height!==K)&&(i.width=j,i.height=K),r.clearRect(0,0,j,K),y.bitmap)){let J=y.bitmap;r.drawImage(J,0,0),console.log(`[JerseyDetector] Bitmap created with dims ${J.width}x${J.height}`),J.close()}q.current.push(Date.now()),q.current=q.current.filter(J=>Date.now()-J<1e3);let Q={jerseyCount:((N=y.stats)==null?void 0:N.jerseyCount)||0,confidence:((oe=y.stats)==null?void 0:oe.confidence)||0,fps:q.current.length,processingTime:((le=y.stats)==null?void 0:le.processingTime)||0},de=$.current;$.current=Q;let fe=se-te.current>t||Q.jerseyCount!==de.jerseyCount||Q.confidence!==de.confidence;fe&&R&&(R(Q),te.current=se),fe&&y.segmentedImages&&y.segmentedImages.length>0&&l&&Ie(y.segmentedImages,y.bboxes)}}catch(j){U.current=!0}finally{a==null||a.close(),re.current=!1}});return Ne(Ee,()=>({get isReady(){return A},get lastError(){return L},get stats(){return $.current},capture:(e="image/jpeg",i=.92)=>{let r=n.current,a=Y.current;if(!r||r.videoWidth<=0||r.videoHeight<=0)throw new Error("Video not ready for capture");let k=document.createElement("canvas");k.width=r.videoWidth,k.height=r.videoHeight;let N=k.getContext("2d");if(!N)throw new Error("Failed to get context for capture canvas");let oe=z.mirror;return N.drawImage(r,0,0,k.width,k.height),a&&a.width>0&&a.height>0&&N.drawImage(a,0,0,k.width,k.height),k.toDataURL(e,i)}}),[A,L,_]),ue(()=>{if(!_||!A||U.current)return;let e=n.current,i=Y.current;if(!e||!i||e.videoWidth===0||e.videoHeight===0){let a=setTimeout(()=>{P.current=requestAnimationFrame(()=>{})},100);return()=>clearTimeout(a)}(i.width!==e.videoWidth||i.height!==e.videoHeight)&&(i.width=e.videoWidth,i.height=e.videoHeight);let r=()=>x(null,null,function*(){!_||!A||U.current||(yield Re(),P.current=requestAnimationFrame(r))});return P.current=requestAnimationFrame(r),()=>{P.current&&cancelAnimationFrame(P.current)}},[_,A]),Pe("canvas",{ref:Y,className:`absolute inset-0 pointer-events-none ${ee||""}`,style:pe({zIndex:10,width:"100%",height:"100%"},g)})});Te.displayName="JerseyDetector";export{u as DEFAULT_CONFIG,Te as JerseyDetector,ce as useJerseyWorker};
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};