@nuralogix.ai/web-measurement-embedded-app 0.1.0-beta.2 → 0.1.0-beta.4

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/lib/index.d.ts CHANGED
@@ -914,13 +914,6 @@ interface Results {
914
914
  statusId: string;
915
915
  }
916
916
 
917
- declare const measurementEmbeddedAppEvents: {
918
- readonly RESULTS: "results";
919
- readonly ERROR: "error";
920
- readonly APPEVENT: "appEvent";
921
- readonly CANCELLED: "cancelled";
922
- readonly LOGS: "logs";
923
- };
924
917
  interface AppSettings {
925
918
  token: string;
926
919
  refreshToken: string;
@@ -962,8 +955,6 @@ interface MeasurementEmbeddedAppOptions {
962
955
  config?: Config;
963
956
  /** API URL for region-specific data processing */
964
957
  apiUrl?: string;
965
- /** Callback function to handle load errors */
966
- loadError?: (error: string) => void;
967
958
  }
968
959
  declare enum logCategory {
969
960
  measurement = "Measurement",
@@ -978,8 +969,8 @@ interface Log {
978
969
  meta?: any;
979
970
  }
980
971
  interface MeasurementEmbedded {
981
- init(options: MeasurementEmbeddedAppOptions): void;
982
- destroy(): void;
972
+ init(options: MeasurementEmbeddedAppOptions): Promise<void>;
973
+ destroy(): Promise<void>;
983
974
  /**
984
975
  * Cancel the measurement
985
976
  * @param {boolean} reset - whether to reset the Web SDK or just close the camera and hide the mask
@@ -1020,6 +1011,10 @@ declare const appEvent: {
1020
1011
  readonly CAMERA_STARTED: "CAMERA_STARTED";
1021
1012
  /** WMEA component has been loaded */
1022
1013
  readonly APP_LOADED: "APP_LOADED";
1014
+ /** Measurement has been prepared */
1015
+ readonly MEASUREMENT_PREPARED: "MEASUREMENT_PREPARED";
1016
+ /** Assets have been downloaded */
1017
+ readonly ASSETS_DOWNLOADED: "ASSETS_DOWNLOADED";
1023
1018
  /** Measurement has started */
1024
1019
  readonly MEASUREMENT_STARTED: "MEASUREMENT_STARTED";
1025
1020
  /** Measurement has completed */
@@ -1047,6 +1042,14 @@ declare const appEvents: {
1047
1042
  readonly event: "APP_LOADED";
1048
1043
  readonly level: "INFO";
1049
1044
  };
1045
+ readonly MEASUREMENT_PREPARED: {
1046
+ readonly event: "MEASUREMENT_PREPARED";
1047
+ readonly level: "INFO";
1048
+ };
1049
+ readonly ASSETS_DOWNLOADED: {
1050
+ readonly event: "ASSETS_DOWNLOADED";
1051
+ readonly level: "INFO";
1052
+ };
1050
1053
  readonly MEASUREMENT_STARTED: {
1051
1054
  readonly event: "MEASUREMENT_STARTED";
1052
1055
  readonly level: "INFO";
@@ -1106,7 +1109,9 @@ declare enum ErrorCodes {
1106
1109
  /** Extraction library error */
1107
1110
  COLLECTOR = "COLLECTOR",
1108
1111
  /** WebSocket disconnected */
1109
- WEBSOCKET_DISCONNECTED = "WEBSOCKET_DISCONNECTED"
1112
+ WEBSOCKET_DISCONNECTED = "WEBSOCKET_DISCONNECTED",
1113
+ /** Measurement preparation failed - invalid or missing credentials */
1114
+ MEASUREMENT_PREPARE_FAILED = "MEASUREMENT_PREPARE_FAILED"
1110
1115
  }
1111
1116
  type MeasurementErrorCodes = ErrorCodes.WORKER_ERROR | ErrorCodes.PROFILE_INFO_NOT_SET;
1112
1117
 
@@ -1135,13 +1140,13 @@ declare class MeasurementEmbeddedApp implements MeasurementEmbedded {
1135
1140
  };
1136
1141
  /** @hideconstructor */
1137
1142
  constructor();
1138
- init(options: MeasurementEmbeddedAppOptions): void;
1139
- destroy(): void;
1143
+ init(options: MeasurementEmbeddedAppOptions): Promise<void>;
1144
+ destroy(): Promise<void>;
1140
1145
  setTheme(theme: 'light' | 'dark'): void;
1141
1146
  setLanguage(language: SupportedLanguage): void;
1142
1147
  cancel(reset: boolean): Promise<boolean>;
1143
1148
  getLogs(): Promise<Log[]>;
1144
1149
  }
1145
1150
 
1146
- export { ErrorCodes, appEvents, MeasurementEmbeddedApp as default, faceAttributeValue, logCategory, measurementEmbeddedAppEvents };
1147
- export type { AppSettings, Config, DfxPointId, DialSection, IMeta, Log, MeasurementEmbeddedAppError, MeasurementEmbeddedAppOptions, MeasurementErrorCodes, Point, PointGroupType, Profile, Results, SupportedLanguage };
1151
+ export { ErrorCodes, appEvents, MeasurementEmbeddedApp as default, faceAttributeValue, logCategory };
1152
+ export type { AppSettings, Config, DfxPointId, DialSection, IMeta, Log, MeasurementEmbeddedAppError, MeasurementEmbeddedAppOptions, MeasurementErrorCodes, Point, PointGroupType, Points, Profile, RealtimeResultNotes, Results, ResultsError, SupportedLanguage };
package/lib/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var Nt="0.1.0-beta.2";const $={RESULTS:"results",ERROR:"error",APPEVENT:"appEvent",CANCELLED:"cancelled",LOGS:"logs"};var je=(t=>(t.measurement="Measurement",t.collector="Collector",t.camera="Camera",t.app="App",t))(je||{});const D={INFO:"INFO",WARN:"WARN",ERROR:"ERROR"},I={CAMERA_STARTED:"CAMERA_STARTED",APP_LOADED:"APP_LOADED",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"},Lt={CAMERA_STARTED:{event:I.CAMERA_STARTED,level:D.INFO},APP_LOADED:{event:I.APP_LOADED,level:D.INFO},MEASUREMENT_STARTED:{event:I.MEASUREMENT_STARTED,level:D.INFO},MEASUREMENT_COMPLETED:{event:I.MEASUREMENT_COMPLETED,level:D.INFO},CAMERA_PERMISSION_GRANTED:{event:I.CAMERA_PERMISSION_GRANTED,level:D.INFO},INTERMEDIATE_RESULTS:{event:I.INTERMEDIATE_RESULTS,level:D.INFO},RESULTS_RECEIVED:{event:I.RESULTS_RECEIVED,level:D.INFO},MEASUREMENT_CANCELED:{event:I.MEASUREMENT_CANCELED,level:D.WARN},CONSTRAINT_VIOLATION:{event:I.CONSTRAINT_VIOLATION,level:D.ERROR},PAGE_UNLOADED:{event:I.PAGE_UNLOADED,level:D.INFO},PAGE_VISIBILITY_CHANGE:{event:I.PAGE_VISIBILITY_CHANGE,level:D.INFO}},re={DESTROY:"destroy",CANCEL:"cancel",SET_THEME:"setTheme",SET_LANGUAGE:"setLanguage",GET_LOGS:"getLogs"};var Ye=(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))(Ye||{}),Je="0.1.0-beta.1",J=(t=>(t.DELETE="DELETE",t.GET="GET",t.PATCH="PATCH",t.POST="POST",t.PUT="PUT",t.CONNECT="CONNECT",t))(J||{}),V=(t=>(t.ON_BEFORE_REST_CALL_ERROR="ON_BEFORE_REST_CALL_ERROR",t))(V||{});const Xe=typeof DedicatedWorkerGlobalScope<"u",be=async({baseUrl:t,urlFragment:e,method:i,headers:r,data:c},d)=>{const n=`${t}/${e}`;let a={Code:"",Message:""};try{const u=await fetch(n,{method:i,cache:"no-store",credentials:"include",headers:r,...c!=null&&{body:JSON.stringify(c)}}),h=u.headers.get("content-type"),p=u.status.toString();a={Code:"UNSUPPORTED_RESPONSE_CONTENT_TYPE",Message:"UNSUPPORTED_RESPONSE_CONTENT_TYPE"},p==="503"&&(a={Code:"SERVICE_UNAVAILABLE",Message:"Service unavailable"}),p==="429"&&(a={Code:"TOO_MANY_REQUESTS",Message:"Too many requests"}),h!=null&&(h.startsWith("application/json;")&&(a=await u.json()),h.startsWith("text/plain;")&&(a={data:await u.text()}));let _=u.headers;if(Xe){const R={};u.headers.forEach((k,L)=>{R[L]=k}),_=R}try{d(p,p==="200"?void 0:a)}catch(R){console.error("Error running onAfterRESTCall callback",R)}return{status:p,headers:_,body:a}}catch(u){return u instanceof SyntaxError?a={Code:"SYNTAX_ERROR",Message:"SYNTAX_ERROR"}:a={Code:"UNEXPECTED_ERROR",Message:"UNEXPECTED_ERROR"},{status:"UNKNOWN",headers:Xe?{}:new Headers,body:a}}},_e=()=>new Headers({"Content-Type":"application/json"});var Dt=Object.defineProperty,It=(t,e,i)=>e in t?Dt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,xt=(t,e,i)=>It(t,e+"",i);class Fe{constructor(e){xt(this,"parent"),this.parent=e}async onBeforeRESTCall(){try{return this.parent.onBeforeRESTCall(),{Code:"SUCCESS",Message:"SUCCESS"}}catch{return{Code:V.ON_BEFORE_REST_CALL_ERROR,Message:V.ON_BEFORE_REST_CALL_ERROR}}}getDefaults(e){return{baseUrl:JSON.parse(this.parent.getUrl()).http.slice(0,-1),method:J[e],headers:_e()}}getHeaderWithDeviceToken(){const e=_e();return e.set("Authorization",`Bearer ${this.parent.getSession().deviceToken}`),e}getHeaderWithUserToken(){const e=_e();return e.set("Authorization",`Bearer ${this.parent.getSession().userToken}`),e}getHeaderWithSessionEnabled(){const e=_e();return e.set("x-nura-session","true"),e}}class Ft extends Fe{async create(e,i){const{Code:r,Message:c}=await this.onBeforeRESTCall();if(r===V.ON_BEFORE_REST_CALL_ERROR)return{status:r,body:{Code:r,Message:c},headers:new Headers};const{status:d,body:n,headers:a}=await be({...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:a}}}class Mt extends Fe{async retrieveSdkConfigData(e,i){const{Code:r,Message:c}=await this.onBeforeRESTCall();if(r===V.ON_BEFORE_REST_CALL_ERROR)return{status:r,body:{Code:r,Message:c},headers:new Headers};const{status:d,body:n,headers:a}=await be({...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:a}}}class Pt extends Fe{async renew(e,i){const{Code:r,Message:c}=await this.onBeforeRESTCall();if(r===V.ON_BEFORE_REST_CALL_ERROR)return{status:r,body:{Code:r,Message:c},headers:new Headers};const{status:d,body:n,headers:a}=await be({...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:a}}async validate(e){const{Code:i,Message:r}=await this.onBeforeRESTCall();return i===V.ON_BEFORE_REST_CALL_ERROR?{status:i,body:{Code:i,Message:r},headers:new Headers}:await be({...this.getDefaults(J.GET),headers:e==="device"?this.getHeaderWithDeviceToken():this.getHeaderWithUserToken(),urlFragment:"auth/v1/validate"},this.parent.onAfterRESTCall)}}var Wt=Object.defineProperty,ze=t=>{throw TypeError(t)},Ut=(t,e,i)=>e in t?Wt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Me=(t,e,i)=>Ut(t,typeof e!="symbol"?e+"":e,i),qe=(t,e,i)=>e.has(t)||ze("Cannot "+i),Pe=(t,e,i)=>(qe(t,e,"read from private field"),i?i.call(t):e.get(t)),Ze=(t,e,i)=>e.has(t)?ze("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),ge=(t,e,i,r)=>(qe(t,e,"write to private field"),e.set(t,i),i),ne,X;class $t{constructor(e){Ze(this,ne,{http:new URL("https://api.deepaffex.ai")}),Ze(this,X),Me(this,"onBeforeRESTCall"),Me(this,"onAfterRESTCall"),Me(this,"http"),ge(this,X,{deviceToken:"",deviceRefreshToken:"",userToken:"",userRefreshToken:"",deviceId:"",roleId:"",userId:"",selectedStudy:"",lastMeasurementId:"",studyCfgHash:"",studyCfgData:""}),this.http={measurements:new Ft(this),studies:new Mt(this),auths:new Pt(this)},this.onBeforeRESTCall=e?.onBeforeRESTCall?e.onBeforeRESTCall:()=>{},this.onAfterRESTCall=e?.onAfterRESTCall?e.onAfterRESTCall:()=>{},e?.url!=null&&ge(this,ne,e.url)}static new(e){return new this(e??void 0)}getUrl(){return JSON.stringify(Pe(this,ne))}setUrl(e){ge(this,ne,{http:new URL(e)})}getSession(){return Pe(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")&&ge(this,X,{...Pe(this,X),...e})}}ne=new WeakMap,X=new WeakMap;const Bt=t=>$t.new(t);var Gt=Object.defineProperty,Qe=t=>{throw TypeError(t)},Ht=(t,e,i)=>e in t?Gt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,Vt=(t,e,i)=>Ht(t,e+"",i),Kt=(t,e,i)=>e.has(t)||Qe("Cannot "+i),jt=(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)=>(Kt(t,e,"access private method"),i),oe,Ue,et;let tt=t=>new Int8Array(t);class Yt extends EventTarget{constructor(){super(...arguments),jt(this,oe),Vt(this,"canDecompress",!1)}static init(){return new this}dispatch(e,i){this.dispatchEvent(new CustomEvent(e,{detail:i}))}getBytesDownloadedEvent(e,i,r,c){return new CustomEvent("bytesDownloaded",{detail:{bytes:e,uncompressedSize:i,url:r,done:c}})}getBytesDownloadErrorEvent(e,i){return new CustomEvent("downloadedError",{detail:{url:e,error:i}})}decompressBrotli(e){const i=atob(e),r=new Uint8Array(i.length);for(let n=0;n<i.length;n++)r[n]=i.charCodeAt(n);const c=new Int8Array(r.length);for(let n=0;n<r.length;n++)c[n]=r[n]>=128?r[n]-256:r[n];return tt(c).buffer}async fetchAsset(e,i,r,c,d){const n=i+r,a=e.find(h=>h.file===r).uncompressedSize,u=(h,p,_,R)=>We(this,oe,Ue).call(this,this.getBytesDownloadedEvent(h,p,_,R));try{const p=(await fetch(n)).body?.getReader();if(!p)throw new Error("Failed to get reader from response body.");let _=0;const R=new ReadableStream({async start(L){await W();async function W(){const{done:G,value:M}=await p.read();if(G){L.close(),u(_,a,n,!0);return}M&&(L.enqueue(M),_+=M.length,u(_,a,n,!1)),await W()}}}),k=new Response(R);if(c){const L=await k.json(),{base64EncodedValue:W}=L;if(d==="gzip"){await We(this,oe,et).call(this,W);return}return this.decompressBrotli(W)}else return await k.arrayBuffer()}catch(h){We(this,oe,Ue).call(this,this.getBytesDownloadErrorEvent(n,h))}}}oe=new WeakSet,Ue=function(t){this.dispatchEvent(t)},et=async function(t){const e=Uint8Array.from(atob(t),h=>h.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip")),c=await new Response(r).arrayBuffer(),d=new TextDecoder().decode(new Uint8Array(c)),n=new Blob([d],{type:"application/javascript"}),a=URL.createObjectURL(n);tt=(await import(a)).BrotliDecode,this.canDecompress=!0,URL.revokeObjectURL(a)};var Jt=Object.defineProperty,Xt=(t,e,i)=>e in t?Jt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,it=(t,e,i)=>Xt(t,typeof e!="symbol"?e+"":e,i);class zt{constructor(){it(this,"version",{webSDK:"",extractionLib:{version:"",sdkId:""},faceTracker:""}),it(this,"debugLogs",[])}appendLog(e){this.debugLogs.push(e)}transferLogs(){}generateHTMLTable(){return`
1
+ var Lt="0.1.0-beta.4";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`
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8">
@@ -128,7 +128,7 @@ var Nt="0.1.0-beta.2";const $={RESULTS:"results",ERROR:"error",APPEVENT:"appEven
128
128
  <label for="thread-filter">Filter by Thread:</label>
129
129
  <select id="thread-filter">
130
130
  <option value="none">None</option>
131
- ${[...new Set(this.debugLogs.map(r=>r.thread))].map(r=>`<option value="${r}">${r}</option>`).join("")}
131
+ ${[...new Set(this.debugLogs.map(a=>a.thread))].map(a=>`<option value="${a}">${a}</option>`).join("")}
132
132
  </select>
133
133
  <br>
134
134
  <br>
@@ -736,4 +736,4 @@ var Nt="0.1.0-beta.2";const $={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"}),r=URL.createObjectURL(i);window.open(r,"_blank")}}var qt=Object.defineProperty,Zt=(t,e,i)=>e in t?qt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,we=(t,e,i)=>Zt(t,typeof e!="symbol"?e+"":e,i);class xe{constructor(e,i){we(this,"workerUrl"),we(this,"worker"),this.worker=e,this.workerUrl=i}static init(e,i,r){const c=new Blob([e],{type:"application/javascript"}),d=URL.createObjectURL(c),n=r||`WORKER${String(new Date().getTime())}`,a=new Worker(new URL(d,import.meta.url),{name:n,type:i});return new xe(a,d)}destroy(){this.worker&&(this.worker.terminate(),URL.revokeObjectURL(this.worker))}}const Qt=(t,e,i,r)=>{const c=t/e,d=i/r;let n=0,a=0;c>d?(n=t,a=t/d):(a=e,n=e*d);const u=(t-n)/2,h=(e-a)/2;return{width:n||0,height:a||0,offsetX:u||0,offsetY:h||0}},ei=(t,e,i,r)=>{const c=(t-i)/2,d=(e-r)/2;return{width:i||0,height:r||0,offsetX:c||0,offsetY:d||0}},ti=(t,e,i,r)=>{const c=t/e,d=i/r;let n=0,a=0;c>d?(a=e,n=e*d):(n=t,a=t/d);const u=(t-n)/2,h=(e-a)/2;return{width:n||0,height:a||0,offsetX:u||0,offsetY:h||0}},ii=(t,e)=>{switch(t){case"none":return ei(...e);case"cover":return Qt(...e);case"contain":default:return ti(...e)}},st=t=>/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(t),si=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"),ai=(t,e)=>{const i={...t};if(e.logger)if(si(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 r=function(n,a){if(!(n in d))return!1;const u=d[n];return typeof a===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,a])=>[n,typeof a]));for(const n in e.constraintOverrides){const a=e.constraintOverrides[n];if(!r(n,a))return{results:"invalid"}}i.constraintOverrides=e.constraintOverrides}return{results:"valid",settings:i}},ri=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 ni=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 at{constructor(e=1e3){we(this,"timestamps",[]),we(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 oi=Object.defineProperty,li=(t,e,i)=>e in t?oi(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,rt=(t,e,i)=>li(t,typeof e!="symbol"?e+"":e,i);const ci=()=>{const t=new Date,e=(t.getMonth()+1).toString().padStart(2,"0"),i=t.getDate().toString().padStart(2,"0"),r=t.getFullYear();let c=t.getHours();const d=t.getMinutes().toString().padStart(2,"0"),n=t.getSeconds().toString().padStart(2,"0"),a=t.getMilliseconds().toString().padStart(3,"0"),u=c>=12?"PM":"AM";return c=c%12||12,`[${e}/${i}/${r}, ${c}:${d}:${n}.${a} ${u}]`};class nt{constructor(){rt(this,"mertics",new zt),rt(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,r,c=!1,d={}){const n=ci();if(c)this.mertics.appendLog({thread:"Main",timestamp:n,category:i,message:e,meta:d});else{const a=`[${i}]`,u=" ",h=e,p=`color:${r}; font-weight:800;`,_=`color:${ni(i)}; font-weight:700;`;console.log("%c%s%c%s%c%s%c%s",p,n,_,a,"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 di={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},K={SEX_ASSIGNED_AT_BIRTH:1,AGE_YEARS:2,HEIGHT_CM:3,WEIGHT_KG:4,SMOKER:5,BLOOD_PRESSURE_MEDICATION:7,DIABETES:8};var ot=(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))(ot||{});const j={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"},Re={CONTAIN:"contain",COVER:"cover",NONE:"none"};var U=(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))(U||{}),hi=Object.defineProperty,lt=t=>{throw TypeError(t)},mi=(t,e,i)=>e in t?hi(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,w=(t,e,i)=>mi(t,typeof e!="symbol"?e+"":e,i),$e=(t,e,i)=>e.has(t)||lt("Cannot "+i),ct=(t,e,i)=>($e(t,e,"read from private field"),i?i.call(t):e.get(t)),dt=(t,e,i)=>e.has(t)?lt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),ui=(t,e,i,r)=>($e(t,e,"write to private field"),e.set(t,i),i),fi=(t,e,i)=>($e(t,e,"access private method"),i),le,Be,ht;const pi=class yt{constructor(e,i,r){dt(this,Be),dt(this,le),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 at(1e3)),w(this,"faceTrackerFpsTracker",new at(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:Re.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:a,isLoggingSdk:u,metrics:h,displayMediaStream:p}=i;this.numOfWorkers=n,this.isLoggingFaceTrackerWorkers=a,this.isLoggingSdk=u,this.metrics=h,ui(this,le,r),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:r,faceTrackerCode:c}=e,d=[],n=new TextDecoder().decode(new Uint8Array(c));if(r>0)for(let a=1;a<=r;a+=1){const u=xe.init(n,"module",`FACE_TRACKER_WORKER_${a-1}`);d.push({ft:u,channel:new MessageChannel,isBusy:!1})}return new yt(d,e,i)}initWorkerOnMessage(e){const i=window.matchMedia("(orientation: portrait)").matches,r=i?360:640,c=i?640:360;this.workers.forEach(d=>{d.ft.worker.postMessage({action:U.INIT_TFJS,payload:{width:r,height:c,models:e,scaleFactor:this.scaleFactor}}),d.ft.worker.postMessage({action:U.SET_PORT,payload:{port:d.channel.port2}},[d.channel.port2]),d.ft.worker.onmessage=n=>{const{action:a,payload:u}=n.data;switch(a){case U.INIT_TFJS:break;case U.READY:{const{workerName:h,version:p,workerId:_,backend:R}=u;this.on.faceTrackersReady&&this.on.faceTrackersReady(h,p,_,R);break}case U.LANDMARKS:{this.faceTrackerFpsTracker.tick(),d.isBusy=!1,this.warmingUp&&this.warmupIndex++;const{face:h,annotations:p,frameTimestamp:_}=u;this.on.landmarksAvailable&&this.on.landmarksAvailable(h,p,_);break}case U.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:U.DESTROY}))},200)}createMediaElements(){this.videoElement.addEventListener("ended",async()=>{this.destroyWorkers()});const e=document.createElement("div"),i=this.settings.displayMediaStream?this.videoElement:e,r="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 ${r}`),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:a}=d[0],{width:u,height:h}=n,{x:p,y:_}=a.getBoundingClientRect(),{faceTrackerWidth:R,faceTrackerHeight:k}=this.settings;this.videoElementSize=ii(this.settings.objectFit,[u,h,this.frameWidth,this.frameHeight]);const{width:L,height:W}=this.videoElementSize;if(!this.settings.displayMediaStream){const G=this.settings.objectFit===Re.NONE;i.style.height=`${Math.trunc(G?W:h)}px`,i.style.width=`${Math.trunc(G?L:u)}px`}this.mediaElement.dispatchEvent(new CustomEvent("mediaElementSizeChanged",{detail:{mediaElementSize:{width:u,height:h,x:p,y:_},videoElementSize:this.videoElementSize,frameInfo:{mediaStreamWidth:this.frameWidth,mediaStreamHeight:this.frameHeight,faceTrackerWidth:R,faceTrackerHeight:k},isPortrait:h>u,aspectRatio:u/h}}))}).observe(this.mediaElement)}log(e,i,r){this.isLoggingSdk&&ct(this,le).info(e,i),this.metrics&&ct(this,le).log(e,i,"",!0,r)}videoFrameCallback(e,i){const{presentedFrames:r,captureTime:c,expectedDisplayTime:d,mediaTime:n}=i;this.videoFpsTracker.tick();const a=c===void 0?d:c;this.numOfFramesPresented=r;const u=`Number of frames presented: ${this.numOfFramesPresented} - time: ${a}`;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:a,presentedFrames:r}),this.warmingUp)if(this.warmupIndex>=this.numOfWorkers)this.warmingUp=!1;else{const p=this.workers[this.warmupIndex];if(!p.isBusy){p.isBusy=!0;const _=new VideoFrame(this.videoElement,{timestamp:h});p.ft.worker.postMessage({action:"TRACK",payload:{frame:_,frameTimestamp:h,frameNumber:this.numOfFramesPresented}},[_])}}if(!this.warmingUp){const p=new VideoFrame(this.videoElement,{timestamp:h});let _=!1;for(let R=0;R<this.numOfWorkers;R++){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]),_=!0;break}}_||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(r=>r.ft.worker.postMessage({action:U.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:r}=await fi(this,Be,ht).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}};le=new WeakMap,Be=new WeakSet,ht=async function(t,e){e.srcObject=t,await new Promise(r=>e.onloadedmetadata=r);const[i]=t.getVideoTracks();return{constraints:i.getConstraints(),settings:i.getSettings()}};let Ei=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||{}),Ti=Object.defineProperty,mt=t=>{throw TypeError(t)},Si=(t,e,i)=>e in t?Ti(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,ut=(t,e,i)=>Si(t,typeof e!="symbol"?e+"":e,i),Ge=(t,e,i)=>e.has(t)||mt("Cannot "+i),s=(t,e,i)=>(Ge(t,e,"read from private field"),i?i.call(t):e.get(t)),S=(t,e,i)=>e.has(t)?mt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,i),f=(t,e,i,r)=>(Ge(t,e,"write to private field"),e.set(t,i),i),l=(t,e,i)=>(Ge(t,e,"access private method"),i),bi=(t,e,i,r)=>({set _(c){f(t,e,c)},get _(){return s(t,e,r)}}),x,g,P,v,O,ke,ve,Ae,ye,ce,z,Oe,de,he,b,q,N,me,F,Ne,Z,Q,ee,te,ue,fe,Y,pe,Le,ie,De,se,Ee,A,Te,B,Se,o,ft,pt,Et,He,Ve,Tt,St,bt,_t,gt,wt,Ie,Ke,E,Ct,Rt,kt,vt,ae,C;const At=Symbol("instance_creation_key"),_i=class Ot{constructor(e){if(S(this,o),S(this,x),S(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:{}}),S(this,P,[{file:"decompress.json",uncompressedSize:89469},{file:"extraction_worker_0.1.0-beta.1_js.json",uncompressedSize:59624},{file:"facetracker_worker_0.1.0-beta.1_js.json",uncompressedSize:306553},{file:"extraction_wasm_0.1.0-beta.1.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}]),S(this,v,new nt),S(this,O,Yt.init()),S(this,ke),S(this,ve),S(this,Ae),S(this,ye),S(this,ce),S(this,z),S(this,Oe),S(this,de,{version:"",sdkId:""}),S(this,he,""),S(this,b),S(this,q,0),S(this,N),S(this,me,j.ASSETS_NOT_DOWNLOADED),S(this,F,""),S(this,Ne,""),S(this,Z,!1),S(this,Q,5),S(this,ee,30),S(this,te,5),S(this,ue,!1),S(this,fe,4),S(this,Y),S(this,pe),S(this,Le),S(this,ie,1e7),S(this,De,0),S(this,se,new Map),S(this,Ee,Promise.resolve()),S(this,A,0),S(this,Te,-1),S(this,B,-1),S(this,Se,.5),ut(this,"on",{beforeRESTCall:null,afterRESTCall:null,bytesDownloaded:null,faceTrackerStateChanged:null,resultsReceived:null,constraintsUpdated:null,mediaElementResize:null,facialLandmarksUpdated:null,chunkSent:null,error:null}),e!==At)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 Ot(At);if(!i.setSettings(e))throw new Error("Invalid settings object");f(i,x,Bt({url:{http:new URL("https://api.deepaffex.ai")},onBeforeRESTCall:()=>{var n,a;l(n=i,o,St).call(n),l(a=i,o,bt).call(a)},onAfterRESTCall:(n,a)=>{var u,h;l(u=i,o,_t).call(u,n,a),l(h=i,o,gt).call(h,n,a)}}));const c=n=>{var a;const{bytes:u,url:h,uncompressedSize:p,done:_}=n.detail;l(a=i,o,E).call(a,`bytesDownloaded event, ${u}, ${p}, ${h}, ${_}`,m.mediaPipe),i.on.bytesDownloaded&&i.on.bytesDownloaded(u,p,h,_)},d=n=>{var a;const{error:u,url:h}=n.detail;l(a=i,o,E).call(a,`downloadError event, ${h}, ${u}`,m.mediaPipe),i.on.error&&i.on.error(Ce.ASSET_DOWNLOAD,{url:h,error:u})};return s(i,O).addEventListener("downloadedError",d),s(i,O).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,j.ASSETS_NOT_DOWNLOADED)},500),new Proxy(i,{get(n,a,u){const h=a;return typeof n[h]=="function"?n[h].bind(n):Reflect.get(n,h,u)},set(n,a,u){return console.log(`Setting property "${String(a)}" to "${u}" is not allowed`),!0}})}loadMask(e){if(s(this,b)){let i=!1;const r=s(this,b).mediaElement.querySelector("svg");r&&(i=!0,s(this,b).mediaElement.removeChild(r)),s(this,b).mediaElement.appendChild(e),i&&(s(this,b).mediaElement.style.setProperty("border","1px solid transparent"),setTimeout(()=>{s(this,b).mediaElement.removeAttribute("style")},100))}}setSettings(e){const i=ai(s(this,g),e);return i.results==="valid"?(f(this,g,i.settings),!0):!1}getVersion(){return{webSDK:Je,extractionLib:s(this,de),faceTracker:s(this,he)}}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,O).fetchAsset(s(this,P),`${e}/`,"decompress.json",!0,"gzip"),s(this,O).canDecompress){await l(this,o,pt).call(this,e),s(this,z)&&await l(this,o,Ve).call(this),l(this,o,E).call(this,"Start downloading TFJS worker...",m.mediaPipe);const i=await s(this,O).fetchAsset(s(this,P),`${e}/`,`facetracker_worker_${this.getVersion().webSDK}_js.json`,!0,"brotli");return i&&(f(this,Oe,i),await l(this,o,ft).call(this,e),await l(this,o,He).call(this)),l(this,o,Et).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,r=5){f(this,Q,e-1),f(this,ee,i),f(this,te,r)}async setNextChunkAsFinal(){f(this,ue,!0),await l(this,o,C).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,b)&&(s(this,b).isExtracting||(s(this,b).setIsExtracting(!0),l(this,o,E).call(this,"Start tracking frames",m.mediaPipe),await l(this,o,C).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,ie)},!0),await l(this,o,Ie).call(this)))}async stopTracking(){if(s(this,b)){s(this,b).stopTracking(),await l(this,o,wt).call(this),s(this,b).setIsExtracting(!1),l(this,o,E).call(this,"Stop extracting frames",m.mediaPipe);const{numOfFramesPresented:e,warmupFrameNumber:i,numOftrackedVideoFrames:r}=s(this,b);l(this,o,E).call(this,"Tracking metrics",m.sdk,{numOfFramesPresented:e,warmupFrameNumber:i,numOftrackedVideoFrames:r}),f(this,F,"")}}async disconnect(){s(this,Z)&&await l(this,o,C).call(this,y.DISCONNECT,{},!0),s(this,g).metrics&&(await l(this,o,C).call(this,T.GET_LOGS,{},!0),s(this,v).retrieveLogs())}async destroy(){s(this,N)&&(s(this,N).destroy(),l(this,o,E).call(this,"Destroyed",m.extractionLibWasm)),s(this,b)&&(s(this,b).destroyWorkers(),l(this,o,E).call(this,"Destroyed",m.mediaPipe))}async reset(){return s(this,me)===j.READY?(await this.stopTracking(),await this.destroy(),f(this,v,new nt),f(this,de,{version:"",sdkId:""}),f(this,he,""),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,ue,!1),f(this,Y,void 0),f(this,ie,1e7),f(this,De,0),f(this,se,new Map),f(this,Ee,Promise.resolve()),f(this,A,0),f(this,Te,-1),f(this,B,-1),s(this,g).mediaElement.innerHTML="",await l(this,o,Ve).call(this),await l(this,o,He).call(this),!0):!1}async setMediaStream(e){if(s(this,b)&&!s(this,b).isExtracting&&s(this,N)){await s(this,b).setMediaStream(e);const i=Object.fromEntries(s(this,b).workers.map((r,c)=>[`port${c+1}`,r.channel.port1]));s(this,N).worker.postMessage({action:T.SET_PORTS,payload:{numOfWorkers:s(this,fe),workerPorts:i}},[...s(this,b).workers.map(r=>r.channel.port1)])}}async prepare(e,i,r,c){s(this,x).setSession({userToken:e,userRefreshToken:i});const{region:d,status:n}=await l(this,o,Ct).call(this,"user");let a=`api.${d}.deepaffex.ai`;s(this,g).apiUrl?a=s(this,g).apiUrl:s(this,g).apiUrl=a,s(this,x).setUrl(`https://${a}`);const u=await l(this,o,Rt).call(this,e,i,"user"),h=await l(this,o,kt).call(this,r,c);return u&&h&&n==="200"}async setConstraintsConfig(e){await l(this,o,C).call(this,T.SET_CONSTRAINTS_CONFIG,{...s(this,Le),...e&&{...s(this,g).constraintOverrides}},!0)}async startMeasurement(e=!1,i={}){if(f(this,ue,!1),f(this,F,""),await l(this,o,vt).call(this,i),s(this,N)&&s(this,F)!==""){await l(this,o,Ke).call(this),await l(this,o,C).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,Q)+1},!0),await this.setConstraintsConfig(e),await l(this,o,Tt).call(this),await l(this,o,Ie).call(this);const{userToken:r}=s(this,x).getSession();r?await l(this,o,C).call(this,y.CONNECT,{token:r,measurementId:s(this,F)},!0):l(this,o,E).call(this,"User token is missing. Unable to connect.",m.webSocket)}}setDemographics(e){ri(e)?(f(this,Y,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,b)&&Re!==void 0&&Object.values(Re).includes(e)?(s(this,b).settings.objectFit=e,!0):!1}};x=new WeakMap,g=new WeakMap,P=new WeakMap,v=new WeakMap,O=new WeakMap,ke=new WeakMap,ve=new WeakMap,Ae=new WeakMap,ye=new WeakMap,ce=new WeakMap,z=new WeakMap,Oe=new WeakMap,de=new WeakMap,he=new WeakMap,b=new WeakMap,q=new WeakMap,N=new WeakMap,me=new WeakMap,F=new WeakMap,Ne=new WeakMap,Z=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ue=new WeakMap,fe=new WeakMap,Y=new WeakMap,pe=new WeakMap,Le=new WeakMap,ie=new WeakMap,De=new WeakMap,se=new WeakMap,Ee=new WeakMap,A=new WeakMap,Te=new WeakMap,B=new WeakMap,Se=new WeakMap,o=new WeakSet,ft=async function(t){l(this,o,E).call(this,"Start downloading TFJS face tracker assets...",m.mediaPipe);const e=`${t}/models/`,[i,r,c,d]=await Promise.all([s(this,O).fetchAsset(s(this,P),e,"detectorModel_json.json",!0,"brotli"),s(this,O).fetchAsset(s(this,P),e,"detectorModel_bin.json",!0,"brotli"),s(this,O).fetchAsset(s(this,P),e,"landmarkModel_json.json",!0,"brotli"),s(this,O).fetchAsset(s(this,P),e,"landmarkModel_bin.json",!0,"brotli")]);l(this,o,E).call(this,"TFJS face tracker assets successfully downloaded",m.mediaPipe),f(this,ke,i),f(this,ve,r),f(this,Ae,c),f(this,ye,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,O).fetchAsset(s(this,P),`${t}/extraction/`,`extraction_wasm_${this.getVersion().webSDK}.json`,!0,"brotli"),s(this,O).fetchAsset(s(this,P),`${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,ce,e),f(this,z,i)},Et=function(){if(s(this,b)){const t=e=>{this.on.mediaElementResize&&this.on.mediaElementResize(e)};s(this,g).mediaElement.addEventListener("mediaElementSizeChanged",t)}},He=async function(){s(this,g),l(this,o,ae).call(this,j.NOT_LOADED);const t={faceTrackerCode:s(this,Oe),numOfWorkers:s(this,fe),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,Se),models:{detectorJson:s(this,ke),detectorBin:s(this,ve),landmarkJson:s(this,Ae),landmarkBin:s(this,ye)}};l(this,o,ae).call(this,j.LOADING),f(this,b,await Ei.init(t,s(this,v))),s(this,b).on.faceTrackersReady=(e,i,r,c)=>{l(this,o,E).call(this,`TFJS face tracker version ${i} loaded. Worker name: ${e} - workerId: ${r} - backend: ${c}`,m.mediaPipe),f(this,he,`${i}-${c}`),f(this,q,s(this,q)+1),s(this,v).setVersion(this.getVersion()),s(this,q)===s(this,fe)&&l(this,o,ae).call(this,j.LOADED)},s(this,b).on.frameAvailable=(e,i,r,c,d)=>{!c&&d?s(this,N).worker.postMessage({action:T.NEW_FRAME,payload:{frameNumber:i,frameTimestamp:e,frame:d,lastFrameNumber:r,tracked:c}},[d]):s(this,N).worker.postMessage({action:T.TRACKING_STATUS,payload:{frameNumber:i,frameTimestamp:e,lastFrameNumber:r,tracked:c}})},s(this,b).on.landmarksAvailable=(e,i,r)=>{const c=r/1e3;s(this,B)===0&&f(this,B,c),f(this,Te,c),s(this,b).numOftrackedVideoFrames+=1;const{starRating:d}=s(this,b),n=30,a=Math.min(s(this,Te)-s(this,B),n),u=s(this,B)>0?a/n*100:0,h={video:s(this,b).videoFpsTracker.fps.toFixed(1),faceTracker:s(this,b).faceTrackerFpsTracker.fps.toFixed(1)},p={face:e,annotations:i,starRating:d,percentCompleted:u,fps:h};this.on.facialLandmarksUpdated&&this.on.facialLandmarksUpdated(p)},s(this,b).on.scaleFactorChanged=e=>{f(this,Se,e),s(this,b).scaleFactor=e,s(this,N).worker.postMessage({action:T.SCALE_FACTOR_CHANGED,payload:{scaleFactor:e}})}},Ve=async function(){const t=new TextDecoder().decode(new Uint8Array(s(this,z)));f(this,N,xe.init(t,"module","EXTRACTION_WORKER"));const{studyCfgData:e}=s(this,x).getSession();e&&s(this,ce)&&s(this,z)&&(s(this,N).worker.onmessage=async i=>{const{data:r}=i,{id:c,result:d}=r,{action:n,payload:a}=d,u=s(this,se).get(c);if(u||c===-1){switch(n){case T.READY:{const{sdkId:h,version:p,workerName:_}=a;f(this,de,{version:p,sdkId:h}),l(this,o,E).call(this,`DFX extraction worker WASM loaded. SDK ID: ${h} - Version: ${p} - Worker Name: ${_}`,m.extractionLibWasm),await l(this,o,C).call(this,T.SET_MODE,{value:"discrete"},!0),await l(this,o,C).call(this,T.SET_NUMBER_OF_CHUNKS,{value:s(this,ie)},!0),await l(this,o,C).call(this,T.SET_TARGET_FPS,{value:s(this,ee)},!0),await l(this,o,C).call(this,T.SET_CHUNK_DURATION_SECONDS,{value:s(this,te)},!0),await l(this,o,C).call(this,T.SET_FRAME_ORDER,{value:ot.RGBA},!0),await l(this,o,C).call(this,T.GET_CONSTRAINTS_CONFIG,{},!0),f(this,Le,s(this,pe));break}case T.SET_MODE:{a&&l(this,o,E).call(this,`Set mode to ${a.mode}`,m.extractionLibWasm);break}case T.SET_NUMBER_OF_CHUNKS:{a&&l(this,o,E).call(this,`Set number of chunks to ${d.number}`,m.extractionLibWasm);break}case T.SET_TARGET_FPS:{a&&l(this,o,E).call(this,`Set target FPS to ${s(this,ee)}`,m.extractionLibWasm);break}case T.SET_CHUNK_DURATION_SECONDS:{a&&l(this,o,E).call(this,`Set chunk duration to ${s(this,te)} Seconds`,m.extractionLibWasm);break}case T.SET_FRAME_ORDER:{a&&l(this,o,E).call(this,"Set channel order RGBA",m.extractionLibWasm);break}case T.GET_CONSTRAINTS_CONFIG:{a&&(f(this,pe,a),l(this,o,E).call(this,`Get constraints ${JSON.stringify(a)}`,m.extractionLibWasm));break}case T.SET_CONSTRAINTS_CONFIG:{a&&(f(this,pe,a),l(this,o,E).call(this,`Set constraints ${JSON.stringify(a)}`,m.extractionLibWasm));break}case T.SET_FACE_ATTRIBUTE:{const{success:h,faceId:p,attribute:_,value:R}=a;h&&l(this,o,E).call(this,`Set face attribute: faceId: ${p}, attribute: ${_}, value: ${R}`,m.extractionLibWasm);break}case T.RESET_COLLECTION:{a&&l(this,o,E).call(this,"Reset collection",m.extractionLibWasm);break}case T.CANCEL_COLLECTION:{a&&l(this,o,E).call(this,"Collecttion cancelled",m.extractionLibWasm);break}case T.START_COLLECTION:{a&&l(this,o,E).call(this,`Collector started - state: ${a}`,m.extractionLibWasm);break}case T.SET_PORTS:{a&&l(this,o,E).call(this,"Ports set",m.extractionLibWasm);break}case T.COLLECTOR_ERROR:{if(a){const{error:h,frameNumber:p}=a;l(this,o,E).call(this,`Collector error on frame ${p}: ${h}`,m.extractionLibWasm),this.on.error&&this.on.error(Ce.COLLECTOR,a),await this.stopTracking()}break}case T.STAR_RATING:{s(this,b).starRating=a.rating;break}case T.ALL_FACE_TRACKERS_WARMED_UP:{const{frameNumber:h}=d;s(this,b).warmupFrameNumber=h,l(this,o,E).call(this,"All face tracker workers are warmed up.",m.mediaPipe),l(this,o,ae).call(this,j.READY);break}case T.CONSTRAINTS_UPDATED:{const{feedback:h,status:p}=a;this.on.constraintsUpdated&&this.on.constraintsUpdated(h,p);break}case T.SHOULD_END_MEASUREMENT_EARLY:{const{currentFinalChunkNumber:h,currentResultsOrder:p,newFinalChunkNumber:_}=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: ${_}`,m.extractionLibWasm);break}case T.GET_LOGS:{console.log(`DFX Log: ${a}`);break}case y.CONNECT:{f(this,Z,!0),f(this,B,0),l(this,o,E).call(this,a?"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(a)}`,m.webSocket),this.on.chunkSent&&this.on.chunkSent(a);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: ${a.code}, reason: ${a.reason}, wasClean: ${a.wasClean}`,m.webSocket),this.on.error&&this.on.error(Ce.WEB_SOCKET,a);break}case y.CHUNK_ACKNOWLEDGED:{l(this,o,E).call(this,`Chunk number ${a.chunkOrder} received by the server!`,m.webSocket),s(this,Q)===a.chunkOrder&&await this.stopTracking();break}case y.RESULTS_RECEIVED:{const{resultsOrder:h,finalChunkNumber:p}=a;this.on.resultsReceived&&this.on.resultsReceived(a),l(this,o,E).call(this,`Results received: ${JSON.stringify(a)}`,m.webSocket),h===p&&(await l(this,o,C).call(this,y.DISCONNECT,{},!0),await l(this,o,Ke).call(this),await l(this,o,Ie).call(this));break}case y.NETWORK_DELAY:{const{delay:h,description:p,actionId:_}=a;l(this,o,E).call(this,`Round-trip delay for ${p} call with Action ID ${_} was ${h.toFixed(2)} ms`,m.webSocket,{delay:h,actionId:_,description:p});break}case y.ERROR:{l(this,o,E).call(this,"Error",m.webSocket),this.on.error&&this.on.error(Ce.WEB_SOCKET,a);break}}u&&(u.resolve(d),s(this,se).delete(c))}},await l(this,o,C).call(this,T.INIT,{wasm:s(this,ce),studyConfigData:e,isLogging:s(this,g).logger?.extractionWorker||!1,metrics:s(this,g).metrics||!1,apiUrl:s(this,g).apiUrl,scaleFactor:s(this,Se)},!0))},Tt=async function(){if(s(this,b)&&s(this,Y)){const{age:e,height:i,weight:r,sex:c,smoking:d,bloodPressureMedication:n,diabetes:a}=s(this,Y);await l(this,o,C).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:K.SEX_ASSIGNED_AT_BIRTH,value:c},!0),await l(this,o,C).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:K.AGE_YEARS,value:e},!0),await l(this,o,C).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:K.HEIGHT_CM,value:i},!0),await l(this,o,C).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:K.WEIGHT_KG,value:r},!0),await l(this,o,C).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:K.SMOKER,value:d},!0),await l(this,o,C).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:K.BLOOD_PRESSURE_MEDICATION,value:n},!0),await l(this,o,C).call(this,T.SET_FACE_ATTRIBUTE,{faceId:"1",attribute:K.DIABETES,value:a},!0),l(this,o,E).call(this,`Set demographics for Face ID 1, ${JSON.stringify(s(this,Y))}`,m.extractionLibWasm)}},St=function(){},bt=function(){const t=new Date().toISOString();st(t)&&(l(this,o,E).call(this,`Action ID: ${s(this,A)}`,m.beforeRESTCall),this.on.beforeRESTCall&&this.on.beforeRESTCall(t,s(this,A)))},_t=function(t,e){},gt=function(t,e){const i=new Date().toISOString();st(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))},wt=async function(){await l(this,o,C).call(this,T.CANCEL_COLLECTION,{},!0)},Ie=async function(){await l(this,o,C).call(this,T.START_COLLECTION,{},!0)},Ke=async function(){await l(this,o,C).call(this,T.RESET_COLLECTION,{},!0),await l(this,o,C).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),r=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:r,actionId:s(this,A),description:"Validate Token"}),c==="200"){const{Region:n}=d;return{region:n,status:c}}else return{status:c,region:""}},Rt=async function(t,e,i){f(this,A,2304);const r=performance.now(),c=await s(this,x).http.auths.renew({Token:t,RefreshToken:e},i),d=performance.now()-r,{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"},kt=async function(t,e){f(this,A,806);const i=performance.now();f(this,Ne,t);const r=await s(this,x).http.studies.retrieveSdkConfigData({StudyID:t,...e&&{sdkId:e}},"user"),c=performance.now()-i,{status:d}=r;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"},vt=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,Ne),Resolution:100};t.partnerId&&(i.PartnerID=t.partnerId),t.userProfileId&&(i.UserProfileID=t.userProfileId);const r=await s(this,x).http.measurements.create(i,"user"),c=performance.now()-e,{status:d,body:n}=r;let a="";d==="200"?(f(this,F,n.ID),a=`Successfully obtained measurement ID: ${s(this,F)}`):(f(this,F,""),a=`Failed to obtain measurement ID. Status: ${d}`),l(this,o,E).call(this,a,m.apiClient,{delay:c,actionId:s(this,A),measurementId:s(this,F),description:"Get Measurement ID"})},ae=function(t){f(this,me,t),l(this,o,E).call(this,`Face tracker state changed: ${t}`,m.mediaPipe),this.on.faceTrackerStateChanged&&this.on.faceTrackerStateChanged(s(this,me))},C=function(t,e,i=!1){return new Promise(r=>{const c=bi(this,De)._++;s(this,se).set(c,{resolve:r,action:t});const d=()=>s(this,N).worker.postMessage({id:c,action:t,payload:e});i?f(this,Ee,s(this,Ee).then(d).catch(n=>console.error(n))):d()})},ut(_i,"VERSION",Je);const gi=document.documentElement.style.overflow;class wi{static VERSION=Nt;#e=document.createElement("div");#t=document.createElement("div");on={results:null,error:null,event:null};constructor(){this.#e.style.height="100%"}init(e){const{container:i,appPath:r,settings:c,profile:d,config:n,loadError:a,language:u,apiUrl:h}=e;this.#t=i,document.body.appendChild(i);const p=i.attachShadow({mode:"open"});document.documentElement.style.overflow="hidden";const _="app",R=document.createElement("link");R.rel="stylesheet",R.href=`${r}/stylex.css`,p.appendChild(R);const k=document.createElement("link");k.rel="stylesheet",k.href=`${r}/${_}.css`,p.appendChild(k);const L=H=>{this.on.results&&this.on.results({...H.detail})},W=H=>{this.on.error&&this.on.error({...H.detail})},G=H=>{this.on.event&&this.on.event({...H.detail})};this.#e.addEventListener($.RESULTS,L),this.#e.addEventListener($.ERROR,W),this.#e.addEventListener($.APPEVENT,G),p.appendChild(this.#e);const M=document.createElement("script");M.type="module",M.src=`${r}/${_}.mjs`,M.onload=()=>{import(M.src).then(H=>{H.app.init(this.#e,r,c,d,h,n,u)}).catch(()=>{a&&a("Failed to initialize Measurement Embedded React app")})},M.onerror=()=>{a&&a("Failed to load the measurement embedded app script")},p.appendChild(M)}destroy(){const e=new CustomEvent("measurement-embedded-app-action",{detail:{action:re.DESTROY,data:{}}});this.#e.dispatchEvent(e),document.documentElement.style.overflow=gi,this.#t&&document.body.contains(this.#t)&&document.body.removeChild(this.#t)}setTheme(e){const i=new CustomEvent("measurement-embedded-app-action",{detail:{action:re.SET_THEME,data:{theme:e}}});this.#e.dispatchEvent(i)}setLanguage(e){const i=new CustomEvent("measurement-embedded-app-action",{detail:{action:re.SET_LANGUAGE,data:{language:e}}});this.#e.dispatchEvent(i)}async cancel(e){return new Promise(i=>{const r=d=>{this.#e.removeEventListener($.CANCELLED,r),i(d.detail.reset)};this.#e.addEventListener($.CANCELLED,r);const c=new CustomEvent("measurement-embedded-app-action",{detail:{action:re.CANCEL,data:{reset:e}}});this.#e.dispatchEvent(c)})}getLogs(){return new Promise(e=>{const i=c=>{this.#e.removeEventListener($.LOGS,i),e(c.detail.logs)};this.#e.addEventListener($.LOGS,i);const r=new CustomEvent("measurement-embedded-app-action",{detail:{action:re.GET_LOGS,data:{}}});this.#e.dispatchEvent(r)})}}export{Ye as ErrorCodes,Lt as appEvents,wi as default,di as faceAttributeValue,je as logCategory,$ as measurementEmbeddedAppEvents};
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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuralogix.ai/web-measurement-embedded-app",
3
- "version": "0.1.0-beta.2",
3
+ "version": "0.1.0-beta.4",
4
4
  "description": "Web Measurement Embedded App",
5
5
  "homepage": "https://docs.deepaffex.ai/wmea/",
6
6
  "contributors": [
@@ -1 +0,0 @@
1
- {"fileName":"extraction_worker_0.1.0-beta.1_js.js","mimeType":"text/javascript","base64EncodedValue":"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"}