seg-cam 1.0.0 → 1.0.2

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