@nuralogix.ai/web-measurement-embedded-app 0.1.0-beta.7 → 0.1.0-beta.9
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/LICENSE +11 -11
- package/README.md +190 -190
- package/dist/app.css +21 -21
- package/dist/app.mjs +9 -9
- package/dist/assets/extraction/{extraction_wasm_0.1.0-beta.2.json → extraction_wasm_0.1.0-beta.3.json} +1 -1
- package/dist/assets/extraction_worker_0.1.0-beta.3_js.json +1 -0
- package/dist/assets/{facetracker_worker_0.1.0-beta.2_js.json → facetracker_worker_0.1.0-beta.3_js.json} +1 -1
- package/dist/language/strings.de.json +20 -20
- package/dist/language/strings.en.json +20 -20
- package/dist/language/strings.es.json +20 -20
- package/dist/language/strings.fr.json +20 -20
- package/dist/language/strings.it.json +20 -20
- package/dist/language/strings.ja.json +20 -20
- package/dist/language/strings.pt-BR.json +20 -20
- package/dist/language/strings.pt.json +20 -20
- package/dist/language/strings.zh.json +20 -20
- package/dist/stylex.css +4 -4
- package/lib/index.d.ts +42 -30
- package/lib/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/assets/extraction_worker_0.1.0-beta.2_js.json +0 -1
package/lib/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Lt="0.1.0-beta.7";const U={RESULTS:"results",ERROR:"error",APPEVENT:"appEvent",CANCELLED:"cancelled",DESTROYED:"destroyed",LOGS:"logs"};var Ye=(t=>(t.measurement="Measurement",t.collector="Collector",t.camera="Camera",t.app="App",t))(Ye||{});const N={INFO:"INFO",WARN:"WARN",ERROR:"ERROR"},L={CAMERA_STARTED:"CAMERA_STARTED",APP_LOADED:"APP_LOADED",MEASUREMENT_PREPARED:"MEASUREMENT_PREPARED",ASSETS_DOWNLOADED:"ASSETS_DOWNLOADED",MEASUREMENT_STARTED:"MEASUREMENT_STARTED",MEASUREMENT_COMPLETED:"MEASUREMENT_COMPLETED",CAMERA_PERMISSION_GRANTED:"CAMERA_PERMISSION_GRANTED",INTERMEDIATE_RESULTS:"INTERMEDIATE_RESULTS",RESULTS_RECEIVED:"RESULTS_RECEIVED",MEASUREMENT_CANCELED:"MEASUREMENT_CANCELED",CONSTRAINT_VIOLATION:"CONSTRAINT_VIOLATION",PAGE_UNLOADED:"PAGE_UNLOADED",PAGE_VISIBILITY_CHANGE:"PAGE_VISIBILITY_CHANGE"},Dt={CAMERA_STARTED:{event:L.CAMERA_STARTED,level:N.INFO},APP_LOADED:{event:L.APP_LOADED,level:N.INFO},MEASUREMENT_PREPARED:{event:L.MEASUREMENT_PREPARED,level:N.INFO},ASSETS_DOWNLOADED:{event:L.ASSETS_DOWNLOADED,level:N.INFO},MEASUREMENT_STARTED:{event:L.MEASUREMENT_STARTED,level:N.INFO},MEASUREMENT_COMPLETED:{event:L.MEASUREMENT_COMPLETED,level:N.INFO},CAMERA_PERMISSION_GRANTED:{event:L.CAMERA_PERMISSION_GRANTED,level:N.INFO},INTERMEDIATE_RESULTS:{event:L.INTERMEDIATE_RESULTS,level:N.INFO},RESULTS_RECEIVED:{event:L.RESULTS_RECEIVED,level:N.INFO},MEASUREMENT_CANCELED:{event:L.MEASUREMENT_CANCELED,level:N.WARN},CONSTRAINT_VIOLATION:{event:L.CONSTRAINT_VIOLATION,level:N.ERROR},PAGE_UNLOADED:{event:L.PAGE_UNLOADED,level:N.INFO},PAGE_VISIBILITY_CHANGE:{event:L.PAGE_VISIBILITY_CHANGE,level:N.INFO}},ne={DESTROY:"destroy",CANCEL:"cancel",SET_THEME:"setTheme",SET_LANGUAGE:"setLanguage",GET_LOGS:"getLogs"};var Je=(t=>(t.CAMERA_PERMISSION_DENIED="CAMERA_PERMISSION_DENIED",t.WORKER_ERROR="WORKER_ERROR",t.PROFILE_INFO_NOT_SET="PROFILE_INFO_NOT_SET",t.NO_DEVICES_FOUND="NO_DEVICES_FOUND",t.PAGE_NOT_VISIBLE="PAGE_NOT_VISIBLE",t.CAMERA_START_FAILED="CAMERA_START_FAILED",t.MEASUREMENT_LOW_SNR="MEASUREMENT_LOW_SNR",t.COLLECTOR="COLLECTOR",t.WEBSOCKET_DISCONNECTED="WEBSOCKET_DISCONNECTED",t.MEASUREMENT_PREPARE_FAILED="MEASUREMENT_PREPARE_FAILED",t))(Je||{}),Xe="0.1.0-beta.2",J=(t=>(t.DELETE="DELETE",t.GET="GET",t.PATCH="PATCH",t.POST="POST",t.PUT="PUT",t.CONNECT="CONNECT",t))(J||{}),H=(t=>(t.ON_BEFORE_REST_CALL_ERROR="ON_BEFORE_REST_CALL_ERROR",t))(H||{});const ze=typeof DedicatedWorkerGlobalScope<"u",_e=async({baseUrl:t,urlFragment:e,method:i,headers:a,data:c},d)=>{const n=`${t}/${e}`;let r={Code:"",Message:""};try{const u=await fetch(n,{method:i,cache:"no-store",credentials:"include",headers:a,...c!=null&&{body:JSON.stringify(c)}}),h=u.headers.get("content-type"),p=u.status.toString();r={Code:"UNSUPPORTED_RESPONSE_CONTENT_TYPE",Message:"UNSUPPORTED_RESPONSE_CONTENT_TYPE"},p==="503"&&(r={Code:"SERVICE_UNAVAILABLE",Message:"Service unavailable"}),p==="429"&&(r={Code:"TOO_MANY_REQUESTS",Message:"Too many requests"}),h!=null&&(h.startsWith("application/json;")&&(r=await u.json()),h.startsWith("text/plain;")&&(r={data:await u.text()}));let S=u.headers;if(ze){const C={};u.headers.forEach((k,O)=>{C[O]=k}),S=C}try{d(p,p==="200"?void 0:r)}catch(C){console.error("Error running onAfterRESTCall callback",C)}return{status:p,headers:S,body:r}}catch(u){return u instanceof SyntaxError?r={Code:"SYNTAX_ERROR",Message:"SYNTAX_ERROR"}:r={Code:"UNEXPECTED_ERROR",Message:"UNEXPECTED_ERROR"},{status:"UNKNOWN",headers:ze?{}:new Headers,body:r}}},ge=()=>new Headers({"Content-Type":"application/json"});var It=Object.defineProperty,xt=(t,e,i)=>e in t?It(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Ft=(t,e,i)=>xt(t,e+"",i);class Me{constructor(e){Ft(this,"parent"),this.parent=e}async onBeforeRESTCall(){try{return this.parent.onBeforeRESTCall(),{Code:"SUCCESS",Message:"SUCCESS"}}catch{return{Code:H.ON_BEFORE_REST_CALL_ERROR,Message:H.ON_BEFORE_REST_CALL_ERROR}}}getDefaults(e){return{baseUrl:JSON.parse(this.parent.getUrl()).http.slice(0,-1),method:J[e],headers:ge()}}getHeaderWithDeviceToken(){const e=ge();return e.set("Authorization",`Bearer ${this.parent.getSession().deviceToken}`),e}getHeaderWithUserToken(){const e=ge();return e.set("Authorization",`Bearer ${this.parent.getSession().userToken}`),e}getHeaderWithSessionEnabled(){const e=ge();return e.set("x-nura-session","true"),e}}class Mt extends Me{async create(e,i){const{Code:a,Message:c}=await this.onBeforeRESTCall();if(a===H.ON_BEFORE_REST_CALL_ERROR)return{status:a,body:{Code:a,Message:c},headers:new Headers};const{status:d,body:n,headers:r}=await _e({...this.getDefaults(J.POST),headers:i==="device"?this.getHeaderWithDeviceToken():this.getHeaderWithUserToken(),urlFragment:"measurements",data:e},this.parent.onAfterRESTCall);return d==="200"&&this.parent.setSession({lastMeasurementId:n.ID}),{status:d,body:n,headers:r}}}class Pt extends Me{async retrieveSdkConfigData(e,i){const{Code:a,Message:c}=await this.onBeforeRESTCall();if(a===H.ON_BEFORE_REST_CALL_ERROR)return{status:a,body:{Code:a,Message:c},headers:new Headers};const{status:d,body:n,headers:r}=await _e({...this.getDefaults(J.POST),headers:i==="device"?this.getHeaderWithDeviceToken():this.getHeaderWithUserToken(),urlFragment:"studies/sdkconfig",data:e},this.parent.onAfterRESTCall);return d==="200"&&this.parent.setSession({studyCfgData:n.ConfigFile,studyCfgHash:n.MD5Hash}),{status:d,body:n,headers:r}}}class Wt extends Me{async renew(e,i){const{Code:a,Message:c}=await this.onBeforeRESTCall();if(a===H.ON_BEFORE_REST_CALL_ERROR)return{status:a,body:{Code:a,Message:c},headers:new Headers};const{status:d,body:n,headers:r}=await _e({...this.getDefaults(J.POST),headers:i==="device"?this.getHeaderWithDeviceToken():this.getHeaderWithUserToken(),urlFragment:"auths/renew",data:e},this.parent.onAfterRESTCall);if(d==="200"){const u=n.Token,h=n.RefreshToken,p={...i==="user"&&{userToken:u,userRefreshToken:h},...i==="device"&&{deviceToken:u,deviceRefreshToken:h}};this.parent.setSession(p)}return{status:d,body:n,headers:r}}async validate(e){const{Code:i,Message:a}=await this.onBeforeRESTCall();return i===H.ON_BEFORE_REST_CALL_ERROR?{status:i,body:{Code:i,Message:a},headers:new Headers}:await _e({...this.getDefaults(J.GET),headers:e==="device"?this.getHeaderWithDeviceToken():this.getHeaderWithUserToken(),urlFragment:"auth/v1/validate"},this.parent.onAfterRESTCall)}}var Ut=Object.defineProperty,qe=t=>{throw TypeError(t)},$t=(t,e,i)=>e in t?Ut(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Pe=(t,e,i)=>$t(t,typeof e!="symbol"?e+"":e,i),Ze=(t,e,i)=>e.has(t)||qe("Cannot "+i),We=(t,e,i)=>(Ze(t,e,"read from private field"),i?i.call(t):e.get(t)),Qe=(t,e,i)=>e.has(t)?qe("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),we=(t,e,i,a)=>(Ze(t,e,"write to private field"),e.set(t,i),i),oe,X;class Bt{constructor(e){Qe(this,oe,{http:new URL("https://api.deepaffex.ai")}),Qe(this,X),Pe(this,"onBeforeRESTCall"),Pe(this,"onAfterRESTCall"),Pe(this,"http"),we(this,X,{deviceToken:"",deviceRefreshToken:"",userToken:"",userRefreshToken:"",deviceId:"",roleId:"",userId:"",selectedStudy:"",lastMeasurementId:"",studyCfgHash:"",studyCfgData:""}),this.http={measurements:new Mt(this),studies:new Pt(this),auths:new Wt(this)},this.onBeforeRESTCall=e?.onBeforeRESTCall?e.onBeforeRESTCall:()=>{},this.onAfterRESTCall=e?.onAfterRESTCall?e.onAfterRESTCall:()=>{},e?.url!=null&&we(this,oe,e.url)}static new(e){return new this(e??void 0)}getUrl(){return JSON.stringify(We(this,oe))}setUrl(e){we(this,oe,{http:new URL(e)})}getSession(){return We(this,X)}setSession(e){const i=["deviceToken","deviceRefreshToken","userToken","userRefreshToken","deviceId","userId","roleId","selectedStudy","lastMeasurementId","studyCfgHash","studyCfgData"];Object.keys(e).every(d=>i.includes(d)&&typeof e[d]=="string")&&we(this,X,{...We(this,X),...e})}}oe=new WeakMap,X=new WeakMap;const Gt=t=>Bt.new(t);var Ht=Object.defineProperty,et=t=>{throw TypeError(t)},Vt=(t,e,i)=>e in t?Ht(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Kt=(t,e,i)=>Vt(t,e+"",i),jt=(t,e,i)=>e.has(t)||et("Cannot "+i),Yt=(t,e,i)=>e.has(t)?et("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),Ue=(t,e,i)=>(jt(t,e,"access private method"),i),le,$e,tt;let it=t=>new Int8Array(t);class Jt extends EventTarget{constructor(){super(...arguments),Yt(this,le),Kt(this,"canDecompress",!1)}static init(){return new this}dispatch(e,i){this.dispatchEvent(new CustomEvent(e,{detail:i}))}getBytesDownloadedEvent(e,i,a,c){return new CustomEvent("bytesDownloaded",{detail:{bytes:e,uncompressedSize:i,url:a,done:c}})}getBytesDownloadErrorEvent(e,i){return new CustomEvent("downloadedError",{detail:{url:e,error:i}})}decompressBrotli(e){const i=atob(e),a=new Uint8Array(i.length);for(let n=0;n<i.length;n++)a[n]=i.charCodeAt(n);const c=new Int8Array(a.length);for(let n=0;n<a.length;n++)c[n]=a[n]>=128?a[n]-256:a[n];return it(c).buffer}async fetchAsset(e,i,a,c,d){const n=i+a,r=e.find(h=>h.file===a).uncompressedSize,u=(h,p,S,C)=>Ue(this,le,$e).call(this,this.getBytesDownloadedEvent(h,p,S,C));try{const p=(await fetch(n)).body?.getReader();if(!p)throw new Error("Failed to get reader from response body.");let S=0;const C=new ReadableStream({async start(O){await P();async function P(){const{done:G,value:re}=await p.read();if(G){O.close(),u(S,r,n,!0);return}re&&(O.enqueue(re),S+=re.length,u(S,r,n,!1)),await P()}}}),k=new Response(C);if(c){const O=await k.json(),{base64EncodedValue:P}=O;if(d==="gzip"){await Ue(this,le,tt).call(this,P);return}return this.decompressBrotli(P)}else return await k.arrayBuffer()}catch(h){Ue(this,le,$e).call(this,this.getBytesDownloadErrorEvent(n,h))}}}le=new WeakSet,$e=function(t){this.dispatchEvent(t)},tt=async function(t){const e=Uint8Array.from(atob(t),h=>h.charCodeAt(0)),a=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip")),c=await new Response(a).arrayBuffer(),d=new TextDecoder().decode(new Uint8Array(c)),n=new Blob([d],{type:"application/javascript"}),r=URL.createObjectURL(n);it=(await import(r)).BrotliDecode,this.canDecompress=!0,URL.revokeObjectURL(r)};var Xt=Object.defineProperty,zt=(t,e,i)=>e in t?Xt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,st=(t,e,i)=>zt(t,typeof e!="symbol"?e+"":e,i);class qt{constructor(){st(this,"version",{webSDK:"",extractionLib:{version:"",sdkId:""},faceTracker:""}),st(this,"debugLogs",[])}appendLog(e){this.debugLogs.push(e)}transferLogs(){}generateHTMLTable(){return`
|
|
1
|
+
var Lt="0.1.0-beta.9";const U={RESULTS:"results",ERROR:"error",APPEVENT:"appEvent",CANCELLED:"cancelled",DESTROYED:"destroyed",LOGS:"logs"};var Ye=(t=>(t.measurement="Measurement",t.collector="Collector",t.camera="Camera",t.app="App",t))(Ye||{});const N={INFO:"INFO",WARN:"WARN",ERROR:"ERROR"},L={CAMERA_STARTED:"CAMERA_STARTED",APP_LOADED:"APP_LOADED",MEASUREMENT_PREPARED:"MEASUREMENT_PREPARED",ASSETS_DOWNLOADED:"ASSETS_DOWNLOADED",MEASUREMENT_STARTED:"MEASUREMENT_STARTED",MEASUREMENT_COMPLETED:"MEASUREMENT_COMPLETED",CAMERA_PERMISSION_GRANTED:"CAMERA_PERMISSION_GRANTED",INTERMEDIATE_RESULTS:"INTERMEDIATE_RESULTS",RESULTS_RECEIVED:"RESULTS_RECEIVED",MEASUREMENT_CANCELED:"MEASUREMENT_CANCELED",CONSTRAINT_VIOLATION:"CONSTRAINT_VIOLATION",PAGE_UNLOADED:"PAGE_UNLOADED",PAGE_VISIBILITY_CHANGE:"PAGE_VISIBILITY_CHANGE"},Dt={CAMERA_STARTED:{event:L.CAMERA_STARTED,level:N.INFO},APP_LOADED:{event:L.APP_LOADED,level:N.INFO},MEASUREMENT_PREPARED:{event:L.MEASUREMENT_PREPARED,level:N.INFO},ASSETS_DOWNLOADED:{event:L.ASSETS_DOWNLOADED,level:N.INFO},MEASUREMENT_STARTED:{event:L.MEASUREMENT_STARTED,level:N.INFO},MEASUREMENT_COMPLETED:{event:L.MEASUREMENT_COMPLETED,level:N.INFO},CAMERA_PERMISSION_GRANTED:{event:L.CAMERA_PERMISSION_GRANTED,level:N.INFO},INTERMEDIATE_RESULTS:{event:L.INTERMEDIATE_RESULTS,level:N.INFO},RESULTS_RECEIVED:{event:L.RESULTS_RECEIVED,level:N.INFO},MEASUREMENT_CANCELED:{event:L.MEASUREMENT_CANCELED,level:N.WARN},CONSTRAINT_VIOLATION:{event:L.CONSTRAINT_VIOLATION,level:N.ERROR},PAGE_UNLOADED:{event:L.PAGE_UNLOADED,level:N.INFO},PAGE_VISIBILITY_CHANGE:{event:L.PAGE_VISIBILITY_CHANGE,level:N.INFO}},ne={DESTROY:"destroy",CANCEL:"cancel",SET_THEME:"setTheme",SET_LANGUAGE:"setLanguage",GET_LOGS:"getLogs"};var Je=(t=>(t.CAMERA_PERMISSION_DENIED="CAMERA_PERMISSION_DENIED",t.WORKER_ERROR="WORKER_ERROR",t.PROFILE_INFO_NOT_SET="PROFILE_INFO_NOT_SET",t.NO_DEVICES_FOUND="NO_DEVICES_FOUND",t.PAGE_NOT_VISIBLE="PAGE_NOT_VISIBLE",t.CAMERA_START_FAILED="CAMERA_START_FAILED",t.MEASUREMENT_LOW_SNR="MEASUREMENT_LOW_SNR",t.COLLECTOR="COLLECTOR",t.WEBSOCKET_DISCONNECTED="WEBSOCKET_DISCONNECTED",t.MEASUREMENT_PREPARE_FAILED="MEASUREMENT_PREPARE_FAILED",t))(Je||{}),Xe="0.1.0-beta.3",J=(t=>(t.DELETE="DELETE",t.GET="GET",t.PATCH="PATCH",t.POST="POST",t.PUT="PUT",t.CONNECT="CONNECT",t))(J||{}),H=(t=>(t.ON_BEFORE_REST_CALL_ERROR="ON_BEFORE_REST_CALL_ERROR",t))(H||{});const ze=typeof DedicatedWorkerGlobalScope<"u",_e=async({baseUrl:t,urlFragment:e,method:i,headers:a,data:c},d)=>{const n=`${t}/${e}`;let r={Code:"",Message:""};try{const u=await fetch(n,{method:i,cache:"no-store",credentials:"include",headers:a,...c!=null&&{body:JSON.stringify(c)}}),h=u.headers.get("content-type"),p=u.status.toString();r={Code:"UNSUPPORTED_RESPONSE_CONTENT_TYPE",Message:"UNSUPPORTED_RESPONSE_CONTENT_TYPE"},p==="503"&&(r={Code:"SERVICE_UNAVAILABLE",Message:"Service unavailable"}),p==="429"&&(r={Code:"TOO_MANY_REQUESTS",Message:"Too many requests"}),h!=null&&(h.startsWith("application/json;")&&(r=await u.json()),h.startsWith("text/plain;")&&(r={data:await u.text()}));let S=u.headers;if(ze){const C={};u.headers.forEach((k,O)=>{C[O]=k}),S=C}try{d(p,p==="200"?void 0:r)}catch(C){console.error("Error running onAfterRESTCall callback",C)}return{status:p,headers:S,body:r}}catch(u){return u instanceof SyntaxError?r={Code:"SYNTAX_ERROR",Message:"SYNTAX_ERROR"}:r={Code:"UNEXPECTED_ERROR",Message:"UNEXPECTED_ERROR"},{status:"UNKNOWN",headers:ze?{}:new Headers,body:r}}},ge=()=>new Headers({"Content-Type":"application/json"});var It=Object.defineProperty,xt=(t,e,i)=>e in t?It(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Ft=(t,e,i)=>xt(t,e+"",i);class Me{constructor(e){Ft(this,"parent"),this.parent=e}async onBeforeRESTCall(){try{return this.parent.onBeforeRESTCall(),{Code:"SUCCESS",Message:"SUCCESS"}}catch{return{Code:H.ON_BEFORE_REST_CALL_ERROR,Message:H.ON_BEFORE_REST_CALL_ERROR}}}getDefaults(e){return{baseUrl:JSON.parse(this.parent.getUrl()).http.slice(0,-1),method:J[e],headers:ge()}}getHeaderWithDeviceToken(){const e=ge();return e.set("Authorization",`Bearer ${this.parent.getSession().deviceToken}`),e}getHeaderWithUserToken(){const e=ge();return e.set("Authorization",`Bearer ${this.parent.getSession().userToken}`),e}getHeaderWithSessionEnabled(){const e=ge();return e.set("x-nura-session","true"),e}}class Mt extends Me{async create(e,i){const{Code:a,Message:c}=await this.onBeforeRESTCall();if(a===H.ON_BEFORE_REST_CALL_ERROR)return{status:a,body:{Code:a,Message:c},headers:new Headers};const{status:d,body:n,headers:r}=await _e({...this.getDefaults(J.POST),headers:i==="device"?this.getHeaderWithDeviceToken():this.getHeaderWithUserToken(),urlFragment:"measurements",data:e},this.parent.onAfterRESTCall);return d==="200"&&this.parent.setSession({lastMeasurementId:n.ID}),{status:d,body:n,headers:r}}}class Pt extends Me{async retrieveSdkConfigData(e,i){const{Code:a,Message:c}=await this.onBeforeRESTCall();if(a===H.ON_BEFORE_REST_CALL_ERROR)return{status:a,body:{Code:a,Message:c},headers:new Headers};const{status:d,body:n,headers:r}=await _e({...this.getDefaults(J.POST),headers:i==="device"?this.getHeaderWithDeviceToken():this.getHeaderWithUserToken(),urlFragment:"studies/sdkconfig",data:e},this.parent.onAfterRESTCall);return d==="200"&&this.parent.setSession({studyCfgData:n.ConfigFile,studyCfgHash:n.MD5Hash}),{status:d,body:n,headers:r}}}class Wt extends Me{async renew(e,i){const{Code:a,Message:c}=await this.onBeforeRESTCall();if(a===H.ON_BEFORE_REST_CALL_ERROR)return{status:a,body:{Code:a,Message:c},headers:new Headers};const{status:d,body:n,headers:r}=await _e({...this.getDefaults(J.POST),headers:i==="device"?this.getHeaderWithDeviceToken():this.getHeaderWithUserToken(),urlFragment:"auths/renew",data:e},this.parent.onAfterRESTCall);if(d==="200"){const u=n.Token,h=n.RefreshToken,p={...i==="user"&&{userToken:u,userRefreshToken:h},...i==="device"&&{deviceToken:u,deviceRefreshToken:h}};this.parent.setSession(p)}return{status:d,body:n,headers:r}}async validate(e){const{Code:i,Message:a}=await this.onBeforeRESTCall();return i===H.ON_BEFORE_REST_CALL_ERROR?{status:i,body:{Code:i,Message:a},headers:new Headers}:await _e({...this.getDefaults(J.GET),headers:e==="device"?this.getHeaderWithDeviceToken():this.getHeaderWithUserToken(),urlFragment:"auth/v1/validate"},this.parent.onAfterRESTCall)}}var Ut=Object.defineProperty,qe=t=>{throw TypeError(t)},$t=(t,e,i)=>e in t?Ut(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Pe=(t,e,i)=>$t(t,typeof e!="symbol"?e+"":e,i),Ze=(t,e,i)=>e.has(t)||qe("Cannot "+i),We=(t,e,i)=>(Ze(t,e,"read from private field"),i?i.call(t):e.get(t)),Qe=(t,e,i)=>e.has(t)?qe("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),we=(t,e,i,a)=>(Ze(t,e,"write to private field"),e.set(t,i),i),oe,X;class Bt{constructor(e){Qe(this,oe,{http:new URL("https://api.deepaffex.ai")}),Qe(this,X),Pe(this,"onBeforeRESTCall"),Pe(this,"onAfterRESTCall"),Pe(this,"http"),we(this,X,{deviceToken:"",deviceRefreshToken:"",userToken:"",userRefreshToken:"",deviceId:"",roleId:"",userId:"",selectedStudy:"",lastMeasurementId:"",studyCfgHash:"",studyCfgData:""}),this.http={measurements:new Mt(this),studies:new Pt(this),auths:new Wt(this)},this.onBeforeRESTCall=e?.onBeforeRESTCall?e.onBeforeRESTCall:()=>{},this.onAfterRESTCall=e?.onAfterRESTCall?e.onAfterRESTCall:()=>{},e?.url!=null&&we(this,oe,e.url)}static new(e){return new this(e??void 0)}getUrl(){return JSON.stringify(We(this,oe))}setUrl(e){we(this,oe,{http:new URL(e)})}getSession(){return We(this,X)}setSession(e){const i=["deviceToken","deviceRefreshToken","userToken","userRefreshToken","deviceId","userId","roleId","selectedStudy","lastMeasurementId","studyCfgHash","studyCfgData"];Object.keys(e).every(d=>i.includes(d)&&typeof e[d]=="string")&&we(this,X,{...We(this,X),...e})}}oe=new WeakMap,X=new WeakMap;const Gt=t=>Bt.new(t);var Ht=Object.defineProperty,et=t=>{throw TypeError(t)},Vt=(t,e,i)=>e in t?Ht(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Kt=(t,e,i)=>Vt(t,e+"",i),jt=(t,e,i)=>e.has(t)||et("Cannot "+i),Yt=(t,e,i)=>e.has(t)?et("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),Ue=(t,e,i)=>(jt(t,e,"access private method"),i),le,$e,tt;let it=t=>new Int8Array(t);class Jt extends EventTarget{constructor(){super(...arguments),Yt(this,le),Kt(this,"canDecompress",!1)}static init(){return new this}dispatch(e,i){this.dispatchEvent(new CustomEvent(e,{detail:i}))}getBytesDownloadedEvent(e,i,a,c){return new CustomEvent("bytesDownloaded",{detail:{bytes:e,uncompressedSize:i,url:a,done:c}})}getBytesDownloadErrorEvent(e,i){return new CustomEvent("downloadedError",{detail:{url:e,error:i}})}decompressBrotli(e){const i=atob(e),a=new Uint8Array(i.length);for(let n=0;n<i.length;n++)a[n]=i.charCodeAt(n);const c=new Int8Array(a.length);for(let n=0;n<a.length;n++)c[n]=a[n]>=128?a[n]-256:a[n];return it(c).buffer}async fetchAsset(e,i,a,c,d){const n=i+a,r=e.find(h=>h.file===a).uncompressedSize,u=(h,p,S,C)=>Ue(this,le,$e).call(this,this.getBytesDownloadedEvent(h,p,S,C));try{const p=(await fetch(n)).body?.getReader();if(!p)throw new Error("Failed to get reader from response body.");let S=0;const C=new ReadableStream({async start(O){await P();async function P(){const{done:G,value:re}=await p.read();if(G){O.close(),u(S,r,n,!0);return}re&&(O.enqueue(re),S+=re.length,u(S,r,n,!1)),await P()}}}),k=new Response(C);if(c){const O=await k.json(),{base64EncodedValue:P}=O;if(d==="gzip"){await Ue(this,le,tt).call(this,P);return}return this.decompressBrotli(P)}else return await k.arrayBuffer()}catch(h){Ue(this,le,$e).call(this,this.getBytesDownloadErrorEvent(n,h))}}}le=new WeakSet,$e=function(t){this.dispatchEvent(t)},tt=async function(t){const e=Uint8Array.from(atob(t),h=>h.charCodeAt(0)),a=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip")),c=await new Response(a).arrayBuffer(),d=new TextDecoder().decode(new Uint8Array(c)),n=new Blob([d],{type:"application/javascript"}),r=URL.createObjectURL(n);it=(await import(r)).BrotliDecode,this.canDecompress=!0,URL.revokeObjectURL(r)};var Xt=Object.defineProperty,zt=(t,e,i)=>e in t?Xt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,st=(t,e,i)=>zt(t,typeof e!="symbol"?e+"":e,i);class qt{constructor(){st(this,"version",{webSDK:"",extractionLib:{version:"",sdkId:""},faceTracker:""}),st(this,"debugLogs",[])}appendLog(e){this.debugLogs.push(e)}transferLogs(){}generateHTMLTable(){return`
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
@@ -736,4 +736,4 @@ var Lt="0.1.0-beta.7";const U={RESULTS:"results",ERROR:"error",APPEVENT:"appEven
|
|
|
736
736
|
<\/script>
|
|
737
737
|
</body>
|
|
738
738
|
</html>
|
|
739
|
-
`}openLogInNewWindow(){const e=this.generateHTMLTable(),i=new Blob([e],{type:"text/html"}),a=URL.createObjectURL(i);window.open(a,"_blank")}}var Zt=Object.defineProperty,Qt=(t,e,i)=>e in t?Zt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Re=(t,e,i)=>Qt(t,typeof e!="symbol"?e+"":e,i);class Fe{constructor(e,i){Re(this,"workerUrl"),Re(this,"worker"),this.worker=e,this.workerUrl=i}static init(e,i,a){const c=new Blob([e],{type:"application/javascript"}),d=URL.createObjectURL(c),n=a||`WORKER${String(new Date().getTime())}`,r=new Worker(new URL(d,import.meta.url),{name:n,type:i});return new Fe(r,d)}destroy(){this.worker&&(this.worker.terminate(),URL.revokeObjectURL(this.worker))}}const ei=(t,e,i,a)=>{const c=t/e,d=i/a;let n=0,r=0;c>d?(n=t,r=t/d):(r=e,n=e*d);const u=(t-n)/2,h=(e-r)/2;return{width:n||0,height:r||0,offsetX:u||0,offsetY:h||0}},ti=(t,e,i,a)=>{const c=(t-i)/2,d=(e-a)/2;return{width:i||0,height:a||0,offsetX:c||0,offsetY:d||0}},ii=(t,e,i,a)=>{const c=t/e,d=i/a;let n=0,r=0;c>d?(r=e,n=e*d):(n=t,r=t/d);const u=(t-n)/2,h=(e-r)/2;return{width:n||0,height:r||0,offsetX:u||0,offsetY:h||0}},si=(t,e)=>{switch(t){case"none":return ti(...e);case"cover":return ei(...e);case"contain":default:return ii(...e)}},at=t=>/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(t),ai=t=>t===void 0?!0:!(typeof t.mediaPipe<"u"&&typeof t.mediaPipe!="boolean"||typeof t.beforeRESTCall<"u"&&typeof t.beforeRESTCall!="boolean"||typeof t.afterRESTCall<"u"&&typeof t.afterRESTCall!="boolean"||typeof t.extractionLibWasm<"u"&&typeof t.extractionLibWasm!="boolean"||typeof t.apiClient<"u"&&typeof t.apiClient!="boolean"||typeof t.extractionWorker<"u"&&typeof t.extractionWorker!="boolean"||typeof t.faceTrackerWorkers<"u"&&typeof t.faceTrackerWorkers!="boolean"||typeof t.sdk<"u"&&typeof t.sdk!="boolean"),ri=(t,e)=>{const i={...t};if(e.logger)if(ai(e.logger))i.logger={...i.logger,...e.logger};else return{results:"invalid"};if(e.apiUrl!==void 0)if(typeof e.apiUrl=="string")i.apiUrl=e.apiUrl;else return{results:"invalid"};if(e.metrics!==void 0)if(typeof e.metrics=="boolean")i.metrics=e.metrics;else return{results:"invalid"};if(e.mirrorVideo!==void 0)if(typeof e.mirrorVideo=="boolean")i.mirrorVideo=e.mirrorVideo;else return{results:"invalid"};if(e.displayMediaStream!==void 0)if(typeof e.displayMediaStream=="boolean")i.displayMediaStream=e.displayMediaStream;else return{results:"invalid"};if(e.assetFolder!==void 0)if(typeof e.assetFolder=="string")i.assetFolder=e.assetFolder;else return{results:"invalid"};if(e.mediaElement!==void 0)if(e.mediaElement instanceof HTMLDivElement)i.mediaElement=e.mediaElement;else return{results:"invalid"};if(e.constraintOverrides!==void 0){let a=function(n,r){if(!(n in d))return!1;const u=d[n];return typeof r===u};const d=Object.fromEntries(Object.entries({backLightMaxPixels_pct:30,backLightSearchMult:1.5,backLightThresh:240,boxCenterX_pct:50,boxCenterY_pct:50,boxHeight_pct:99,boxWidth_pct:50,cameraRot_chunkThresh:.7853981633974483,cameraRot_windowThresh:.2617993877991494,checkBackLight:!1,checkCameraMovement:!1,checkCentered:!1,checkDistance:!1,checkEyebrowMovement:!1,checkFaceDirection:!1,checkLighting:!1,checkMaxDistance:!1,checkMinFps:!1,checkMovement:!1,chunkMovementThresh_pct:60,enableDebugLog:!1,enableFigures:!1,faceRotLR_thresh:.33,faceRotUD_lowerthresh:.25,faceRotUD_upperThresh:5,hy_faceRotLR_thresh:.05,hy_maxFaceRotLR_deg:2,hy_maxFaceRotUD_deg:2,hy_minInterPupilDist_px:5,hy_minimumFps:1,maxEyebrowMovement_mm:3,maxFaceRotLR_deg:12.5,maxFaceRotUD_deg:25,maxMovement_mm:10,minInterPupilDist_px:100,minimumFps:26,movementWindow_ms:2e3,threshBright:225,threshDark:48}).map(([n,r])=>[n,typeof r]));for(const n in e.constraintOverrides){const r=e.constraintOverrides[n];if(!a(n,r))return{results:"invalid"}}i.constraintOverrides=e.constraintOverrides}return{results:"valid",settings:i}},ni=t=>typeof t.age!="number"||t.age<13||t.age>120?(console.error("Invalid age. It should be a number between 13 and 120."),!1):typeof t.height!="number"||t.height<120||t.height>220?(console.error("Invalid height. It should be a number between 120 and 220."),!1):typeof t.weight!="number"||t.weight<30||t.weight>300?(console.error("Invalid weight. It should be a number between 30 and 300."),!1):typeof t.sex!="number"||t.sex<1||t.sex>3?(console.error("Invalid sex. It should be a number between 1 and 3."),!1):typeof t.diabetes!="number"||t.diabetes<4||t.diabetes>6?(console.error("Invalid diabetes. It should be a number between 4 and 6."),!1):typeof t.bloodPressureMedication!="number"||t.bloodPressureMedication!==0&&t.bloodPressureMedication!==1?(console.error("Invalid bloodPressureMedication. It should be either 0 or 1."),!1):typeof t.smoking!="number"||t.smoking!==0&&t.smoking!==1?(console.error("Invalid smoking. It should be either 0 or 1."),!1):!0;var m=(t=>(t.beforeRESTCall="Before REST call event",t.afterRESTCall="After REST call event",t.mediaPipe="MediaPipe",t.extractionLibWasm="DFX Extraction lib WASM",t.apiClient="DFX API client",t.webSocket="WebSocket",t.sdk="SDK",t.dfxWorker="DFX Worker",t))(m||{});const oi=t=>{switch(t){case"Before REST call event":return"red";case"After REST call event":return"orange";case"MediaPipe":return"green";case"DFX Extraction lib WASM":return"violet";case"DFX API client":return"#d34110";case"WebSocket":return"#d34110";case"SDK":return"#d34110";case"DFX Worker":return"#ad4393";default:return"black"}};class rt{constructor(e=1e3){Re(this,"timestamps",[]),Re(this,"windowMs"),this.windowMs=e}tick(e=performance.now()){for(this.timestamps.push(e);this.timestamps.length>0&&e-this.timestamps[0]>this.windowMs;)this.timestamps.shift()}get fps(){const e=this.timestamps.length,i=this.timestamps.at(-1)-this.timestamps[0]||1;return e/i*1e3}get frameCount(){return this.timestamps.length}reset(){this.timestamps=[]}}var li=Object.defineProperty,ci=(t,e,i)=>e in t?li(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,nt=(t,e,i)=>ci(t,typeof e!="symbol"?e+"":e,i);const di=()=>{const t=new Date,e=(t.getMonth()+1).toString().padStart(2,"0"),i=t.getDate().toString().padStart(2,"0"),a=t.getFullYear();let c=t.getHours();const d=t.getMinutes().toString().padStart(2,"0"),n=t.getSeconds().toString().padStart(2,"0"),r=t.getMilliseconds().toString().padStart(3,"0"),u=c>=12?"PM":"AM";return c=c%12||12,`[${e}/${i}/${a}, ${c}:${d}:${n}.${r} ${u}]`};class ot{constructor(){nt(this,"mertics",new qt),nt(this,"version",{webSDK:"",extractionLib:{version:"",sdkId:""},faceTracker:""})}retrieveLogs(){this.mertics.transferLogs(),this.mertics.openLogInNewWindow(),this.mertics.debugLogs=[]}setVersion(e){this.version=e,this.mertics.version=e}log(e,i,a,c=!1,d={}){const n=di();if(c)this.mertics.appendLog({thread:"Main",timestamp:n,category:i,message:e,meta:d});else{const r=`[${i}]`,u=" ",h=e,p=`color:${a}; font-weight:800;`,S=`color:${oi(i)}; font-weight:700;`;console.log("%c%s%c%s%c%s%c%s",p,n,S,r,"background:inherit;",u,"font-style: italic;",h)}}info(e,i){this.log(e,i,"blue")}warn(e,i){this.log(e,i,"orange")}error(e,i){this.log(e,i,"red")}debug(e,i){this.log(e,i,"green")}start(){console.log("%c%s","color: #5e5e5e; background-color: #2d2d2d; letter-spacing: 0.1em; text-shadow: -1px -1px 1px #111, 2px 2px 1px #363636; font-size: 36px; padding: 20px 40px; text-align: center; text-transform: uppercase; text-rendering: optimizeLegibility;","Anura Web Core SDK"),console.log(`Version: ${this.version.webSDK}`),console.log("https://www.deepaffex.ai")}}const hi={SEX_NOT_PROVIDED:1,SEX_ASSIGNED_MALE_AT_BIRTH:2,SEX_ASSIGNED_FEMALE_AT_BIRTH:3,DIABETES_NONE:4,DIABETES_TYPE1:5,DIABETES_TYPE2:6,SMOKER_TRUE:0,SMOKER_FALSE:1,BLOOD_PRESSURE_MEDICATION_TRUE:1,BLOOD_PRESSURE_MEDICATION_FALSE:0},V={SEX_ASSIGNED_AT_BIRTH:1,AGE_YEARS:2,HEIGHT_CM:3,WEIGHT_KG:4,SMOKER:5,BLOOD_PRESSURE_MEDICATION:7,DIABETES:8};var lt=(t=>(t[t.BGR=1]="BGR",t[t.RGB=2]="RGB",t[t.BGRA=3]="BGRA",t[t.RGBA=4]="RGBA",t[t.Infrared=5]="Infrared",t[t.Infrared888=6]="Infrared888",t[t.BGR_Infrared=7]="BGR_Infrared",t[t.RGB_Infrared=8]="RGB_Infrared",t[t.Gray=9]="Gray",t))(lt||{});const K={ASSETS_NOT_DOWNLOADED:"ASSETS_NOT_DOWNLOADED",NOT_LOADED:"NOT_LOADED",LOADING:"LOADING",LOADED:"LOADED",READY:"READY"},Ce={COLLECTOR:"COLLECTOR",ASSET_DOWNLOAD:"ASSET_DOWNLOAD",WEB_SOCKET:"WEB_SOCKET"},ke={CONTAIN:"contain",COVER:"cover",NONE:"none"};var $=(t=>(t.INIT="INIT",t.READY="READY",t.INIT_TFJS="INIT_TFJS",t.SET_PORT="SET_PORT",t.TRACK="TRACK",t.RESULTS_READY="RESULTS_READY",t.WARM_UP="WARM_UP",t.DESTROY="DESTROY",t.LANDMARKS="LANDMARKS",t.VIDEO_FRAME="VIDEO_FRAME",t.SCALE_FACTOR_CHANGED="SCALE_FACTOR_CHANGED",t))($||{}),mi=Object.defineProperty,ct=t=>{throw TypeError(t)},ui=(t,e,i)=>e in t?mi(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,w=(t,e,i)=>ui(t,typeof e!="symbol"?e+"":e,i),Be=(t,e,i)=>e.has(t)||ct("Cannot "+i),dt=(t,e,i)=>(Be(t,e,"read from private field"),i?i.call(t):e.get(t)),ht=(t,e,i)=>e.has(t)?ct("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),fi=(t,e,i,a)=>(Be(t,e,"write to private field"),e.set(t,i),i),Ei=(t,e,i)=>(Be(t,e,"access private method"),i),ce,Ge,mt;const pi=class Ot{constructor(e,i,a){ht(this,Ge),ht(this,ce),w(this,"mediaElement"),w(this,"numOfFramesPresented",0),w(this,"workers",[]),w(this,"numOftrackedVideoFrames",0),w(this,"warmupFrameNumber",0),w(this,"videoCallbackId",0),w(this,"numOfWorkers",4),w(this,"isLoggingFaceTrackerWorkers",!1),w(this,"isLoggingSdk",!1),w(this,"workerIndex",0),w(this,"metrics",!1),w(this,"videoFpsTracker",new rt(1e3)),w(this,"faceTrackerFpsTracker",new rt(1e3)),w(this,"videoElementSize",{width:0,height:0,offsetX:0,offsetY:0}),w(this,"videoElement",document.createElement("video")),w(this,"frameWidth",0),w(this,"frameHeight",0),w(this,"mirrorVideo",!0),w(this,"settings",{faceTrackerWidth:0,faceTrackerHeight:0,displayMediaStream:!0,objectFit:ke.COVER}),w(this,"isExtracting",!1),w(this,"starRating",0),w(this,"scaleFactor",1),w(this,"warmupIndex",0),w(this,"warmingUp",!0),w(this,"ftWorkerIndex",0),w(this,"lastFrameNumber",-1),w(this,"on",{faceTrackersReady:null,frameAvailable:null,landmarksAvailable:null,scaleFactorChanged:null});const{mediaElement:c,mirrorVideo:d,numOfWorkers:n,isLoggingFaceTrackerWorkers:r,isLoggingSdk:u,metrics:h,displayMediaStream:p}=i;this.numOfWorkers=n,this.isLoggingFaceTrackerWorkers=r,this.isLoggingSdk=u,this.metrics=h,fi(this,ce,a),this.settings.displayMediaStream=p,this.mirrorVideo=d,this.mediaElement=c,this.videoFrameCallback=this.videoFrameCallback.bind(this),this.workers=e,this.scaleFactor=i.scaleFactor,this.initWorkerOnMessage(i.models),this.videoElement.muted=!0,this.videoElement.playsInline=!0,this.videoElement.preload="auto"}static async init(e,i){const{numOfWorkers:a,faceTrackerCode:c}=e,d=[],n=new TextDecoder().decode(new Uint8Array(c));if(a>0)for(let r=1;r<=a;r+=1){const u=Fe.init(n,"module",`FACE_TRACKER_WORKER_${r-1}`);d.push({ft:u,channel:new MessageChannel,isBusy:!1})}return new Ot(d,e,i)}initWorkerOnMessage(e){const i=window.matchMedia("(orientation: portrait)").matches,a=i?360:640,c=i?640:360;this.workers.forEach(d=>{d.ft.worker.postMessage({action:$.INIT_TFJS,payload:{width:a,height:c,models:e,scaleFactor:this.scaleFactor}}),d.ft.worker.postMessage({action:$.SET_PORT,payload:{port:d.channel.port2}},[d.channel.port2]),d.ft.worker.onmessage=n=>{const{action:r,payload:u}=n.data;switch(r){case $.INIT_TFJS:break;case $.READY:{const{workerName:h,version:p,workerId:S,backend:C}=u;this.on.faceTrackersReady&&this.on.faceTrackersReady(h,p,S,C);break}case $.LANDMARKS:{this.faceTrackerFpsTracker.tick(),d.isBusy=!1,this.warmingUp&&this.warmupIndex++;const{face:h,annotations:p,frameTimestamp:S}=u;this.on.landmarksAvailable&&this.on.landmarksAvailable(h,p,S);break}case $.DESTROY:{const{workerId:h}=u;this.workers[h].ft.destroy();break}}}})}getMediaElement(){return this.mediaElement}setIsExtracting(e){this.isExtracting=e}destroyWorkers(){setTimeout(async()=>{this.videoCallbackId&&this.videoElement.cancelVideoFrameCallback(this.videoCallbackId),this.workers.forEach(e=>e.ft.worker.postMessage({action:$.DESTROY}))},200)}createMediaElements(){this.videoElement.addEventListener("ended",async()=>{this.destroyWorkers()});const e=document.createElement("div"),i=this.settings.displayMediaStream?this.videoElement:e,a="white";this.mediaElement.appendChild(i),i.style.width="100%",i.style.height="100%",i.style.boxSizing="border-box",this.settings.displayMediaStream&&(i.style.border=`1px solid ${a}`),i.style.objectFit=this.settings.objectFit,i.style.transform=`scale(${this.mirrorVideo?"-1":"1"},1)`,this.settings.displayMediaStream||(i.style.height=`${this.frameHeight}px`,i.style.width=`${this.frameWidth}px`),new ResizeObserver(d=>{const{contentRect:n,target:r}=d[0],{width:u,height:h}=n,{x:p,y:S}=r.getBoundingClientRect(),{faceTrackerWidth:C,faceTrackerHeight:k}=this.settings;this.videoElementSize=si(this.settings.objectFit,[u,h,this.frameWidth,this.frameHeight]);const{width:O,height:P}=this.videoElementSize;if(!this.settings.displayMediaStream){const G=this.settings.objectFit===ke.NONE;i.style.height=`${Math.trunc(G?P:h)}px`,i.style.width=`${Math.trunc(G?O:u)}px`}this.mediaElement.dispatchEvent(new CustomEvent("mediaElementSizeChanged",{detail:{mediaElementSize:{width:u,height:h,x:p,y:S},videoElementSize:this.videoElementSize,frameInfo:{mediaStreamWidth:this.frameWidth,mediaStreamHeight:this.frameHeight,faceTrackerWidth:C,faceTrackerHeight:k},isPortrait:h>u,aspectRatio:u/h}}))}).observe(this.mediaElement)}log(e,i,a){this.isLoggingSdk&&dt(this,ce).info(e,i),this.metrics&&dt(this,ce).log(e,i,"",!0,a)}videoFrameCallback(e,i){const{presentedFrames:a,captureTime:c,expectedDisplayTime:d,mediaTime:n}=i;this.videoFpsTracker.tick();const r=c===void 0?d:c;this.numOfFramesPresented=a;const u=`Number of frames presented: ${this.numOfFramesPresented} - time: ${r}`;let h=0;if(n&&n>0?h=n*1e3:c&&c>0?h=c>1e6?c-performance.timeOrigin:c:h=e,this.log(u,m.sdk,{captureTime:r,presentedFrames:a}),this.warmingUp)if(this.warmupIndex>=this.numOfWorkers)this.warmingUp=!1;else{const p=this.workers[this.warmupIndex];if(!p.isBusy){p.isBusy=!0;const S=new VideoFrame(this.videoElement,{timestamp:h});p.ft.worker.postMessage({action:"TRACK",payload:{frame:S,frameTimestamp:h,frameNumber:this.numOfFramesPresented}},[S])}}if(!this.warmingUp){const p=new VideoFrame(this.videoElement,{timestamp:h});let S=!1;for(let C=0;C<this.numOfWorkers;C++){this.ftWorkerIndex=(this.ftWorkerIndex+1)%this.numOfWorkers;const k=this.workers[this.ftWorkerIndex];if(k&&!k.isBusy){k.isBusy=!0,this.on.frameAvailable(h,this.numOfFramesPresented,this.lastFrameNumber,!0),k.ft.worker.postMessage({action:"TRACK",payload:{frame:p,frameTimestamp:h,frameNumber:this.numOfFramesPresented}},[p]),S=!0;break}}S||this.on.frameAvailable(h,this.numOfFramesPresented,this.lastFrameNumber,!1,p)}this.lastFrameNumber=this.numOfFramesPresented,this.videoCallbackId=this.videoElement.requestVideoFrameCallback(this.videoFrameCallback)}setFaceTrackerMediaStreamResolution(e,i){(e<=360||i<=360)&&(this.scaleFactor=1),this.settings.faceTrackerWidth=e*this.scaleFactor,this.settings.faceTrackerHeight=i*this.scaleFactor,this.workers.forEach(a=>a.ft.worker.postMessage({action:$.SCALE_FACTOR_CHANGED,payload:{scaleFactor:this.scaleFactor}})),this.on.scaleFactorChanged&&this.on.scaleFactorChanged(this.scaleFactor)}async setMediaStream(e){if(e instanceof MediaStream)try{const{settings:i,constraints:a}=await Ei(this,Ge,mt).call(this,e,this.videoElement);await this.videoElement.play(),this.settings.displayMediaStream||(this.videoElement.style.visibility="none");const{width:c,height:d}=i;return this.setFaceTrackerMediaStreamResolution(c??0,d??0),this.frameWidth=c||1,this.frameHeight=d||1,this.log(`Face tracker resolution: ${c} x ${d} pixels. Video resolution: ${this.frameWidth} x ${this.frameHeight} pixels`,m.sdk,{ftWidth:c,ftHeight:d,frameWidth:this.frameWidth,frameHeight:this.frameHeight}),this.createMediaElements(),this.videoCallbackId=this.videoElement.requestVideoFrameCallback(this.videoFrameCallback),!0}catch(i){return console.log("Error applying face tracker video track constraints",i),!1}return!1}stopTracking(){this.videoCallbackId&&this.videoElement.cancelVideoFrameCallback(this.videoCallbackId),this.videoElement.pause(),this.videoElement.srcObject=null}};ce=new WeakMap,Ge=new WeakSet,mt=async function(t,e){e.srcObject=t,await new Promise(a=>e.onloadedmetadata=a);const[i]=t.getVideoTracks();return{constraints:i.getConstraints(),settings:i.getSettings()}};let Ti=pi;var T=(t=>(t.INIT="INIT",t.READY="READY",t.SET_MODE="SET_MODE",t.SET_NUMBER_OF_CHUNKS="SET_NUMBER_OF_CHUNKS",t.SET_TARGET_FPS="SET_TARGET_FPS",t.SET_CHUNK_DURATION_SECONDS="SET_CHUNK_DURATION_SECONDS",t.SET_FRAME_ORDER="SET_FRAME_ORDER",t.GET_CONSTRAINTS_CONFIG="GET_CONSTRAINTS_CONFIG",t.SET_CONSTRAINTS_CONFIG="SET_CONSTRAINTS_CONFIG",t.SET_FACE_ATTRIBUTE="SET_FACE_ATTRIBUTE",t.RESET_COLLECTION="RESET_COLLECTION",t.CANCEL_COLLECTION="CANCEL_COLLECTION",t.START_COLLECTION="START_COLLECTION",t.SET_PORTS="SET_PORTS",t.COLLECTOR_ERROR="COLLECTOR_ERROR",t.STAR_RATING="STAR_RATING",t.ALL_FACE_TRACKERS_WARMED_UP="ALL_FACE_TRACKERS_WARMED_UP",t.CONSTRAINTS_UPDATED="CONSTRAINTS_UPDATED",t.SHOULD_END_MEASUREMENT_EARLY="SHOULD_END_MEASUREMENT_EARLY",t.GET_LOGS="GET_LOGS",t.NEW_FRAME="NEW_FRAME",t.TRACKING_STATUS="TRACKING_STATUS",t.SCALE_FACTOR_CHANGED="SCALE_FACTOR_CHANGED",t))(T||{}),y=(t=>(t.CONNECT="CONNECT",t.DISCONNECT="DISCONNECT",t.DISCONNECTED="DISCONNECTED",t.LOGIN_WITH_TOKEN_SUCCESS="LOGIN_WITH_TOKEN_SUCCESS",t.SUBSCRIBED_TO_RESULTS="SUBSCRIBED_TO_RESULTS",t.CHUNK_SENT="CHUNK_SENT",t.RESULTS_RECEIVED="RESULTS_RECEIVED",t.CHUNK_ACKNOWLEDGED="CHUNK_ACKNOWLEDGED",t.ERROR="ERROR",t.NETWORK_DELAY="NETWORK_DELAY",t))(y||{}),Si=Object.defineProperty,ut=t=>{throw TypeError(t)},bi=(t,e,i)=>e in t?Si(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,ft=(t,e,i)=>bi(t,typeof e!="symbol"?e+"":e,i),He=(t,e,i)=>e.has(t)||ut("Cannot "+i),s=(t,e,i)=>(He(t,e,"read from private field"),i?i.call(t):e.get(t)),b=(t,e,i)=>e.has(t)?ut("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),f=(t,e,i,a)=>(He(t,e,"write to private field"),e.set(t,i),i),l=(t,e,i)=>(He(t,e,"access private method"),i),_i=(t,e,i,a)=>({set _(c){f(t,e,c)},get _(){return s(t,e,a)}}),x,g,M,v,D,ve,Ae,ye,Oe,de,z,Ne,he,me,_,q,I,ue,F,Le,Z,Q,ee,te,fe,Ee,j,pe,De,ie,Ie,se,Te,A,Se,B,be,o,Et,pt,Tt,Ve,Ke,St,bt,_t,gt,wt,Rt,xe,je,E,Ct,kt,vt,At,ae,R;const yt=Symbol("instance_creation_key"),gi=class Nt{constructor(e){if(b(this,o),b(this,x),b(this,g,{mediaElement:document.createElement("div"),assetFolder:"",apiUrl:"",metrics:!1,logger:{sdk:!1,mediaPipe:!1,beforeRESTCall:!1,afterRESTCall:!1,extractionLibWasm:!1,apiClient:!1,extractionWorker:!1,faceTrackerWorkers:!1},mirrorVideo:!0,displayMediaStream:!0,constraintOverrides:{}}),b(this,M,[{file:"decompress.json",uncompressedSize:89469},{file:"extraction_worker_0.1.0-beta.2_js.json",uncompressedSize:59696},{file:"facetracker_worker_0.1.0-beta.2_js.json",uncompressedSize:306553},{file:"extraction_wasm_0.1.0-beta.2.json",uncompressedSize:1926126},{file:"detectorModel_json.json",uncompressedSize:4640},{file:"detectorModel_bin.json",uncompressedSize:242046},{file:"landmarkModel_json.json",uncompressedSize:5036},{file:"landmarkModel_bin.json",uncompressedSize:1704814}]),b(this,v,new ot),b(this,D,Jt.init()),b(this,ve),b(this,Ae),b(this,ye),b(this,Oe),b(this,de),b(this,z),b(this,Ne),b(this,he,{version:"",sdkId:""}),b(this,me,""),b(this,_),b(this,q,0),b(this,I),b(this,ue,K.ASSETS_NOT_DOWNLOADED),b(this,F,""),b(this,Le,""),b(this,Z,!1),b(this,Q,5),b(this,ee,30),b(this,te,5),b(this,fe,!1),b(this,Ee,4),b(this,j),b(this,pe),b(this,De),b(this,ie,1e7),b(this,Ie,0),b(this,se,new Map),b(this,Te,Promise.resolve()),b(this,A,0),b(this,Se,-1),b(this,B,-1),b(this,be,.5),ft(this,"on",{beforeRESTCall:null,afterRESTCall:null,bytesDownloaded:null,faceTrackerStateChanged:null,resultsReceived:null,constraintsUpdated:null,mediaElementResize:null,facialLandmarksUpdated:null,chunkSent:null,error:null}),e!==yt)throw new Error("Use await Measurement.init() to create an instance of Measurement class.")}static async init(e){if(!e)throw new Error("Missing `settings` object");const i=new Nt(yt);if(!i.setSettings(e))throw new Error("Invalid settings object");f(i,x,Gt({url:{http:new URL("https://api.deepaffex.ai")},onBeforeRESTCall:()=>{var n,r;l(n=i,o,bt).call(n),l(r=i,o,_t).call(r)},onAfterRESTCall:(n,r)=>{var u,h;l(u=i,o,gt).call(u,n,r),l(h=i,o,wt).call(h,n,r)}}));const c=n=>{var r;const{bytes:u,url:h,uncompressedSize:p,done:S}=n.detail;l(r=i,o,E).call(r,`bytesDownloaded event, ${u}, ${p}, ${h}, ${S}`,m.mediaPipe),i.on.bytesDownloaded&&i.on.bytesDownloaded(u,p,h,S)},d=n=>{var r;const{error:u,url:h}=n.detail;l(r=i,o,E).call(r,`downloadError event, ${h}, ${u}`,m.mediaPipe),i.on.error&&i.on.error(Ce.ASSET_DOWNLOAD,{url:h,error:u})};return s(i,D).addEventListener("downloadedError",d),s(i,D).addEventListener("bytesDownloaded",c),s(i,v).setVersion(i.getVersion()),s(i,g).logger&&Object.values(s(i,g).logger).some(n=>n===!0)&&s(i,v).start(),setTimeout(()=>{var n;l(n=i,o,ae).call(n,K.ASSETS_NOT_DOWNLOADED)},500),new Proxy(i,{get(n,r,u){const h=r;return typeof n[h]=="function"?n[h].bind(n):Reflect.get(n,h,u)},set(n,r,u){return console.log(`Setting property "${String(r)}" to "${u}" is not allowed`),!0}})}loadMask(e){if(s(this,_)){let i=!1;const a=s(this,_).mediaElement.querySelector("svg");a&&(i=!0,s(this,_).mediaElement.removeChild(a)),s(this,_).mediaElement.appendChild(e),i&&(s(this,_).mediaElement.style.setProperty("border","1px solid transparent"),setTimeout(()=>{s(this,_).mediaElement.removeAttribute("style")},100))}}setSettings(e){const i=ri(s(this,g),e);return i.results==="valid"?(f(this,g,i.settings),!0):!1}getVersion(){return{webSDK:Xe,extractionLib:s(this,he),faceTracker:s(this,me)}}async downloadAssets(){const{assetFolder:e}=s(this,g);try{if(l(this,o,E).call(this,`Asset base URL ${e}`,m.sdk),l(this,o,E).call(this,"Start downloading decompressor...",m.sdk),await s(this,D).fetchAsset(s(this,M),`${e}/`,"decompress.json",!0,"gzip"),s(this,D).canDecompress){await l(this,o,pt).call(this,e),s(this,z)&&await l(this,o,Ke).call(this),l(this,o,E).call(this,"Start downloading TFJS worker...",m.mediaPipe);const i=await s(this,D).fetchAsset(s(this,M),`${e}/`,`facetracker_worker_${this.getVersion().webSDK}_js.json`,!0,"brotli");return i&&(f(this,Ne,i),await l(this,o,Et).call(this,e),await l(this,o,Ve).call(this)),l(this,o,Tt).call(this),!0}}catch{return l(this,o,E).call(this,"Failed to download TFJS face tracker or DFX extraction worker WASM assets",m.mediaPipe),!1}}setExtractionLibSettings(e=6,i=30,a=5){f(this,Q,e-1),f(this,ee,i),f(this,te,a)}async setNextChunkAsFinal(){f(this,fe,!0),await l(this,o,R).call(this,T.SHOULD_END_MEASUREMENT_EARLY,{},!0),l(this,o,E).call(this,"Set the action for the next chunk to LAST::PROCESS",m.extractionLibWasm)}async startTracking(){s(this,_)&&(s(this,_).isExtracting||(s(this,_).setIsExtracting(!0),l(this,o,E).call(this,"Start tracking frames",m.mediaPipe),await l(this,o,R).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,ie)},!0),await l(this,o,xe).call(this)))}async stopTracking(){if(s(this,_)){s(this,_).stopTracking(),await l(this,o,Rt).call(this),s(this,_).setIsExtracting(!1),l(this,o,E).call(this,"Stop extracting frames",m.mediaPipe);const{numOfFramesPresented:e,warmupFrameNumber:i,numOftrackedVideoFrames:a}=s(this,_);l(this,o,E).call(this,"Tracking metrics",m.sdk,{numOfFramesPresented:e,warmupFrameNumber:i,numOftrackedVideoFrames:a}),f(this,F,"")}}async disconnect(){s(this,Z)&&await l(this,o,R).call(this,y.DISCONNECT,{},!0),s(this,g).metrics&&(await l(this,o,R).call(this,T.GET_LOGS,{},!0),s(this,v).retrieveLogs())}async destroy(){s(this,I)&&(s(this,I).destroy(),l(this,o,E).call(this,"Destroyed",m.extractionLibWasm)),s(this,_)&&(s(this,_).destroyWorkers(),l(this,o,E).call(this,"Destroyed",m.mediaPipe))}async reset(){return s(this,ue)===K.READY?(await this.stopTracking(),await this.destroy(),f(this,v,new ot),f(this,he,{version:"",sdkId:""}),f(this,me,""),f(this,q,0),f(this,F,""),f(this,Z,!1),f(this,Q,5),f(this,ee,30),f(this,te,5),f(this,fe,!1),f(this,j,void 0),f(this,ie,1e7),f(this,Ie,0),f(this,se,new Map),f(this,Te,Promise.resolve()),f(this,A,0),f(this,Se,-1),f(this,B,-1),s(this,g).mediaElement.innerHTML="",await l(this,o,Ke).call(this),await l(this,o,Ve).call(this),!0):!1}async setMediaStream(e){if(s(this,_)&&!s(this,_).isExtracting&&s(this,I)){await s(this,_).setMediaStream(e);const i=Object.fromEntries(s(this,_).workers.map((a,c)=>[`port${c+1}`,a.channel.port1]));s(this,I).worker.postMessage({action:T.SET_PORTS,payload:{numOfWorkers:s(this,Ee),workerPorts:i}},[...s(this,_).workers.map(a=>a.channel.port1)])}}async prepare(e,i,a,c){s(this,x).setSession({userToken:e,userRefreshToken:i});const{region:d,status:n}=await l(this,o,Ct).call(this,"user");let r=`api.${d}.deepaffex.ai`;s(this,g).apiUrl?r=s(this,g).apiUrl:s(this,g).apiUrl=r,s(this,x).setUrl(`https://${r}`);const u=await l(this,o,kt).call(this,e,i,"user"),h=await l(this,o,vt).call(this,a,c);return u&&h&&n==="200"}async setConstraintsConfig(e){await l(this,o,R).call(this,T.SET_CONSTRAINTS_CONFIG,{...s(this,De),...e&&{...s(this,g).constraintOverrides}},!0)}async startMeasurement(e=!1,i={}){if(f(this,fe,!1),f(this,F,""),await l(this,o,At).call(this,i),s(this,I)&&s(this,F)!==""){await l(this,o,je).call(this),await l(this,o,R).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,Q)+1},!0),await this.setConstraintsConfig(e),await l(this,o,St).call(this),await l(this,o,xe).call(this);const{userToken:a}=s(this,x).getSession();a?await l(this,o,R).call(this,y.CONNECT,{token:a,measurementId:s(this,F)},!0):l(this,o,E).call(this,"User token is missing. Unable to connect.",m.webSocket)}}setDemographics(e){ni(e)?(f(this,j,e),l(this,o,E).call(this,`Demographics updated ${JSON.stringify(e)}`,m.extractionLibWasm)):l(this,o,E).call(this,`Error updating Demographics ${JSON.stringify(e)}`,m.extractionLibWasm)}setObjectFit(e){return s(this,_)&&ke!==void 0&&Object.values(ke).includes(e)?(s(this,_).settings.objectFit=e,!0):!1}};x=new WeakMap,g=new WeakMap,M=new WeakMap,v=new WeakMap,D=new WeakMap,ve=new WeakMap,Ae=new WeakMap,ye=new WeakMap,Oe=new WeakMap,de=new WeakMap,z=new WeakMap,Ne=new WeakMap,he=new WeakMap,me=new WeakMap,_=new WeakMap,q=new WeakMap,I=new WeakMap,ue=new WeakMap,F=new WeakMap,Le=new WeakMap,Z=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,fe=new WeakMap,Ee=new WeakMap,j=new WeakMap,pe=new WeakMap,De=new WeakMap,ie=new WeakMap,Ie=new WeakMap,se=new WeakMap,Te=new WeakMap,A=new WeakMap,Se=new WeakMap,B=new WeakMap,be=new WeakMap,o=new WeakSet,Et=async function(t){l(this,o,E).call(this,"Start downloading TFJS face tracker assets...",m.mediaPipe);const e=`${t}/models/`,[i,a,c,d]=await Promise.all([s(this,D).fetchAsset(s(this,M),e,"detectorModel_json.json",!0,"brotli"),s(this,D).fetchAsset(s(this,M),e,"detectorModel_bin.json",!0,"brotli"),s(this,D).fetchAsset(s(this,M),e,"landmarkModel_json.json",!0,"brotli"),s(this,D).fetchAsset(s(this,M),e,"landmarkModel_bin.json",!0,"brotli")]);l(this,o,E).call(this,"TFJS face tracker assets successfully downloaded",m.mediaPipe),f(this,ve,i),f(this,Ae,a),f(this,ye,c),f(this,Oe,d)},pt=async function(t){l(this,o,E).call(this,"Start downloading DFX extraction worker assets...",m.extractionLibWasm);const[e,i]=await Promise.all([s(this,D).fetchAsset(s(this,M),`${t}/extraction/`,`extraction_wasm_${this.getVersion().webSDK}.json`,!0,"brotli"),s(this,D).fetchAsset(s(this,M),`${t}/`,`extraction_worker_${this.getVersion().webSDK}_js.json`,!0,"brotli")]);l(this,o,E).call(this,"DFX extraction worker assets successfully downloaded",m.extractionLibWasm),f(this,de,e),f(this,z,i)},Tt=function(){if(s(this,_)){const t=e=>{this.on.mediaElementResize&&this.on.mediaElementResize(e)};s(this,g).mediaElement.addEventListener("mediaElementSizeChanged",t)}},Ve=async function(){s(this,g),l(this,o,ae).call(this,K.NOT_LOADED);const t={faceTrackerCode:s(this,Ne),numOfWorkers:s(this,Ee),mediaElement:s(this,g).mediaElement,mirrorVideo:s(this,g).mirrorVideo,metrics:s(this,g).metrics,displayMediaStream:s(this,g).displayMediaStream,isLoggingFaceTrackerWorkers:s(this,g).logger?.faceTrackerWorkers??!1,isLoggingSdk:s(this,g).logger?.sdk??!1,scaleFactor:s(this,be),models:{detectorJson:s(this,ve),detectorBin:s(this,Ae),landmarkJson:s(this,ye),landmarkBin:s(this,Oe)}};l(this,o,ae).call(this,K.LOADING),f(this,_,await Ti.init(t,s(this,v))),s(this,_).on.faceTrackersReady=(e,i,a,c)=>{l(this,o,E).call(this,`TFJS face tracker version ${i} loaded. Worker name: ${e} - workerId: ${a} - backend: ${c}`,m.mediaPipe),f(this,me,`${i}-${c}`),f(this,q,s(this,q)+1),s(this,v).setVersion(this.getVersion()),s(this,q)===s(this,Ee)&&l(this,o,ae).call(this,K.LOADED)},s(this,_).on.frameAvailable=(e,i,a,c,d)=>{!c&&d?s(this,I).worker.postMessage({action:T.NEW_FRAME,payload:{frameNumber:i,frameTimestamp:e,frame:d,lastFrameNumber:a,tracked:c}},[d]):s(this,I).worker.postMessage({action:T.TRACKING_STATUS,payload:{frameNumber:i,frameTimestamp:e,lastFrameNumber:a,tracked:c}})},s(this,_).on.landmarksAvailable=(e,i,a)=>{const c=a/1e3;s(this,B)===0&&f(this,B,c),f(this,Se,c),s(this,_).numOftrackedVideoFrames+=1;const{starRating:d}=s(this,_),n=30,r=Math.min(s(this,Se)-s(this,B),n),u=s(this,B)>0?r/n*100:0,h={video:s(this,_).videoFpsTracker.fps.toFixed(1),faceTracker:s(this,_).faceTrackerFpsTracker.fps.toFixed(1)},p={face:e,annotations:i,starRating:d,percentCompleted:u,fps:h};this.on.facialLandmarksUpdated&&this.on.facialLandmarksUpdated(p)},s(this,_).on.scaleFactorChanged=e=>{f(this,be,e),s(this,_).scaleFactor=e,s(this,I).worker.postMessage({action:T.SCALE_FACTOR_CHANGED,payload:{scaleFactor:e}})}},Ke=async function(){const t=new TextDecoder().decode(new Uint8Array(s(this,z)));f(this,I,Fe.init(t,"module","EXTRACTION_WORKER"));const{studyCfgData:e}=s(this,x).getSession();e&&s(this,de)&&s(this,z)&&(s(this,I).worker.onmessage=async i=>{const{data:a}=i,{id:c,result:d}=a,{action:n,payload:r}=d,u=s(this,se).get(c);if(u||c===-1){switch(n){case T.READY:{const{sdkId:h,version:p,workerName:S}=r;f(this,he,{version:p,sdkId:h}),l(this,o,E).call(this,`DFX extraction worker WASM loaded. SDK ID: ${h} - Version: ${p} - Worker Name: ${S}`,m.extractionLibWasm),await l(this,o,R).call(this,T.SET_MODE,{value:"discrete"},!0),await l(this,o,R).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,ie)},!0),await l(this,o,R).call(this,T.SET_TARGET_FPS,{value:s(this,ee)},!0),await l(this,o,R).call(this,T.SET_CHUNK_DURATION_SECONDS,{value:s(this,te)},!0),await l(this,o,R).call(this,T.SET_FRAME_ORDER,{value:lt.RGBA},!0),await l(this,o,R).call(this,T.GET_CONSTRAINTS_CONFIG,{},!0),f(this,De,s(this,pe));break}case T.SET_MODE:{r&&l(this,o,E).call(this,`Set mode to ${r.mode}`,m.extractionLibWasm);break}case T.SET_NUMBER_OF_CHUNKS:{r&&l(this,o,E).call(this,`Set number of chunks to ${d.number}`,m.extractionLibWasm);break}case T.SET_TARGET_FPS:{r&&l(this,o,E).call(this,`Set target FPS to ${s(this,ee)}`,m.extractionLibWasm);break}case T.SET_CHUNK_DURATION_SECONDS:{r&&l(this,o,E).call(this,`Set chunk duration to ${s(this,te)} Seconds`,m.extractionLibWasm);break}case T.SET_FRAME_ORDER:{r&&l(this,o,E).call(this,"Set channel order RGBA",m.extractionLibWasm);break}case T.GET_CONSTRAINTS_CONFIG:{r&&(f(this,pe,r),l(this,o,E).call(this,`Get constraints ${JSON.stringify(r)}`,m.extractionLibWasm));break}case T.SET_CONSTRAINTS_CONFIG:{r&&(f(this,pe,r),l(this,o,E).call(this,`Set constraints ${JSON.stringify(r)}`,m.extractionLibWasm));break}case T.SET_FACE_ATTRIBUTE:{const{success:h,faceId:p,attribute:S,value:C}=r;h&&l(this,o,E).call(this,`Set face attribute: faceId: ${p}, attribute: ${S}, value: ${C}`,m.extractionLibWasm);break}case T.RESET_COLLECTION:{r&&l(this,o,E).call(this,"Reset collection",m.extractionLibWasm);break}case T.CANCEL_COLLECTION:{r&&l(this,o,E).call(this,"Collecttion cancelled",m.extractionLibWasm);break}case T.START_COLLECTION:{r&&l(this,o,E).call(this,`Collector started - state: ${r}`,m.extractionLibWasm);break}case T.SET_PORTS:{r&&l(this,o,E).call(this,"Ports set",m.extractionLibWasm);break}case T.COLLECTOR_ERROR:{if(r){const{error:h,frameNumber:p}=r;l(this,o,E).call(this,`Collector error on frame ${p}: ${h}`,m.extractionLibWasm),this.on.error&&this.on.error(Ce.COLLECTOR,r),await this.stopTracking()}break}case T.STAR_RATING:{s(this,_).starRating=r.rating;break}case T.ALL_FACE_TRACKERS_WARMED_UP:{const{frameNumber:h}=d;s(this,_).warmupFrameNumber=h,l(this,o,E).call(this,"All face tracker workers are warmed up.",m.mediaPipe),l(this,o,ae).call(this,K.READY);break}case T.CONSTRAINTS_UPDATED:{const{feedback:h,status:p}=r;this.on.constraintsUpdated&&this.on.constraintsUpdated(h,p);break}case T.SHOULD_END_MEASUREMENT_EARLY:{const{currentFinalChunkNumber:h,currentResultsOrder:p,newFinalChunkNumber:S}=d;l(this,o,E).call(this,`Request the end measurement early. Current final chunk number: ${h}, Current results order: ${p}, New final chunk number: ${S}`,m.extractionLibWasm);break}case T.GET_LOGS:{console.log(`DFX Log: ${r}`);break}case y.CONNECT:{f(this,Z,!0),f(this,B,0),l(this,o,E).call(this,r?"Connected":"Connection error",m.webSocket);break}case y.LOGIN_WITH_TOKEN_SUCCESS:{l(this,o,E).call(this,"Successfully logged in with token",m.webSocket);break}case y.SUBSCRIBED_TO_RESULTS:{l(this,o,E).call(this,"Subscribed to the results",m.webSocket);break}case y.CHUNK_SENT:{l(this,o,E).call(this,`Chunk sent ${JSON.stringify(r)}`,m.webSocket),this.on.chunkSent&&this.on.chunkSent(r);break}case y.DISCONNECT:{f(this,Z,!1),l(this,o,E).call(this,"Disconnect",m.webSocket);break}case y.DISCONNECTED:{l(this,o,E).call(this,`Disconnected! - code: ${r.code}, reason: ${r.reason}, wasClean: ${r.wasClean}`,m.webSocket),this.on.error&&this.on.error(Ce.WEB_SOCKET,r);break}case y.CHUNK_ACKNOWLEDGED:{l(this,o,E).call(this,`Chunk number ${r.chunkOrder} received by the server!`,m.webSocket),s(this,Q)===r.chunkOrder&&await this.stopTracking();break}case y.RESULTS_RECEIVED:{const{resultsOrder:h,finalChunkNumber:p}=r;this.on.resultsReceived&&this.on.resultsReceived(r),l(this,o,E).call(this,`Results received: ${JSON.stringify(r)}`,m.webSocket),h===p&&(await l(this,o,R).call(this,y.DISCONNECT,{},!0),await l(this,o,je).call(this),await l(this,o,xe).call(this));break}case y.NETWORK_DELAY:{const{delay:h,description:p,actionId:S}=r;l(this,o,E).call(this,`Round-trip delay for ${p} call with Action ID ${S} was ${h.toFixed(2)} ms`,m.webSocket,{delay:h,actionId:S,description:p});break}case y.ERROR:{l(this,o,E).call(this,"Error",m.webSocket),this.on.error&&this.on.error(Ce.WEB_SOCKET,r);break}}u&&(u.resolve(d),s(this,se).delete(c))}},await l(this,o,R).call(this,T.INIT,{wasm:s(this,de),studyConfigData:e,isLogging:s(this,g).logger?.extractionWorker||!1,metrics:s(this,g).metrics||!1,apiUrl:s(this,g).apiUrl,scaleFactor:s(this,be)},!0))},St=async function(){if(s(this,_)&&s(this,j)){const{age:e,height:i,weight:a,sex:c,smoking:d,bloodPressureMedication:n,diabetes:r}=s(this,j);await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.SEX_ASSIGNED_AT_BIRTH,value:c},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.AGE_YEARS,value:e},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.HEIGHT_CM,value:i},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.WEIGHT_KG,value:a},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.SMOKER,value:d},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.BLOOD_PRESSURE_MEDICATION,value:n},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.DIABETES,value:r},!0),l(this,o,E).call(this,`Set demographics for Face ID 1, ${JSON.stringify(s(this,j))}`,m.extractionLibWasm)}},bt=function(){},_t=function(){const t=new Date().toISOString();at(t)&&(l(this,o,E).call(this,`Action ID: ${s(this,A)}`,m.beforeRESTCall),this.on.beforeRESTCall&&this.on.beforeRESTCall(t,s(this,A)))},gt=function(t,e){},wt=function(t,e){const i=new Date().toISOString();at(i)&&(l(this,o,E).call(this,`Action ID: ${s(this,A)}, HTTP status code: ${t}, error: ${JSON.stringify(e)}`,m.afterRESTCall),this.on.afterRESTCall&&this.on.afterRESTCall(i,s(this,A),t,e))},Rt=async function(){await l(this,o,R).call(this,T.CANCEL_COLLECTION,{},!0)},xe=async function(){await l(this,o,R).call(this,T.START_COLLECTION,{},!0)},je=async function(){await l(this,o,R).call(this,T.RESET_COLLECTION,{},!0),await l(this,o,R).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,ie)},!0)},E=function(t,e,i){s(this,g).metrics&&s(this,v).log(t,e,"",!0,i),s(this,g).logger?.mediaPipe&&e===m.mediaPipe&&s(this,v).info(t,e),s(this,g).logger?.beforeRESTCall&&e===m.beforeRESTCall&&s(this,v).info(t,e),s(this,g).logger?.afterRESTCall&&e===m.afterRESTCall&&s(this,v).info(t,e),s(this,g).logger?.extractionLibWasm&&e===m.extractionLibWasm&&s(this,v).info(t,e),s(this,g).logger?.apiClient&&e===m.apiClient&&s(this,v).info(t,e),s(this,g).logger?.webSocket&&e===m.webSocket&&s(this,v).info(t,e),s(this,g).logger?.sdk&&e===m.sdk&&s(this,v).info(t,e)},Ct=async function(t){f(this,A,0);const e=performance.now(),i=await s(this,x).http.auths.validate(t),a=performance.now()-e,{status:c,body:d}=i;if(l(this,o,E).call(this,c==="200"?"Successfully validated the Token":`Failed to validate token. Status: ${c}`,m.apiClient,{delay:a,actionId:s(this,A),description:"Validate Token"}),c==="200"){const{Region:n}=d;return{region:n,status:c}}else return{status:c,region:""}},kt=async function(t,e,i){f(this,A,2304);const a=performance.now(),c=await s(this,x).http.auths.renew({Token:t,RefreshToken:e},i),d=performance.now()-a,{status:n}=c;return l(this,o,E).call(this,n==="200"?"Successfully refreshed the Token":`Failed to refresh token. Status: ${n}`,m.apiClient,{delay:d,actionId:s(this,A),description:"Refresh Token"}),n==="200"},vt=async function(t,e){f(this,A,806);const i=performance.now();f(this,Le,t);const a=await s(this,x).http.studies.retrieveSdkConfigData({StudyID:t,...e&&{sdkId:e}},"user"),c=performance.now()-i,{status:d}=a;return l(this,o,E).call(this,d==="200"?"Retrieve SDK Config Data - success":"Retrieve SDK Config Data - failure",m.apiClient,{delay:c,actionId:s(this,A),description:"Retrieve SDK Config Data"}),d==="200"},At=async function(t){l(this,o,E).call(this,"Get Measurement ID",m.apiClient),f(this,A,504);const e=performance.now(),i={StudyID:s(this,Le),Resolution:100};t.partnerId&&(i.PartnerID=t.partnerId),t.userProfileId&&(i.UserProfileID=t.userProfileId);const a=await s(this,x).http.measurements.create(i,"user"),c=performance.now()-e,{status:d,body:n}=a;let r="";d==="200"?(f(this,F,n.ID),r=`Successfully obtained measurement ID: ${s(this,F)}`):(f(this,F,""),r=`Failed to obtain measurement ID. Status: ${d}`),l(this,o,E).call(this,r,m.apiClient,{delay:c,actionId:s(this,A),measurementId:s(this,F),description:"Get Measurement ID"})},ae=function(t){f(this,ue,t),l(this,o,E).call(this,`Face tracker state changed: ${t}`,m.mediaPipe),this.on.faceTrackerStateChanged&&this.on.faceTrackerStateChanged(s(this,ue))},R=function(t,e,i=!1){return new Promise(a=>{const c=_i(this,Ie)._++;s(this,se).set(c,{resolve:a,action:t});const d=()=>s(this,I).worker.postMessage({id:c,action:t,payload:e});i?f(this,Te,s(this,Te).then(d).catch(n=>console.error(n))):d()})},ft(gi,"VERSION",Xe);class wi{static VERSION=Lt;#e=document.createElement("div");#i=document.createElement("div");#s=!1;on={results:null,error:null,event:null};constructor(){this.#e.style.height="100%"}async init(e){const{container:i,appPath:a,settings:c,profile:d,config:n,language:r,apiUrl:u}=e;return this.#i=i,new Promise((h,p)=>{const S=i.attachShadow({mode:"open"}),C="app",k=document.createElement("link");k.rel="stylesheet",k.href=`${a}/stylex.css`,S.appendChild(k);const O=document.createElement("link");O.rel="stylesheet",O.href=`${a}/${C}.css`,S.appendChild(O);const P=W=>{this.on.results&&this.on.results({...W.detail})},G=W=>{this.on.error&&this.on.error({...W.detail})},re=W=>{this.on.event&&this.on.event({...W.detail})};this.#e.addEventListener(U.RESULTS,P),this.#e.addEventListener(U.ERROR,G),this.#e.addEventListener(U.APPEVENT,re),S.appendChild(this.#e);const Y=document.createElement("script");Y.type="module",Y.src=`${a}/${C}.mjs`,Y.onload=()=>{import(Y.src).then(W=>{W.app.init(this.#e,a,c,d,u,n,r),this.#s=!0,h()}).catch(W=>{p(new Error("Failed to initialize Measurement Embedded React app: "+W.message))})},Y.onerror=()=>{p(new Error("Failed to load the measurement embedded app script"))},S.appendChild(Y)})}#t(){if(!this.#s)throw new Error("MeasurementEmbeddedApp is not initialized. Call init() before using this method.")}async destroy(){return this.#t(),new Promise(e=>{const i=c=>{if(this.#e.removeEventListener(U.DESTROYED,i),this.#i){const d=this.#i.cloneNode(!1);this.#i.replaceWith(d)}e()};this.#e.addEventListener(U.DESTROYED,i);const a=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.DESTROY,data:{}}});this.#e.dispatchEvent(a)})}setTheme(e){this.#t();const i=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.SET_THEME,data:{theme:e}}});this.#e.dispatchEvent(i)}setLanguage(e){this.#t();const i=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.SET_LANGUAGE,data:{language:e}}});this.#e.dispatchEvent(i)}async cancel(e){return this.#t(),new Promise(i=>{const a=d=>{this.#e.removeEventListener(U.CANCELLED,a),i(d.detail.reset)};this.#e.addEventListener(U.CANCELLED,a);const c=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.CANCEL,data:{reset:e}}});this.#e.dispatchEvent(c)})}getLogs(){return this.#t(),new Promise(e=>{const i=c=>{this.#e.removeEventListener(U.LOGS,i),e(c.detail.logs)};this.#e.addEventListener(U.LOGS,i);const a=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.GET_LOGS,data:{}}});this.#e.dispatchEvent(a)})}}export{Je as ErrorCodes,Dt as appEvents,wi as default,hi as faceAttributeValue,Ye as logCategory};
|
|
739
|
+
`}openLogInNewWindow(){const e=this.generateHTMLTable(),i=new Blob([e],{type:"text/html"}),a=URL.createObjectURL(i);window.open(a,"_blank")}}var Zt=Object.defineProperty,Qt=(t,e,i)=>e in t?Zt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Re=(t,e,i)=>Qt(t,typeof e!="symbol"?e+"":e,i);class Fe{constructor(e,i){Re(this,"workerUrl"),Re(this,"worker"),this.worker=e,this.workerUrl=i}static init(e,i,a){const c=new Blob([e],{type:"application/javascript"}),d=URL.createObjectURL(c),n=a||`WORKER${String(new Date().getTime())}`,r=new Worker(new URL(d,import.meta.url),{name:n,type:i});return new Fe(r,d)}destroy(){this.worker&&(this.worker.terminate(),URL.revokeObjectURL(this.worker))}}const ei=(t,e,i,a)=>{const c=t/e,d=i/a;let n=0,r=0;c>d?(n=t,r=t/d):(r=e,n=e*d);const u=(t-n)/2,h=(e-r)/2;return{width:n||0,height:r||0,offsetX:u||0,offsetY:h||0}},ti=(t,e,i,a)=>{const c=(t-i)/2,d=(e-a)/2;return{width:i||0,height:a||0,offsetX:c||0,offsetY:d||0}},ii=(t,e,i,a)=>{const c=t/e,d=i/a;let n=0,r=0;c>d?(r=e,n=e*d):(n=t,r=t/d);const u=(t-n)/2,h=(e-r)/2;return{width:n||0,height:r||0,offsetX:u||0,offsetY:h||0}},si=(t,e)=>{switch(t){case"none":return ti(...e);case"cover":return ei(...e);case"contain":default:return ii(...e)}},at=t=>/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(t),ai=t=>t===void 0?!0:!(typeof t.mediaPipe<"u"&&typeof t.mediaPipe!="boolean"||typeof t.beforeRESTCall<"u"&&typeof t.beforeRESTCall!="boolean"||typeof t.afterRESTCall<"u"&&typeof t.afterRESTCall!="boolean"||typeof t.extractionLibWasm<"u"&&typeof t.extractionLibWasm!="boolean"||typeof t.apiClient<"u"&&typeof t.apiClient!="boolean"||typeof t.extractionWorker<"u"&&typeof t.extractionWorker!="boolean"||typeof t.faceTrackerWorkers<"u"&&typeof t.faceTrackerWorkers!="boolean"||typeof t.sdk<"u"&&typeof t.sdk!="boolean"),ri=(t,e)=>{const i={...t};if(e.logger)if(ai(e.logger))i.logger={...i.logger,...e.logger};else return{results:"invalid"};if(e.apiUrl!==void 0)if(typeof e.apiUrl=="string")i.apiUrl=e.apiUrl;else return{results:"invalid"};if(e.metrics!==void 0)if(typeof e.metrics=="boolean")i.metrics=e.metrics;else return{results:"invalid"};if(e.mirrorVideo!==void 0)if(typeof e.mirrorVideo=="boolean")i.mirrorVideo=e.mirrorVideo;else return{results:"invalid"};if(e.displayMediaStream!==void 0)if(typeof e.displayMediaStream=="boolean")i.displayMediaStream=e.displayMediaStream;else return{results:"invalid"};if(e.assetFolder!==void 0)if(typeof e.assetFolder=="string")i.assetFolder=e.assetFolder;else return{results:"invalid"};if(e.mediaElement!==void 0)if(e.mediaElement instanceof HTMLDivElement)i.mediaElement=e.mediaElement;else return{results:"invalid"};if(e.constraintOverrides!==void 0){let a=function(n,r){if(!(n in d))return!1;const u=d[n];return typeof r===u};const d=Object.fromEntries(Object.entries({backLightMaxPixels_pct:30,backLightSearchMult:1.5,backLightThresh:240,boxCenterX_pct:50,boxCenterY_pct:50,boxHeight_pct:99,boxWidth_pct:50,cameraRot_chunkThresh:.7853981633974483,cameraRot_windowThresh:.2617993877991494,checkBackLight:!1,checkCameraMovement:!1,checkCentered:!1,checkDistance:!1,checkEyebrowMovement:!1,checkFaceDirection:!1,checkLighting:!1,checkMaxDistance:!1,checkMinFps:!1,checkMovement:!1,chunkMovementThresh_pct:60,enableDebugLog:!1,enableFigures:!1,faceRotLR_thresh:.33,faceRotUD_lowerthresh:.25,faceRotUD_upperThresh:5,hy_faceRotLR_thresh:.05,hy_maxFaceRotLR_deg:2,hy_maxFaceRotUD_deg:2,hy_minInterPupilDist_px:5,hy_minimumFps:1,maxEyebrowMovement_mm:3,maxFaceRotLR_deg:12.5,maxFaceRotUD_deg:25,maxMovement_mm:10,minInterPupilDist_px:100,minimumFps:26,movementWindow_ms:2e3,threshBright:225,threshDark:48}).map(([n,r])=>[n,typeof r]));for(const n in e.constraintOverrides){const r=e.constraintOverrides[n];if(!a(n,r))return{results:"invalid"}}i.constraintOverrides=e.constraintOverrides}return{results:"valid",settings:i}},ni=t=>typeof t.age!="number"||t.age<13||t.age>120?(console.error("Invalid age. It should be a number between 13 and 120."),!1):typeof t.height!="number"||t.height<120||t.height>220?(console.error("Invalid height. It should be a number between 120 and 220."),!1):typeof t.weight!="number"||t.weight<30||t.weight>300?(console.error("Invalid weight. It should be a number between 30 and 300."),!1):typeof t.sex!="number"||t.sex<1||t.sex>3?(console.error("Invalid sex. It should be a number between 1 and 3."),!1):typeof t.diabetes!="number"||t.diabetes<4||t.diabetes>6?(console.error("Invalid diabetes. It should be a number between 4 and 6."),!1):typeof t.bloodPressureMedication!="number"||t.bloodPressureMedication!==0&&t.bloodPressureMedication!==1?(console.error("Invalid bloodPressureMedication. It should be either 0 or 1."),!1):typeof t.smoking!="number"||t.smoking!==0&&t.smoking!==1?(console.error("Invalid smoking. It should be either 0 or 1."),!1):!0;var m=(t=>(t.beforeRESTCall="Before REST call event",t.afterRESTCall="After REST call event",t.mediaPipe="MediaPipe",t.extractionLibWasm="DFX Extraction lib WASM",t.apiClient="DFX API client",t.webSocket="WebSocket",t.sdk="SDK",t.dfxWorker="DFX Worker",t))(m||{});const oi=t=>{switch(t){case"Before REST call event":return"red";case"After REST call event":return"orange";case"MediaPipe":return"green";case"DFX Extraction lib WASM":return"violet";case"DFX API client":return"#d34110";case"WebSocket":return"#d34110";case"SDK":return"#d34110";case"DFX Worker":return"#ad4393";default:return"black"}};class rt{constructor(e=1e3){Re(this,"timestamps",[]),Re(this,"windowMs"),this.windowMs=e}tick(e=performance.now()){for(this.timestamps.push(e);this.timestamps.length>0&&e-this.timestamps[0]>this.windowMs;)this.timestamps.shift()}get fps(){const e=this.timestamps.length,i=this.timestamps.at(-1)-this.timestamps[0]||1;return e/i*1e3}get frameCount(){return this.timestamps.length}reset(){this.timestamps=[]}}var li=Object.defineProperty,ci=(t,e,i)=>e in t?li(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,nt=(t,e,i)=>ci(t,typeof e!="symbol"?e+"":e,i);const di=()=>{const t=new Date,e=(t.getMonth()+1).toString().padStart(2,"0"),i=t.getDate().toString().padStart(2,"0"),a=t.getFullYear();let c=t.getHours();const d=t.getMinutes().toString().padStart(2,"0"),n=t.getSeconds().toString().padStart(2,"0"),r=t.getMilliseconds().toString().padStart(3,"0"),u=c>=12?"PM":"AM";return c=c%12||12,`[${e}/${i}/${a}, ${c}:${d}:${n}.${r} ${u}]`};class ot{constructor(){nt(this,"mertics",new qt),nt(this,"version",{webSDK:"",extractionLib:{version:"",sdkId:""},faceTracker:""})}retrieveLogs(){this.mertics.transferLogs(),this.mertics.openLogInNewWindow(),this.mertics.debugLogs=[]}setVersion(e){this.version=e,this.mertics.version=e}log(e,i,a,c=!1,d={}){const n=di();if(c)this.mertics.appendLog({thread:"Main",timestamp:n,category:i,message:e,meta:d});else{const r=`[${i}]`,u=" ",h=e,p=`color:${a}; font-weight:800;`,S=`color:${oi(i)}; font-weight:700;`;console.log("%c%s%c%s%c%s%c%s",p,n,S,r,"background:inherit;",u,"font-style: italic;",h)}}info(e,i){this.log(e,i,"blue")}warn(e,i){this.log(e,i,"orange")}error(e,i){this.log(e,i,"red")}debug(e,i){this.log(e,i,"green")}start(){console.log("%c%s","color: #5e5e5e; background-color: #2d2d2d; letter-spacing: 0.1em; text-shadow: -1px -1px 1px #111, 2px 2px 1px #363636; font-size: 36px; padding: 20px 40px; text-align: center; text-transform: uppercase; text-rendering: optimizeLegibility;","Anura Web Core SDK"),console.log(`Version: ${this.version.webSDK}`),console.log("https://www.deepaffex.ai")}}const hi={SEX_NOT_PROVIDED:1,SEX_ASSIGNED_MALE_AT_BIRTH:2,SEX_ASSIGNED_FEMALE_AT_BIRTH:3,DIABETES_NONE:4,DIABETES_TYPE1:5,DIABETES_TYPE2:6,SMOKER_TRUE:0,SMOKER_FALSE:1,BLOOD_PRESSURE_MEDICATION_TRUE:1,BLOOD_PRESSURE_MEDICATION_FALSE:0},V={SEX_ASSIGNED_AT_BIRTH:1,AGE_YEARS:2,HEIGHT_CM:3,WEIGHT_KG:4,SMOKER:5,BLOOD_PRESSURE_MEDICATION:7,DIABETES:8};var lt=(t=>(t[t.BGR=1]="BGR",t[t.RGB=2]="RGB",t[t.BGRA=3]="BGRA",t[t.RGBA=4]="RGBA",t[t.Infrared=5]="Infrared",t[t.Infrared888=6]="Infrared888",t[t.BGR_Infrared=7]="BGR_Infrared",t[t.RGB_Infrared=8]="RGB_Infrared",t[t.Gray=9]="Gray",t))(lt||{});const K={ASSETS_NOT_DOWNLOADED:"ASSETS_NOT_DOWNLOADED",NOT_LOADED:"NOT_LOADED",LOADING:"LOADING",LOADED:"LOADED",READY:"READY"},Ce={COLLECTOR:"COLLECTOR",ASSET_DOWNLOAD:"ASSET_DOWNLOAD",WEB_SOCKET:"WEB_SOCKET"},ke={CONTAIN:"contain",COVER:"cover",NONE:"none"};var $=(t=>(t.INIT="INIT",t.READY="READY",t.INIT_TFJS="INIT_TFJS",t.SET_PORT="SET_PORT",t.TRACK="TRACK",t.RESULTS_READY="RESULTS_READY",t.WARM_UP="WARM_UP",t.DESTROY="DESTROY",t.LANDMARKS="LANDMARKS",t.VIDEO_FRAME="VIDEO_FRAME",t.SCALE_FACTOR_CHANGED="SCALE_FACTOR_CHANGED",t))($||{}),mi=Object.defineProperty,ct=t=>{throw TypeError(t)},ui=(t,e,i)=>e in t?mi(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,w=(t,e,i)=>ui(t,typeof e!="symbol"?e+"":e,i),Be=(t,e,i)=>e.has(t)||ct("Cannot "+i),dt=(t,e,i)=>(Be(t,e,"read from private field"),i?i.call(t):e.get(t)),ht=(t,e,i)=>e.has(t)?ct("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),fi=(t,e,i,a)=>(Be(t,e,"write to private field"),e.set(t,i),i),Ei=(t,e,i)=>(Be(t,e,"access private method"),i),ce,Ge,mt;const pi=class Ot{constructor(e,i,a){ht(this,Ge),ht(this,ce),w(this,"mediaElement"),w(this,"numOfFramesPresented",0),w(this,"workers",[]),w(this,"numOftrackedVideoFrames",0),w(this,"warmupFrameNumber",0),w(this,"videoCallbackId",0),w(this,"numOfWorkers",4),w(this,"isLoggingFaceTrackerWorkers",!1),w(this,"isLoggingSdk",!1),w(this,"workerIndex",0),w(this,"metrics",!1),w(this,"videoFpsTracker",new rt(1e3)),w(this,"faceTrackerFpsTracker",new rt(1e3)),w(this,"videoElementSize",{width:0,height:0,offsetX:0,offsetY:0}),w(this,"videoElement",document.createElement("video")),w(this,"frameWidth",0),w(this,"frameHeight",0),w(this,"mirrorVideo",!0),w(this,"settings",{faceTrackerWidth:0,faceTrackerHeight:0,displayMediaStream:!0,objectFit:ke.COVER}),w(this,"isExtracting",!1),w(this,"starRating",0),w(this,"scaleFactor",1),w(this,"warmupIndex",0),w(this,"warmingUp",!0),w(this,"ftWorkerIndex",0),w(this,"lastFrameNumber",-1),w(this,"on",{faceTrackersReady:null,frameAvailable:null,landmarksAvailable:null,scaleFactorChanged:null});const{mediaElement:c,mirrorVideo:d,numOfWorkers:n,isLoggingFaceTrackerWorkers:r,isLoggingSdk:u,metrics:h,displayMediaStream:p}=i;this.numOfWorkers=n,this.isLoggingFaceTrackerWorkers=r,this.isLoggingSdk=u,this.metrics=h,fi(this,ce,a),this.settings.displayMediaStream=p,this.mirrorVideo=d,this.mediaElement=c,this.videoFrameCallback=this.videoFrameCallback.bind(this),this.workers=e,this.scaleFactor=i.scaleFactor,this.initWorkerOnMessage(i.models),this.videoElement.muted=!0,this.videoElement.playsInline=!0,this.videoElement.preload="auto"}static async init(e,i){const{numOfWorkers:a,faceTrackerCode:c}=e,d=[],n=new TextDecoder().decode(new Uint8Array(c));if(a>0)for(let r=1;r<=a;r+=1){const u=Fe.init(n,"module",`FACE_TRACKER_WORKER_${r-1}`);d.push({ft:u,channel:new MessageChannel,isBusy:!1})}return new Ot(d,e,i)}initWorkerOnMessage(e){const i=window.matchMedia("(orientation: portrait)").matches,a=i?360:640,c=i?640:360;this.workers.forEach(d=>{d.ft.worker.postMessage({action:$.INIT_TFJS,payload:{width:a,height:c,models:e,scaleFactor:this.scaleFactor}}),d.ft.worker.postMessage({action:$.SET_PORT,payload:{port:d.channel.port2}},[d.channel.port2]),d.ft.worker.onmessage=n=>{const{action:r,payload:u}=n.data;switch(r){case $.INIT_TFJS:break;case $.READY:{const{workerName:h,version:p,workerId:S,backend:C}=u;this.on.faceTrackersReady&&this.on.faceTrackersReady(h,p,S,C);break}case $.LANDMARKS:{this.faceTrackerFpsTracker.tick(),d.isBusy=!1,this.warmingUp&&this.warmupIndex++;const{face:h,annotations:p,frameTimestamp:S}=u;this.on.landmarksAvailable&&this.on.landmarksAvailable(h,p,S);break}case $.DESTROY:{const{workerId:h}=u;this.workers[h].ft.destroy();break}}}})}getMediaElement(){return this.mediaElement}setIsExtracting(e){this.isExtracting=e}destroyWorkers(){setTimeout(async()=>{this.videoCallbackId&&this.videoElement.cancelVideoFrameCallback(this.videoCallbackId),this.workers.forEach(e=>e.ft.worker.postMessage({action:$.DESTROY}))},200)}createMediaElements(){this.videoElement.addEventListener("ended",async()=>{this.destroyWorkers()});const e=document.createElement("div"),i=this.settings.displayMediaStream?this.videoElement:e,a="white";this.mediaElement.appendChild(i),i.style.width="100%",i.style.height="100%",i.style.boxSizing="border-box",this.settings.displayMediaStream&&(i.style.border=`1px solid ${a}`),i.style.objectFit=this.settings.objectFit,i.style.transform=`scale(${this.mirrorVideo?"-1":"1"},1)`,this.settings.displayMediaStream||(i.style.height=`${this.frameHeight}px`,i.style.width=`${this.frameWidth}px`),new ResizeObserver(d=>{const{contentRect:n,target:r}=d[0],{width:u,height:h}=n,{x:p,y:S}=r.getBoundingClientRect(),{faceTrackerWidth:C,faceTrackerHeight:k}=this.settings;this.videoElementSize=si(this.settings.objectFit,[u,h,this.frameWidth,this.frameHeight]);const{width:O,height:P}=this.videoElementSize;if(!this.settings.displayMediaStream){const G=this.settings.objectFit===ke.NONE;i.style.height=`${Math.trunc(G?P:h)}px`,i.style.width=`${Math.trunc(G?O:u)}px`}this.mediaElement.dispatchEvent(new CustomEvent("mediaElementSizeChanged",{detail:{mediaElementSize:{width:u,height:h,x:p,y:S},videoElementSize:this.videoElementSize,frameInfo:{mediaStreamWidth:this.frameWidth,mediaStreamHeight:this.frameHeight,faceTrackerWidth:C,faceTrackerHeight:k},isPortrait:h>u,aspectRatio:u/h}}))}).observe(this.mediaElement)}log(e,i,a){this.isLoggingSdk&&dt(this,ce).info(e,i),this.metrics&&dt(this,ce).log(e,i,"",!0,a)}videoFrameCallback(e,i){const{presentedFrames:a,captureTime:c,expectedDisplayTime:d,mediaTime:n}=i;this.videoFpsTracker.tick();const r=c===void 0?d:c;this.numOfFramesPresented=a;const u=`Number of frames presented: ${this.numOfFramesPresented} - time: ${r}`;let h=0;if(n&&n>0?h=n*1e3:c&&c>0?h=c>1e6?c-performance.timeOrigin:c:h=e,this.log(u,m.sdk,{captureTime:r,presentedFrames:a}),this.warmingUp)if(this.warmupIndex>=this.numOfWorkers)this.warmingUp=!1;else{const p=this.workers[this.warmupIndex];if(!p.isBusy){p.isBusy=!0;const S=new VideoFrame(this.videoElement,{timestamp:h});p.ft.worker.postMessage({action:"TRACK",payload:{frame:S,frameTimestamp:h,frameNumber:this.numOfFramesPresented}},[S])}}if(!this.warmingUp){const p=new VideoFrame(this.videoElement,{timestamp:h});let S=!1;for(let C=0;C<this.numOfWorkers;C++){this.ftWorkerIndex=(this.ftWorkerIndex+1)%this.numOfWorkers;const k=this.workers[this.ftWorkerIndex];if(k&&!k.isBusy){k.isBusy=!0,this.on.frameAvailable(h,this.numOfFramesPresented,this.lastFrameNumber,!0),k.ft.worker.postMessage({action:"TRACK",payload:{frame:p,frameTimestamp:h,frameNumber:this.numOfFramesPresented}},[p]),S=!0;break}}S||this.on.frameAvailable(h,this.numOfFramesPresented,this.lastFrameNumber,!1,p)}this.lastFrameNumber=this.numOfFramesPresented,this.videoCallbackId=this.videoElement.requestVideoFrameCallback(this.videoFrameCallback)}setFaceTrackerMediaStreamResolution(e,i){(e<=360||i<=360)&&(this.scaleFactor=1),this.settings.faceTrackerWidth=e*this.scaleFactor,this.settings.faceTrackerHeight=i*this.scaleFactor,this.workers.forEach(a=>a.ft.worker.postMessage({action:$.SCALE_FACTOR_CHANGED,payload:{scaleFactor:this.scaleFactor}})),this.on.scaleFactorChanged&&this.on.scaleFactorChanged(this.scaleFactor)}async setMediaStream(e){if(e instanceof MediaStream)try{const{settings:i,constraints:a}=await Ei(this,Ge,mt).call(this,e,this.videoElement);await this.videoElement.play(),this.settings.displayMediaStream||(this.videoElement.style.visibility="none");const{width:c,height:d}=i;return this.setFaceTrackerMediaStreamResolution(c??0,d??0),this.frameWidth=c||1,this.frameHeight=d||1,this.log(`Face tracker resolution: ${c} x ${d} pixels. Video resolution: ${this.frameWidth} x ${this.frameHeight} pixels`,m.sdk,{ftWidth:c,ftHeight:d,frameWidth:this.frameWidth,frameHeight:this.frameHeight}),this.createMediaElements(),this.videoCallbackId=this.videoElement.requestVideoFrameCallback(this.videoFrameCallback),!0}catch(i){return console.log("Error applying face tracker video track constraints",i),!1}return!1}stopTracking(){this.videoCallbackId&&this.videoElement.cancelVideoFrameCallback(this.videoCallbackId),this.videoElement.pause(),this.videoElement.srcObject=null}};ce=new WeakMap,Ge=new WeakSet,mt=async function(t,e){e.srcObject=t,await new Promise(a=>e.onloadedmetadata=a);const[i]=t.getVideoTracks();return{constraints:i.getConstraints(),settings:i.getSettings()}};let Ti=pi;var T=(t=>(t.INIT="INIT",t.READY="READY",t.SET_MODE="SET_MODE",t.SET_NUMBER_OF_CHUNKS="SET_NUMBER_OF_CHUNKS",t.SET_TARGET_FPS="SET_TARGET_FPS",t.SET_CHUNK_DURATION_SECONDS="SET_CHUNK_DURATION_SECONDS",t.SET_FRAME_ORDER="SET_FRAME_ORDER",t.GET_CONSTRAINTS_CONFIG="GET_CONSTRAINTS_CONFIG",t.SET_CONSTRAINTS_CONFIG="SET_CONSTRAINTS_CONFIG",t.SET_FACE_ATTRIBUTE="SET_FACE_ATTRIBUTE",t.RESET_COLLECTION="RESET_COLLECTION",t.CANCEL_COLLECTION="CANCEL_COLLECTION",t.START_COLLECTION="START_COLLECTION",t.SET_PORTS="SET_PORTS",t.COLLECTOR_ERROR="COLLECTOR_ERROR",t.STAR_RATING="STAR_RATING",t.ALL_FACE_TRACKERS_WARMED_UP="ALL_FACE_TRACKERS_WARMED_UP",t.CONSTRAINTS_UPDATED="CONSTRAINTS_UPDATED",t.SHOULD_END_MEASUREMENT_EARLY="SHOULD_END_MEASUREMENT_EARLY",t.GET_LOGS="GET_LOGS",t.NEW_FRAME="NEW_FRAME",t.TRACKING_STATUS="TRACKING_STATUS",t.SCALE_FACTOR_CHANGED="SCALE_FACTOR_CHANGED",t))(T||{}),y=(t=>(t.CONNECT="CONNECT",t.DISCONNECT="DISCONNECT",t.DISCONNECTED="DISCONNECTED",t.LOGIN_WITH_TOKEN_SUCCESS="LOGIN_WITH_TOKEN_SUCCESS",t.SUBSCRIBED_TO_RESULTS="SUBSCRIBED_TO_RESULTS",t.CHUNK_SENT="CHUNK_SENT",t.RESULTS_RECEIVED="RESULTS_RECEIVED",t.CHUNK_ACKNOWLEDGED="CHUNK_ACKNOWLEDGED",t.ERROR="ERROR",t.NETWORK_DELAY="NETWORK_DELAY",t))(y||{}),Si=Object.defineProperty,ut=t=>{throw TypeError(t)},bi=(t,e,i)=>e in t?Si(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,ft=(t,e,i)=>bi(t,typeof e!="symbol"?e+"":e,i),He=(t,e,i)=>e.has(t)||ut("Cannot "+i),s=(t,e,i)=>(He(t,e,"read from private field"),i?i.call(t):e.get(t)),b=(t,e,i)=>e.has(t)?ut("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),f=(t,e,i,a)=>(He(t,e,"write to private field"),e.set(t,i),i),l=(t,e,i)=>(He(t,e,"access private method"),i),_i=(t,e,i,a)=>({set _(c){f(t,e,c)},get _(){return s(t,e,a)}}),F,g,M,v,D,ve,Ae,ye,Oe,de,z,Ne,he,me,_,q,I,ue,x,Le,Z,Q,ee,te,fe,Ee,j,pe,De,ie,Ie,se,Te,A,Se,B,be,o,Et,pt,Tt,Ve,Ke,St,bt,_t,gt,wt,Rt,xe,je,E,Ct,kt,vt,At,ae,R;const yt=Symbol("instance_creation_key"),gi=class Nt{constructor(e){if(b(this,o),b(this,F),b(this,g,{mediaElement:document.createElement("div"),assetFolder:"",apiUrl:"",metrics:!1,logger:{sdk:!1,mediaPipe:!1,beforeRESTCall:!1,afterRESTCall:!1,extractionLibWasm:!1,apiClient:!1,extractionWorker:!1,faceTrackerWorkers:!1},mirrorVideo:!0,displayMediaStream:!0,constraintOverrides:{}}),b(this,M,[{file:"decompress.json",uncompressedSize:89469},{file:"extraction_worker_0.1.0-beta.3_js.json",uncompressedSize:59816},{file:"facetracker_worker_0.1.0-beta.3_js.json",uncompressedSize:306553},{file:"extraction_wasm_0.1.0-beta.3.json",uncompressedSize:1926126},{file:"detectorModel_json.json",uncompressedSize:4640},{file:"detectorModel_bin.json",uncompressedSize:242046},{file:"landmarkModel_json.json",uncompressedSize:5036},{file:"landmarkModel_bin.json",uncompressedSize:1704814}]),b(this,v,new ot),b(this,D,Jt.init()),b(this,ve),b(this,Ae),b(this,ye),b(this,Oe),b(this,de),b(this,z),b(this,Ne),b(this,he,{version:"",sdkId:""}),b(this,me,""),b(this,_),b(this,q,0),b(this,I),b(this,ue,K.ASSETS_NOT_DOWNLOADED),b(this,x,""),b(this,Le,""),b(this,Z,!1),b(this,Q,5),b(this,ee,30),b(this,te,5),b(this,fe,!1),b(this,Ee,4),b(this,j),b(this,pe),b(this,De),b(this,ie,1e7),b(this,Ie,0),b(this,se,new Map),b(this,Te,Promise.resolve()),b(this,A,0),b(this,Se,-1),b(this,B,-1),b(this,be,.5),ft(this,"on",{beforeRESTCall:null,afterRESTCall:null,bytesDownloaded:null,faceTrackerStateChanged:null,resultsReceived:null,constraintsUpdated:null,mediaElementResize:null,facialLandmarksUpdated:null,chunkSent:null,error:null}),e!==yt)throw new Error("Use await Measurement.init() to create an instance of Measurement class.")}static async init(e){if(!e)throw new Error("Missing `settings` object");const i=new Nt(yt);if(!i.setSettings(e))throw new Error("Invalid settings object");f(i,F,Gt({url:{http:new URL("https://api.deepaffex.ai")},onBeforeRESTCall:()=>{var n,r;l(n=i,o,bt).call(n),l(r=i,o,_t).call(r)},onAfterRESTCall:(n,r)=>{var u,h;l(u=i,o,gt).call(u,n,r),l(h=i,o,wt).call(h,n,r)}}));const c=n=>{var r;const{bytes:u,url:h,uncompressedSize:p,done:S}=n.detail;l(r=i,o,E).call(r,`bytesDownloaded event, ${u}, ${p}, ${h}, ${S}`,m.mediaPipe),i.on.bytesDownloaded&&i.on.bytesDownloaded(u,p,h,S)},d=n=>{var r;const{error:u,url:h}=n.detail;l(r=i,o,E).call(r,`downloadError event, ${h}, ${u}`,m.mediaPipe),i.on.error&&i.on.error(Ce.ASSET_DOWNLOAD,{url:h,error:u})};return s(i,D).addEventListener("downloadedError",d),s(i,D).addEventListener("bytesDownloaded",c),s(i,v).setVersion(i.getVersion()),s(i,g).logger&&Object.values(s(i,g).logger).some(n=>n===!0)&&s(i,v).start(),setTimeout(()=>{var n;l(n=i,o,ae).call(n,K.ASSETS_NOT_DOWNLOADED)},500),new Proxy(i,{get(n,r,u){const h=r;return typeof n[h]=="function"?n[h].bind(n):Reflect.get(n,h,u)},set(n,r,u){return console.log(`Setting property "${String(r)}" to "${u}" is not allowed`),!0}})}loadMask(e){if(s(this,_)){let i=!1;const a=s(this,_).mediaElement.querySelector("svg");a&&(i=!0,s(this,_).mediaElement.removeChild(a)),s(this,_).mediaElement.appendChild(e),i&&(s(this,_).mediaElement.style.setProperty("border","1px solid transparent"),setTimeout(()=>{s(this,_).mediaElement.removeAttribute("style")},100))}}setSettings(e){const i=ri(s(this,g),e);return i.results==="valid"?(f(this,g,i.settings),!0):!1}getVersion(){return{webSDK:Xe,extractionLib:s(this,he),faceTracker:s(this,me)}}async downloadAssets(){const{assetFolder:e}=s(this,g);try{if(l(this,o,E).call(this,`Asset base URL ${e}`,m.sdk),l(this,o,E).call(this,"Start downloading decompressor...",m.sdk),await s(this,D).fetchAsset(s(this,M),`${e}/`,"decompress.json",!0,"gzip"),s(this,D).canDecompress){await l(this,o,pt).call(this,e),s(this,z)&&await l(this,o,Ke).call(this),l(this,o,E).call(this,"Start downloading TFJS worker...",m.mediaPipe);const i=await s(this,D).fetchAsset(s(this,M),`${e}/`,`facetracker_worker_${this.getVersion().webSDK}_js.json`,!0,"brotli");return i&&(f(this,Ne,i),await l(this,o,Et).call(this,e),await l(this,o,Ve).call(this)),l(this,o,Tt).call(this),!0}}catch{return l(this,o,E).call(this,"Failed to download TFJS face tracker or DFX extraction worker WASM assets",m.mediaPipe),!1}}setExtractionLibSettings(e=6,i=30,a=5){f(this,Q,e-1),f(this,ee,i),f(this,te,a)}async setNextChunkAsFinal(){f(this,fe,!0),await l(this,o,R).call(this,T.SHOULD_END_MEASUREMENT_EARLY,{},!0),l(this,o,E).call(this,"Set the action for the next chunk to LAST::PROCESS",m.extractionLibWasm)}async startTracking(){s(this,_)&&(s(this,_).isExtracting||(s(this,_).setIsExtracting(!0),l(this,o,E).call(this,"Start tracking frames",m.mediaPipe),await l(this,o,R).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,ie)},!0),await l(this,o,xe).call(this)))}async stopTracking(){if(s(this,_)){s(this,_).stopTracking(),await l(this,o,Rt).call(this),s(this,_).setIsExtracting(!1),l(this,o,E).call(this,"Stop extracting frames",m.mediaPipe);const{numOfFramesPresented:e,warmupFrameNumber:i,numOftrackedVideoFrames:a}=s(this,_);l(this,o,E).call(this,"Tracking metrics",m.sdk,{numOfFramesPresented:e,warmupFrameNumber:i,numOftrackedVideoFrames:a}),f(this,x,"")}}async disconnect(){s(this,Z)&&await l(this,o,R).call(this,y.DISCONNECT,{},!0),s(this,g).metrics&&(await l(this,o,R).call(this,T.GET_LOGS,{},!0),s(this,v).retrieveLogs())}async destroy(){s(this,I)&&(s(this,I).destroy(),l(this,o,E).call(this,"Destroyed",m.extractionLibWasm)),s(this,_)&&(s(this,_).destroyWorkers(),l(this,o,E).call(this,"Destroyed",m.mediaPipe))}async reset(){return s(this,ue)===K.READY?(await this.stopTracking(),await this.destroy(),f(this,v,new ot),f(this,he,{version:"",sdkId:""}),f(this,me,""),f(this,q,0),f(this,x,""),f(this,Z,!1),f(this,Q,5),f(this,ee,30),f(this,te,5),f(this,fe,!1),f(this,j,void 0),f(this,ie,1e7),f(this,Ie,0),f(this,se,new Map),f(this,Te,Promise.resolve()),f(this,A,0),f(this,Se,-1),f(this,B,-1),s(this,g).mediaElement.innerHTML="",await l(this,o,Ke).call(this),await l(this,o,Ve).call(this),!0):!1}async setMediaStream(e){if(s(this,_)&&!s(this,_).isExtracting&&s(this,I)){await s(this,_).setMediaStream(e);const i=Object.fromEntries(s(this,_).workers.map((a,c)=>[`port${c+1}`,a.channel.port1]));s(this,I).worker.postMessage({action:T.SET_PORTS,payload:{numOfWorkers:s(this,Ee),workerPorts:i}},[...s(this,_).workers.map(a=>a.channel.port1)])}}async prepare(e,i,a,c){s(this,F).setSession({userToken:e,userRefreshToken:i});const{region:d,status:n}=await l(this,o,Ct).call(this,"user");let r=`api.${d}.deepaffex.ai`;s(this,g).apiUrl?r=s(this,g).apiUrl:s(this,g).apiUrl=r,s(this,F).setUrl(`https://${r}`);const u=await l(this,o,kt).call(this,e,i,"user"),h=await l(this,o,vt).call(this,a,c);return u&&h&&n==="200"}async setConstraintsConfig(e){await l(this,o,R).call(this,T.SET_CONSTRAINTS_CONFIG,{...s(this,De),...e&&{...s(this,g).constraintOverrides}},!0)}async startMeasurement(e=!1,i={}){if(f(this,fe,!1),f(this,x,""),await l(this,o,At).call(this,i),s(this,I)&&s(this,x)!==""){await l(this,o,je).call(this),await l(this,o,R).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,Q)+1},!0),await this.setConstraintsConfig(e),await l(this,o,St).call(this),await l(this,o,xe).call(this);const{userToken:a}=s(this,F).getSession();a?await l(this,o,R).call(this,y.CONNECT,{token:a,measurementId:s(this,x)},!0):l(this,o,E).call(this,"User token is missing. Unable to connect.",m.webSocket)}return s(this,x)}setDemographics(e){ni(e)?(f(this,j,e),l(this,o,E).call(this,`Demographics updated ${JSON.stringify(e)}`,m.extractionLibWasm)):l(this,o,E).call(this,`Error updating Demographics ${JSON.stringify(e)}`,m.extractionLibWasm)}setObjectFit(e){return s(this,_)&&ke!==void 0&&Object.values(ke).includes(e)?(s(this,_).settings.objectFit=e,!0):!1}};F=new WeakMap,g=new WeakMap,M=new WeakMap,v=new WeakMap,D=new WeakMap,ve=new WeakMap,Ae=new WeakMap,ye=new WeakMap,Oe=new WeakMap,de=new WeakMap,z=new WeakMap,Ne=new WeakMap,he=new WeakMap,me=new WeakMap,_=new WeakMap,q=new WeakMap,I=new WeakMap,ue=new WeakMap,x=new WeakMap,Le=new WeakMap,Z=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,fe=new WeakMap,Ee=new WeakMap,j=new WeakMap,pe=new WeakMap,De=new WeakMap,ie=new WeakMap,Ie=new WeakMap,se=new WeakMap,Te=new WeakMap,A=new WeakMap,Se=new WeakMap,B=new WeakMap,be=new WeakMap,o=new WeakSet,Et=async function(t){l(this,o,E).call(this,"Start downloading TFJS face tracker assets...",m.mediaPipe);const e=`${t}/models/`,[i,a,c,d]=await Promise.all([s(this,D).fetchAsset(s(this,M),e,"detectorModel_json.json",!0,"brotli"),s(this,D).fetchAsset(s(this,M),e,"detectorModel_bin.json",!0,"brotli"),s(this,D).fetchAsset(s(this,M),e,"landmarkModel_json.json",!0,"brotli"),s(this,D).fetchAsset(s(this,M),e,"landmarkModel_bin.json",!0,"brotli")]);l(this,o,E).call(this,"TFJS face tracker assets successfully downloaded",m.mediaPipe),f(this,ve,i),f(this,Ae,a),f(this,ye,c),f(this,Oe,d)},pt=async function(t){l(this,o,E).call(this,"Start downloading DFX extraction worker assets...",m.extractionLibWasm);const[e,i]=await Promise.all([s(this,D).fetchAsset(s(this,M),`${t}/extraction/`,`extraction_wasm_${this.getVersion().webSDK}.json`,!0,"brotli"),s(this,D).fetchAsset(s(this,M),`${t}/`,`extraction_worker_${this.getVersion().webSDK}_js.json`,!0,"brotli")]);l(this,o,E).call(this,"DFX extraction worker assets successfully downloaded",m.extractionLibWasm),f(this,de,e),f(this,z,i)},Tt=function(){if(s(this,_)){const t=e=>{this.on.mediaElementResize&&this.on.mediaElementResize(e)};s(this,g).mediaElement.addEventListener("mediaElementSizeChanged",t)}},Ve=async function(){s(this,g),l(this,o,ae).call(this,K.NOT_LOADED);const t={faceTrackerCode:s(this,Ne),numOfWorkers:s(this,Ee),mediaElement:s(this,g).mediaElement,mirrorVideo:s(this,g).mirrorVideo,metrics:s(this,g).metrics,displayMediaStream:s(this,g).displayMediaStream,isLoggingFaceTrackerWorkers:s(this,g).logger?.faceTrackerWorkers??!1,isLoggingSdk:s(this,g).logger?.sdk??!1,scaleFactor:s(this,be),models:{detectorJson:s(this,ve),detectorBin:s(this,Ae),landmarkJson:s(this,ye),landmarkBin:s(this,Oe)}};l(this,o,ae).call(this,K.LOADING),f(this,_,await Ti.init(t,s(this,v))),s(this,_).on.faceTrackersReady=(e,i,a,c)=>{l(this,o,E).call(this,`TFJS face tracker version ${i} loaded. Worker name: ${e} - workerId: ${a} - backend: ${c}`,m.mediaPipe),f(this,me,`${i}-${c}`),f(this,q,s(this,q)+1),s(this,v).setVersion(this.getVersion()),s(this,q)===s(this,Ee)&&l(this,o,ae).call(this,K.LOADED)},s(this,_).on.frameAvailable=(e,i,a,c,d)=>{!c&&d?s(this,I).worker.postMessage({action:T.NEW_FRAME,payload:{frameNumber:i,frameTimestamp:e,frame:d,lastFrameNumber:a,tracked:c}},[d]):s(this,I).worker.postMessage({action:T.TRACKING_STATUS,payload:{frameNumber:i,frameTimestamp:e,lastFrameNumber:a,tracked:c}})},s(this,_).on.landmarksAvailable=(e,i,a)=>{const c=a/1e3;s(this,B)===0&&f(this,B,c),f(this,Se,c),s(this,_).numOftrackedVideoFrames+=1;const{starRating:d}=s(this,_),n=30,r=Math.min(s(this,Se)-s(this,B),n),u=s(this,B)>0?r/n*100:0,h={video:s(this,_).videoFpsTracker.fps.toFixed(1),faceTracker:s(this,_).faceTrackerFpsTracker.fps.toFixed(1)},p={face:e,annotations:i,starRating:d,percentCompleted:u,fps:h};this.on.facialLandmarksUpdated&&this.on.facialLandmarksUpdated(p)},s(this,_).on.scaleFactorChanged=e=>{f(this,be,e),s(this,_).scaleFactor=e,s(this,I).worker.postMessage({action:T.SCALE_FACTOR_CHANGED,payload:{scaleFactor:e}})}},Ke=async function(){const t=new TextDecoder().decode(new Uint8Array(s(this,z)));f(this,I,Fe.init(t,"module","EXTRACTION_WORKER"));const{studyCfgData:e}=s(this,F).getSession();e&&s(this,de)&&s(this,z)&&(s(this,I).worker.onmessage=async i=>{const{data:a}=i,{id:c,result:d}=a,{action:n,payload:r}=d,u=s(this,se).get(c);if(u||c===-1){switch(n){case T.READY:{const{sdkId:h,version:p,workerName:S}=r;f(this,he,{version:p,sdkId:h}),l(this,o,E).call(this,`DFX extraction worker WASM loaded. SDK ID: ${h} - Version: ${p} - Worker Name: ${S}`,m.extractionLibWasm),await l(this,o,R).call(this,T.SET_MODE,{value:"discrete"},!0),await l(this,o,R).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,ie)},!0),await l(this,o,R).call(this,T.SET_TARGET_FPS,{value:s(this,ee)},!0),await l(this,o,R).call(this,T.SET_CHUNK_DURATION_SECONDS,{value:s(this,te)},!0),await l(this,o,R).call(this,T.SET_FRAME_ORDER,{value:lt.RGBA},!0),await l(this,o,R).call(this,T.GET_CONSTRAINTS_CONFIG,{},!0),f(this,De,s(this,pe));break}case T.SET_MODE:{r&&l(this,o,E).call(this,`Set mode to ${r.mode}`,m.extractionLibWasm);break}case T.SET_NUMBER_OF_CHUNKS:{r&&l(this,o,E).call(this,`Set number of chunks to ${d.number}`,m.extractionLibWasm);break}case T.SET_TARGET_FPS:{r&&l(this,o,E).call(this,`Set target FPS to ${s(this,ee)}`,m.extractionLibWasm);break}case T.SET_CHUNK_DURATION_SECONDS:{r&&l(this,o,E).call(this,`Set chunk duration to ${s(this,te)} Seconds`,m.extractionLibWasm);break}case T.SET_FRAME_ORDER:{r&&l(this,o,E).call(this,"Set channel order RGBA",m.extractionLibWasm);break}case T.GET_CONSTRAINTS_CONFIG:{r&&(f(this,pe,r),l(this,o,E).call(this,`Get constraints ${JSON.stringify(r)}`,m.extractionLibWasm));break}case T.SET_CONSTRAINTS_CONFIG:{r&&(f(this,pe,r),l(this,o,E).call(this,`Set constraints ${JSON.stringify(r)}`,m.extractionLibWasm));break}case T.SET_FACE_ATTRIBUTE:{const{success:h,faceId:p,attribute:S,value:C}=r;h&&l(this,o,E).call(this,`Set face attribute: faceId: ${p}, attribute: ${S}, value: ${C}`,m.extractionLibWasm);break}case T.RESET_COLLECTION:{r&&l(this,o,E).call(this,"Reset collection",m.extractionLibWasm);break}case T.CANCEL_COLLECTION:{r&&l(this,o,E).call(this,"Collecttion cancelled",m.extractionLibWasm);break}case T.START_COLLECTION:{r&&l(this,o,E).call(this,`Collector started - state: ${r}`,m.extractionLibWasm);break}case T.SET_PORTS:{r&&l(this,o,E).call(this,"Ports set",m.extractionLibWasm);break}case T.COLLECTOR_ERROR:{if(r){const{error:h,frameNumber:p}=r;l(this,o,E).call(this,`Collector error on frame ${p}: ${h}`,m.extractionLibWasm),this.on.error&&this.on.error(Ce.COLLECTOR,r),await this.stopTracking()}break}case T.STAR_RATING:{s(this,_).starRating=r.rating;break}case T.ALL_FACE_TRACKERS_WARMED_UP:{const{frameNumber:h}=d;s(this,_).warmupFrameNumber=h,l(this,o,E).call(this,"All face tracker workers are warmed up.",m.mediaPipe),l(this,o,ae).call(this,K.READY);break}case T.CONSTRAINTS_UPDATED:{const{feedback:h,status:p}=r;this.on.constraintsUpdated&&this.on.constraintsUpdated(h,p);break}case T.SHOULD_END_MEASUREMENT_EARLY:{const{currentFinalChunkNumber:h,currentResultsOrder:p,newFinalChunkNumber:S}=d;l(this,o,E).call(this,`Request the end measurement early. Current final chunk number: ${h}, Current results order: ${p}, New final chunk number: ${S}`,m.extractionLibWasm);break}case T.GET_LOGS:{console.log(`DFX Log: ${r}`);break}case y.CONNECT:{f(this,Z,!0),f(this,B,0),l(this,o,E).call(this,r?"Connected":"Connection error",m.webSocket);break}case y.LOGIN_WITH_TOKEN_SUCCESS:{l(this,o,E).call(this,"Successfully logged in with token",m.webSocket);break}case y.SUBSCRIBED_TO_RESULTS:{l(this,o,E).call(this,"Subscribed to the results",m.webSocket);break}case y.CHUNK_SENT:{l(this,o,E).call(this,`Chunk sent ${JSON.stringify(r)}`,m.webSocket),this.on.chunkSent&&this.on.chunkSent(r);break}case y.DISCONNECT:{f(this,Z,!1),l(this,o,E).call(this,"Disconnect",m.webSocket);break}case y.DISCONNECTED:{l(this,o,E).call(this,`Disconnected! - code: ${r.code}, reason: ${r.reason}, wasClean: ${r.wasClean}`,m.webSocket),this.on.error&&this.on.error(Ce.WEB_SOCKET,r);break}case y.CHUNK_ACKNOWLEDGED:{l(this,o,E).call(this,`Chunk number ${r.chunkOrder} received by the server!`,m.webSocket),s(this,Q)===r.chunkOrder&&await this.stopTracking();break}case y.RESULTS_RECEIVED:{const{resultsOrder:h,finalChunkNumber:p}=r;this.on.resultsReceived&&this.on.resultsReceived(r),l(this,o,E).call(this,`Results received: ${JSON.stringify(r)}`,m.webSocket),h===p&&(await l(this,o,R).call(this,y.DISCONNECT,{},!0),await l(this,o,je).call(this),await l(this,o,xe).call(this));break}case y.NETWORK_DELAY:{const{delay:h,description:p,actionId:S}=r;l(this,o,E).call(this,`Round-trip delay for ${p} call with Action ID ${S} was ${h.toFixed(2)} ms`,m.webSocket,{delay:h,actionId:S,description:p});break}case y.ERROR:{l(this,o,E).call(this,"Error",m.webSocket),this.on.error&&this.on.error(Ce.WEB_SOCKET,r);break}}u&&(u.resolve(d),s(this,se).delete(c))}},await l(this,o,R).call(this,T.INIT,{wasm:s(this,de),studyConfigData:e,isLogging:s(this,g).logger?.extractionWorker||!1,metrics:s(this,g).metrics||!1,apiUrl:s(this,g).apiUrl,scaleFactor:s(this,be)},!0))},St=async function(){if(s(this,_)&&s(this,j)){const{age:e,height:i,weight:a,sex:c,smoking:d,bloodPressureMedication:n,diabetes:r}=s(this,j);await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.SEX_ASSIGNED_AT_BIRTH,value:c},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.AGE_YEARS,value:e},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.HEIGHT_CM,value:i},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.WEIGHT_KG,value:a},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.SMOKER,value:d},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.BLOOD_PRESSURE_MEDICATION,value:n},!0),await l(this,o,R).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:V.DIABETES,value:r},!0),l(this,o,E).call(this,`Set demographics for Face ID 1, ${JSON.stringify(s(this,j))}`,m.extractionLibWasm)}},bt=function(){},_t=function(){const t=new Date().toISOString();at(t)&&(l(this,o,E).call(this,`Action ID: ${s(this,A)}`,m.beforeRESTCall),this.on.beforeRESTCall&&this.on.beforeRESTCall(t,s(this,A)))},gt=function(t,e){},wt=function(t,e){const i=new Date().toISOString();at(i)&&(l(this,o,E).call(this,`Action ID: ${s(this,A)}, HTTP status code: ${t}, error: ${JSON.stringify(e)}`,m.afterRESTCall),this.on.afterRESTCall&&this.on.afterRESTCall(i,s(this,A),t,e))},Rt=async function(){await l(this,o,R).call(this,T.CANCEL_COLLECTION,{},!0)},xe=async function(){await l(this,o,R).call(this,T.START_COLLECTION,{},!0)},je=async function(){await l(this,o,R).call(this,T.RESET_COLLECTION,{},!0),await l(this,o,R).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,ie)},!0)},E=function(t,e,i){s(this,g).metrics&&s(this,v).log(t,e,"",!0,i),s(this,g).logger?.mediaPipe&&e===m.mediaPipe&&s(this,v).info(t,e),s(this,g).logger?.beforeRESTCall&&e===m.beforeRESTCall&&s(this,v).info(t,e),s(this,g).logger?.afterRESTCall&&e===m.afterRESTCall&&s(this,v).info(t,e),s(this,g).logger?.extractionLibWasm&&e===m.extractionLibWasm&&s(this,v).info(t,e),s(this,g).logger?.apiClient&&e===m.apiClient&&s(this,v).info(t,e),s(this,g).logger?.webSocket&&e===m.webSocket&&s(this,v).info(t,e),s(this,g).logger?.sdk&&e===m.sdk&&s(this,v).info(t,e)},Ct=async function(t){f(this,A,0);const e=performance.now(),i=await s(this,F).http.auths.validate(t),a=performance.now()-e,{status:c,body:d}=i;if(l(this,o,E).call(this,c==="200"?"Successfully validated the Token":`Failed to validate token. Status: ${c}`,m.apiClient,{delay:a,actionId:s(this,A),description:"Validate Token"}),c==="200"){const{Region:n}=d;return{region:n,status:c}}else return{status:c,region:""}},kt=async function(t,e,i){f(this,A,2304);const a=performance.now(),c=await s(this,F).http.auths.renew({Token:t,RefreshToken:e},i),d=performance.now()-a,{status:n}=c;return l(this,o,E).call(this,n==="200"?"Successfully refreshed the Token":`Failed to refresh token. Status: ${n}`,m.apiClient,{delay:d,actionId:s(this,A),description:"Refresh Token"}),n==="200"},vt=async function(t,e){f(this,A,806);const i=performance.now();f(this,Le,t);const a=await s(this,F).http.studies.retrieveSdkConfigData({StudyID:t,...e&&{sdkId:e}},"user"),c=performance.now()-i,{status:d}=a;return l(this,o,E).call(this,d==="200"?"Retrieve SDK Config Data - success":"Retrieve SDK Config Data - failure",m.apiClient,{delay:c,actionId:s(this,A),description:"Retrieve SDK Config Data"}),d==="200"},At=async function(t){l(this,o,E).call(this,"Get Measurement ID",m.apiClient),f(this,A,504);const e=performance.now(),i={StudyID:s(this,Le),Resolution:100};t.partnerId&&(i.PartnerID=t.partnerId),t.userProfileId&&(i.UserProfileID=t.userProfileId);const a=await s(this,F).http.measurements.create(i,"user"),c=performance.now()-e,{status:d,body:n}=a;let r="";d==="200"?(f(this,x,n.ID),r=`Successfully obtained measurement ID: ${s(this,x)}`):(f(this,x,""),r=`Failed to obtain measurement ID. Status: ${d}`),l(this,o,E).call(this,r,m.apiClient,{delay:c,actionId:s(this,A),measurementId:s(this,x),description:"Get Measurement ID"})},ae=function(t){f(this,ue,t),l(this,o,E).call(this,`Face tracker state changed: ${t}`,m.mediaPipe),this.on.faceTrackerStateChanged&&this.on.faceTrackerStateChanged(s(this,ue))},R=function(t,e,i=!1){return new Promise(a=>{const c=_i(this,Ie)._++;s(this,se).set(c,{resolve:a,action:t});const d=()=>s(this,I).worker.postMessage({id:c,action:t,payload:e});i?f(this,Te,s(this,Te).then(d).catch(n=>console.error(n))):d()})},ft(gi,"VERSION",Xe);class wi{static VERSION=Lt;#e=document.createElement("div");#i=document.createElement("div");#s=!1;on={results:null,error:null,event:null};constructor(){this.#e.style.height="100%"}async init(e){const{container:i,appPath:a,settings:c,profile:d,config:n,language:r,apiUrl:u}=e;return this.#i=i,new Promise((h,p)=>{const S=i.attachShadow({mode:"open"}),C="app",k=document.createElement("link");k.rel="stylesheet",k.href=`${a}/stylex.css`,S.appendChild(k);const O=document.createElement("link");O.rel="stylesheet",O.href=`${a}/${C}.css`,S.appendChild(O);const P=W=>{this.on.results&&this.on.results({...W.detail})},G=W=>{this.on.error&&this.on.error({...W.detail})},re=W=>{this.on.event&&this.on.event({...W.detail})};this.#e.addEventListener(U.RESULTS,P),this.#e.addEventListener(U.ERROR,G),this.#e.addEventListener(U.APPEVENT,re),S.appendChild(this.#e);const Y=document.createElement("script");Y.type="module",Y.src=`${a}/${C}.mjs`,Y.onload=()=>{import(Y.src).then(W=>{W.app.init(this.#e,a,c,d,u,n,r),this.#s=!0,h()}).catch(W=>{p(new Error("Failed to initialize Measurement Embedded React app: "+W.message))})},Y.onerror=()=>{p(new Error("Failed to load the measurement embedded app script"))},S.appendChild(Y)})}#t(){if(!this.#s)throw new Error("MeasurementEmbeddedApp is not initialized. Call init() before using this method.")}async destroy(){return this.#t(),new Promise(e=>{const i=c=>{if(this.#e.removeEventListener(U.DESTROYED,i),this.#i){const d=this.#i.cloneNode(!1);this.#i.replaceWith(d)}e()};this.#e.addEventListener(U.DESTROYED,i);const a=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.DESTROY,data:{}}});this.#e.dispatchEvent(a)})}setTheme(e){this.#t();const i=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.SET_THEME,data:{theme:e}}});this.#e.dispatchEvent(i)}setLanguage(e){this.#t();const i=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.SET_LANGUAGE,data:{language:e}}});this.#e.dispatchEvent(i)}async cancel(e){return this.#t(),new Promise(i=>{const a=d=>{this.#e.removeEventListener(U.CANCELLED,a),i(d.detail.reset)};this.#e.addEventListener(U.CANCELLED,a);const c=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.CANCEL,data:{reset:e}}});this.#e.dispatchEvent(c)})}getLogs(){return this.#t(),new Promise(e=>{const i=c=>{this.#e.removeEventListener(U.LOGS,i),e(c.detail.logs)};this.#e.addEventListener(U.LOGS,i);const a=new CustomEvent("measurement-embedded-app-action",{detail:{action:ne.GET_LOGS,data:{}}});this.#e.dispatchEvent(a)})}}export{Je as ErrorCodes,Dt as appEvents,wi as default,hi as faceAttributeValue,Ye as logCategory};
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"fileName":"extraction_worker_0.1.0-beta.2_js.js","mimeType":"text/javascript","base64EncodedValue":"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"}
|