@monitordog/detector 1.0.3 → 1.0.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/README.md +17 -0
- package/dist/assets/{inference-worker-EjUccpPR.js → inference-worker-jrK75m_K.js} +2 -2
- package/dist/assets/sdk/detector-320.onnx.enc +0 -0
- package/dist/assets/sdk/detector-416.onnx.enc +0 -0
- package/dist/assets/sdk/detector-640.onnx.enc +0 -0
- package/dist/detect/model-loader.d.ts +2 -1
- package/dist/index.d.ts +1 -1
- package/dist/monitordog-detector.js +116 -97
- package/dist/monitordog-detector.umd.cjs +1 -1
- package/dist/runtime-options.d.ts +7 -0
- package/dist/types.d.ts +3 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,6 +7,10 @@ import { MonitorDogDetector } from "@monitordog/detector";
|
|
|
7
7
|
|
|
8
8
|
const detector = await MonitorDogDetector.init({
|
|
9
9
|
apiBaseUrl: "https://dev-api.monitor.dog/v1",
|
|
10
|
+
// 앱이 SDK runtime asset을 별도 static 경로로 복사해 노출하는 경우 지정합니다.
|
|
11
|
+
runtimeAssetBaseUrl: "/assets/monitordog",
|
|
12
|
+
// "auto"는 데스크톱 640, 모바일/태블릿 416으로 시작합니다.
|
|
13
|
+
modelInputSize: "auto",
|
|
10
14
|
sessionTokenProvider: async ({ email }) => {
|
|
11
15
|
const response = await fetch("/api/monitordog/sdk-session", {
|
|
12
16
|
method: "POST",
|
|
@@ -25,3 +29,16 @@ await detector.start();
|
|
|
25
29
|
```
|
|
26
30
|
|
|
27
31
|
이 패키지는 입력 크기 `320`, `416`, `640`용 암호화된 detector ONNX 자산을 포함합니다. 브라우저에서는 `onnxruntime-web` WebAssembly를 로컬로 사용하고, `/auth/sdk-asset-key`에서는 패키지 자산 복호화에 필요한 DEK만 요청합니다.
|
|
32
|
+
|
|
33
|
+
## Runtime assets
|
|
34
|
+
|
|
35
|
+
SDK를 앱 workspace/root에 설치하면 JS 번들은 import되어도 패키지의 runtime asset이 앱의 정적 파일 경로로 자동 배포되지 않을 수 있습니다. 이 경우 `node_modules/@monitordog/detector/dist/assets/` 전체를 앱의 static 디렉터리로 복사하고, 노출 URL을 `runtimeAssetBaseUrl`로 지정하세요.
|
|
36
|
+
|
|
37
|
+
예를 들어 앱이 복사한 파일을 `/assets/monitordog/`에서 제공한다면 SDK는 다음 경로를 사용합니다.
|
|
38
|
+
|
|
39
|
+
- detector model: `/assets/monitordog/sdk/detector-640.onnx.enc`
|
|
40
|
+
- ORT wasm runtime: `/assets/monitordog/ort/`
|
|
41
|
+
|
|
42
|
+
`runtimeAssetBaseUrl`을 지정하지 않으면 SDK는 기존처럼 worker JS 위치 기준의 `./sdk/`, `./ort/`에서 asset을 읽습니다. `.onnx.enc`만 복사하면 `onnxruntime-web` wasm 파일을 찾지 못할 수 있으므로 `dist/assets/` 전체를 복사해야 합니다.
|
|
43
|
+
|
|
44
|
+
`modelInputSize`는 초기 모델 크기 선택 옵션입니다. 기본값 `"auto"`는 데스크톱에서 `640`, 모바일/태블릿에서 `416`으로 시작하며, `320`, `416`, `640`을 직접 지정할 수 있습니다. 메모리 부족이 발생하면 기존과 동일하게 `640 -> 416 -> 320` 순서로 fallback합니다. 이 옵션은 runtime asset 404를 해결하는 옵션이 아니며, asset 경로 문제는 `runtimeAssetBaseUrl`로 처리합니다.
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
5
5
|
* Licensed under the MIT License.
|
|
6
6
|
*/
|
|
7
|
-
var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,i=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error(`Dynamic require of "`+e+`" is not supported`)}),a=(e,t)=>()=>(e&&(t=e(e=0)),t),o=(t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})},s=(i,a,o,s)=>{if(a&&typeof a==`object`||typeof a==`function`)for(let c of n(a))!r.call(i,c)&&c!==o&&e(i,c,{get:()=>a[c],enumerable:!(s=t(a,c))||s.enumerable});return i},c=t=>s(e({},`__esModule`,{value:!0}),t),l,u,d,f,p,m=a(()=>{"use strict";l=new Map,u=[],d=(e,t,n)=>{if(t&&typeof t.init==`function`&&typeof t.createInferenceSessionHandler==`function`){let r=l.get(e);if(r===void 0)l.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let t=u.indexOf(e);t!==-1&&u.splice(t,1);for(let t=0;t<u.length;t++)if(l.get(u[t]).priority<=n){u.splice(t,0,e);return}u.push(e)}return}throw TypeError(`not a valid backend`)},f=async e=>{let t=l.get(e);if(!t)return`backend not found.`;if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(e){return n||(t.error=`${e}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},p=async e=>{let t=e.executionProviders||[],n=t.map(e=>typeof e==`string`?e:e.name),r=n.length===0?u:n,i,a=[],o=new Set;for(let e of r){let t=await f(e);typeof t==`string`?a.push({name:e,err:t}):(i||=t,i===t&&o.add(e))}if(!i)throw Error(`no available backend found. ERR: ${a.map(e=>`[${e.name}] ${e.err}`).join(`, `)}`);for(let{name:e,err:t}of a)n.includes(e)&&console.warn(`removing requested execution provider "${e}" from session options because it is not available: ${t}`);let s=t.filter(e=>o.has(typeof e==`string`?e:e.name));return[i,new Proxy(e,{get:(e,t)=>t===`executionProviders`?s:Reflect.get(e,t)})]}}),h=a(()=>{"use strict";m()}),g,_=a(()=>{"use strict";g=`1.24.3`}),v,y,b=a(()=>{"use strict";_(),v=`warning`,y={wasm:{},webgl:{},webgpu:{},versions:{common:g},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);v=e}},get logLevel(){return v}},Object.defineProperty(y,"logLevel",{enumerable:!0})}),x,S=a(()=>{"use strict";b(),x=y}),ee,te,C=a(()=>{"use strict";ee=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t<a;t++)for(let n=0;n<i;n++){let i=(e.data[d++]-l[0])*c[0],a=(e.data[f++]-l[1])*c[1],o=(e.data[p++]-l[2])*c[2],s=m===-1?255:(e.data[m++]-l[3])*c[3];r.fillStyle=`rgba(`+i+`,`+a+`,`+o+`,`+s+`)`,r.fillRect(n,t,1,1)}if(`toDataURL`in n)return n.toDataURL();throw Error(`toDataURL is not supported`)}else throw Error(`Can not access image data`)},te=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t!==void 0&&t.format!==void 0?t.format:`RGB`,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t<a*i;f+=4,p+=4,m+=4,h+=4,t++)r.data[f]=(e.data[g++]-u[0])*l[0],r.data[p]=(e.data[_++]-u[1])*l[1],r.data[m]=(e.data[v++]-u[2])*l[2],r.data[h]=y===-1?255:(e.data[y++]-u[3])*l[3]}else throw Error(`Can not access image data`);return r}}),w,ne,re,ie,ae,oe,se=a(()=>{"use strict";me(),w=(e,t)=>{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:`RGB`,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t<l;t++,f+=d,m+=d,p+=d,h+=d)u[g++]=(e[f]+o[0])/a[0],u[_++]=(e[p]+o[1])/a[1],u[v++]=(e[m]+o[2])/a[2],y!==-1&&h!==-1&&(u[y++]=(e[h]+o[3])/a[3]);return c===`RGBA`?new D(`float32`,u,[1,4,n,r]):new D(`float32`,u,[1,3,n,r])},ne=async(e,t)=>{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,w(o,s)}else throw Error(`Can not access image data`)}else{if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(w(e.data,s))}});throw Error(`Input data provided is not supported - aborted tensor creation`)}if(o!==void 0)return w(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},re=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new D({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ie=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new D({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},ae=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new D({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},oe=(e,t,n)=>new D({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]})}),T,E,ce,le,ue=a(()=>{"use strict";T=new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),E=new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]),ce=!1,le=()=>{if(!ce){ce=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<`u`&&n.from;e&&(T.set(`int64`,BigInt64Array),E.set(BigInt64Array,`int64`)),t&&(T.set(`uint64`,BigUint64Array),E.set(BigUint64Array,`uint64`)),r?(T.set(`float16`,n),E.set(n,`float16`)):T.set(`float16`,Uint16Array)}}}),de,fe,pe=a(()=>{"use strict";me(),de=e=>{let t=1;for(let n=0;n<e.length;n++){let r=e[n];if(typeof r!=`number`||!Number.isSafeInteger(r))throw TypeError(`dims[${n}] must be an integer, got: ${r}`);if(r<0)throw RangeError(`dims[${n}] must be a non-negative integer, got: ${r}`);t*=r}return t},fe=(e,t)=>{switch(e.location){case`cpu`:return new D(e.type,e.data,t);case`cpu-pinned`:return new D({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new D({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new D({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new D({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),D,me=a(()=>{"use strict";C(),se(),ue(),pe(),D=class{constructor(e,t,n){le();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=T.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`)if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=T.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray)if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`);else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=E.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=de(i);if(this.cpuData&&a!==this.cpuData.length&&!((r===`uint4`||r===`int4`)&&Math.ceil(a/2)===this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return ne(e,t)}static fromTexture(e,t){return re(e,t)}static fromGpuBuffer(e,t){return ie(e,t)}static fromMLTensor(e,t){return ae(e,t)}static fromPinnedBuffer(e,t,n){return oe(e,t,n)}toDataURL(e){return ee(this,e)}toImageData(e){return te(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return fe(this,e)}}}),O,he=a(()=>{"use strict";me(),O=D}),ge,_e,k,A,j,M,ve=a(()=>{"use strict";b(),ge=(e,t)=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||console.timeStamp(`${e}::ORT::${t}`)},_e=(e,t)=>{let n=Error().stack?.split(/\r\n|\r|\n/g)||[],r=!1;for(let i=0;i<n.length;i++){if(r&&!n[i].includes(`TRACE_FUNC`)){let r=`FUNC_${e}::${n[i].trim().split(` `)[1]}`;t&&(r+=`::${t}`),ge(`CPU`,r);return}n[i].includes(`TRACE_FUNC`)&&(r=!0)}},k=e=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||_e(`BEGIN`,e)},A=e=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||_e(`END`,e)},j=e=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||console.time(`ORT::${e}`)},M=e=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||console.timeEnd(`ORT::${e}`)}}),ye,be=a(()=>{"use strict";m(),he(),ve(),ye=class e{constructor(e){this.handler=e}async run(e,t,n){k(),j(`InferenceSession.run`);let r={},i={};if(typeof e!=`object`||!e||e instanceof O||Array.isArray(e))throw TypeError(`'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.`);let a=!0;if(typeof t==`object`){if(t===null)throw TypeError(`Unexpected argument[1]: cannot be null.`);if(t instanceof O)throw TypeError(`'fetches' cannot be a Tensor`);if(Array.isArray(t)){if(t.length===0)throw TypeError(`'fetches' cannot be an empty array.`);a=!1;for(let e of t){if(typeof e!=`string`)throw TypeError(`'fetches' must be a string array or an object.`);if(this.outputNames.indexOf(e)===-1)throw RangeError(`'fetches' contains invalid output name: ${e}.`);r[e]=null}if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else{let e=!1,o=Object.getOwnPropertyNames(t);for(let n of this.outputNames)if(o.indexOf(n)!==-1){let i=t[n];(i===null||i instanceof O)&&(e=!0,a=!1,r[n]=i)}if(e){if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else i=t}}else if(typeof t<`u`)throw TypeError(`Unexpected argument[1]: must be 'fetches' or 'options'.`);for(let t of this.inputNames)if(typeof e[t]>`u`)throw Error(`input '${t}' is missing in 'feeds'.`);if(a)for(let e of this.outputNames)r[e]=null;let o=await this.handler.run(e,r,i),s={};for(let e in o)if(Object.hasOwnProperty.call(o,e)){let t=o[e];t instanceof O?s[e]=t:s[e]=new O(t.type,t.data,t.dims)}return M(`InferenceSession.run`),A(),s}async release(){return this.handler.dispose()}static async create(t,n,r,i){k(),j(`InferenceSession.create`);let a,o={};if(typeof t==`string`){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof Uint8Array){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&t instanceof SharedArrayBuffer){let e=t,s=0,c=t.byteLength;if(typeof n==`object`&&n)o=n;else if(typeof n==`number`){if(s=n,!Number.isSafeInteger(s))throw RangeError(`'byteOffset' must be an integer.`);if(s<0||s>=e.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${e.byteLength}).`);if(c=t.byteLength-s,typeof r==`number`){if(c=r,!Number.isSafeInteger(c))throw RangeError(`'byteLength' must be an integer.`);if(c<=0||s+c>e.byteLength)throw RangeError(`'byteLength' is out of range (0, ${e.byteLength-s}].`);if(typeof i==`object`&&i)o=i;else if(typeof i<`u`)throw TypeError(`'options' must be an object.`)}else if(typeof r<`u`)throw TypeError(`'byteLength' must be a number.`)}else if(typeof n<`u`)throw TypeError(`'options' must be an object.`);a=new Uint8Array(e,s,c)}else throw TypeError(`Unexpected argument[0]: must be 'path' or 'buffer'.`);let[s,c]=await p(o),l=await s.createInferenceSessionHandler(a,c);return M(`InferenceSession.create`),A(),new e(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),xe,Se=a(()=>{"use strict";be(),xe=ye}),Ce=a(()=>{"use strict";}),we=a(()=>{"use strict";}),Te=a(()=>{"use strict";}),Ee=a(()=>{"use strict";});o({},{InferenceSession:()=>xe,TRACE:()=>ge,TRACE_EVENT_BEGIN:()=>j,TRACE_EVENT_END:()=>M,TRACE_FUNC_BEGIN:()=>k,TRACE_FUNC_END:()=>A,Tensor:()=>O,env:()=>x,registerBackend:()=>d});var N=a(()=>{"use strict";h(),S(),Se(),he(),Ce(),we(),ve(),Te(),Ee()}),De=a(()=>{"use strict";}),Oe={};o(Oe,{default:()=>je});var ke,Ae,je,Me=a(()=>{"use strict";jt(),L(),Ke(),ke=`ort-wasm-proxy-worker`,Ae=globalThis.self?.name===ke,Ae&&(self.onmessage=e=>{let{type:t,in:n}=e.data;try{switch(t){case`init-wasm`:$e(n.wasm).then(()=>{bt(n).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})})},e=>{postMessage({type:t,err:e})});break;case`init-ep`:{let{epName:e,env:r}=n;xt(r,e).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})});break}case`copy-from`:{let{buffer:e}=n,r=wt(e);postMessage({type:t,out:r});break}case`create`:{let{model:e,options:r}=n;Tt(e,r).then(e=>{postMessage({type:t,out:e})},e=>{postMessage({type:t,err:e})});break}case`release`:Et(n),postMessage({type:t});break;case`run`:{let{sessionId:e,inputIndices:r,inputs:i,outputIndices:a,options:o}=n;Ot(e,r,i,a,Array(a.length).fill(null),o).then(e=>{e.some(e=>e[3]!==`cpu`)?postMessage({type:t,err:`Proxy does not support non-cpu tensor location.`}):postMessage({type:t,out:e},At([...i,...e]))},e=>{postMessage({type:t,err:e})});break}case`end-profiling`:kt(n),postMessage({type:t});break;default:}}catch(e){postMessage({type:t,err:e})}}),je=Ae?null:e=>new Worker(e??P,{type:`module`,name:ke})}),Ne,Pe,Fe,P,Ie,Le,Re,ze,Be,Ve,He,Ue,We,Ge,Ke=a(()=>{"use strict";De(),Ne=typeof location>`u`?void 0:location.origin,Pe=self.location.href>`file:`&&self.location.href<`file;`,Fe=()=>Pe?new URL(new URL(`ort.wasm.min.mjs`,self.location.href).href,Ne).href:self.location.href,P=Fe(),Ie=()=>{if(P&&!P.startsWith(`blob:`))return P.substring(0,P.lastIndexOf(`/`)+1)},Le=(e,t)=>{try{let n=t??P;return(n?new URL(e,n):new URL(e)).origin===Ne}catch{return!1}},Re=(e,t)=>{let n=t??P;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},ze=(e,t)=>`${t??`./`}${e}`,Be=async e=>{let t=await(await fetch(e,{credentials:`same-origin`})).blob();return URL.createObjectURL(t)},Ve=async e=>(await import(e)).default,He=(Me(),c(Oe)).default,Ue=async()=>{if(!P)throw Error(`Failed to load proxy worker: cannot determine the script source URL.`);if(Le(P))return[void 0,He()];let e=await Be(P);return[e,He(e)]},We=void 0,Ge=async(e,t,n,r)=>{let i=We&&!(e||t);if(i)if(P)i=Le(P)||r&&!n;else if(r&&!n)i=!0;else throw Error(`cannot determine the script source URL.`);if(i)return[void 0,We];{let r=`ort-wasm-simd-threaded.mjs`,i=e??Re(r,t),a=n&&i&&!Le(i,t),o=a?await Be(i):i??ze(r,t);return[a?o:void 0,await Ve(o)]}}}),qe,Je,F,Ye,Xe,Ze,Qe,$e,I,L=a(()=>{"use strict";Ke(),Je=!1,F=!1,Ye=!1,Xe=()=>{if(typeof SharedArrayBuffer>`u`)return!1;try{return typeof MessageChannel<`u`&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},Ze=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},Qe=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},$e=async e=>{if(Je)return Promise.resolve();if(F)throw Error(`multiple calls to 'initializeWebAssembly()' detected.`);if(Ye)throw Error(`previous call to 'initializeWebAssembly()' failed.`);F=!0;let t=e.initTimeout,n=e.numThreads;if(e.simd!==!1){if(e.simd===`relaxed`){if(!Qe())throw Error(`Relaxed WebAssembly SIMD is not supported in the current environment.`)}else if(!Ze())throw Error(`WebAssembly SIMD is not supported in the current environment.`)}let r=Xe();n>1&&!r&&(typeof self<`u`&&!self.crossOriginIsolated&&console.warn(`env.wasm.numThreads is set to `+n+`, but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info.`),console.warn(`WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading.`),e.numThreads=n=1);let i=e.wasmPaths,a=typeof i==`string`?i:void 0,o=i?.mjs,s=o?.href??o,c=i?.wasm,l=c?.href??c,u=e.wasmBinary,[d,f]=await Ge(s,a,n>1,!!u||!!l),p=!1,m=[];if(t>0&&m.push(new Promise(e=>{setTimeout(()=>{p=!0,e()},t)})),m.push(new Promise((e,t)=>{let r={numThreads:n};if(u)r.wasmBinary=u,r.locateFile=e=>e;else if(l||a)r.locateFile=e=>l??a+e;else if(s&&s.indexOf(`blob:`)!==0)r.locateFile=e=>new URL(e,s).href;else if(d){let e=Ie();e&&(r.locateFile=t=>e+t)}f(r).then(t=>{F=!1,Je=!0,qe=t,e(),d&&URL.revokeObjectURL(d)},e=>{F=!1,Ye=!0,t(e)})})),await Promise.race(m),p)throw Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},I=()=>{if(Je&&qe)return qe;throw Error(`WebAssembly is not initialized yet.`)}}),R,et,z,tt=a(()=>{"use strict";L(),R=(e,t)=>{let n=I(),r=n.lengthBytesUTF8(e)+1,i=n._malloc(r);return n.stringToUTF8(e,i,r),t.push(i),i},et=(e,t,n,r)=>{if(typeof e==`object`&&e){if(n.has(e))throw Error(`Circular reference in options`);n.add(e)}Object.entries(e).forEach(([e,i])=>{let a=t?t+e:e;if(typeof i==`object`)et(i,a+`.`,n,r);else if(typeof i==`string`||typeof i==`number`)r(a,i.toString());else if(typeof i==`boolean`)r(a,i?`1`:`0`);else throw Error(`Can't handle extra config type: ${typeof i}`)})},z=e=>{let t=I(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetLastError(r,r+n);let i=Number(t.getValue(r,n===4?`i32`:`i64`)),a=t.getValue(r+n,`*`),o=a?t.UTF8ToString(a):``;throw Error(`${e} ERROR_CODE: ${i}, ERROR_MESSAGE: ${o}`)}finally{t.stackRestore(n)}}}),nt,rt=a(()=>{"use strict";L(),tt(),nt=e=>{let t=I(),n=0,r=[],i=e||{};try{if(e?.logSeverityLevel===void 0)i.logSeverityLevel=2;else if(typeof e.logSeverityLevel!=`number`||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw Error(`log severity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)i.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!=`number`||!Number.isInteger(e.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(i.terminate=!1);let a=0;return e?.tag!==void 0&&(a=R(e.tag,r)),n=t._OrtCreateRunOptions(i.logSeverityLevel,i.logVerbosityLevel,!!i.terminate,a),n===0&&z(`Can't create run options.`),e?.extra!==void 0&&et(e.extra,``,new WeakSet,(e,i)=>{let a=R(e,r),o=R(i,r);t._OrtAddRunConfigEntry(n,a,o)!==0&&z(`Can't set a run config entry: ${e} - ${i}.`)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(e=>t._free(e)),e}}}),it,at,ot,B,st,ct,lt=a(()=>{"use strict";L(),tt(),it=e=>{switch(e){case`disabled`:return 0;case`basic`:return 1;case`extended`:return 2;case`layout`:return 3;case`all`:return 99;default:throw Error(`unsupported graph optimization level: ${e}`)}},at=e=>{switch(e){case`sequential`:return 0;case`parallel`:return 1;default:throw Error(`unsupported execution mode: ${e}`)}},ot=e=>{e.extra||={},e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||=`1`,e.executionProviders&&e.executionProviders.some(e=>(typeof e==`string`?e:e.name)===`webgpu`)&&(e.enableMemPattern=!1)},B=(e,t,n,r)=>{let i=R(t,r),a=R(n,r);I()._OrtAddSessionConfigEntry(e,i,a)!==0&&z(`Can't set a session config entry: ${t} - ${n}.`)},st=async(e,t,n)=>{let r=t.executionProviders;for(let t of r){let r=typeof t==`string`?t:t.name,i=[];switch(r){case`webnn`:if(r=`WEBNN`,typeof t!=`string`){let r=t?.deviceType;r&&B(e,`deviceType`,r,n)}break;case`webgpu`:if(r=`JS`,typeof t!=`string`){let r=t;if(r?.preferredLayout){if(r.preferredLayout!==`NCHW`&&r.preferredLayout!==`NHWC`)throw Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${r.preferredLayout}`);B(e,`preferredLayout`,r.preferredLayout,n)}}break;case`wasm`:case`cpu`:continue;default:throw Error(`not supported execution provider: ${r}`)}let a=R(r,n),o=i.length,s=0,c=0;if(o>0){s=I()._malloc(o*I().PTR_SIZE),n.push(s),c=I()._malloc(o*I().PTR_SIZE),n.push(c);for(let e=0;e<o;e++)I().setValue(s+e*I().PTR_SIZE,i[e][0],`*`),I().setValue(c+e*I().PTR_SIZE,i[e][1],`*`)}await I()._OrtAppendExecutionProvider(e,a,s,c,o)!==0&&z(`Can't append execution provider: ${r}.`)}},ct=async e=>{let t=I(),n=0,r=[],i=e||{};ot(i);try{let e=it(i.graphOptimizationLevel??`all`),a=at(i.executionMode??`sequential`),o=typeof i.logId==`string`?R(i.logId,r):0,s=i.logSeverityLevel??2;if(!Number.isInteger(s)||s<0||s>4)throw Error(`log severity level is not valid: ${s}`);let c=i.logVerbosityLevel??0;if(!Number.isInteger(c)||c<0||c>4)throw Error(`log verbosity level is not valid: ${c}`);let l=typeof i.optimizedModelFilePath==`string`?R(i.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(e,!!i.enableCpuMemArena,!!i.enableMemPattern,a,!!i.enableProfiling,0,o,s,c,l),n===0&&z(`Can't create session options.`),i.executionProviders&&await st(n,i,r),i.enableGraphCapture!==void 0){if(typeof i.enableGraphCapture!=`boolean`)throw Error(`enableGraphCapture must be a boolean value: ${i.enableGraphCapture}`);B(n,`enableGraphCapture`,i.enableGraphCapture.toString(),r)}if(i.freeDimensionOverrides)for(let[e,a]of Object.entries(i.freeDimensionOverrides)){if(typeof e!=`string`)throw Error(`free dimension override name must be a string: ${e}`);if(typeof a!=`number`||!Number.isInteger(a)||a<0)throw Error(`free dimension override value must be a non-negative integer: ${a}`);let i=R(e,r);t._OrtAddFreeDimensionOverride(n,i,a)!==0&&z(`Can't set a free dimension override: ${e} - ${a}.`)}return i.extra!==void 0&&et(i.extra,``,new WeakSet,(e,t)=>{B(n,e,t,r)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&z(`Can't release session options.`),r.forEach(e=>t._free(e)),e}}}),V,ut,H,dt,ft,pt,mt,ht,gt=a(()=>{"use strict";V=e=>{switch(e){case`int8`:return 3;case`uint8`:return 2;case`bool`:return 9;case`int16`:return 5;case`uint16`:return 4;case`int32`:return 6;case`uint32`:return 12;case`float16`:return 10;case`float32`:return 1;case`float64`:return 11;case`string`:return 8;case`int64`:return 7;case`uint64`:return 13;case`int4`:return 22;case`uint4`:return 21;default:throw Error(`unsupported data type: ${e}`)}},ut=e=>{switch(e){case 3:return`int8`;case 2:return`uint8`;case 9:return`bool`;case 5:return`int16`;case 4:return`uint16`;case 6:return`int32`;case 12:return`uint32`;case 10:return`float16`;case 1:return`float32`;case 11:return`float64`;case 8:return`string`;case 7:return`int64`;case 13:return`uint64`;case 22:return`int4`;case 21:return`uint4`;default:throw Error(`unsupported data type: ${e}`)}},H=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t==`number`?t:t.reduce((e,t)=>e*t,1);return n>0?Math.ceil(r*n):void 0},dt=e=>{switch(e){case`float16`:return typeof Float16Array<`u`&&Float16Array.from?Float16Array:Uint16Array;case`float32`:return Float32Array;case`uint8`:return Uint8Array;case`int8`:return Int8Array;case`uint16`:return Uint16Array;case`int16`:return Int16Array;case`int32`:return Int32Array;case`bool`:return Uint8Array;case`float64`:return Float64Array;case`uint32`:return Uint32Array;case`int64`:return BigInt64Array;case`uint64`:return BigUint64Array;default:throw Error(`unsupported type: ${e}`)}},ft=e=>{switch(e){case`verbose`:return 0;case`info`:return 1;case`warning`:return 2;case`error`:return 3;case`fatal`:return 4;default:throw Error(`unsupported logging level: ${e}`)}},pt=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,mt=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint64`||e===`int8`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,ht=e=>{switch(e){case`none`:return 0;case`cpu`:return 1;case`cpu-pinned`:return 2;case`texture`:return 3;case`gpu-buffer`:return 4;case`ml-tensor`:return 5;default:throw Error(`unsupported data location: ${e}`)}}}),_t,vt=a(()=>{"use strict";De(),_t=async e=>{if(typeof e==`string`){let t=await fetch(e);if(!t.ok)throw Error(`failed to load external data file: ${e}`);let n=t.headers.get(`Content-Length`),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw Error(`failed to load external data file: ${e}, no response body.`);let n=t.body.getReader(),i;try{i=new ArrayBuffer(r)}catch(e){if(e instanceof RangeError){let e=Math.ceil(r/65536);i=new WebAssembly.Memory({initial:e,maximum:e}).buffer}else throw e}let a=0;for(;;){let{done:e,value:t}=await n.read();if(e)break;let r=t.byteLength;new Uint8Array(i,a,r).set(t),a+=r}return new Uint8Array(i,0,r)}}else return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),yt,bt,xt,U,St,Ct,wt,Tt,Et,Dt,Ot,kt,At,jt=a(()=>{"use strict";N(),rt(),lt(),gt(),L(),tt(),vt(),yt=(e,t)=>{I()._OrtInit(e,t)!==0&&z(`Can't initialize onnxruntime.`)},bt=async e=>{yt(e.wasm.numThreads,ft(e.logLevel))},xt=async(e,t)=>{I().asyncInit?.();let n=e.webgpu.adapter;if(t===`webgpu`){if(typeof navigator>`u`||!navigator.gpu)throw Error(`WebGPU is not supported in current environment`);if(n){if(typeof n.limits!=`object`||typeof n.features!=`object`||typeof n.requestDevice!=`function`)throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let t=e.webgpu.powerPreference;if(t!==void 0&&t!==`low-power`&&t!==`high-performance`)throw Error(`Invalid powerPreference setting: "${t}"`);let r=e.webgpu.forceFallbackAdapter;if(r!==void 0&&typeof r!=`boolean`)throw Error(`Invalid forceFallbackAdapter setting: "${r}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:t,forceFallbackAdapter:r}),!n)throw Error(`Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.`)}}if(t===`webnn`&&(typeof navigator>`u`||!navigator.ml))throw Error(`WebNN is not supported in current environment`)},U=new Map,St=e=>{let t=I(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetInputOutputCount(e,r,r+n)!==0&&z(`Can't get session input/output count.`);let i=n===4?`i32`:`i64`;return[Number(t.getValue(r,i)),Number(t.getValue(r+n,i))]}finally{t.stackRestore(n)}},Ct=(e,t)=>{let n=I(),r=n.stackSave(),i=0;try{let r=n.PTR_SIZE,a=n.stackAlloc(2*r);n._OrtGetInputOutputMetadata(e,t,a,a+r)!==0&&z(`Can't get session input/output metadata.`);let o=Number(n.getValue(a,`*`));i=Number(n.getValue(a+r,`*`));let s=n.HEAP32[i/4];if(s===0)return[o,0];let c=n.HEAPU32[i/4+1],l=[];for(let e=0;e<c;e++){let t=Number(n.getValue(i+8+e*r,`*`));l.push(t===0?Number(n.getValue(i+8+(e+c)*r,`*`)):n.UTF8ToString(t))}return[o,s,l]}finally{n.stackRestore(r),i!==0&&n._OrtFree(i)}},wt=e=>{let t=I(),n=t._malloc(e.byteLength);if(n===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},Tt=async(e,t)=>{let n,r,i=I();Array.isArray(e)?[n,r]=e:e.buffer===i.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=wt(e);let a=0,o=0,s=[],c=[],l=[];try{if([o,s]=await ct(t),t?.externalData&&i.mountExternalData){let e=[];for(let n of t.externalData){let t=typeof n==`string`?n:n.path;e.push(_t(typeof n==`string`?n:n.data).then(e=>{i.mountExternalData(t,e)}))}await Promise.all(e)}for(let e of t?.executionProviders??[])if((typeof e==`string`?e:e.name)===`webnn`){if(i.shouldTransferToMLTensor=!1,typeof e!=`string`){let t=e,n=t?.context,r=t?.gpuDevice,a=t?.deviceType,o=t?.powerPreference;n?i.currentContext=n:r?i.currentContext=await i.webnnCreateMLContext(r):i.currentContext=await i.webnnCreateMLContext({deviceType:a,powerPreference:o})}else i.currentContext=await i.webnnCreateMLContext();break}a=await i._OrtCreateSession(n,r,o),i.webgpuOnCreateSession?.(a),a===0&&z(`Can't create a session.`),i.jsepOnCreateSession?.(),i.currentContext&&(i.webnnRegisterMLContext(a,i.currentContext),i.currentContext=void 0,i.shouldTransferToMLTensor=!0);let[e,u]=St(a),d=!!t?.enableGraphCapture,f=[],p=[],m=[],h=[];for(let t=0;t<e;t++){let[e,n,r]=Ct(a,t);e===0&&z(`Can't get an input name.`),c.push(e);let o=i.UTF8ToString(e);f.push(o),m.push(n===0?{name:o,isTensor:!1}:{name:o,isTensor:!0,type:ut(n),shape:r})}for(let t=0;t<u;t++){let[n,r,o]=Ct(a,t+e);n===0&&z(`Can't get an output name.`),l.push(n);let s=i.UTF8ToString(n);p.push(s),h.push(r===0?{name:s,isTensor:!1}:{name:s,isTensor:!0,type:ut(r),shape:o})}return U.set(a,[a,c,l,null,d,!1]),[a,f,p,m,h]}catch(e){throw c.forEach(e=>i._OrtFree(e)),l.forEach(e=>i._OrtFree(e)),a!==0&&i._OrtReleaseSession(a)!==0&&z(`Can't release session.`),e}finally{i._free(n),o!==0&&i._OrtReleaseSessionOptions(o)!==0&&z(`Can't release session options.`),s.forEach(e=>i._free(e)),i.unmountExternalData?.()}},Et=e=>{let t=I(),n=U.get(e);if(!n)throw Error(`cannot release session. invalid session id: ${e}`);let[r,i,a,o,s]=n;o&&(s&&t._OrtClearBoundOutputs(o.handle)!==0&&z(`Can't clear bound outputs.`),t._OrtReleaseBinding(o.handle)!==0&&z(`Can't release IO binding.`)),t.jsepOnReleaseSession?.(e),t.webnnOnReleaseSession?.(e),t.webgpuOnReleaseSession?.(e),i.forEach(e=>t._OrtFree(e)),a.forEach(e=>t._OrtFree(e)),t._OrtReleaseSession(r)!==0&&z(`Can't release session.`),U.delete(e)},Dt=async(e,t,n,r,i,a,o=!1)=>{if(!e){t.push(0);return}let s=I(),c=s.PTR_SIZE,l=e[0],u=e[1],d=e[3],f=d,p,m;if(l===`string`&&(d===`gpu-buffer`||d===`ml-tensor`))throw Error(`String tensor is not supported on GPU.`);if(o&&d!==`gpu-buffer`)throw Error(`External buffer must be provided for input/output index ${a} when enableGraphCapture is true.`);if(d===`gpu-buffer`){let t=e[2].gpuBuffer;m=H(V(l),u);{let e=s.jsepRegisterBuffer;if(!e)throw Error(`Tensor location "gpu-buffer" is not supported without using WebGPU.`);p=e(r,a,t,m)}}else if(d===`ml-tensor`){let t=e[2].mlTensor;m=H(V(l),u);let n=s.webnnRegisterMLTensor;if(!n)throw Error(`Tensor location "ml-tensor" is not supported without using WebNN.`);p=n(r,t,V(l),u)}else{let t=e[2];if(Array.isArray(t)){m=c*t.length,p=s._malloc(m),n.push(p);for(let e=0;e<t.length;e++){if(typeof t[e]!=`string`)throw TypeError(`tensor data at index ${e} is not a string`);s.setValue(p+e*c,R(t[e],n),`*`)}}else{let e=s.webnnIsGraphInput,a=s.webnnIsGraphOutput;if(l!==`string`&&e&&a){let o=s.UTF8ToString(i);if(e(r,o)||a(r,o)){let e=V(l);m=H(e,u),f=`ml-tensor`;let n=s.webnnCreateTemporaryTensor,i=s.webnnUploadTensor;if(!n||!i)throw Error(`Tensor location "ml-tensor" is not supported without using WebNN.`);let a=await n(r,e,u);i(a,new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),p=a}else m=t.byteLength,p=s._malloc(m),n.push(p),s.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,m),p)}else m=t.byteLength,p=s._malloc(m),n.push(p),s.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,m),p)}}let h=s.stackSave(),g=s.stackAlloc(4*u.length);try{u.forEach((e,t)=>s.setValue(g+t*c,e,c===4?`i32`:`i64`));let e=s._OrtCreateTensor(V(l),p,m,g,u.length,ht(f));e===0&&z(`Can't create tensor for input/output. session=${r}, index=${a}.`),t.push(e)}finally{s.stackRestore(h)}},Ot=async(e,t,n,r,i,a)=>{let o=I(),s=o.PTR_SIZE,c=U.get(e);if(!c)throw Error(`cannot run inference. invalid session id: ${e}`);let l=c[0],u=c[1],d=c[2],f=c[3],p=c[4];c[5];let m=t.length,h=r.length,g=0,_=[],v=[],y=[],b=[],x=[],S=o.stackSave(),ee=o.stackAlloc(m*s),te=o.stackAlloc(m*s),C=o.stackAlloc(h*s),w=o.stackAlloc(h*s);try{[g,_]=nt(a),j(`wasm prepareInputOutputTensor`);for(let r=0;r<m;r++)await Dt(n[r],v,b,e,u[t[r]],t[r],p);for(let t=0;t<h;t++)await Dt(i[t],y,b,e,d[r[t]],m+r[t],p);M(`wasm prepareInputOutputTensor`);for(let e=0;e<m;e++)o.setValue(ee+e*s,v[e],`*`),o.setValue(te+e*s,u[t[e]],`*`);for(let e=0;e<h;e++)o.setValue(C+e*s,y[e],`*`),o.setValue(w+e*s,d[r[e]],`*`);o.jsepOnRunStart?.(l),o.webnnOnRunStart?.(l);let c;c=await o._OrtRun(l,te,ee,m,w,h,C,g),c!==0&&z(`failed to call OrtRun().`);let S=[],ne=[];j(`wasm ProcessOutputTensor`);for(let t=0;t<h;t++){let n=Number(o.getValue(C+t*s,`*`));if(n===y[t]||x.includes(y[t])){S.push(i[t]),n!==y[t]&&o._OrtReleaseTensor(n)!==0&&z(`Can't release tensor.`);continue}let a=o.stackSave(),c=o.stackAlloc(4*s),l=!1,u,d=0;try{o._OrtGetTensorData(n,c,c+s,c+2*s,c+3*s)!==0&&z(`Can't access output tensor data on index ${t}.`);let i=s===4?`i32`:`i64`,a=Number(o.getValue(c,i));d=o.getValue(c+s,`*`);let p=o.getValue(c+s*2,`*`),m=Number(o.getValue(c+s*3,i)),h=[];for(let e=0;e<m;e++)h.push(Number(o.getValue(p+e*s,i)));o._OrtFree(p)!==0&&z(`Can't free memory for tensor dims.`);let g=h.reduce((e,t)=>e*t,1);u=ut(a);let _=f?.outputPreferredLocations[r[t]];if(u===`string`){if(_===`gpu-buffer`||_===`ml-tensor`)throw Error(`String tensor is not supported on GPU.`);let e=[];for(let t=0;t<g;t++){let n=o.getValue(d+t*s,`*`),r=o.getValue(d+(t+1)*s,`*`),i=t===g-1?void 0:r-n;e.push(o.UTF8ToString(n,i))}S.push([u,h,e,`cpu`])}else if(_===`gpu-buffer`&&g>0){let e=o.jsepGetBuffer;if(!e)throw Error(`preferredLocation "gpu-buffer" is not supported without using WebGPU.`);let t=e(d),r=H(a,g);if(r===void 0||!pt(u))throw Error(`Unsupported data type: ${u}`);l=!0,S.push([u,h,{gpuBuffer:t,download:o.jsepCreateDownloader(t,r,u),dispose:()=>{o._OrtReleaseTensor(n)!==0&&z(`Can't release tensor.`)}},`gpu-buffer`])}else if(_===`ml-tensor`&&g>0){let t=o.webnnEnsureTensor,r=o.webnnIsGraphInputOutputTypeSupported;if(!t||!r)throw Error(`preferredLocation "ml-tensor" is not supported without using WebNN.`);if(H(a,g)===void 0||!mt(u))throw Error(`Unsupported data type: ${u}`);if(!r(e,u,!1))throw Error(`preferredLocation "ml-tensor" for ${u} output is not supported by current WebNN Context.`);let i=await t(e,d,a,h,!1);l=!0,S.push([u,h,{mlTensor:i,download:o.webnnCreateMLTensorDownloader(d,u),dispose:()=>{o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n)}},`ml-tensor`])}else if(_===`ml-tensor-cpu-output`&&g>0){let e=o.webnnCreateMLTensorDownloader(d,u)(),t=S.length;l=!0,ne.push((async()=>{let r=[t,await e];return o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n),r})()),S.push([u,h,[],`cpu`])}else{let e=new(dt(u))(g);new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(o.HEAPU8.subarray(d,d+e.byteLength)),S.push([u,h,e,`cpu`])}}finally{o.stackRestore(a),u===`string`&&d&&o._free(d),l||o._OrtReleaseTensor(n)}}f&&!p&&(o._OrtClearBoundOutputs(f.handle)!==0&&z(`Can't clear bound outputs.`),U.set(e,[l,u,d,f,p,!1]));for(let[e,t]of await Promise.all(ne))S[e][2]=t;return M(`wasm ProcessOutputTensor`),S}finally{o.webnnOnRunEnd?.(l),o.stackRestore(S),v.forEach(e=>o._OrtReleaseTensor(e)),y.forEach(e=>o._OrtReleaseTensor(e)),b.forEach(e=>o._free(e)),g!==0&&o._OrtReleaseRunOptions(g),_.forEach(e=>o._free(e))}},kt=e=>{let t=I(),n=U.get(e);if(!n)throw Error(`invalid session id`);let r=n[0],i=t._OrtEndProfiling(r);i===0&&z(`Can't get an profile file name.`),t._OrtFree(i)},At=e=>{let t=[];for(let n of e){let e=n[2];!Array.isArray(e)&&`buffer`in e&&t.push(e.buffer)}return t}}),W,G,K,q,J,Mt,Nt,Pt,Y,X,Ft,It,Lt,Rt,zt,Bt,Vt,Ht,Ut=a(()=>{"use strict";N(),jt(),L(),Ke(),W=()=>!!x.wasm.proxy&&typeof document<`u`,K=!1,q=!1,J=!1,Pt=new Map,Y=(e,t)=>{let n=Pt.get(e);n?n.push(t):Pt.set(e,[t])},X=()=>{if(K||!q||J||!G)throw Error(`worker not ready`)},Ft=e=>{switch(e.data.type){case`init-wasm`:K=!1,e.data.err?(J=!0,Nt[1](e.data.err)):(q=!0,Nt[0]()),Mt&&=(URL.revokeObjectURL(Mt),void 0);break;case`init-ep`:case`copy-from`:case`create`:case`release`:case`run`:case`end-profiling`:{let t=Pt.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}default:}},It=async()=>{if(!q){if(K)throw Error(`multiple calls to 'initWasm()' detected.`);if(J)throw Error(`previous call to 'initWasm()' failed.`);if(K=!0,W())return new Promise((e,t)=>{G?.terminate(),Ue().then(([n,r])=>{try{G=r,G.onerror=e=>t(e),G.onmessage=Ft,Nt=[e,t];let i={type:`init-wasm`,in:x};if(!i.in.wasm.wasmPaths&&n){let e=Ie();e&&(i.in.wasm.wasmPaths=e)}G.postMessage(i),Mt=n}catch(e){t(e)}},t)});try{await $e(x.wasm),await bt(x),q=!0}catch(e){throw J=!0,e}finally{K=!1}}},Lt=async e=>{if(W())return X(),new Promise((t,n)=>{Y(`init-ep`,[t,n]);let r={type:`init-ep`,in:{epName:e,env:x}};G.postMessage(r)});await xt(x,e)},Rt=async e=>W()?(X(),new Promise((t,n)=>{Y(`copy-from`,[t,n]);let r={type:`copy-from`,in:{buffer:e}};G.postMessage(r,[e.buffer])})):wt(e),zt=async(e,t)=>{if(W()){if(t?.preferredOutputLocation)throw Error(`session option "preferredOutputLocation" is not supported for proxy.`);return X(),new Promise((n,r)=>{Y(`create`,[n,r]);let i={type:`create`,in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),G.postMessage(i,a)})}else return Tt(e,t)},Bt=async e=>{if(W())return X(),new Promise((t,n)=>{Y(`release`,[t,n]);let r={type:`release`,in:e};G.postMessage(r)});Et(e)},Vt=async(e,t,n,r,i,a)=>{if(W()){if(n.some(e=>e[3]!==`cpu`))throw Error(`input tensor on GPU is not supported for proxy.`);if(i.some(e=>e))throw Error(`pre-allocated output tensor is not supported for proxy.`);return X(),new Promise((i,o)=>{Y(`run`,[i,o]);let s=n,c={type:`run`,in:{sessionId:e,inputIndices:t,inputs:s,outputIndices:r,options:a}};G.postMessage(c,At(s))})}else return Ot(e,t,n,r,i,a)},Ht=async e=>{if(W())return X(),new Promise((t,n)=>{Y(`end-profiling`,[t,n]);let r={type:`end-profiling`,in:e};G.postMessage(r)});kt(e)}}),Wt,Gt,Kt,qt=a(()=>{"use strict";N(),Ut(),gt(),De(),vt(),Wt=(e,t)=>{switch(e.location){case`cpu`:return[e.type,e.dims,e.data,`cpu`];case`gpu-buffer`:return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},`gpu-buffer`];case`ml-tensor`:return[e.type,e.dims,{mlTensor:e.mlTensor},`ml-tensor`];default:throw Error(`invalid data location: ${e.location} for ${t()}`)}},Gt=e=>{switch(e[3]){case`cpu`:return new O(e[0],e[2],e[1]);case`gpu-buffer`:{let t=e[0];if(!pt(t))throw Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:i}=e[2];return O.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:i})}case`ml-tensor`:{let t=e[0];if(!mt(t))throw Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:i}=e[2];return O.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:i})}default:throw Error(`invalid data location: ${e[3]}`)}},Kt=class{async fetchModelAndCopyToWasmMemory(e){return Rt(await _t(e))}async loadModel(e,t){k();let n;n=typeof e==`string`?await this.fetchModelAndCopyToWasmMemory(e):e,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await zt(n,t),A()}async dispose(){return Bt(this.sessionId)}async run(e,t,n){k();let r=[],i=[];Object.entries(e).forEach(e=>{let t=e[0],n=e[1],a=this.inputNames.indexOf(t);if(a===-1)throw Error(`invalid input '${t}'`);r.push(n),i.push(a)});let a=[],o=[];Object.entries(t).forEach(e=>{let t=e[0],n=e[1],r=this.outputNames.indexOf(t);if(r===-1)throw Error(`invalid output '${t}'`);a.push(n),o.push(r)});let s=r.map((e,t)=>Wt(e,()=>`input "${this.inputNames[i[t]]}"`)),c=a.map((e,t)=>e?Wt(e,()=>`output "${this.outputNames[o[t]]}"`):null),l=await Vt(this.sessionId,i,s,o,c,n),u={};for(let e=0;e<l.length;e++)u[this.outputNames[o[e]]]=a[e]??Gt(l[e]);return A(),u}startProfiling(){}endProfiling(){Ht(this.sessionId)}}}),Jt={};o(Jt,{OnnxruntimeWebAssemblyBackend:()=>Xt,initializeFlags:()=>Yt,wasmBackend:()=>Zt});var Yt,Xt,Zt,Qt=a(()=>{"use strict";N(),Ut(),qt(),Yt=()=>{(typeof x.wasm.initTimeout!=`number`||x.wasm.initTimeout<0)&&(x.wasm.initTimeout=0);let e=x.wasm.simd;if(typeof e!=`boolean`&&e!==void 0&&e!==`fixed`&&e!==`relaxed`&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${e}". Reset it to \`false\` and ignore SIMD feature checking.`),x.wasm.simd=!1),typeof x.wasm.proxy!=`boolean`&&(x.wasm.proxy=!1),typeof x.wasm.trace!=`boolean`&&(x.wasm.trace=!1),typeof x.wasm.numThreads!=`number`||!Number.isInteger(x.wasm.numThreads)||x.wasm.numThreads<=0)if(typeof self<`u`&&!self.crossOriginIsolated)x.wasm.numThreads=1;else{let e=typeof navigator>`u`?i(`node:os`).cpus().length:navigator.hardwareConcurrency;x.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}},Xt=class{async init(e){Yt(),await It(),await Lt(e)}async createInferenceSessionHandler(e,t){let n=new Kt;return await n.loadModel(e,t),n}},Zt=new Xt});N(),N(),N();var $t=`1.24.3`;{let e=(Qt(),c(Jt)).wasmBackend;d(`cpu`,e,10),d(`wasm`,e,10)}Object.defineProperty(x.versions,"web",{value:$t,enumerable:!0});let Z={environment:`prod`,bundleId:`prod-20260702T131256-51023440`,assetVersion:`0.0.1`,createdAt:`2026-07-02T13:12:56.292388+00:00`,assets:{detector:{320:{file:`assets/detector-320.onnx.enc`,version:`0.0.1`,encryptedSha256:`5ec381b61dc78ef1011337c212e1a0bab70e9aed957ebc968384055ed9285f0e`},416:{file:`assets/detector-416.onnx.enc`,version:`0.0.1`,encryptedSha256:`6044cd6369b5046e2ed761c15620cd360ec960d4ff0c8e10493919d7f2e6ed3f`},640:{file:`assets/detector-640.onnx.enc`,version:`0.0.1`,encryptedSha256:`f4a711673881d44eefefb28093bac5fbb899de7389546085510cb22e1ac8c025`}}}};async function en(e){gn();let t=tn(e.inputSize),n=await crypto.subtle.generateKey({name:`RSA-OAEP`,modulusLength:2048,publicExponent:new Uint8Array([1,0,1]),hash:`SHA-256`},!0,[`decrypt`]),r=ln(await sn(n.publicKey)),[i,a]=await Promise.all([rn(t.file),nn({apiBaseUrl:e.apiBaseUrl,accessToken:e.accessToken,inputSize:e.inputSize,assetEntry:t},r)]),o=new Uint8Array(await crypto.subtle.decrypt({name:`RSA-OAEP`},n.privateKey,hn(un(a.encrypted_dek)))),s=dn(o);try{return await on(i,s)}finally{i.fill(0),o.fill(0),s.fill(0)}}function tn(e){if(e!==320&&e!==416&&e!==640)throw Error(`MonitorDog detector input size must be 320, 416, or 640.`);let t=Z.assets.detector[String(e)];if(!Z.environment||!Z.bundleId||!t?.file)throw Error(`MonitorDog SDK encrypted asset manifest is not configured. Run package:dev or package:prod before building a release package.`);if(!t.version||!t.encryptedSha256)throw Error(`MonitorDog SDK detector ${e} asset manifest is incomplete.`);return t}async function nn(e,t){let n=new URLSearchParams({environment:Z.environment,bundle_id:Z.bundleId,asset:`detector`,input_size:String(e.inputSize),version:e.assetEntry.version,encrypted_sha256:e.assetEntry.encryptedSha256,public_key:t}),r=await fetch(`${e.apiBaseUrl}/auth/sdk-asset-key?${n}`,{method:`GET`,headers:{accept:`application/json`,authorization:`Bearer ${e.accessToken}`,"Device-Access-Token":e.accessToken}});if(!r.ok)throw Error(`MonitorDog SDK model key request failed: ${r.status}`);let i=await r.json();if(!i.encrypted_dek)throw Error(`MonitorDog SDK model key response is incomplete.`);return{encrypted_dek:i.encrypted_dek,asset:i.asset??`detector`,input_size:i.input_size??e.inputSize,version:i.version??e.assetEntry.version}}async function rn(e){let t=await fetch(an(e));if(!t.ok)throw Error(`Failed to download packaged MonitorDog model: ${t.status} ${t.statusText}`);return new Uint8Array(await t.arrayBuffer())}function an(e){let t=e.replace(/\\/g,`/`).split(`/`).pop();if(!t||!t.endsWith(`.onnx.enc`))throw Error(`Invalid MonitorDog SDK asset file path: ${e}`);return new URL(`./sdk/${t}`,self.location.href).href}async function on(e,t){if(e.byteLength<=12)throw Error(`MonitorDog encrypted model data is too short.`);let n=await crypto.subtle.importKey(`raw`,hn(t),{name:`AES-GCM`},!1,[`decrypt`]),r=e.slice(0,12),i=e.slice(12);return new Uint8Array(await crypto.subtle.decrypt({name:`AES-GCM`,iv:hn(r)},n,hn(i)))}async function sn(e){let t=await crypto.subtle.exportKey(`spki`,e);return[`-----BEGIN PUBLIC KEY-----`,...cn(new Uint8Array(t)).match(/.{1,64}/g)??[],`-----END PUBLIC KEY-----`].join(`
|
|
8
|
-
`)}function
|
|
7
|
+
var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,i=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error(`Dynamic require of "`+e+`" is not supported`)}),a=(e,t)=>()=>(e&&(t=e(e=0)),t),o=(t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})},s=(i,a,o,s)=>{if(a&&typeof a==`object`||typeof a==`function`)for(let c of n(a))!r.call(i,c)&&c!==o&&e(i,c,{get:()=>a[c],enumerable:!(s=t(a,c))||s.enumerable});return i},c=t=>s(e({},`__esModule`,{value:!0}),t),l,u,d,f,p,m=a(()=>{"use strict";l=new Map,u=[],d=(e,t,n)=>{if(t&&typeof t.init==`function`&&typeof t.createInferenceSessionHandler==`function`){let r=l.get(e);if(r===void 0)l.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let t=u.indexOf(e);t!==-1&&u.splice(t,1);for(let t=0;t<u.length;t++)if(l.get(u[t]).priority<=n){u.splice(t,0,e);return}u.push(e)}return}throw TypeError(`not a valid backend`)},f=async e=>{let t=l.get(e);if(!t)return`backend not found.`;if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(e){return n||(t.error=`${e}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},p=async e=>{let t=e.executionProviders||[],n=t.map(e=>typeof e==`string`?e:e.name),r=n.length===0?u:n,i,a=[],o=new Set;for(let e of r){let t=await f(e);typeof t==`string`?a.push({name:e,err:t}):(i||=t,i===t&&o.add(e))}if(!i)throw Error(`no available backend found. ERR: ${a.map(e=>`[${e.name}] ${e.err}`).join(`, `)}`);for(let{name:e,err:t}of a)n.includes(e)&&console.warn(`removing requested execution provider "${e}" from session options because it is not available: ${t}`);let s=t.filter(e=>o.has(typeof e==`string`?e:e.name));return[i,new Proxy(e,{get:(e,t)=>t===`executionProviders`?s:Reflect.get(e,t)})]}}),h=a(()=>{"use strict";m()}),g,_=a(()=>{"use strict";g=`1.24.3`}),v,y,b=a(()=>{"use strict";_(),v=`warning`,y={wasm:{},webgl:{},webgpu:{},versions:{common:g},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);v=e}},get logLevel(){return v}},Object.defineProperty(y,"logLevel",{enumerable:!0})}),x,S=a(()=>{"use strict";b(),x=y}),ee,te,C=a(()=>{"use strict";ee=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t<a;t++)for(let n=0;n<i;n++){let i=(e.data[d++]-l[0])*c[0],a=(e.data[f++]-l[1])*c[1],o=(e.data[p++]-l[2])*c[2],s=m===-1?255:(e.data[m++]-l[3])*c[3];r.fillStyle=`rgba(`+i+`,`+a+`,`+o+`,`+s+`)`,r.fillRect(n,t,1,1)}if(`toDataURL`in n)return n.toDataURL();throw Error(`toDataURL is not supported`)}else throw Error(`Can not access image data`)},te=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t!==void 0&&t.format!==void 0?t.format:`RGB`,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t<a*i;f+=4,p+=4,m+=4,h+=4,t++)r.data[f]=(e.data[g++]-u[0])*l[0],r.data[p]=(e.data[_++]-u[1])*l[1],r.data[m]=(e.data[v++]-u[2])*l[2],r.data[h]=y===-1?255:(e.data[y++]-u[3])*l[3]}else throw Error(`Can not access image data`);return r}}),w,ne,re,ie,ae,oe,se=a(()=>{"use strict";me(),w=(e,t)=>{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:`RGB`,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t<l;t++,f+=d,m+=d,p+=d,h+=d)u[g++]=(e[f]+o[0])/a[0],u[_++]=(e[p]+o[1])/a[1],u[v++]=(e[m]+o[2])/a[2],y!==-1&&h!==-1&&(u[y++]=(e[h]+o[3])/a[3]);return c===`RGBA`?new D(`float32`,u,[1,4,n,r]):new D(`float32`,u,[1,3,n,r])},ne=async(e,t)=>{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,w(o,s)}else throw Error(`Can not access image data`)}else{if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(w(e.data,s))}});throw Error(`Input data provided is not supported - aborted tensor creation`)}if(o!==void 0)return w(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},re=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new D({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ie=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new D({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},ae=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new D({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},oe=(e,t,n)=>new D({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]})}),T,E,ce,le,ue=a(()=>{"use strict";T=new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),E=new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]),ce=!1,le=()=>{if(!ce){ce=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<`u`&&n.from;e&&(T.set(`int64`,BigInt64Array),E.set(BigInt64Array,`int64`)),t&&(T.set(`uint64`,BigUint64Array),E.set(BigUint64Array,`uint64`)),r?(T.set(`float16`,n),E.set(n,`float16`)):T.set(`float16`,Uint16Array)}}}),de,fe,pe=a(()=>{"use strict";me(),de=e=>{let t=1;for(let n=0;n<e.length;n++){let r=e[n];if(typeof r!=`number`||!Number.isSafeInteger(r))throw TypeError(`dims[${n}] must be an integer, got: ${r}`);if(r<0)throw RangeError(`dims[${n}] must be a non-negative integer, got: ${r}`);t*=r}return t},fe=(e,t)=>{switch(e.location){case`cpu`:return new D(e.type,e.data,t);case`cpu-pinned`:return new D({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new D({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new D({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new D({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),D,me=a(()=>{"use strict";C(),se(),ue(),pe(),D=class{constructor(e,t,n){le();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=T.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`)if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=T.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray)if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`);else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=E.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=de(i);if(this.cpuData&&a!==this.cpuData.length&&!((r===`uint4`||r===`int4`)&&Math.ceil(a/2)===this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return ne(e,t)}static fromTexture(e,t){return re(e,t)}static fromGpuBuffer(e,t){return ie(e,t)}static fromMLTensor(e,t){return ae(e,t)}static fromPinnedBuffer(e,t,n){return oe(e,t,n)}toDataURL(e){return ee(this,e)}toImageData(e){return te(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return fe(this,e)}}}),O,he=a(()=>{"use strict";me(),O=D}),ge,_e,k,A,j,M,ve=a(()=>{"use strict";b(),ge=(e,t)=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||console.timeStamp(`${e}::ORT::${t}`)},_e=(e,t)=>{let n=Error().stack?.split(/\r\n|\r|\n/g)||[],r=!1;for(let i=0;i<n.length;i++){if(r&&!n[i].includes(`TRACE_FUNC`)){let r=`FUNC_${e}::${n[i].trim().split(` `)[1]}`;t&&(r+=`::${t}`),ge(`CPU`,r);return}n[i].includes(`TRACE_FUNC`)&&(r=!0)}},k=e=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||_e(`BEGIN`,e)},A=e=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||_e(`END`,e)},j=e=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||console.time(`ORT::${e}`)},M=e=>{(typeof y.trace>`u`?!y.wasm.trace:!y.trace)||console.timeEnd(`ORT::${e}`)}}),ye,be=a(()=>{"use strict";m(),he(),ve(),ye=class e{constructor(e){this.handler=e}async run(e,t,n){k(),j(`InferenceSession.run`);let r={},i={};if(typeof e!=`object`||!e||e instanceof O||Array.isArray(e))throw TypeError(`'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.`);let a=!0;if(typeof t==`object`){if(t===null)throw TypeError(`Unexpected argument[1]: cannot be null.`);if(t instanceof O)throw TypeError(`'fetches' cannot be a Tensor`);if(Array.isArray(t)){if(t.length===0)throw TypeError(`'fetches' cannot be an empty array.`);a=!1;for(let e of t){if(typeof e!=`string`)throw TypeError(`'fetches' must be a string array or an object.`);if(this.outputNames.indexOf(e)===-1)throw RangeError(`'fetches' contains invalid output name: ${e}.`);r[e]=null}if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else{let e=!1,o=Object.getOwnPropertyNames(t);for(let n of this.outputNames)if(o.indexOf(n)!==-1){let i=t[n];(i===null||i instanceof O)&&(e=!0,a=!1,r[n]=i)}if(e){if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else i=t}}else if(typeof t<`u`)throw TypeError(`Unexpected argument[1]: must be 'fetches' or 'options'.`);for(let t of this.inputNames)if(typeof e[t]>`u`)throw Error(`input '${t}' is missing in 'feeds'.`);if(a)for(let e of this.outputNames)r[e]=null;let o=await this.handler.run(e,r,i),s={};for(let e in o)if(Object.hasOwnProperty.call(o,e)){let t=o[e];t instanceof O?s[e]=t:s[e]=new O(t.type,t.data,t.dims)}return M(`InferenceSession.run`),A(),s}async release(){return this.handler.dispose()}static async create(t,n,r,i){k(),j(`InferenceSession.create`);let a,o={};if(typeof t==`string`){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof Uint8Array){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&t instanceof SharedArrayBuffer){let e=t,s=0,c=t.byteLength;if(typeof n==`object`&&n)o=n;else if(typeof n==`number`){if(s=n,!Number.isSafeInteger(s))throw RangeError(`'byteOffset' must be an integer.`);if(s<0||s>=e.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${e.byteLength}).`);if(c=t.byteLength-s,typeof r==`number`){if(c=r,!Number.isSafeInteger(c))throw RangeError(`'byteLength' must be an integer.`);if(c<=0||s+c>e.byteLength)throw RangeError(`'byteLength' is out of range (0, ${e.byteLength-s}].`);if(typeof i==`object`&&i)o=i;else if(typeof i<`u`)throw TypeError(`'options' must be an object.`)}else if(typeof r<`u`)throw TypeError(`'byteLength' must be a number.`)}else if(typeof n<`u`)throw TypeError(`'options' must be an object.`);a=new Uint8Array(e,s,c)}else throw TypeError(`Unexpected argument[0]: must be 'path' or 'buffer'.`);let[s,c]=await p(o),l=await s.createInferenceSessionHandler(a,c);return M(`InferenceSession.create`),A(),new e(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),xe,Se=a(()=>{"use strict";be(),xe=ye}),Ce=a(()=>{"use strict";}),we=a(()=>{"use strict";}),Te=a(()=>{"use strict";}),Ee=a(()=>{"use strict";});o({},{InferenceSession:()=>xe,TRACE:()=>ge,TRACE_EVENT_BEGIN:()=>j,TRACE_EVENT_END:()=>M,TRACE_FUNC_BEGIN:()=>k,TRACE_FUNC_END:()=>A,Tensor:()=>O,env:()=>x,registerBackend:()=>d});var N=a(()=>{"use strict";h(),S(),Se(),he(),Ce(),we(),ve(),Te(),Ee()}),De=a(()=>{"use strict";}),Oe={};o(Oe,{default:()=>je});var ke,Ae,je,Me=a(()=>{"use strict";jt(),L(),Ke(),ke=`ort-wasm-proxy-worker`,Ae=globalThis.self?.name===ke,Ae&&(self.onmessage=e=>{let{type:t,in:n}=e.data;try{switch(t){case`init-wasm`:$e(n.wasm).then(()=>{bt(n).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})})},e=>{postMessage({type:t,err:e})});break;case`init-ep`:{let{epName:e,env:r}=n;xt(r,e).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})});break}case`copy-from`:{let{buffer:e}=n,r=wt(e);postMessage({type:t,out:r});break}case`create`:{let{model:e,options:r}=n;Tt(e,r).then(e=>{postMessage({type:t,out:e})},e=>{postMessage({type:t,err:e})});break}case`release`:Et(n),postMessage({type:t});break;case`run`:{let{sessionId:e,inputIndices:r,inputs:i,outputIndices:a,options:o}=n;Ot(e,r,i,a,Array(a.length).fill(null),o).then(e=>{e.some(e=>e[3]!==`cpu`)?postMessage({type:t,err:`Proxy does not support non-cpu tensor location.`}):postMessage({type:t,out:e},At([...i,...e]))},e=>{postMessage({type:t,err:e})});break}case`end-profiling`:kt(n),postMessage({type:t});break;default:}}catch(e){postMessage({type:t,err:e})}}),je=Ae?null:e=>new Worker(e??P,{type:`module`,name:ke})}),Ne,Pe,Fe,P,Ie,Le,Re,ze,Be,Ve,He,Ue,We,Ge,Ke=a(()=>{"use strict";De(),Ne=typeof location>`u`?void 0:location.origin,Pe=self.location.href>`file:`&&self.location.href<`file;`,Fe=()=>Pe?new URL(new URL(`ort.wasm.min.mjs`,self.location.href).href,Ne).href:self.location.href,P=Fe(),Ie=()=>{if(P&&!P.startsWith(`blob:`))return P.substring(0,P.lastIndexOf(`/`)+1)},Le=(e,t)=>{try{let n=t??P;return(n?new URL(e,n):new URL(e)).origin===Ne}catch{return!1}},Re=(e,t)=>{let n=t??P;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},ze=(e,t)=>`${t??`./`}${e}`,Be=async e=>{let t=await(await fetch(e,{credentials:`same-origin`})).blob();return URL.createObjectURL(t)},Ve=async e=>(await import(e)).default,He=(Me(),c(Oe)).default,Ue=async()=>{if(!P)throw Error(`Failed to load proxy worker: cannot determine the script source URL.`);if(Le(P))return[void 0,He()];let e=await Be(P);return[e,He(e)]},We=void 0,Ge=async(e,t,n,r)=>{let i=We&&!(e||t);if(i)if(P)i=Le(P)||r&&!n;else if(r&&!n)i=!0;else throw Error(`cannot determine the script source URL.`);if(i)return[void 0,We];{let r=`ort-wasm-simd-threaded.mjs`,i=e??Re(r,t),a=n&&i&&!Le(i,t),o=a?await Be(i):i??ze(r,t);return[a?o:void 0,await Ve(o)]}}}),qe,Je,F,Ye,Xe,Ze,Qe,$e,I,L=a(()=>{"use strict";Ke(),Je=!1,F=!1,Ye=!1,Xe=()=>{if(typeof SharedArrayBuffer>`u`)return!1;try{return typeof MessageChannel<`u`&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},Ze=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},Qe=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},$e=async e=>{if(Je)return Promise.resolve();if(F)throw Error(`multiple calls to 'initializeWebAssembly()' detected.`);if(Ye)throw Error(`previous call to 'initializeWebAssembly()' failed.`);F=!0;let t=e.initTimeout,n=e.numThreads;if(e.simd!==!1){if(e.simd===`relaxed`){if(!Qe())throw Error(`Relaxed WebAssembly SIMD is not supported in the current environment.`)}else if(!Ze())throw Error(`WebAssembly SIMD is not supported in the current environment.`)}let r=Xe();n>1&&!r&&(typeof self<`u`&&!self.crossOriginIsolated&&console.warn(`env.wasm.numThreads is set to `+n+`, but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info.`),console.warn(`WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading.`),e.numThreads=n=1);let i=e.wasmPaths,a=typeof i==`string`?i:void 0,o=i?.mjs,s=o?.href??o,c=i?.wasm,l=c?.href??c,u=e.wasmBinary,[d,f]=await Ge(s,a,n>1,!!u||!!l),p=!1,m=[];if(t>0&&m.push(new Promise(e=>{setTimeout(()=>{p=!0,e()},t)})),m.push(new Promise((e,t)=>{let r={numThreads:n};if(u)r.wasmBinary=u,r.locateFile=e=>e;else if(l||a)r.locateFile=e=>l??a+e;else if(s&&s.indexOf(`blob:`)!==0)r.locateFile=e=>new URL(e,s).href;else if(d){let e=Ie();e&&(r.locateFile=t=>e+t)}f(r).then(t=>{F=!1,Je=!0,qe=t,e(),d&&URL.revokeObjectURL(d)},e=>{F=!1,Ye=!0,t(e)})})),await Promise.race(m),p)throw Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},I=()=>{if(Je&&qe)return qe;throw Error(`WebAssembly is not initialized yet.`)}}),R,et,z,tt=a(()=>{"use strict";L(),R=(e,t)=>{let n=I(),r=n.lengthBytesUTF8(e)+1,i=n._malloc(r);return n.stringToUTF8(e,i,r),t.push(i),i},et=(e,t,n,r)=>{if(typeof e==`object`&&e){if(n.has(e))throw Error(`Circular reference in options`);n.add(e)}Object.entries(e).forEach(([e,i])=>{let a=t?t+e:e;if(typeof i==`object`)et(i,a+`.`,n,r);else if(typeof i==`string`||typeof i==`number`)r(a,i.toString());else if(typeof i==`boolean`)r(a,i?`1`:`0`);else throw Error(`Can't handle extra config type: ${typeof i}`)})},z=e=>{let t=I(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetLastError(r,r+n);let i=Number(t.getValue(r,n===4?`i32`:`i64`)),a=t.getValue(r+n,`*`),o=a?t.UTF8ToString(a):``;throw Error(`${e} ERROR_CODE: ${i}, ERROR_MESSAGE: ${o}`)}finally{t.stackRestore(n)}}}),nt,rt=a(()=>{"use strict";L(),tt(),nt=e=>{let t=I(),n=0,r=[],i=e||{};try{if(e?.logSeverityLevel===void 0)i.logSeverityLevel=2;else if(typeof e.logSeverityLevel!=`number`||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw Error(`log severity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)i.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!=`number`||!Number.isInteger(e.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(i.terminate=!1);let a=0;return e?.tag!==void 0&&(a=R(e.tag,r)),n=t._OrtCreateRunOptions(i.logSeverityLevel,i.logVerbosityLevel,!!i.terminate,a),n===0&&z(`Can't create run options.`),e?.extra!==void 0&&et(e.extra,``,new WeakSet,(e,i)=>{let a=R(e,r),o=R(i,r);t._OrtAddRunConfigEntry(n,a,o)!==0&&z(`Can't set a run config entry: ${e} - ${i}.`)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(e=>t._free(e)),e}}}),it,at,ot,B,st,ct,lt=a(()=>{"use strict";L(),tt(),it=e=>{switch(e){case`disabled`:return 0;case`basic`:return 1;case`extended`:return 2;case`layout`:return 3;case`all`:return 99;default:throw Error(`unsupported graph optimization level: ${e}`)}},at=e=>{switch(e){case`sequential`:return 0;case`parallel`:return 1;default:throw Error(`unsupported execution mode: ${e}`)}},ot=e=>{e.extra||={},e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||=`1`,e.executionProviders&&e.executionProviders.some(e=>(typeof e==`string`?e:e.name)===`webgpu`)&&(e.enableMemPattern=!1)},B=(e,t,n,r)=>{let i=R(t,r),a=R(n,r);I()._OrtAddSessionConfigEntry(e,i,a)!==0&&z(`Can't set a session config entry: ${t} - ${n}.`)},st=async(e,t,n)=>{let r=t.executionProviders;for(let t of r){let r=typeof t==`string`?t:t.name,i=[];switch(r){case`webnn`:if(r=`WEBNN`,typeof t!=`string`){let r=t?.deviceType;r&&B(e,`deviceType`,r,n)}break;case`webgpu`:if(r=`JS`,typeof t!=`string`){let r=t;if(r?.preferredLayout){if(r.preferredLayout!==`NCHW`&&r.preferredLayout!==`NHWC`)throw Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${r.preferredLayout}`);B(e,`preferredLayout`,r.preferredLayout,n)}}break;case`wasm`:case`cpu`:continue;default:throw Error(`not supported execution provider: ${r}`)}let a=R(r,n),o=i.length,s=0,c=0;if(o>0){s=I()._malloc(o*I().PTR_SIZE),n.push(s),c=I()._malloc(o*I().PTR_SIZE),n.push(c);for(let e=0;e<o;e++)I().setValue(s+e*I().PTR_SIZE,i[e][0],`*`),I().setValue(c+e*I().PTR_SIZE,i[e][1],`*`)}await I()._OrtAppendExecutionProvider(e,a,s,c,o)!==0&&z(`Can't append execution provider: ${r}.`)}},ct=async e=>{let t=I(),n=0,r=[],i=e||{};ot(i);try{let e=it(i.graphOptimizationLevel??`all`),a=at(i.executionMode??`sequential`),o=typeof i.logId==`string`?R(i.logId,r):0,s=i.logSeverityLevel??2;if(!Number.isInteger(s)||s<0||s>4)throw Error(`log severity level is not valid: ${s}`);let c=i.logVerbosityLevel??0;if(!Number.isInteger(c)||c<0||c>4)throw Error(`log verbosity level is not valid: ${c}`);let l=typeof i.optimizedModelFilePath==`string`?R(i.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(e,!!i.enableCpuMemArena,!!i.enableMemPattern,a,!!i.enableProfiling,0,o,s,c,l),n===0&&z(`Can't create session options.`),i.executionProviders&&await st(n,i,r),i.enableGraphCapture!==void 0){if(typeof i.enableGraphCapture!=`boolean`)throw Error(`enableGraphCapture must be a boolean value: ${i.enableGraphCapture}`);B(n,`enableGraphCapture`,i.enableGraphCapture.toString(),r)}if(i.freeDimensionOverrides)for(let[e,a]of Object.entries(i.freeDimensionOverrides)){if(typeof e!=`string`)throw Error(`free dimension override name must be a string: ${e}`);if(typeof a!=`number`||!Number.isInteger(a)||a<0)throw Error(`free dimension override value must be a non-negative integer: ${a}`);let i=R(e,r);t._OrtAddFreeDimensionOverride(n,i,a)!==0&&z(`Can't set a free dimension override: ${e} - ${a}.`)}return i.extra!==void 0&&et(i.extra,``,new WeakSet,(e,t)=>{B(n,e,t,r)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&z(`Can't release session options.`),r.forEach(e=>t._free(e)),e}}}),V,ut,H,dt,ft,pt,mt,ht,gt=a(()=>{"use strict";V=e=>{switch(e){case`int8`:return 3;case`uint8`:return 2;case`bool`:return 9;case`int16`:return 5;case`uint16`:return 4;case`int32`:return 6;case`uint32`:return 12;case`float16`:return 10;case`float32`:return 1;case`float64`:return 11;case`string`:return 8;case`int64`:return 7;case`uint64`:return 13;case`int4`:return 22;case`uint4`:return 21;default:throw Error(`unsupported data type: ${e}`)}},ut=e=>{switch(e){case 3:return`int8`;case 2:return`uint8`;case 9:return`bool`;case 5:return`int16`;case 4:return`uint16`;case 6:return`int32`;case 12:return`uint32`;case 10:return`float16`;case 1:return`float32`;case 11:return`float64`;case 8:return`string`;case 7:return`int64`;case 13:return`uint64`;case 22:return`int4`;case 21:return`uint4`;default:throw Error(`unsupported data type: ${e}`)}},H=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t==`number`?t:t.reduce((e,t)=>e*t,1);return n>0?Math.ceil(r*n):void 0},dt=e=>{switch(e){case`float16`:return typeof Float16Array<`u`&&Float16Array.from?Float16Array:Uint16Array;case`float32`:return Float32Array;case`uint8`:return Uint8Array;case`int8`:return Int8Array;case`uint16`:return Uint16Array;case`int16`:return Int16Array;case`int32`:return Int32Array;case`bool`:return Uint8Array;case`float64`:return Float64Array;case`uint32`:return Uint32Array;case`int64`:return BigInt64Array;case`uint64`:return BigUint64Array;default:throw Error(`unsupported type: ${e}`)}},ft=e=>{switch(e){case`verbose`:return 0;case`info`:return 1;case`warning`:return 2;case`error`:return 3;case`fatal`:return 4;default:throw Error(`unsupported logging level: ${e}`)}},pt=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,mt=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint64`||e===`int8`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,ht=e=>{switch(e){case`none`:return 0;case`cpu`:return 1;case`cpu-pinned`:return 2;case`texture`:return 3;case`gpu-buffer`:return 4;case`ml-tensor`:return 5;default:throw Error(`unsupported data location: ${e}`)}}}),_t,vt=a(()=>{"use strict";De(),_t=async e=>{if(typeof e==`string`){let t=await fetch(e);if(!t.ok)throw Error(`failed to load external data file: ${e}`);let n=t.headers.get(`Content-Length`),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw Error(`failed to load external data file: ${e}, no response body.`);let n=t.body.getReader(),i;try{i=new ArrayBuffer(r)}catch(e){if(e instanceof RangeError){let e=Math.ceil(r/65536);i=new WebAssembly.Memory({initial:e,maximum:e}).buffer}else throw e}let a=0;for(;;){let{done:e,value:t}=await n.read();if(e)break;let r=t.byteLength;new Uint8Array(i,a,r).set(t),a+=r}return new Uint8Array(i,0,r)}}else return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),yt,bt,xt,U,St,Ct,wt,Tt,Et,Dt,Ot,kt,At,jt=a(()=>{"use strict";N(),rt(),lt(),gt(),L(),tt(),vt(),yt=(e,t)=>{I()._OrtInit(e,t)!==0&&z(`Can't initialize onnxruntime.`)},bt=async e=>{yt(e.wasm.numThreads,ft(e.logLevel))},xt=async(e,t)=>{I().asyncInit?.();let n=e.webgpu.adapter;if(t===`webgpu`){if(typeof navigator>`u`||!navigator.gpu)throw Error(`WebGPU is not supported in current environment`);if(n){if(typeof n.limits!=`object`||typeof n.features!=`object`||typeof n.requestDevice!=`function`)throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let t=e.webgpu.powerPreference;if(t!==void 0&&t!==`low-power`&&t!==`high-performance`)throw Error(`Invalid powerPreference setting: "${t}"`);let r=e.webgpu.forceFallbackAdapter;if(r!==void 0&&typeof r!=`boolean`)throw Error(`Invalid forceFallbackAdapter setting: "${r}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:t,forceFallbackAdapter:r}),!n)throw Error(`Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.`)}}if(t===`webnn`&&(typeof navigator>`u`||!navigator.ml))throw Error(`WebNN is not supported in current environment`)},U=new Map,St=e=>{let t=I(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetInputOutputCount(e,r,r+n)!==0&&z(`Can't get session input/output count.`);let i=n===4?`i32`:`i64`;return[Number(t.getValue(r,i)),Number(t.getValue(r+n,i))]}finally{t.stackRestore(n)}},Ct=(e,t)=>{let n=I(),r=n.stackSave(),i=0;try{let r=n.PTR_SIZE,a=n.stackAlloc(2*r);n._OrtGetInputOutputMetadata(e,t,a,a+r)!==0&&z(`Can't get session input/output metadata.`);let o=Number(n.getValue(a,`*`));i=Number(n.getValue(a+r,`*`));let s=n.HEAP32[i/4];if(s===0)return[o,0];let c=n.HEAPU32[i/4+1],l=[];for(let e=0;e<c;e++){let t=Number(n.getValue(i+8+e*r,`*`));l.push(t===0?Number(n.getValue(i+8+(e+c)*r,`*`)):n.UTF8ToString(t))}return[o,s,l]}finally{n.stackRestore(r),i!==0&&n._OrtFree(i)}},wt=e=>{let t=I(),n=t._malloc(e.byteLength);if(n===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},Tt=async(e,t)=>{let n,r,i=I();Array.isArray(e)?[n,r]=e:e.buffer===i.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=wt(e);let a=0,o=0,s=[],c=[],l=[];try{if([o,s]=await ct(t),t?.externalData&&i.mountExternalData){let e=[];for(let n of t.externalData){let t=typeof n==`string`?n:n.path;e.push(_t(typeof n==`string`?n:n.data).then(e=>{i.mountExternalData(t,e)}))}await Promise.all(e)}for(let e of t?.executionProviders??[])if((typeof e==`string`?e:e.name)===`webnn`){if(i.shouldTransferToMLTensor=!1,typeof e!=`string`){let t=e,n=t?.context,r=t?.gpuDevice,a=t?.deviceType,o=t?.powerPreference;n?i.currentContext=n:r?i.currentContext=await i.webnnCreateMLContext(r):i.currentContext=await i.webnnCreateMLContext({deviceType:a,powerPreference:o})}else i.currentContext=await i.webnnCreateMLContext();break}a=await i._OrtCreateSession(n,r,o),i.webgpuOnCreateSession?.(a),a===0&&z(`Can't create a session.`),i.jsepOnCreateSession?.(),i.currentContext&&(i.webnnRegisterMLContext(a,i.currentContext),i.currentContext=void 0,i.shouldTransferToMLTensor=!0);let[e,u]=St(a),d=!!t?.enableGraphCapture,f=[],p=[],m=[],h=[];for(let t=0;t<e;t++){let[e,n,r]=Ct(a,t);e===0&&z(`Can't get an input name.`),c.push(e);let o=i.UTF8ToString(e);f.push(o),m.push(n===0?{name:o,isTensor:!1}:{name:o,isTensor:!0,type:ut(n),shape:r})}for(let t=0;t<u;t++){let[n,r,o]=Ct(a,t+e);n===0&&z(`Can't get an output name.`),l.push(n);let s=i.UTF8ToString(n);p.push(s),h.push(r===0?{name:s,isTensor:!1}:{name:s,isTensor:!0,type:ut(r),shape:o})}return U.set(a,[a,c,l,null,d,!1]),[a,f,p,m,h]}catch(e){throw c.forEach(e=>i._OrtFree(e)),l.forEach(e=>i._OrtFree(e)),a!==0&&i._OrtReleaseSession(a)!==0&&z(`Can't release session.`),e}finally{i._free(n),o!==0&&i._OrtReleaseSessionOptions(o)!==0&&z(`Can't release session options.`),s.forEach(e=>i._free(e)),i.unmountExternalData?.()}},Et=e=>{let t=I(),n=U.get(e);if(!n)throw Error(`cannot release session. invalid session id: ${e}`);let[r,i,a,o,s]=n;o&&(s&&t._OrtClearBoundOutputs(o.handle)!==0&&z(`Can't clear bound outputs.`),t._OrtReleaseBinding(o.handle)!==0&&z(`Can't release IO binding.`)),t.jsepOnReleaseSession?.(e),t.webnnOnReleaseSession?.(e),t.webgpuOnReleaseSession?.(e),i.forEach(e=>t._OrtFree(e)),a.forEach(e=>t._OrtFree(e)),t._OrtReleaseSession(r)!==0&&z(`Can't release session.`),U.delete(e)},Dt=async(e,t,n,r,i,a,o=!1)=>{if(!e){t.push(0);return}let s=I(),c=s.PTR_SIZE,l=e[0],u=e[1],d=e[3],f=d,p,m;if(l===`string`&&(d===`gpu-buffer`||d===`ml-tensor`))throw Error(`String tensor is not supported on GPU.`);if(o&&d!==`gpu-buffer`)throw Error(`External buffer must be provided for input/output index ${a} when enableGraphCapture is true.`);if(d===`gpu-buffer`){let t=e[2].gpuBuffer;m=H(V(l),u);{let e=s.jsepRegisterBuffer;if(!e)throw Error(`Tensor location "gpu-buffer" is not supported without using WebGPU.`);p=e(r,a,t,m)}}else if(d===`ml-tensor`){let t=e[2].mlTensor;m=H(V(l),u);let n=s.webnnRegisterMLTensor;if(!n)throw Error(`Tensor location "ml-tensor" is not supported without using WebNN.`);p=n(r,t,V(l),u)}else{let t=e[2];if(Array.isArray(t)){m=c*t.length,p=s._malloc(m),n.push(p);for(let e=0;e<t.length;e++){if(typeof t[e]!=`string`)throw TypeError(`tensor data at index ${e} is not a string`);s.setValue(p+e*c,R(t[e],n),`*`)}}else{let e=s.webnnIsGraphInput,a=s.webnnIsGraphOutput;if(l!==`string`&&e&&a){let o=s.UTF8ToString(i);if(e(r,o)||a(r,o)){let e=V(l);m=H(e,u),f=`ml-tensor`;let n=s.webnnCreateTemporaryTensor,i=s.webnnUploadTensor;if(!n||!i)throw Error(`Tensor location "ml-tensor" is not supported without using WebNN.`);let a=await n(r,e,u);i(a,new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),p=a}else m=t.byteLength,p=s._malloc(m),n.push(p),s.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,m),p)}else m=t.byteLength,p=s._malloc(m),n.push(p),s.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,m),p)}}let h=s.stackSave(),g=s.stackAlloc(4*u.length);try{u.forEach((e,t)=>s.setValue(g+t*c,e,c===4?`i32`:`i64`));let e=s._OrtCreateTensor(V(l),p,m,g,u.length,ht(f));e===0&&z(`Can't create tensor for input/output. session=${r}, index=${a}.`),t.push(e)}finally{s.stackRestore(h)}},Ot=async(e,t,n,r,i,a)=>{let o=I(),s=o.PTR_SIZE,c=U.get(e);if(!c)throw Error(`cannot run inference. invalid session id: ${e}`);let l=c[0],u=c[1],d=c[2],f=c[3],p=c[4];c[5];let m=t.length,h=r.length,g=0,_=[],v=[],y=[],b=[],x=[],S=o.stackSave(),ee=o.stackAlloc(m*s),te=o.stackAlloc(m*s),C=o.stackAlloc(h*s),w=o.stackAlloc(h*s);try{[g,_]=nt(a),j(`wasm prepareInputOutputTensor`);for(let r=0;r<m;r++)await Dt(n[r],v,b,e,u[t[r]],t[r],p);for(let t=0;t<h;t++)await Dt(i[t],y,b,e,d[r[t]],m+r[t],p);M(`wasm prepareInputOutputTensor`);for(let e=0;e<m;e++)o.setValue(ee+e*s,v[e],`*`),o.setValue(te+e*s,u[t[e]],`*`);for(let e=0;e<h;e++)o.setValue(C+e*s,y[e],`*`),o.setValue(w+e*s,d[r[e]],`*`);o.jsepOnRunStart?.(l),o.webnnOnRunStart?.(l);let c;c=await o._OrtRun(l,te,ee,m,w,h,C,g),c!==0&&z(`failed to call OrtRun().`);let S=[],ne=[];j(`wasm ProcessOutputTensor`);for(let t=0;t<h;t++){let n=Number(o.getValue(C+t*s,`*`));if(n===y[t]||x.includes(y[t])){S.push(i[t]),n!==y[t]&&o._OrtReleaseTensor(n)!==0&&z(`Can't release tensor.`);continue}let a=o.stackSave(),c=o.stackAlloc(4*s),l=!1,u,d=0;try{o._OrtGetTensorData(n,c,c+s,c+2*s,c+3*s)!==0&&z(`Can't access output tensor data on index ${t}.`);let i=s===4?`i32`:`i64`,a=Number(o.getValue(c,i));d=o.getValue(c+s,`*`);let p=o.getValue(c+s*2,`*`),m=Number(o.getValue(c+s*3,i)),h=[];for(let e=0;e<m;e++)h.push(Number(o.getValue(p+e*s,i)));o._OrtFree(p)!==0&&z(`Can't free memory for tensor dims.`);let g=h.reduce((e,t)=>e*t,1);u=ut(a);let _=f?.outputPreferredLocations[r[t]];if(u===`string`){if(_===`gpu-buffer`||_===`ml-tensor`)throw Error(`String tensor is not supported on GPU.`);let e=[];for(let t=0;t<g;t++){let n=o.getValue(d+t*s,`*`),r=o.getValue(d+(t+1)*s,`*`),i=t===g-1?void 0:r-n;e.push(o.UTF8ToString(n,i))}S.push([u,h,e,`cpu`])}else if(_===`gpu-buffer`&&g>0){let e=o.jsepGetBuffer;if(!e)throw Error(`preferredLocation "gpu-buffer" is not supported without using WebGPU.`);let t=e(d),r=H(a,g);if(r===void 0||!pt(u))throw Error(`Unsupported data type: ${u}`);l=!0,S.push([u,h,{gpuBuffer:t,download:o.jsepCreateDownloader(t,r,u),dispose:()=>{o._OrtReleaseTensor(n)!==0&&z(`Can't release tensor.`)}},`gpu-buffer`])}else if(_===`ml-tensor`&&g>0){let t=o.webnnEnsureTensor,r=o.webnnIsGraphInputOutputTypeSupported;if(!t||!r)throw Error(`preferredLocation "ml-tensor" is not supported without using WebNN.`);if(H(a,g)===void 0||!mt(u))throw Error(`Unsupported data type: ${u}`);if(!r(e,u,!1))throw Error(`preferredLocation "ml-tensor" for ${u} output is not supported by current WebNN Context.`);let i=await t(e,d,a,h,!1);l=!0,S.push([u,h,{mlTensor:i,download:o.webnnCreateMLTensorDownloader(d,u),dispose:()=>{o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n)}},`ml-tensor`])}else if(_===`ml-tensor-cpu-output`&&g>0){let e=o.webnnCreateMLTensorDownloader(d,u)(),t=S.length;l=!0,ne.push((async()=>{let r=[t,await e];return o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n),r})()),S.push([u,h,[],`cpu`])}else{let e=new(dt(u))(g);new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(o.HEAPU8.subarray(d,d+e.byteLength)),S.push([u,h,e,`cpu`])}}finally{o.stackRestore(a),u===`string`&&d&&o._free(d),l||o._OrtReleaseTensor(n)}}f&&!p&&(o._OrtClearBoundOutputs(f.handle)!==0&&z(`Can't clear bound outputs.`),U.set(e,[l,u,d,f,p,!1]));for(let[e,t]of await Promise.all(ne))S[e][2]=t;return M(`wasm ProcessOutputTensor`),S}finally{o.webnnOnRunEnd?.(l),o.stackRestore(S),v.forEach(e=>o._OrtReleaseTensor(e)),y.forEach(e=>o._OrtReleaseTensor(e)),b.forEach(e=>o._free(e)),g!==0&&o._OrtReleaseRunOptions(g),_.forEach(e=>o._free(e))}},kt=e=>{let t=I(),n=U.get(e);if(!n)throw Error(`invalid session id`);let r=n[0],i=t._OrtEndProfiling(r);i===0&&z(`Can't get an profile file name.`),t._OrtFree(i)},At=e=>{let t=[];for(let n of e){let e=n[2];!Array.isArray(e)&&`buffer`in e&&t.push(e.buffer)}return t}}),W,G,K,q,J,Mt,Nt,Pt,Y,X,Ft,It,Lt,Rt,zt,Bt,Vt,Ht,Ut=a(()=>{"use strict";N(),jt(),L(),Ke(),W=()=>!!x.wasm.proxy&&typeof document<`u`,K=!1,q=!1,J=!1,Pt=new Map,Y=(e,t)=>{let n=Pt.get(e);n?n.push(t):Pt.set(e,[t])},X=()=>{if(K||!q||J||!G)throw Error(`worker not ready`)},Ft=e=>{switch(e.data.type){case`init-wasm`:K=!1,e.data.err?(J=!0,Nt[1](e.data.err)):(q=!0,Nt[0]()),Mt&&=(URL.revokeObjectURL(Mt),void 0);break;case`init-ep`:case`copy-from`:case`create`:case`release`:case`run`:case`end-profiling`:{let t=Pt.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}default:}},It=async()=>{if(!q){if(K)throw Error(`multiple calls to 'initWasm()' detected.`);if(J)throw Error(`previous call to 'initWasm()' failed.`);if(K=!0,W())return new Promise((e,t)=>{G?.terminate(),Ue().then(([n,r])=>{try{G=r,G.onerror=e=>t(e),G.onmessage=Ft,Nt=[e,t];let i={type:`init-wasm`,in:x};if(!i.in.wasm.wasmPaths&&n){let e=Ie();e&&(i.in.wasm.wasmPaths=e)}G.postMessage(i),Mt=n}catch(e){t(e)}},t)});try{await $e(x.wasm),await bt(x),q=!0}catch(e){throw J=!0,e}finally{K=!1}}},Lt=async e=>{if(W())return X(),new Promise((t,n)=>{Y(`init-ep`,[t,n]);let r={type:`init-ep`,in:{epName:e,env:x}};G.postMessage(r)});await xt(x,e)},Rt=async e=>W()?(X(),new Promise((t,n)=>{Y(`copy-from`,[t,n]);let r={type:`copy-from`,in:{buffer:e}};G.postMessage(r,[e.buffer])})):wt(e),zt=async(e,t)=>{if(W()){if(t?.preferredOutputLocation)throw Error(`session option "preferredOutputLocation" is not supported for proxy.`);return X(),new Promise((n,r)=>{Y(`create`,[n,r]);let i={type:`create`,in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),G.postMessage(i,a)})}else return Tt(e,t)},Bt=async e=>{if(W())return X(),new Promise((t,n)=>{Y(`release`,[t,n]);let r={type:`release`,in:e};G.postMessage(r)});Et(e)},Vt=async(e,t,n,r,i,a)=>{if(W()){if(n.some(e=>e[3]!==`cpu`))throw Error(`input tensor on GPU is not supported for proxy.`);if(i.some(e=>e))throw Error(`pre-allocated output tensor is not supported for proxy.`);return X(),new Promise((i,o)=>{Y(`run`,[i,o]);let s=n,c={type:`run`,in:{sessionId:e,inputIndices:t,inputs:s,outputIndices:r,options:a}};G.postMessage(c,At(s))})}else return Ot(e,t,n,r,i,a)},Ht=async e=>{if(W())return X(),new Promise((t,n)=>{Y(`end-profiling`,[t,n]);let r={type:`end-profiling`,in:e};G.postMessage(r)});kt(e)}}),Wt,Gt,Kt,qt=a(()=>{"use strict";N(),Ut(),gt(),De(),vt(),Wt=(e,t)=>{switch(e.location){case`cpu`:return[e.type,e.dims,e.data,`cpu`];case`gpu-buffer`:return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},`gpu-buffer`];case`ml-tensor`:return[e.type,e.dims,{mlTensor:e.mlTensor},`ml-tensor`];default:throw Error(`invalid data location: ${e.location} for ${t()}`)}},Gt=e=>{switch(e[3]){case`cpu`:return new O(e[0],e[2],e[1]);case`gpu-buffer`:{let t=e[0];if(!pt(t))throw Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:i}=e[2];return O.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:i})}case`ml-tensor`:{let t=e[0];if(!mt(t))throw Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:i}=e[2];return O.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:i})}default:throw Error(`invalid data location: ${e[3]}`)}},Kt=class{async fetchModelAndCopyToWasmMemory(e){return Rt(await _t(e))}async loadModel(e,t){k();let n;n=typeof e==`string`?await this.fetchModelAndCopyToWasmMemory(e):e,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await zt(n,t),A()}async dispose(){return Bt(this.sessionId)}async run(e,t,n){k();let r=[],i=[];Object.entries(e).forEach(e=>{let t=e[0],n=e[1],a=this.inputNames.indexOf(t);if(a===-1)throw Error(`invalid input '${t}'`);r.push(n),i.push(a)});let a=[],o=[];Object.entries(t).forEach(e=>{let t=e[0],n=e[1],r=this.outputNames.indexOf(t);if(r===-1)throw Error(`invalid output '${t}'`);a.push(n),o.push(r)});let s=r.map((e,t)=>Wt(e,()=>`input "${this.inputNames[i[t]]}"`)),c=a.map((e,t)=>e?Wt(e,()=>`output "${this.outputNames[o[t]]}"`):null),l=await Vt(this.sessionId,i,s,o,c,n),u={};for(let e=0;e<l.length;e++)u[this.outputNames[o[e]]]=a[e]??Gt(l[e]);return A(),u}startProfiling(){}endProfiling(){Ht(this.sessionId)}}}),Jt={};o(Jt,{OnnxruntimeWebAssemblyBackend:()=>Xt,initializeFlags:()=>Yt,wasmBackend:()=>Zt});var Yt,Xt,Zt,Qt=a(()=>{"use strict";N(),Ut(),qt(),Yt=()=>{(typeof x.wasm.initTimeout!=`number`||x.wasm.initTimeout<0)&&(x.wasm.initTimeout=0);let e=x.wasm.simd;if(typeof e!=`boolean`&&e!==void 0&&e!==`fixed`&&e!==`relaxed`&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${e}". Reset it to \`false\` and ignore SIMD feature checking.`),x.wasm.simd=!1),typeof x.wasm.proxy!=`boolean`&&(x.wasm.proxy=!1),typeof x.wasm.trace!=`boolean`&&(x.wasm.trace=!1),typeof x.wasm.numThreads!=`number`||!Number.isInteger(x.wasm.numThreads)||x.wasm.numThreads<=0)if(typeof self<`u`&&!self.crossOriginIsolated)x.wasm.numThreads=1;else{let e=typeof navigator>`u`?i(`node:os`).cpus().length:navigator.hardwareConcurrency;x.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}},Xt=class{async init(e){Yt(),await It(),await Lt(e)}async createInferenceSessionHandler(e,t){let n=new Kt;return await n.loadModel(e,t),n}},Zt=new Xt});N(),N(),N();var $t=`1.24.3`;{let e=(Qt(),c(Jt)).wasmBackend;d(`cpu`,e,10),d(`wasm`,e,10)}Object.defineProperty(x.versions,"web",{value:$t,enumerable:!0});function en(e){if(e===void 0)return;let t=e.trim();if(t.length===0)throw Error(`MonitorDog runtimeAssetBaseUrl must be a non-empty string when provided.`);let n=t.replace(/\/+$/,``);return n.length===0?`/`:n}function tn(e,t){let n=en(e),r=t.replace(/^\/+/,``);if(n===void 0)throw Error(`MonitorDog runtimeAssetBaseUrl must be provided to resolve runtime assets.`);return n===`/`?`/${r}`:`${n}/${r}`}function nn(e,t,n){return t===void 0?n:tn(t,`sdk/${e}`)}function rn(e,t){return e===void 0?t:tn(e,`ort/`)}let Z={environment:`prod`,bundleId:`prod-20260703T040558-1d3fcd9b`,assetVersion:`0.0.1`,createdAt:`2026-07-03T04:05:58.737144+00:00`,assets:{detector:{320:{file:`assets/detector-320.onnx.enc`,version:`0.0.1`,encryptedSha256:`77f36858a65a5479379f23faa2bc60766a8303c76be798a22f56fd7a6bb2b642`},416:{file:`assets/detector-416.onnx.enc`,version:`0.0.1`,encryptedSha256:`fb2b30e093295020e15f51f3d5868a9e98f4f499a8e2041d40ea1114a8116503`},640:{file:`assets/detector-640.onnx.enc`,version:`0.0.1`,encryptedSha256:`7968ae2abca0c01e544833f39c28eb0a024437c0a349c0305bb7363e9446ff90`}}}};async function an(e){bn();let t=on(e.inputSize),n=await crypto.subtle.generateKey({name:`RSA-OAEP`,modulusLength:2048,publicExponent:new Uint8Array([1,0,1]),hash:`SHA-256`},!0,[`decrypt`]),r=pn(await dn(n.publicKey)),[i,a]=await Promise.all([cn(t.file,e.runtimeAssetBaseUrl),sn({apiBaseUrl:e.apiBaseUrl,accessToken:e.accessToken,inputSize:e.inputSize,assetEntry:t},r)]),o=new Uint8Array(await crypto.subtle.decrypt({name:`RSA-OAEP`},n.privateKey,yn(mn(a.encrypted_dek)))),s=hn(o);try{return await un(i,s)}finally{i.fill(0),o.fill(0),s.fill(0)}}function on(e){if(e!==320&&e!==416&&e!==640)throw Error(`MonitorDog detector input size must be 320, 416, or 640.`);let t=Z.assets.detector[String(e)];if(!Z.environment||!Z.bundleId||!t?.file)throw Error(`MonitorDog SDK encrypted asset manifest is not configured. Run package:dev or package:prod before building a release package.`);if(!t.version||!t.encryptedSha256)throw Error(`MonitorDog SDK detector ${e} asset manifest is incomplete.`);return t}async function sn(e,t){let n=new URLSearchParams({environment:Z.environment,bundle_id:Z.bundleId,asset:`detector`,input_size:String(e.inputSize),version:e.assetEntry.version,encrypted_sha256:e.assetEntry.encryptedSha256,public_key:t}),r=await fetch(`${e.apiBaseUrl}/auth/sdk-asset-key?${n}`,{method:`GET`,headers:{accept:`application/json`,authorization:`Bearer ${e.accessToken}`,"Device-Access-Token":e.accessToken}});if(!r.ok)throw Error(`MonitorDog SDK model key request failed: ${r.status}`);let i=await r.json();if(!i.encrypted_dek)throw Error(`MonitorDog SDK model key response is incomplete.`);return{encrypted_dek:i.encrypted_dek,asset:i.asset??`detector`,input_size:i.input_size??e.inputSize,version:i.version??e.assetEntry.version}}async function cn(e,t){let n=await fetch(ln(e,t));if(!n.ok)throw Error(`Failed to download packaged MonitorDog model: ${n.status} ${n.statusText}`);return new Uint8Array(await n.arrayBuffer())}function ln(e,t){let n=e.replace(/\\/g,`/`).split(`/`).pop();if(!n||!n.endsWith(`.onnx.enc`))throw Error(`Invalid MonitorDog SDK asset file path: ${e}`);return nn(n,t,new URL(`./sdk/${n}`,self.location.href).href)}async function un(e,t){if(e.byteLength<=12)throw Error(`MonitorDog encrypted model data is too short.`);let n=await crypto.subtle.importKey(`raw`,yn(t),{name:`AES-GCM`},!1,[`decrypt`]),r=e.slice(0,12),i=e.slice(12);return new Uint8Array(await crypto.subtle.decrypt({name:`AES-GCM`,iv:yn(r)},n,yn(i)))}async function dn(e){let t=await crypto.subtle.exportKey(`spki`,e);return[`-----BEGIN PUBLIC KEY-----`,...fn(new Uint8Array(t)).match(/.{1,64}/g)??[],`-----END PUBLIC KEY-----`].join(`
|
|
8
|
+
`)}function fn(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function pn(e){return fn(new TextEncoder().encode(e))}function mn(e){let t=e.replace(/-----BEGIN [^-]+-----/g,``).replace(/-----END [^-]+-----/g,``).replace(/\s/g,``).replace(/-/g,`+`).replace(/_/g,`/`),n=(4-t.length%4)%4,r=t+`=`.repeat(n),i=atob(r),a=new Uint8Array(i.length);for(let e=0;e<i.length;e+=1)a[e]=i.charCodeAt(e);return a}function hn(e){if(vn(e.byteLength))return new Uint8Array(e);let t=new TextDecoder().decode(e).trim(),n=gn(t.startsWith(`"`)&&t.endsWith(`"`)?t.slice(1,-1):t);if(n&&vn(n.byteLength))return n;throw Error(`MonitorDog SDK model DEK must decode to a 128-bit or 256-bit AES key. Received ${e.byteLength} bytes.`)}function gn(e){if(/^[0-9a-f]+$/i.test(e)&&e.length%2==0)return _n(e);try{return mn(e)}catch{return}}function _n(e){let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n+=1)t[n]=Number.parseInt(e.slice(n*2,n*2+2),16);return t}function vn(e){return e===16||e===32}function yn(e){let t=new ArrayBuffer(e.byteLength);return new Uint8Array(t).set(e),t}function bn(){if(!globalThis.crypto?.subtle)throw Error(`MonitorDog SDK model decryption requires Web Crypto API.`)}let xn=new Set([0,1]),Sn=[`phone_back`,`phone_front`,`phone_back_cam`,`cup`,`hand`,`face`];function Cn(e){if(e.output.type!==`float32`)throw Error(`Detector postprocessing requires float32 output.`);if(!(e.output.data instanceof Float32Array))throw Error(`Detector postprocessing expected Float32Array output.`);let t=e.output.data,n=[...e.output.dims];if(n.length!==3||n[0]!==1||n[1]<=0||n[2]<=0)throw Error(`Detector postprocessing received an unexpected output shape.`);let r=n[1]===10,i=r?n[2]:n[1];if((r?n[1]:n[2])<10||i===0)throw Error(`Detector postprocessing received an incomplete output tensor.`);let a=[];for(let n=0;n<i;n+=1){let o=Q(t,r,n,0,i),s=Q(t,r,n,1,i),c=Q(t,r,n,2,i),l=Q(t,r,n,3,i),u=0,d=0;for(let e=0;e<6;e+=1){let a=Q(t,r,n,e+4,i);a>d&&(d=a,u=e)}let f=u===5?e.faceConfidenceThreshold:e.confidenceThreshold,p={classId:u,score:d,cx:o,cy:s,width:c,height:l};d>=f&&wn(p,e.metadata)&&a.push(p)}let o=Tn(a,e.iouThreshold,e.maxDetections),s=[],c=[],l=[];for(let t of o){let n=En(t,e.metadata);xn.has(t.classId)?s.push(n):t.classId===4?c.push(n):t.classId===5&&l.push(n)}let u=s.filter(e=>c.some(t=>On(e,t)>=.01)||e.score>=.9);return{faceDetected:l.length>0,phoneDetected:u.length>0,faceCount:l.length,phoneCount:u.length,faceDetections:l,phoneDetections:u}}function Q(e,t,n,r,i){return e[t?r*i+n:n*10+r]}function wn(e,t){let n=e.cx-e.width/2,r=e.cy-e.height/2,i=e.cx+e.width/2,a=e.cy+e.height/2;return i>=t.padX&&a>=t.padY&&n<=t.padX+t.sourceWidth*t.ratio&&r<=t.padY+t.sourceHeight*t.ratio}function Tn(e,t,n){let r=[...e].sort((e,t)=>t.score-e.score),i=[];for(let e of r)if(i.some(n=>n.classId===e.classId&&Dn(n,e)>t)||i.push(e),i.length>=n)break;return i}function En(e,t){let n=(e.cx-e.width/2-t.padX)/t.ratio,r=(e.cy-e.height/2-t.padY)/t.ratio,i=(e.cx+e.width/2-t.padX)/t.ratio,a=(e.cy+e.height/2-t.padY)/t.ratio,o=kn(n,0,t.sourceWidth),s=kn(r,0,t.sourceHeight);return{classId:e.classId,label:Sn[e.classId]??`unknown`,score:e.score,confidence:Math.round(e.score*1e4)/100,x:o,y:s,width:kn(i,0,t.sourceWidth)-o,height:kn(a,0,t.sourceHeight)-s}}function Dn(e,t){let n=e.cx-e.width/2,r=e.cy-e.height/2,i=e.cx+e.width/2,a=e.cy+e.height/2,o=t.cx-t.width/2,s=t.cy-t.height/2,c=t.cx+t.width/2,l=t.cy+t.height/2,u=Math.max(0,Math.min(i,c)-Math.max(n,o))*Math.max(0,Math.min(a,l)-Math.max(r,s)),d=e.width*e.height+t.width*t.height-u;return d<=0?0:u/d}function On(e,t){let n=e.x+e.width,r=e.y+e.height,i=t.x+t.width,a=t.y+t.height,o=Math.max(0,Math.min(n,i)-Math.max(e.x,t.x))*Math.max(0,Math.min(r,a)-Math.max(e.y,t.y)),s=e.width*e.height+t.width*t.height-o;return s<=0?0:o/s}function kn(e,t,n){return Math.min(Math.max(e,t),n)}let An=self,$,jn=Promise.resolve(),Mn=new URL(`./ort/`,self.location.href).href;x.wasm.numThreads=1,x.wasm.wasmPaths=Mn,An.addEventListener(`message`,e=>{Nn(e.data)});async function Nn(e){try{if(e.type===`load`){Pn(e.model.runtimeAssetBaseUrl),$=void 0;let t=await an(e.model);try{$=await xe.create(Gn(t),{executionProviders:[`wasm`]})}finally{t.fill(0)}Un({id:e.id,ok:!0});return}let t=await Fn(e);Un({id:e.id,ok:!0,result:t})}catch(t){Un({id:e.id,ok:!1,error:t instanceof Error?t.message:String(t)})}}function Pn(e){x.wasm.wasmPaths=rn(e,Mn)}function Fn(e){let t=jn.then(()=>In(e));return jn=t.then(()=>void 0,()=>void 0),t}async function In(e){if(!$)throw Error(`MonitorDog ONNX runtime session is not loaded.`);if(e.inputType!==`float32`)throw Error(`MonitorDog ONNX runtime only supports float32 input.`);let t=e.debug?performance.now():0,n=e.debug?performance.now():0,{input:r,metadata:i}=e.source.kind===`bitmap`?Rn(e.source,e.inputSize):zn(e.source,e.inputSize),a=e.debug?performance.now():0,o=Cn({output:await Ln(r,$),metadata:i,confidenceThreshold:e.confidenceThreshold,faceConfidenceThreshold:e.faceConfidenceThreshold,iouThreshold:e.iouThreshold,maxDetections:e.maxDetections});if(e.debug){let r=performance.now();console.info(`[MonitorDog] worker inference`,{source:e.source.kind,inputSize:e.inputSize,preprocessMs:Wn(a-n),ortMs:Wn(r-a),totalMs:Wn(r-t)})}return o}async function Ln(e,t){if(!(e.data instanceof Float32Array))throw Error(`MonitorDog ONNX runtime expected Float32Array input.`);let n=t.inputNames[0],r=t.outputNames[0],i=(await t.run({[n]:new O(`float32`,e.data,[...e.dims])}))[r];if(!i||i.type!==`float32`)throw Error(`MonitorDog ONNX runtime returned a non-float32 output.`);return{type:`float32`,data:i.data,dims:i.dims}}function Rn(e,t){try{if(typeof OffscreenCanvas>`u`)throw Error(`OffscreenCanvas is not available.`);let n=Bn(e.sourceWidth,e.sourceHeight,t),r=new OffscreenCanvas(t,t).getContext(`2d`);if(!r)throw Error(`2D canvas context is not available.`);return r.fillStyle=`rgb(114, 114, 114)`,r.fillRect(0,0,t,t),r.drawImage(e.bitmap,n.padX,n.padY,Math.round(e.sourceWidth*n.ratio),Math.round(e.sourceHeight*n.ratio)),{input:Hn(r.getImageData(0,0,t,t).data,t),metadata:n}}finally{e.bitmap.close()}}function zn(e,t){let n=Bn(e.sourceWidth,e.sourceHeight,t);return{input:Vn(e.data,e.sourceWidth,e.sourceHeight,n,t),metadata:n}}function Bn(e,t,n){let r=Math.min(n/e,n/t);return{sourceWidth:e,sourceHeight:t,ratio:r,padX:Math.floor((n-Math.round(e*r))/2),padY:Math.floor((n-Math.round(t*r))/2)}}function Vn(e,t,n,r,i){let a=i*i,o=[1,3,i,i],s=new Float32Array(a*3);for(let o=0;o<i;o+=1)for(let c=0;c<i;c+=1){let l=o*i+c,u=Math.floor((c-r.padX)/r.ratio),d=Math.floor((o-r.padY)/r.ratio),f=u>=0&&d>=0&&u<t&&d<n,p=(d*t+u)*4,m=f?e[p]:114,h=f?e[p+1]:114,g=f?e[p+2]:114;s[l]=m/255,s[l+a]=h/255,s[l+a*2]=g/255}return{type:`float32`,data:s,dims:o}}function Hn(e,t){let n=t*t,r=[1,3,t,t],i=new Float32Array(n*3);for(let t=0;t<n;t+=1){let r=t*4;i[t]=e[r]/255,i[t+n]=e[r+1]/255,i[t+n*2]=e[r+2]/255}return{type:`float32`,data:i,dims:r}}function Un(e,t){An.postMessage(e,t??[])}function Wn(e){return Math.round(e*10)/10}function Gn(e){let t=new ArrayBuffer(e.byteLength);return new Uint8Array(t).set(e),t}})();
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -2,6 +2,7 @@ export type WorkerModelLoadOptions = {
|
|
|
2
2
|
apiBaseUrl: string;
|
|
3
3
|
accessToken: string;
|
|
4
4
|
inputSize: number;
|
|
5
|
+
runtimeAssetBaseUrl?: string;
|
|
5
6
|
};
|
|
6
7
|
export declare function downloadAndDecryptModel(options: WorkerModelLoadOptions): Promise<Uint8Array>;
|
|
7
|
-
export declare function resolvePackageSdkAssetUrl(file: string): string;
|
|
8
|
+
export declare function resolvePackageSdkAssetUrl(file: string, runtimeAssetBaseUrl?: string): string;
|
package/dist/index.d.ts
CHANGED
|
@@ -36,4 +36,4 @@ export declare function configureMonitorDogDetector(options: MonitorDogDetectorO
|
|
|
36
36
|
export declare function createMonitorDogDetector(options: MonitorDogDetectorOptions): Promise<MonitorDogDetector>;
|
|
37
37
|
export declare function getDetector(): MonitorDogDetector;
|
|
38
38
|
export { MonitorDogSdkError, isMonitorDogSdkError } from "./sdk-error";
|
|
39
|
-
export type { AccountResponse, LockPolicyResponse, MonitorDogDetection, MonitorDogDetectionResult, MonitorDogDetectorCameraStatus, MonitorDogDetectorOptions, MonitorDogDetectorSessionStatus, MonitorDogDetectorState, MonitorDogDetectorStatus, MonitorDogLoginRequest, MonitorDogSdkErrorCode, MonitorDogSdkTokenResponse, MonitorDogSessionToken, MonitorDogSessionTokenProvider, MonitorDogVideoDetectionResult, UserPreferences, } from "./types";
|
|
39
|
+
export type { AccountResponse, LockPolicyResponse, MonitorDogDetection, MonitorDogDetectionResult, MonitorDogDetectorCameraStatus, MonitorDogDetectorOptions, MonitorDogDetectorSessionStatus, MonitorDogDetectorState, MonitorDogDetectorStatus, MonitorDogLoginRequest, MonitorDogModelInputSize, MonitorDogSdkErrorCode, MonitorDogSdkTokenResponse, MonitorDogSessionToken, MonitorDogSessionTokenProvider, MonitorDogVideoDetectionResult, UserPreferences, } from "./types";
|
|
@@ -35,37 +35,53 @@ function u() {
|
|
|
35
35
|
return /win/.test(t) || /windows/.test(e) ? "windows" : /mac/.test(t) || /mac os/.test(e) ? "macos" : /android/.test(e) ? "android" : /iphone|ipad|ipod/.test(e) ? "ios" : /linux/.test(t) || /linux/.test(e) ? "linux" : "other";
|
|
36
36
|
}
|
|
37
37
|
//#endregion
|
|
38
|
+
//#region src/runtime-options.ts
|
|
39
|
+
function d(e) {
|
|
40
|
+
return e === "auto" || e === 320 || e === 416 || e === 640;
|
|
41
|
+
}
|
|
42
|
+
function f(e, t) {
|
|
43
|
+
let n = e ?? "auto";
|
|
44
|
+
return n === "auto" ? t ? 416 : 640 : n;
|
|
45
|
+
}
|
|
46
|
+
function p(e) {
|
|
47
|
+
if (e === void 0) return;
|
|
48
|
+
let t = e.trim();
|
|
49
|
+
if (t.length === 0) throw Error("MonitorDog runtimeAssetBaseUrl must be a non-empty string when provided.");
|
|
50
|
+
let n = t.replace(/\/+$/, "");
|
|
51
|
+
return n.length === 0 ? "/" : n;
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
38
54
|
//#region src/sdk-error.ts
|
|
39
|
-
var
|
|
55
|
+
var m = class extends Error {
|
|
40
56
|
code;
|
|
41
57
|
cause;
|
|
42
58
|
constructor(e, t, n) {
|
|
43
59
|
super(t), this.name = "MonitorDogSdkError", this.code = e, this.cause = n;
|
|
44
60
|
}
|
|
45
61
|
};
|
|
46
|
-
function
|
|
47
|
-
return e instanceof
|
|
62
|
+
function h(e) {
|
|
63
|
+
return e instanceof m;
|
|
48
64
|
}
|
|
49
65
|
//#endregion
|
|
50
66
|
//#region src/events.ts
|
|
51
|
-
function
|
|
52
|
-
if (e.faceCount === 0) return
|
|
53
|
-
if (e.faceCount >= 2) return
|
|
54
|
-
if (e.phoneCount >= 1) return
|
|
67
|
+
function g(e) {
|
|
68
|
+
if (e.faceCount === 0) return y("noFaceDetected", e);
|
|
69
|
+
if (e.faceCount >= 2) return y("twoFacesDetected", e);
|
|
70
|
+
if (e.phoneCount >= 1) return y("mobileDevice", e);
|
|
55
71
|
}
|
|
56
|
-
function
|
|
72
|
+
function _(e) {
|
|
57
73
|
return {
|
|
58
|
-
...
|
|
74
|
+
...b(e, (/* @__PURE__ */ new Date()).toISOString()),
|
|
59
75
|
properties: {},
|
|
60
76
|
webcam_imgs: [],
|
|
61
77
|
monitor_imgs: []
|
|
62
78
|
};
|
|
63
79
|
}
|
|
64
|
-
function
|
|
80
|
+
function v(e) {
|
|
65
81
|
return e.phoneCount === 0 && e.faceCount === 1;
|
|
66
82
|
}
|
|
67
|
-
function
|
|
68
|
-
let n =
|
|
83
|
+
function y(e, t) {
|
|
84
|
+
let n = b(e, (/* @__PURE__ */ new Date()).toISOString());
|
|
69
85
|
switch (e) {
|
|
70
86
|
case "noFaceDetected": return {
|
|
71
87
|
type: e,
|
|
@@ -82,7 +98,7 @@ function g(e, t) {
|
|
|
82
98
|
payload: {
|
|
83
99
|
...n,
|
|
84
100
|
properties: {
|
|
85
|
-
confidence:
|
|
101
|
+
confidence: x(t.faceDetections),
|
|
86
102
|
spots: t.faceDetections
|
|
87
103
|
}
|
|
88
104
|
}
|
|
@@ -92,16 +108,16 @@ function g(e, t) {
|
|
|
92
108
|
payload: {
|
|
93
109
|
...n,
|
|
94
110
|
properties: {
|
|
95
|
-
confidence:
|
|
111
|
+
confidence: x(t.phoneDetections),
|
|
96
112
|
spots: t.phoneDetections
|
|
97
113
|
}
|
|
98
114
|
}
|
|
99
115
|
};
|
|
100
116
|
}
|
|
101
117
|
}
|
|
102
|
-
function
|
|
118
|
+
function b(e, t) {
|
|
103
119
|
return {
|
|
104
|
-
basic_event_uuid:
|
|
120
|
+
basic_event_uuid: S(e),
|
|
105
121
|
occured_at: t,
|
|
106
122
|
sended_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
107
123
|
device_type: l(),
|
|
@@ -109,10 +125,10 @@ function _(e, t) {
|
|
|
109
125
|
device_id: "browser"
|
|
110
126
|
};
|
|
111
127
|
}
|
|
112
|
-
function
|
|
128
|
+
function x(e) {
|
|
113
129
|
return e.reduce((e, t) => Math.max(e, t.score), 0);
|
|
114
130
|
}
|
|
115
|
-
function
|
|
131
|
+
function S(e) {
|
|
116
132
|
switch (e) {
|
|
117
133
|
case "logout": return "12ca646a-d832-4581-b03c-48f95627507f";
|
|
118
134
|
case "login": return "4c6f98ea-88d8-4215-9b6a-9b3ccb753465";
|
|
@@ -124,9 +140,9 @@ function y(e) {
|
|
|
124
140
|
}
|
|
125
141
|
//#endregion
|
|
126
142
|
//#region src/service/auth-service.ts
|
|
127
|
-
var
|
|
143
|
+
var C = "MonitorDog token refresh was superseded.", w = 300 * 1e3, T = class {
|
|
128
144
|
services;
|
|
129
|
-
refreshBeforeMs =
|
|
145
|
+
refreshBeforeMs = w;
|
|
130
146
|
periodicRefreshIntervalMs = r;
|
|
131
147
|
token;
|
|
132
148
|
tokenExpiresAt;
|
|
@@ -220,7 +236,7 @@ var b = "MonitorDog token refresh was superseded.", x = 300 * 1e3, S = class {
|
|
|
220
236
|
if (!t) throw Error("MonitorDog login email is required to refresh SDK token.");
|
|
221
237
|
let n = await this.fetchSessionToken(t), r = i(n);
|
|
222
238
|
if (!r || typeof r != "string") throw Error("MonitorDog SDK token response did not include a token.");
|
|
223
|
-
if (e !== this.authSessionId) throw Error(
|
|
239
|
+
if (e !== this.authSessionId) throw Error(C);
|
|
224
240
|
return this.setSessionTokenPayload(n), r;
|
|
225
241
|
}
|
|
226
242
|
startPeriodicRefresh() {
|
|
@@ -243,7 +259,7 @@ var b = "MonitorDog token refresh was superseded.", x = 300 * 1e3, S = class {
|
|
|
243
259
|
return !!(this.tokenExpiresAt && Date.now() >= this.tokenExpiresAt);
|
|
244
260
|
}
|
|
245
261
|
isRefreshSupersededError(e) {
|
|
246
|
-
return e instanceof Error && e.message ===
|
|
262
|
+
return e instanceof Error && e.message === C;
|
|
247
263
|
}
|
|
248
264
|
async fetchSessionToken(e) {
|
|
249
265
|
let t = this.services.options.sessionTokenProvider;
|
|
@@ -271,24 +287,24 @@ var b = "MonitorDog token refresh was superseded.", x = 300 * 1e3, S = class {
|
|
|
271
287
|
let t = await this.authorizedFetch("/event", {
|
|
272
288
|
method: "POST",
|
|
273
289
|
headers: { "content-type": "application/json" },
|
|
274
|
-
body: JSON.stringify(
|
|
290
|
+
body: JSON.stringify(_(e))
|
|
275
291
|
});
|
|
276
292
|
if (!t.ok) throw Error(`MonitorDog ${e} event failed: ${t.status}`);
|
|
277
293
|
} catch (t) {
|
|
278
|
-
let n = this.createSdkError(
|
|
294
|
+
let n = this.createSdkError(E(e), `MonitorDog ${e} event failed.`, t);
|
|
279
295
|
if (this.services.options.onAuthError?.(n), e === "logout") throw n;
|
|
280
296
|
}
|
|
281
297
|
}
|
|
282
298
|
createSdkError(e, t, n) {
|
|
283
|
-
return n instanceof
|
|
299
|
+
return n instanceof m ? n : new m(e, t, n);
|
|
284
300
|
}
|
|
285
301
|
};
|
|
286
|
-
function
|
|
302
|
+
function E(e) {
|
|
287
303
|
return e === "logout" ? "LOGOUT_FAILED" : "SESSION_TOKEN_FAILED";
|
|
288
304
|
}
|
|
289
305
|
//#endregion
|
|
290
306
|
//#region src/service/camera-service.ts
|
|
291
|
-
var
|
|
307
|
+
var D = /(obs|virtual|xsplit|manycam|splitcam|webcammax|fake|loopback|camtwist|e2esoft|vcam|droidcam|iriun|epoccam|camo|mmhmm|nvidia broadcast|streamlabs|bandicam|wirecast|chromacam|youcam|cyberlink|altserver|logi capture|elgato|streamfx|screen capture|desktop capture)/i, O = class {
|
|
292
308
|
async createWebcamStream(e) {
|
|
293
309
|
if (!navigator.mediaDevices?.getUserMedia) throw Error("getUserMedia is not available in this browser.");
|
|
294
310
|
let t = this.getBaseWebcamConstraints(e), n = await this.createFirstCameraConstraints(t);
|
|
@@ -407,7 +423,7 @@ var w = /(obs|virtual|xsplit|manycam|splitcam|webcammax|fake|loopback|camtwist|e
|
|
|
407
423
|
}
|
|
408
424
|
isVirtualCamera(e) {
|
|
409
425
|
let t = e.label.toLowerCase();
|
|
410
|
-
return t ?
|
|
426
|
+
return t ? D.test(t) : !1;
|
|
411
427
|
}
|
|
412
428
|
isPermissionError(e) {
|
|
413
429
|
return e instanceof DOMException && (e.name === "NotAllowedError" || e.name === "SecurityError");
|
|
@@ -431,7 +447,7 @@ var w = /(obs|virtual|xsplit|manycam|splitcam|webcammax|fake|loopback|camtwist|e
|
|
|
431
447
|
};
|
|
432
448
|
//#endregion
|
|
433
449
|
//#region src/capture.ts
|
|
434
|
-
function
|
|
450
|
+
function k(e) {
|
|
435
451
|
if (e.videoWidth === 0 || e.videoHeight === 0) throw Error("Video frame is not ready for capture.");
|
|
436
452
|
let t = document.createElement("canvas"), n = t.getContext("2d");
|
|
437
453
|
if (!n) throw Error("2D canvas context is not available.");
|
|
@@ -445,7 +461,7 @@ function E(e) {
|
|
|
445
461
|
}, "image/jpeg", .9);
|
|
446
462
|
});
|
|
447
463
|
}
|
|
448
|
-
async function
|
|
464
|
+
async function A() {
|
|
449
465
|
if (typeof document > "u" || !document.body) return null;
|
|
450
466
|
let t = await e(document.body, {
|
|
451
467
|
backgroundColor: "#ffffff",
|
|
@@ -457,7 +473,7 @@ async function D() {
|
|
|
457
473
|
}
|
|
458
474
|
//#endregion
|
|
459
475
|
//#region src/service/detection-event-service.ts
|
|
460
|
-
var
|
|
476
|
+
var j = class e {
|
|
461
477
|
static NO_FACE_STARTUP_GRACE_MS = 1500;
|
|
462
478
|
services;
|
|
463
479
|
detectionEventLocked = !1;
|
|
@@ -469,12 +485,12 @@ var O = class e {
|
|
|
469
485
|
this.services = e;
|
|
470
486
|
}
|
|
471
487
|
async handleDetectionResult(e, t) {
|
|
472
|
-
if (
|
|
488
|
+
if (v(e)) {
|
|
473
489
|
this.noFaceStartedAt = void 0, this.clearLock();
|
|
474
490
|
return;
|
|
475
491
|
}
|
|
476
492
|
if (this.detectionEventLocked || this.detectionEventInFlight) return;
|
|
477
|
-
let n =
|
|
493
|
+
let n = g(e);
|
|
478
494
|
if (!n) {
|
|
479
495
|
this.noFaceStartedAt = void 0;
|
|
480
496
|
return;
|
|
@@ -511,11 +527,11 @@ var O = class e {
|
|
|
511
527
|
}
|
|
512
528
|
async uploadWebcamImage(e) {
|
|
513
529
|
if (!(e instanceof HTMLVideoElement) || e.videoWidth === 0 || e.videoHeight === 0) return;
|
|
514
|
-
let t = await
|
|
530
|
+
let t = await k(e);
|
|
515
531
|
return this.uploadImage(t, "webcam.jpg");
|
|
516
532
|
}
|
|
517
533
|
async uploadMonitorImage() {
|
|
518
|
-
let e = this.services.options.captureMonitorImage ? await this.services.options.captureMonitorImage() : await
|
|
534
|
+
let e = this.services.options.captureMonitorImage ? await this.services.options.captureMonitorImage() : await A();
|
|
519
535
|
if (!e) return;
|
|
520
536
|
let t = typeof File < "u" && e instanceof File ? e.name : "monitor.jpg";
|
|
521
537
|
return this.uploadImage(e, t);
|
|
@@ -532,8 +548,8 @@ var O = class e {
|
|
|
532
548
|
}
|
|
533
549
|
shouldSendEvent(e, t) {
|
|
534
550
|
switch (e) {
|
|
535
|
-
case "mobileDevice": return this.services.userPreferences.mobileDetectionEnabled &&
|
|
536
|
-
case "twoFacesDetected": return this.services.userPreferences.multiPersonDetectionEnabled &&
|
|
551
|
+
case "mobileDevice": return this.services.userPreferences.mobileDetectionEnabled && M(t.phoneDetections) >= this.services.userPreferences.mobileDetectionThreshold;
|
|
552
|
+
case "twoFacesDetected": return this.services.userPreferences.multiPersonDetectionEnabled && M(t.faceDetections) >= this.services.userPreferences.faceDetectionThreshold;
|
|
537
553
|
case "noFaceDetected": return this.services.userPreferences.noPersonDetectionEnabled;
|
|
538
554
|
}
|
|
539
555
|
}
|
|
@@ -565,12 +581,12 @@ var O = class e {
|
|
|
565
581
|
}
|
|
566
582
|
}
|
|
567
583
|
};
|
|
568
|
-
function
|
|
584
|
+
function M(e) {
|
|
569
585
|
return e.reduce((e, t) => Math.max(e, t.confidence), 0);
|
|
570
586
|
}
|
|
571
587
|
//#endregion
|
|
572
588
|
//#region src/detect/inference-worker.ts?worker&url
|
|
573
|
-
var
|
|
589
|
+
var N = "" + new URL("assets/inference-worker-jrK75m_K.js", import.meta.url).href, P = class {
|
|
574
590
|
worker;
|
|
575
591
|
nextRequestId = 1;
|
|
576
592
|
pendingRequests = /* @__PURE__ */ new Map();
|
|
@@ -610,7 +626,7 @@ var A = "" + new URL("assets/inference-worker-EjUccpPR.js", import.meta.url).hre
|
|
|
610
626
|
});
|
|
611
627
|
}
|
|
612
628
|
getWorker() {
|
|
613
|
-
return this.worker || (this.worker = new Worker(
|
|
629
|
+
return this.worker || (this.worker = new Worker(N, {
|
|
614
630
|
name: "MonitorDogInference",
|
|
615
631
|
type: "module"
|
|
616
632
|
}), this.worker.addEventListener("message", this.handleMessage), this.worker.addEventListener("error", this.handleError), this.worker.addEventListener("messageerror", this.handleError)), this.worker;
|
|
@@ -636,15 +652,15 @@ var A = "" + new URL("assets/inference-worker-EjUccpPR.js", import.meta.url).hre
|
|
|
636
652
|
};
|
|
637
653
|
//#endregion
|
|
638
654
|
//#region src/detect/preprocess.ts
|
|
639
|
-
async function
|
|
640
|
-
let { sourceWidth: t, sourceHeight: n } =
|
|
655
|
+
async function F(e) {
|
|
656
|
+
let { sourceWidth: t, sourceHeight: n } = I(e);
|
|
641
657
|
if (e instanceof ImageData) return {
|
|
642
658
|
kind: "rgba",
|
|
643
659
|
data: new Uint8ClampedArray(e.data),
|
|
644
660
|
sourceWidth: t,
|
|
645
661
|
sourceHeight: n
|
|
646
662
|
};
|
|
647
|
-
if (
|
|
663
|
+
if (L() && R()) try {
|
|
648
664
|
return {
|
|
649
665
|
kind: "bitmap",
|
|
650
666
|
bitmap: await createImageBitmap(e),
|
|
@@ -652,9 +668,9 @@ async function M(e) {
|
|
|
652
668
|
sourceHeight: n
|
|
653
669
|
};
|
|
654
670
|
} catch {}
|
|
655
|
-
return
|
|
671
|
+
return z(e, t, n);
|
|
656
672
|
}
|
|
657
|
-
function
|
|
673
|
+
function I(e) {
|
|
658
674
|
return e instanceof ImageData ? {
|
|
659
675
|
sourceWidth: e.width,
|
|
660
676
|
sourceHeight: e.height
|
|
@@ -669,13 +685,13 @@ function N(e) {
|
|
|
669
685
|
sourceHeight: e.height
|
|
670
686
|
};
|
|
671
687
|
}
|
|
672
|
-
function
|
|
688
|
+
function L() {
|
|
673
689
|
return typeof createImageBitmap == "function";
|
|
674
690
|
}
|
|
675
|
-
function
|
|
691
|
+
function R() {
|
|
676
692
|
return typeof OffscreenCanvas == "function";
|
|
677
693
|
}
|
|
678
|
-
function
|
|
694
|
+
function z(e, t, n) {
|
|
679
695
|
let r = document.createElement("canvas"), i = r.getContext("2d");
|
|
680
696
|
if (!i) throw Error("2D canvas context is not available.");
|
|
681
697
|
return r.width = t, r.height = n, i.drawImage(e, 0, 0, t, n), {
|
|
@@ -687,18 +703,18 @@ function I(e, t, n) {
|
|
|
687
703
|
}
|
|
688
704
|
//#endregion
|
|
689
705
|
//#region src/video.ts
|
|
690
|
-
function
|
|
706
|
+
function B(e) {
|
|
691
707
|
return e.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA && e.videoWidth > 0 && e.videoHeight > 0 && !e.paused && !e.ended;
|
|
692
708
|
}
|
|
693
|
-
function
|
|
694
|
-
return
|
|
709
|
+
function V(e, t = 1e4) {
|
|
710
|
+
return H(e) ? Promise.resolve() : new Promise((n, r) => {
|
|
695
711
|
let i = window.setTimeout(() => {
|
|
696
712
|
o(), r(/* @__PURE__ */ Error("Timed out waiting for webcam video metadata."));
|
|
697
713
|
}, t), a = window.setInterval(s, 100), o = () => {
|
|
698
714
|
window.clearTimeout(i), window.clearInterval(a), e.removeEventListener("loadedmetadata", c), e.removeEventListener("loadeddata", c), e.removeEventListener("canplay", c), e.removeEventListener("playing", c), e.removeEventListener("resize", c), e.removeEventListener("error", l);
|
|
699
715
|
};
|
|
700
716
|
function s() {
|
|
701
|
-
|
|
717
|
+
H(e) && (o(), n());
|
|
702
718
|
}
|
|
703
719
|
let c = () => {
|
|
704
720
|
s();
|
|
@@ -708,12 +724,12 @@ function R(e, t = 1e4) {
|
|
|
708
724
|
e.addEventListener("loadedmetadata", c, { once: !0 }), e.addEventListener("loadeddata", c, { once: !0 }), e.addEventListener("canplay", c, { once: !0 }), e.addEventListener("playing", c, { once: !0 }), e.addEventListener("resize", c, { once: !0 }), e.addEventListener("error", l, { once: !0 });
|
|
709
725
|
});
|
|
710
726
|
}
|
|
711
|
-
function
|
|
727
|
+
function H(e) {
|
|
712
728
|
return e.readyState >= HTMLMediaElement.HAVE_METADATA && e.videoWidth > 0 && e.videoHeight > 0;
|
|
713
729
|
}
|
|
714
730
|
//#endregion
|
|
715
731
|
//#region src/service/detect-service.ts
|
|
716
|
-
var
|
|
732
|
+
var U = class {
|
|
717
733
|
services;
|
|
718
734
|
inferenceWorker;
|
|
719
735
|
loadPromise;
|
|
@@ -726,7 +742,7 @@ var B = class {
|
|
|
726
742
|
}
|
|
727
743
|
async detect(e) {
|
|
728
744
|
await this.load();
|
|
729
|
-
let t = this.services.options, n = t.debug ? performance.now() : 0, r = t.debug ? performance.now() : 0, i = await
|
|
745
|
+
let t = this.services.options, n = t.debug ? performance.now() : 0, r = t.debug ? performance.now() : 0, i = await F(e), a = t.debug ? performance.now() : 0, o = await this.getInferenceWorker().run({
|
|
730
746
|
source: i,
|
|
731
747
|
inputSize: t.inputSize,
|
|
732
748
|
inputType: t.inputType,
|
|
@@ -739,9 +755,9 @@ var B = class {
|
|
|
739
755
|
if (t.debug) {
|
|
740
756
|
let e = performance.now();
|
|
741
757
|
console.info("[MonitorDog] detect frame", {
|
|
742
|
-
sourceMs:
|
|
743
|
-
workerRoundtripMs:
|
|
744
|
-
totalMs:
|
|
758
|
+
sourceMs: W(a - r),
|
|
759
|
+
workerRoundtripMs: W(e - a),
|
|
760
|
+
totalMs: W(e - n)
|
|
745
761
|
});
|
|
746
762
|
}
|
|
747
763
|
return o;
|
|
@@ -760,7 +776,7 @@ var B = class {
|
|
|
760
776
|
let t = !1, n, r = this.services.options.detectionIntervalMs, i = async () => {
|
|
761
777
|
if (!t) {
|
|
762
778
|
try {
|
|
763
|
-
if (!this.services.shouldPauseDetection &&
|
|
779
|
+
if (!this.services.shouldPauseDetection && B(e)) {
|
|
764
780
|
let n = await this.detect(e);
|
|
765
781
|
if (t) return;
|
|
766
782
|
try {
|
|
@@ -775,7 +791,7 @@ var B = class {
|
|
|
775
791
|
if (t) return;
|
|
776
792
|
await this.services.detectionEvents.handleDetectionResult(n, e).catch((e) => {
|
|
777
793
|
this.services.options.onError?.(e);
|
|
778
|
-
}),
|
|
794
|
+
}), v(n) && this.services.detectionEvents.clearTransientState();
|
|
779
795
|
}
|
|
780
796
|
} catch (e) {
|
|
781
797
|
this.handleDetectionLoopError(e);
|
|
@@ -791,7 +807,7 @@ var B = class {
|
|
|
791
807
|
let e = this.services.options, t = await this.services.camera.createWebcamStream(e.constraints), n = this.services.camera, r = !e.video, i = e.video ?? document.createElement("video"), a = i.muted, o = i.playsInline, s = i.srcObject;
|
|
792
808
|
i.muted = !0, i.playsInline = !0, i.srcObject = t;
|
|
793
809
|
try {
|
|
794
|
-
await Promise.all([i.play(),
|
|
810
|
+
await Promise.all([i.play(), V(i)]);
|
|
795
811
|
} catch (e) {
|
|
796
812
|
throw n.stopStream(t), i.pause(), r ? i.srcObject = null : (i.muted = a, i.playsInline = o, i.srcObject = s), e;
|
|
797
813
|
}
|
|
@@ -829,7 +845,7 @@ var B = class {
|
|
|
829
845
|
return /out of memory|oom|memory access out of bounds|cannot enlarge memory|array buffer allocation|bad allocation|allocation failed/i.test(t);
|
|
830
846
|
}
|
|
831
847
|
getInferenceWorker() {
|
|
832
|
-
return this.inferenceWorker ||= new
|
|
848
|
+
return this.inferenceWorker ||= new P(), this.inferenceWorker;
|
|
833
849
|
}
|
|
834
850
|
async loadInferenceWorker() {
|
|
835
851
|
try {
|
|
@@ -851,16 +867,17 @@ var B = class {
|
|
|
851
867
|
await this.getInferenceWorker().load({
|
|
852
868
|
apiBaseUrl: t.apiBaseUrl,
|
|
853
869
|
accessToken: e,
|
|
854
|
-
inputSize: t.inputSize
|
|
870
|
+
inputSize: t.inputSize,
|
|
871
|
+
runtimeAssetBaseUrl: t.runtimeAssetBaseUrl
|
|
855
872
|
});
|
|
856
873
|
}
|
|
857
874
|
};
|
|
858
|
-
function
|
|
875
|
+
function W(e) {
|
|
859
876
|
return Math.round(e * 10) / 10;
|
|
860
877
|
}
|
|
861
878
|
//#endregion
|
|
862
879
|
//#region src/service/webcam-service.ts
|
|
863
|
-
var
|
|
880
|
+
var G = class {
|
|
864
881
|
services;
|
|
865
882
|
isWebcamRunning = !1;
|
|
866
883
|
stopCurrentWebcam;
|
|
@@ -952,7 +969,7 @@ var H = class {
|
|
|
952
969
|
removeVisibilityListener() {
|
|
953
970
|
typeof document > "u" || document.removeEventListener("visibilitychange", this.handleVisibilityChange);
|
|
954
971
|
}
|
|
955
|
-
},
|
|
972
|
+
}, K = class {
|
|
956
973
|
auth;
|
|
957
974
|
camera;
|
|
958
975
|
detectionEvents;
|
|
@@ -961,10 +978,10 @@ var H = class {
|
|
|
961
978
|
onCameraDisconnect;
|
|
962
979
|
onLoginRequired;
|
|
963
980
|
#e = 0;
|
|
964
|
-
#t =
|
|
981
|
+
#t = q();
|
|
965
982
|
#n;
|
|
966
983
|
constructor(e) {
|
|
967
|
-
this.#n = e, this.camera = new
|
|
984
|
+
this.#n = e, this.camera = new O(), this.auth = new T(this), this.detectionEvents = new j(this), this.detect = new U(this), this.webcam = new G(this);
|
|
968
985
|
}
|
|
969
986
|
get options() {
|
|
970
987
|
return Object.freeze({ ...this.#n() });
|
|
@@ -997,14 +1014,14 @@ var H = class {
|
|
|
997
1014
|
}
|
|
998
1015
|
applyPolicyItems(e, t) {
|
|
999
1016
|
let n = { ...this.#t };
|
|
1000
|
-
for (let t of e)
|
|
1017
|
+
for (let t of e) Y(n, t);
|
|
1001
1018
|
this.#t = n, this.#n().confidenceThreshold = n.mobileDetectionThreshold, this.#n().faceConfidenceThreshold = n.faceDetectionThreshold, this.updateRequiredPasswordFromServer(!1);
|
|
1002
1019
|
}
|
|
1003
1020
|
resetAuthenticatedState() {
|
|
1004
|
-
this.#e = 0, this.#t =
|
|
1021
|
+
this.#e = 0, this.#t = q(), this.#n().requiredPassword = !1, this.#n().confidenceThreshold = this.#t.mobileDetectionThreshold, this.#n().faceConfidenceThreshold = this.#t.faceDetectionThreshold;
|
|
1005
1022
|
}
|
|
1006
1023
|
};
|
|
1007
|
-
function
|
|
1024
|
+
function q() {
|
|
1008
1025
|
return {
|
|
1009
1026
|
mobileDetectionThreshold: .8,
|
|
1010
1027
|
faceDetectionThreshold: .8,
|
|
@@ -1020,19 +1037,19 @@ function W() {
|
|
|
1020
1037
|
multiPersonDetectionMode: "auto_lock"
|
|
1021
1038
|
};
|
|
1022
1039
|
}
|
|
1023
|
-
function
|
|
1040
|
+
function J(e) {
|
|
1024
1041
|
return e === "none";
|
|
1025
1042
|
}
|
|
1026
|
-
function
|
|
1027
|
-
let n = t.policy, r = !
|
|
1043
|
+
function Y(e, t) {
|
|
1044
|
+
let n = t.policy, r = !J(t.policy), i = t.seconds * 1e3, a = "sensitivity" in t ? 1 - t.sensitivity / 100 : void 0;
|
|
1028
1045
|
switch (t.basic_event_uuid) {
|
|
1029
|
-
case
|
|
1046
|
+
case S("mobileDevice"):
|
|
1030
1047
|
e.mobileDetectionEnabled = r, e.mobileDetectionLockDuration = i, e.mobileDetectionMode = n, a !== void 0 && (e.mobileDetectionThreshold = a);
|
|
1031
1048
|
break;
|
|
1032
|
-
case
|
|
1049
|
+
case S("twoFacesDetected"):
|
|
1033
1050
|
e.multiPersonDetectionEnabled = r, e.multiPersonLockDuration = i, e.multiPersonDetectionMode = n, a !== void 0 && (e.faceDetectionThreshold = a);
|
|
1034
1051
|
break;
|
|
1035
|
-
case
|
|
1052
|
+
case S("noFaceDetected"):
|
|
1036
1053
|
e.noPersonDetectionEnabled = r, e.noPersonLockDuration = i, e.noPersonDetectionMode = n;
|
|
1037
1054
|
break;
|
|
1038
1055
|
default: break;
|
|
@@ -1040,7 +1057,7 @@ function K(e, t) {
|
|
|
1040
1057
|
}
|
|
1041
1058
|
//#endregion
|
|
1042
1059
|
//#region src/index.ts
|
|
1043
|
-
var
|
|
1060
|
+
var X = class e {
|
|
1044
1061
|
#e;
|
|
1045
1062
|
#t;
|
|
1046
1063
|
#n = "anonymous";
|
|
@@ -1049,23 +1066,24 @@ var q = class e {
|
|
|
1049
1066
|
#a;
|
|
1050
1067
|
#o;
|
|
1051
1068
|
static async init(t) {
|
|
1052
|
-
return
|
|
1069
|
+
return Q = new e(t), Q;
|
|
1053
1070
|
}
|
|
1054
1071
|
constructor(e) {
|
|
1055
|
-
|
|
1056
|
-
let r =
|
|
1072
|
+
re(e);
|
|
1073
|
+
let r = ne(), i = p(e.runtimeAssetBaseUrl);
|
|
1057
1074
|
this.#t = {
|
|
1058
1075
|
...e,
|
|
1059
1076
|
apiBaseUrl: c(e.apiBaseUrl),
|
|
1077
|
+
runtimeAssetBaseUrl: i,
|
|
1060
1078
|
confidenceThreshold: t,
|
|
1061
1079
|
faceConfidenceThreshold: t,
|
|
1062
1080
|
iouThreshold: n,
|
|
1063
1081
|
maxDetections: 100,
|
|
1064
|
-
inputSize: r
|
|
1082
|
+
inputSize: f(e.modelInputSize, r),
|
|
1065
1083
|
inputType: "float32",
|
|
1066
1084
|
detectionIntervalMs: e.detectionIntervalMs ?? 300,
|
|
1067
1085
|
requiredPassword: !1
|
|
1068
|
-
}, this.#e = new
|
|
1086
|
+
}, this.#e = new K(() => this.#t), this.#e.onLoginRequired = () => this.resetLoggedOutState(), Object.freeze(this);
|
|
1069
1087
|
}
|
|
1070
1088
|
async load() {
|
|
1071
1089
|
this.assertUsable(), this.assertAuthenticated("loading detection");
|
|
@@ -1196,7 +1214,7 @@ var q = class e {
|
|
|
1196
1214
|
});
|
|
1197
1215
|
} catch (e) {
|
|
1198
1216
|
let t = this.createSdkError(this.getStartErrorCode(e), this.getStartErrorMessage(e), e);
|
|
1199
|
-
throw this.transitionToError(t,
|
|
1217
|
+
throw this.transitionToError(t, Z(t.code) ? "blocked" : "idle"), this.#t.onError?.(t), t;
|
|
1200
1218
|
}
|
|
1201
1219
|
}
|
|
1202
1220
|
clearSessionState() {
|
|
@@ -1242,7 +1260,7 @@ var q = class e {
|
|
|
1242
1260
|
}
|
|
1243
1261
|
}
|
|
1244
1262
|
createSdkError(e, t, n) {
|
|
1245
|
-
return
|
|
1263
|
+
return h(n) ? n : new m(e, t, n);
|
|
1246
1264
|
}
|
|
1247
1265
|
isDetectorRunning() {
|
|
1248
1266
|
return this.#r === "running" || this.#r === "starting" || !!this.#o || this.#e.webcam.isRunning || this.#e.webcam.isStarting;
|
|
@@ -1268,29 +1286,30 @@ var q = class e {
|
|
|
1268
1286
|
return typeof DOMException < "u" && e instanceof DOMException && e.name === "NotReadableError";
|
|
1269
1287
|
}
|
|
1270
1288
|
};
|
|
1271
|
-
function
|
|
1289
|
+
function Z(e) {
|
|
1272
1290
|
return e === "CAMERA_PERMISSION_DENIED" || e === "CAMERA_READ_FAILED";
|
|
1273
1291
|
}
|
|
1274
|
-
var
|
|
1275
|
-
function
|
|
1276
|
-
return
|
|
1292
|
+
var Q;
|
|
1293
|
+
function $(e) {
|
|
1294
|
+
return Q = new X(e), Q;
|
|
1277
1295
|
}
|
|
1278
|
-
async function
|
|
1279
|
-
return
|
|
1296
|
+
async function ee(e) {
|
|
1297
|
+
return X.init(e);
|
|
1280
1298
|
}
|
|
1281
|
-
function
|
|
1282
|
-
if (!
|
|
1283
|
-
return
|
|
1299
|
+
function te() {
|
|
1300
|
+
if (!Q) throw Error("MonitorDog is not configured. Call MonitorDogDetector.init(), createMonitorDogDetector(), or configureMonitorDogDetector() before using getDetector().");
|
|
1301
|
+
return Q;
|
|
1284
1302
|
}
|
|
1285
|
-
function
|
|
1303
|
+
function ne() {
|
|
1286
1304
|
if (typeof navigator > "u") return !1;
|
|
1287
1305
|
let e = l();
|
|
1288
1306
|
return e === "mobile" || e === "tablet";
|
|
1289
1307
|
}
|
|
1290
|
-
function
|
|
1308
|
+
function re(e) {
|
|
1291
1309
|
if (!e || typeof e.apiBaseUrl != "string" || e.apiBaseUrl.length === 0) throw Error("MonitorDog apiBaseUrl is required.");
|
|
1292
1310
|
if (typeof e.sessionTokenProvider != "function") throw Error("MonitorDog sessionTokenProvider is required.");
|
|
1293
1311
|
if (typeof e.onDetect != "function") throw Error("MonitorDog onDetect callback is required.");
|
|
1312
|
+
if (e.runtimeAssetBaseUrl !== void 0 && p(e.runtimeAssetBaseUrl), e.modelInputSize !== void 0 && !d(e.modelInputSize)) throw Error("MonitorDog modelInputSize must be \"auto\", 320, 416, or 640.");
|
|
1294
1313
|
}
|
|
1295
1314
|
//#endregion
|
|
1296
|
-
export {
|
|
1315
|
+
export { X as MonitorDogDetector, m as MonitorDogSdkError, $ as configureMonitorDogDetector, ee as createMonitorDogDetector, te as getDetector, h as isMonitorDogSdkError };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("html2canvas")):typeof define==`function`&&define.amd?define([`exports`,`html2canvas`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.MonitorDogDetector={},e.html2canvas))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,o=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,c=(e,t,n,o)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=a(t),l=0,u=c.length,d;l<u;l++)d=c[l],!s.call(e,d)&&d!==n&&r(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(o=i(t,d))||o.enumerable});return e};t=((e,t,i)=>(i=e==null?{}:n(o(e)),c(t||!e||!e.__esModule?r(i,`default`,{value:e,enumerable:!0}):i,e)))(t,1);var l=.8,u=.7,d=3e4;function f(e){return typeof e==`string`?e:e.access_token}function p(e){if(typeof e!=`string`)return e.expires_in}function ee(e){if(typeof e!=`string`)return e.expires_at}function m(e){if(e.expiresAt){let t=Date.parse(e.expiresAt);if(!Number.isNaN(t))return t}if(e.expiresIn)return e.expiresIn>1e9?e.expiresIn*1e3:Date.now()+e.expiresIn*1e3}function h(e){return e.replace(/\/+$/,``)}function g(){if(typeof navigator>`u`)return`none`;let e=navigator.userAgent.toLowerCase();return/ipad|tablet/.test(e)?`tablet`:/mobile|iphone|ipod|android/.test(e)?`mobile`:/macintosh|windows|linux/.test(e)?`desktop`:`other`}function _(){if(typeof navigator>`u`)return`none`;let e=navigator.userAgent.toLowerCase(),t=navigator.platform.toLowerCase();return/win/.test(t)||/windows/.test(e)?`windows`:/mac/.test(t)||/mac os/.test(e)?`macos`:/android/.test(e)?`android`:/iphone|ipad|ipod/.test(e)?`ios`:/linux/.test(t)||/linux/.test(e)?`linux`:`other`}var v=class extends Error{code;cause;constructor(e,t,n){super(t),this.name=`MonitorDogSdkError`,this.code=e,this.cause=n}};function y(e){return e instanceof v}function b(e){if(e.faceCount===0)return C(`noFaceDetected`,e);if(e.faceCount>=2)return C(`twoFacesDetected`,e);if(e.phoneCount>=1)return C(`mobileDevice`,e)}function x(e){return{...w(e,new Date().toISOString()),properties:{},webcam_imgs:[],monitor_imgs:[]}}function S(e){return e.phoneCount===0&&e.faceCount===1}function C(e,t){let n=w(e,new Date().toISOString());switch(e){case`noFaceDetected`:return{type:e,payload:{...n,properties:{confidence:0,spots:[]}}};case`twoFacesDetected`:return{type:e,payload:{...n,properties:{confidence:T(t.faceDetections),spots:t.faceDetections}}};case`mobileDevice`:return{type:e,payload:{...n,properties:{confidence:T(t.phoneDetections),spots:t.phoneDetections}}}}}function w(e,t){return{basic_event_uuid:E(e),occured_at:t,sended_at:new Date().toISOString(),device_type:g(),device_os:_(),device_id:`browser`}}function T(e){return e.reduce((e,t)=>Math.max(e,t.score),0)}function E(e){switch(e){case`logout`:return`12ca646a-d832-4581-b03c-48f95627507f`;case`login`:return`4c6f98ea-88d8-4215-9b6a-9b3ccb753465`;case`mobileDevice`:return`027af5c9-297d-4a64-983f-4199ca4b9dad`;case`twoFacesDetected`:return`d555efac-7465-4067-8056-611e95385807`;case`noFaceDetected`:return`e2c48c23-36e2-4253-82b1-7f6565fdcfc3`;default:return``}}var D=`MonitorDog token refresh was superseded.`,te=300*1e3,O=class{services;refreshBeforeMs=te;periodicRefreshIntervalMs=d;token;tokenExpiresAt;refreshPromise;refreshIntervalId;authSessionId=0;sessionEmail;constructor(e){this.services=e}async login(e){let t=await this.fetchSessionToken(e.email);return this.sessionEmail=e.email,this.setSessionTokenPayload(t),await this.sendUserActivityEvent(`login`),t}async logout(){if(this.token)try{await this.sendUserActivityEvent(`logout`)}finally{this.clearTokens()}}getToken(){return this.token}getTokenExpiresAt(){return this.tokenExpiresAt}getSessionEmail(){return this.sessionEmail}isAuthenticated(){return!!this.token}dispose(){this.clearTokens()}assertAuthenticated(){if(!this.token)throw Error(`MonitorDog login is required before detection.`)}async getValidAccessToken(){if(this.shouldRefreshCurrentToken())try{await this.handleAuthRefresh()}catch(e){if(this.token&&this.tokenExpiresAt&&Date.now()<this.tokenExpiresAt)return this.token;throw e}return this.token}async authorizedFetch(e,t={},n=!0){let r=await this.getValidAccessToken(),i=new Headers(t.headers);r&&(i.set(`authorization`,`Bearer ${r}`),i.set(`Device-Access-Token`,r));let a=await fetch(`${this.services.options.apiBaseUrl}${e}`,{...t,headers:i}),o=await this.getApiErrorCode(a);return a.status===400&&o===4221&&this.handleLoginRequired(),n&&this.shouldRefreshAfterAuthError(a,o)?(await this.handleAuthRefresh(),this.authorizedFetch(e,t,!1)):a}setSessionTokenPayload(e){let t=f(e);if(!t||typeof t!=`string`)throw Error(`MonitorDog SDK token response did not include a token.`);this.setTokens({accessToken:t,expiresIn:p(e),expiresAt:ee(e)})}setTokens(e){this.token=e.accessToken,this.tokenExpiresAt=m(e),this.tokenExpiresAt?this.startPeriodicRefresh():this.stopPeriodicRefresh()}clearTokens(){this.authSessionId+=1,this.token=void 0,this.tokenExpiresAt=void 0,this.refreshPromise=void 0,this.sessionEmail=void 0,this.stopPeriodicRefresh()}async refreshToken(){return this.refreshPromise||=this.refreshAccessToken().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async handleAuthRefresh(){try{return await this.refreshToken()}catch(e){if(!this.isRefreshSupersededError(e)){let t=this.createSdkError(`SESSION_TOKEN_FAILED`,`MonitorDog SDK session token refresh failed.`,e);this.services.options.onAuthError?.(t),this.isCurrentTokenExpired()&&(this.clearTokens(),this.services.onLoginRequired?.())}throw e}}async refreshAccessToken(){let e=this.authSessionId,t=this.sessionEmail;if(!t)throw Error(`MonitorDog login email is required to refresh SDK token.`);let n=await this.fetchSessionToken(t),r=f(n);if(!r||typeof r!=`string`)throw Error(`MonitorDog SDK token response did not include a token.`);if(e!==this.authSessionId)throw Error(D);return this.setSessionTokenPayload(n),r}startPeriodicRefresh(){this.refreshIntervalId||=setInterval(()=>{this.refreshPeriodically()},this.periodicRefreshIntervalMs)}stopPeriodicRefresh(){this.refreshIntervalId&&=(clearInterval(this.refreshIntervalId),void 0)}async refreshPeriodically(){if(!(!this.token||!this.shouldRefreshCurrentToken()))try{await this.handleAuthRefresh()}catch{}}shouldRefreshCurrentToken(){return!!(this.token&&this.tokenExpiresAt&&Date.now()>=this.tokenExpiresAt-this.refreshBeforeMs)}isCurrentTokenExpired(){return!!(this.tokenExpiresAt&&Date.now()>=this.tokenExpiresAt)}isRefreshSupersededError(e){return e instanceof Error&&e.message===D}async fetchSessionToken(e){let t=this.services.options.sessionTokenProvider;if(!t)throw Error(`MonitorDog sessionTokenProvider is required for SDK login.`);return t({email:e})}async getApiErrorCode(e){if(e.status===400)try{let t=await e.clone().json();if(typeof t==`object`&&t&&`code`in t&&typeof t.code==`number`)return t.code}catch{return}}shouldRefreshAfterAuthError(e,t){return e.status===401?!0:e.status===400&&t===422}handleLoginRequired(){this.clearTokens(),this.services.onLoginRequired?.();let e=this.createSdkError(`NOT_LOGGED_IN`,`MonitorDog login is required.`);throw this.services.options.onAuthError?.(e),e}async sendUserActivityEvent(e){try{let t=await this.authorizedFetch(`/event`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(x(e))});if(!t.ok)throw Error(`MonitorDog ${e} event failed: ${t.status}`)}catch(t){let n=this.createSdkError(k(e),`MonitorDog ${e} event failed.`,t);if(this.services.options.onAuthError?.(n),e===`logout`)throw n}}createSdkError(e,t,n){return n instanceof v?n:new v(e,t,n)}};function k(e){return e===`logout`?`LOGOUT_FAILED`:`SESSION_TOKEN_FAILED`}var A=/(obs|virtual|xsplit|manycam|splitcam|webcammax|fake|loopback|camtwist|e2esoft|vcam|droidcam|iriun|epoccam|camo|mmhmm|nvidia broadcast|streamlabs|bandicam|wirecast|chromacam|youcam|cyberlink|altserver|logi capture|elgato|streamfx|screen capture|desktop capture)/i,j=class{async createWebcamStream(e){if(!navigator.mediaDevices?.getUserMedia)throw Error(`getUserMedia is not available in this browser.`);let t=this.getBaseWebcamConstraints(e),n=await this.createFirstCameraConstraints(t);try{return await this.getUserMedia(n)}catch(e){if(this.isPermissionError(e)||this.isCameraRequestTimeoutError(e))throw e;return this.createFallbackWebcamStream(n,e)}}stopStream(e){e.getTracks().forEach(e=>e.stop())}watchStreamDeviceDisconnect(e,t,n=1e3){let r=e.getVideoTracks()[0],i=r?.getSettings().deviceId;if(!r&&!i)return()=>{};let a=!1,o,s=()=>{a||(a=!0,t())},c=()=>{i&&(o&&clearTimeout(o),o=setTimeout(()=>{o=void 0,this.handleDeviceChange(i,s)},n))};return r?.addEventListener(`ended`,s),navigator.mediaDevices?.addEventListener?.(`devicechange`,c),()=>{o&&clearTimeout(o),r?.removeEventListener(`ended`,s),navigator.mediaDevices?.removeEventListener?.(`devicechange`,c)}}isCameraInUse(e){let t=e?.srcObject;return t instanceof MediaStream?t.getTracks().some(e=>e.readyState===`live`):!1}async getVideoInputDevices(){return navigator.mediaDevices?.enumerateDevices?(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`videoinput`):[]}async getRealVideoInputDevices(){let e=await this.getVideoInputDevices(),t=e.filter(e=>!this.isVirtualCamera(e));return t.length>0?t:e}async createFallbackWebcamStream(e,t){let n=await this.getRealVideoInputDevices();if(n.length===0)throw t;let r=n[0],i=t;if(!r?.deviceId)throw i;let a=await this.getWebcamNaturalAspectRatio(r.deviceId),o=this.generateResolutionList(a,720);for(let t of o)try{return await this.getUserMedia(this.createDeviceConstraints(e,r.deviceId,t))}catch(e){i=e}throw i}async handleDeviceChange(e,t){try{(await this.getVideoInputDevices()).some(t=>t.deviceId===e)||t()}catch{}}getBaseWebcamConstraints(e){return e??{audio:!1,video:{facingMode:`user`}}}async createFirstCameraConstraints(e){let t=typeof e.video==`object`?e.video:{};if(`deviceId`in t||`facingMode`in t)return e;let n=(await this.getRealVideoInputDevices())[0];return n?.deviceId?this.createDeviceConstraints(e,n.deviceId):e}async getWebcamNaturalAspectRatio(e){let t;try{t=await this.getUserMedia({audio:!1,video:{deviceId:{exact:e}}});let n=t.getVideoTracks()[0]?.getSettings();if(n?.width&&n.height)return n.width/n.height}catch{}finally{t?.getTracks().forEach(e=>e.stop())}return 16/9}generateResolutionList(e,t){return[t,640,600,480,320,240].map(t=>({width:t,height:Math.max(1,Math.round(t/e))})).filter(e=>e.width<=t&&e.height>=120&&e.height<=1080)}createDeviceConstraints(e,t,n){let r=typeof e.video==`object`?e.video:{};return{...e,audio:e.audio??!1,video:{...r,deviceId:{exact:t},...n?{width:{min:n.width,ideal:n.width},height:{min:n.height,ideal:n.height}}:{}}}}isVirtualCamera(e){let t=e.label.toLowerCase();return t?A.test(t):!1}isPermissionError(e){return e instanceof DOMException&&(e.name===`NotAllowedError`||e.name===`SecurityError`)}getUserMedia(e,t=15e3){let n=!1,r,i=navigator.mediaDevices.getUserMedia(e).then(e=>{if(n)throw this.stopStream(e),Error(`Camera permission request timed out.`);return e}),a=new Promise((e,i)=>{r=setTimeout(()=>{n=!0,i(Error(`Camera permission request timed out.`))},t)});return Promise.race([i,a]).finally(()=>{r&&clearTimeout(r)})}isCameraRequestTimeoutError(e){return e instanceof Error&&e.message===`Camera permission request timed out.`}};function M(e){if(e.videoWidth===0||e.videoHeight===0)throw Error(`Video frame is not ready for capture.`);let t=document.createElement(`canvas`),n=t.getContext(`2d`);if(!n)throw Error(`2D canvas context is not available.`);return t.width=e.videoWidth,t.height=e.videoHeight,n.drawImage(e,0,0,t.width,t.height),new Promise((e,n)=>{t.toBlob(t=>{if(!t){n(Error(`Failed to capture video frame.`));return}e(t)},`image/jpeg`,.9)})}async function N(){if(typeof document>`u`||!document.body)return null;let e=await(0,t.default)(document.body,{backgroundColor:`#ffffff`,useCORS:!0});return new Promise(t=>{e.toBlob(t,`image/jpeg`,.9)})}var P=class e{static NO_FACE_STARTUP_GRACE_MS=1500;services;detectionEventLocked=!1;detectionEventInFlight=!1;detectionEventLockTimeoutId;noFaceStartedAt;suppressNoFaceUntil=0;constructor(e){this.services=e}async handleDetectionResult(e,t){if(S(e)){this.noFaceStartedAt=void 0,this.clearLock();return}if(this.detectionEventLocked||this.detectionEventInFlight)return;let n=b(e);if(!n){this.noFaceStartedAt=void 0;return}if(!(n.type===`noFaceDetected`&&!this.hasNoFaceDelayElapsed())&&(n.type!==`noFaceDetected`&&(this.noFaceStartedAt=void 0),this.shouldSendEvent(n.type,e))){this.lock(n.type),this.detectionEventInFlight=!0;try{let e=await this.uploadWebcamImage(t);e&&(n.payload.webcam_imgs=e);let r=await this.uploadMonitorImage();if(r&&(n.payload.monitor_imgs=r),this.services.options.debug){console.log(n.payload);return}let i=await this.services.auth.authorizedFetch(`/event`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n.payload)});if(!i.ok)throw Error(`MonitorDog event request failed: ${i.status}`)}finally{this.detectionEventInFlight=!1}}}reset(){this.clearLock(),this.noFaceStartedAt=void 0,this.suppressNoFaceUntil=0}resetForWebcamStartup(){this.clearLock(),this.noFaceStartedAt=void 0,this.suppressNoFaceUntil=Date.now()+e.NO_FACE_STARTUP_GRACE_MS}clearTransientState(){this.noFaceStartedAt=void 0}async uploadWebcamImage(e){if(!(e instanceof HTMLVideoElement)||e.videoWidth===0||e.videoHeight===0)return;let t=await M(e);return this.uploadImage(t,`webcam.jpg`)}async uploadMonitorImage(){let e=this.services.options.captureMonitorImage?await this.services.options.captureMonitorImage():await N();if(!e)return;let t=typeof File<`u`&&e instanceof File?e.name:`monitor.jpg`;return this.uploadImage(e,t)}async uploadImage(e,t){let n=new FormData;n.append(`files`,e,t);let r=await this.services.auth.authorizedFetch(`/file/image`,{method:`POST`,body:n});if(!r.ok)throw Error(`MonitorDog image upload failed: ${r.status}`);return r.json()}shouldSendEvent(e,t){switch(e){case`mobileDevice`:return this.services.userPreferences.mobileDetectionEnabled&&F(t.phoneDetections)>=this.services.userPreferences.mobileDetectionThreshold;case`twoFacesDetected`:return this.services.userPreferences.multiPersonDetectionEnabled&&F(t.faceDetections)>=this.services.userPreferences.faceDetectionThreshold;case`noFaceDetected`:return this.services.userPreferences.noPersonDetectionEnabled}}lock(e){this.clearLock(),this.detectionEventLocked=!0;let t=this.getLockDuration(e);if(t<=0){this.detectionEventLocked=!1;return}this.detectionEventLockTimeoutId=setTimeout(()=>{this.detectionEventLocked=!1,this.detectionEventLockTimeoutId=void 0},t)}clearLock(){this.detectionEventLockTimeoutId&&=(clearTimeout(this.detectionEventLockTimeoutId),void 0),this.detectionEventLocked=!1}hasNoFaceDelayElapsed(){if(Date.now()<this.suppressNoFaceUntil)return this.noFaceStartedAt=void 0,!1;if(this.services.noFaceEventDelayMs<=0)return!0;let e=Date.now();return this.noFaceStartedAt===void 0?(this.noFaceStartedAt=e,!1):e-this.noFaceStartedAt>=this.services.noFaceEventDelayMs}getLockDuration(e){switch(e){case`mobileDevice`:return this.services.userPreferences.mobileDetectionLockDuration;case`twoFacesDetected`:return this.services.userPreferences.multiPersonLockDuration;case`noFaceDetected`:return this.services.userPreferences.noPersonLockDuration}}};function F(e){return e.reduce((e,t)=>Math.max(e,t.confidence),0)}var I=``+(typeof document>`u`&&typeof location>`u`?require("url").pathToFileURL(__dirname+`/assets/inference-worker-EjUccpPR.js`).href:new URL(`assets/inference-worker-EjUccpPR.js`,typeof document>`u`?location.href:document.currentScript&&document.currentScript.tagName.toUpperCase()===`SCRIPT`&&document.currentScript.src||document.baseURI).href),L=class{worker;nextRequestId=1;pendingRequests=new Map;async load(e){let t={id:this.nextRequestId,type:`load`,model:e};await this.request(t)}run(e){let t=e.source.kind===`bitmap`?[e.source.bitmap]:[e.source.data.buffer];return this.request({id:this.nextRequestId,type:`run`,source:e.source,inputSize:e.inputSize,inputType:e.inputType,confidenceThreshold:e.confidenceThreshold,faceConfidenceThreshold:e.faceConfidenceThreshold,iouThreshold:e.iouThreshold,maxDetections:e.maxDetections,debug:e.debug},t)}terminate(){this.rejectPendingRequests(Error(`Inference worker was terminated.`)),this.worker?.terminate(),this.worker=void 0}request(e,t=[]){let n=this.getWorker();return this.nextRequestId+=1,new Promise((r,i)=>{this.pendingRequests.set(e.id,{resolve:r,reject:i}),n.postMessage(e,t)})}getWorker(){return this.worker||(this.worker=new Worker(I,{name:`MonitorDogInference`,type:`module`}),this.worker.addEventListener(`message`,this.handleMessage),this.worker.addEventListener(`error`,this.handleError),this.worker.addEventListener(`messageerror`,this.handleError)),this.worker}handleMessage=e=>{let t=e.data,n=this.pendingRequests.get(t.id);if(n){if(this.pendingRequests.delete(t.id),!t.ok){n.reject(Error(t.error));return}n.resolve(t.result)}};handleError=e=>{let t=e instanceof ErrorEvent?e.message:`Inference worker message failed.`;this.rejectPendingRequests(Error(t)),this.worker?.terminate(),this.worker=void 0};rejectPendingRequests(e){for(let t of this.pendingRequests.values())t.reject(e);this.pendingRequests.clear()}};async function R(e){let{sourceWidth:t,sourceHeight:n}=z(e);if(e instanceof ImageData)return{kind:`rgba`,data:new Uint8ClampedArray(e.data),sourceWidth:t,sourceHeight:n};if(B()&&V())try{return{kind:`bitmap`,bitmap:await createImageBitmap(e),sourceWidth:t,sourceHeight:n}}catch{}return H(e,t,n)}function z(e){return e instanceof ImageData?{sourceWidth:e.width,sourceHeight:e.height}:e instanceof HTMLVideoElement?{sourceWidth:e.videoWidth,sourceHeight:e.videoHeight}:e instanceof HTMLImageElement?{sourceWidth:e.naturalWidth,sourceHeight:e.naturalHeight}:{sourceWidth:e.width,sourceHeight:e.height}}function B(){return typeof createImageBitmap==`function`}function V(){return typeof OffscreenCanvas==`function`}function H(e,t,n){let r=document.createElement(`canvas`),i=r.getContext(`2d`);if(!i)throw Error(`2D canvas context is not available.`);return r.width=t,r.height=n,i.drawImage(e,0,0,t,n),{kind:`rgba`,data:i.getImageData(0,0,t,n).data,sourceWidth:t,sourceHeight:n}}function ne(e){return e.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA&&e.videoWidth>0&&e.videoHeight>0&&!e.paused&&!e.ended}function U(e,t=1e4){return W(e)?Promise.resolve():new Promise((n,r)=>{let i=window.setTimeout(()=>{o(),r(Error(`Timed out waiting for webcam video metadata.`))},t),a=window.setInterval(s,100),o=()=>{window.clearTimeout(i),window.clearInterval(a),e.removeEventListener(`loadedmetadata`,c),e.removeEventListener(`loadeddata`,c),e.removeEventListener(`canplay`,c),e.removeEventListener(`playing`,c),e.removeEventListener(`resize`,c),e.removeEventListener(`error`,l)};function s(){W(e)&&(o(),n())}let c=()=>{s()},l=()=>{o(),r(Error(`Failed to load webcam video stream.`))};e.addEventListener(`loadedmetadata`,c,{once:!0}),e.addEventListener(`loadeddata`,c,{once:!0}),e.addEventListener(`canplay`,c,{once:!0}),e.addEventListener(`playing`,c,{once:!0}),e.addEventListener(`resize`,c,{once:!0}),e.addEventListener(`error`,l,{once:!0})})}function W(e){return e.readyState>=HTMLMediaElement.HAVE_METADATA&&e.videoWidth>0&&e.videoHeight>0}var G=class{services;inferenceWorker;loadPromise;lastInferenceMemoryErrorAt=0;constructor(e){this.services=e}async load(){this.loadPromise||=this.loadInferenceWorker(),await this.loadPromise}async detect(e){await this.load();let t=this.services.options,n=t.debug?performance.now():0,r=t.debug?performance.now():0,i=await R(e),a=t.debug?performance.now():0,o=await this.getInferenceWorker().run({source:i,inputSize:t.inputSize,inputType:t.inputType,confidenceThreshold:t.confidenceThreshold,faceConfidenceThreshold:t.faceConfidenceThreshold,iouThreshold:t.iouThreshold,maxDetections:t.maxDetections,debug:!!t.debug});if(t.debug){let e=performance.now();console.info(`[MonitorDog] detect frame`,{sourceMs:K(a-r),workerRoundtripMs:K(e-a),totalMs:K(e-n)})}return o}toPublicResult(e){return{faceDetected:e.faceDetected,phoneDetected:e.phoneDetected,faceCount:e.faceCount,phoneCount:e.phoneCount,faceDetections:e.faceDetections,phoneDetections:e.phoneDetections}}detectVideo(e){let t=!1,n,r=this.services.options.detectionIntervalMs,i=async()=>{if(!t){try{if(!this.services.shouldPauseDetection&&ne(e)){let n=await this.detect(e);if(t)return;try{await this.services.options.onDetect({...this.toPublicResult(n),video:e,timestamp:e.currentTime})}catch(e){this.services.options.onError?.(e)}if(t)return;await this.services.detectionEvents.handleDetectionResult(n,e).catch(e=>{this.services.options.onError?.(e)}),S(n)&&this.services.detectionEvents.clearTransientState()}}catch(e){this.handleDetectionLoopError(e)}t||(n=setTimeout(i,r))}};return i(),{stop(){t=!0,n&&clearTimeout(n)}}}async startWebcamDetection(){let e=this.services.options,t=await this.services.camera.createWebcamStream(e.constraints),n=this.services.camera,r=!e.video,i=e.video??document.createElement(`video`),a=i.muted,o=i.playsInline,s=i.srcObject;i.muted=!0,i.playsInline=!0,i.srcObject=t;try{await Promise.all([i.play(),U(i)])}catch(e){throw n.stopStream(t),i.pause(),r?i.srcObject=null:(i.muted=a,i.playsInline=o,i.srcObject=s),e}this.services.detectionEvents.resetForWebcamStartup();let c=this.detectVideo(i),l=!1,u=n.watchStreamDeviceDisconnect(t,()=>{d(),this.services.onCameraDisconnect?.()}),d=()=>{l||(l=!0,u(),c.stop(),this.services.detectionEvents.reset(),n.stopStream(t),i.pause(),r?i.srcObject=null:(i.muted=a,i.playsInline=o,i.srcObject=s))};return{stream:t,video:i,stop:d}}dispose(){this.inferenceWorker?.terminate(),this.inferenceWorker=void 0,this.loadPromise=void 0,this.services.detectionEvents.reset()}handleDetectionLoopError(e){this.isInferenceMemoryError(e)&&this.recoverFromInferenceMemoryError(),this.services.options.onError?.(e)}recoverFromInferenceMemoryError(){this.degradeModelForMemoryPressure(),this.resetInferenceWorker();let e=Date.now();e-this.lastInferenceMemoryErrorAt<1e4||(this.lastInferenceMemoryErrorAt=e)}resetInferenceWorker(){this.inferenceWorker?.terminate(),this.inferenceWorker=void 0,this.loadPromise=void 0}degradeModelForMemoryPressure(){this.services.degradeInferenceModelForMemoryPressure()}isInferenceMemoryError(e){let t=e instanceof Error?e.message:String(e);return/out of memory|oom|memory access out of bounds|cannot enlarge memory|array buffer allocation|bad allocation|allocation failed/i.test(t)}getInferenceWorker(){return this.inferenceWorker||=new L,this.inferenceWorker}async loadInferenceWorker(){try{await this.loadInferenceWorkerWithOptions()}catch(e){if(!this.isInferenceMemoryError(e))throw e;this.recoverFromInferenceMemoryError();try{await this.loadInferenceWorkerWithOptions()}catch(e){throw this.recoverFromInferenceMemoryError(),e}}}async loadInferenceWorkerWithOptions(){let e=await this.services.auth.getValidAccessToken();if(!e)throw Error(`MonitorDog login is required before loading detection.`);let t=this.services.options;await this.getInferenceWorker().load({apiBaseUrl:t.apiBaseUrl,accessToken:e,inputSize:t.inputSize})}};function K(e){return Math.round(e*10)/10}var q=class{services;isWebcamRunning=!1;stopCurrentWebcam;startPromise;shouldRun=!1;resumeWhenUnpaused=!1;handleVisibilityChange=()=>{this.syncPauseState()};constructor(e){this.services=e,this.services.onCameraDisconnect=()=>this.handleCameraDisconnect()}get isRunning(){return this.isWebcamRunning}get isStarting(){return!!this.startPromise}async start(){if(this.services.auth.assertAuthenticated(),this.shouldRun=!0,this.addVisibilityListener(),!this.isWebcamRunning){if(this.services.shouldPauseDetection){this.resumeWhenUnpaused=!0;return}await this.ensureStarted()}}stop(){this.shouldRun=!1,this.resumeWhenUnpaused=!1,this.removeVisibilityListener(),this.services.detectionEvents.reset(),this.stopWebcam()}async retryConnection(){await this.start()}async syncPauseState(){if(this.shouldRun){if(this.services.shouldPauseDetection){this.isWebcamRunning&&(this.resumeWhenUnpaused=!0,this.stopWebcam());return}if(this.resumeWhenUnpaused&&!this.isWebcamRunning){this.resumeWhenUnpaused=!1;try{await this.ensureStarted()}catch{this.shouldRun=!1}}}}syncBackgroundPreference(){this.services.options.runInBackground?this.removeVisibilityListener():this.shouldRun&&this.addVisibilityListener(),this.syncPauseState()}async ensureStarted(){this.isWebcamRunning||(this.startPromise||=this.startWebcam().finally(()=>{this.startPromise=void 0}),await this.startPromise)}async startWebcam(){try{let e=await this.services.detect.startWebcamDetection();if(!this.shouldRun){e.stop();return}this.isWebcamRunning=!0,this.stopCurrentWebcam=e.stop}catch(e){throw this.services.options.onError?.(e),e}}stopWebcam(){this.stopCurrentWebcam?.(),this.stopCurrentWebcam=void 0,this.isWebcamRunning=!1}async handleCameraDisconnect(){if(this.isWebcamRunning&&(this.stopWebcam(),this.shouldRun)){if(this.services.shouldPauseDetection){this.resumeWhenUnpaused=!0;return}try{await this.ensureStarted()}catch(e){this.services.options.onError?.(e)}}}addVisibilityListener(){this.services.options.runInBackground||typeof document>`u`||document.addEventListener(`visibilitychange`,this.handleVisibilityChange)}removeVisibilityListener(){typeof document>`u`||document.removeEventListener(`visibilitychange`,this.handleVisibilityChange)}},J=class{auth;camera;detectionEvents;detect;webcam;onCameraDisconnect;onLoginRequired;#e=0;#t=Y();#n;constructor(e){this.#n=e,this.camera=new j,this.auth=new O(this),this.detectionEvents=new P(this),this.detect=new G(this),this.webcam=new q(this)}get options(){return Object.freeze({...this.#n()})}get noFaceEventDelayMs(){return this.#e}get userPreferences(){return Object.freeze({...this.#t})}updateNoFaceEventDelayFromServer(e){this.#e=e}updateRequiredPasswordFromServer(e){this.#n().requiredPassword=e}degradeInferenceModelForMemoryPressure(){let e=this.#n();if(e.inputSize>416){e.inputSize=416;return}e.inputSize>320&&(e.inputSize=320)}get shouldPauseForHiddenPage(){return!this.options.runInBackground&&typeof document<`u`&&document.hidden}get shouldPauseDetection(){return this.shouldPauseForHiddenPage}applyPolicyItems(e,t){let n={...this.#t};for(let t of e)Z(n,t);this.#t=n,this.#n().confidenceThreshold=n.mobileDetectionThreshold,this.#n().faceConfidenceThreshold=n.faceDetectionThreshold,this.updateRequiredPasswordFromServer(!1)}resetAuthenticatedState(){this.#e=0,this.#t=Y(),this.#n().requiredPassword=!1,this.#n().confidenceThreshold=this.#t.mobileDetectionThreshold,this.#n().faceConfidenceThreshold=this.#t.faceDetectionThreshold}};function Y(){return{mobileDetectionThreshold:.8,faceDetectionThreshold:.8,language:`en`,mobileDetectionEnabled:!0,noPersonDetectionEnabled:!0,multiPersonDetectionEnabled:!0,noPersonLockDuration:0,multiPersonLockDuration:0,mobileDetectionLockDuration:0,mobileDetectionMode:`auto_lock`,noPersonDetectionMode:`auto_lock`,multiPersonDetectionMode:`auto_lock`}}function X(e){return e===`none`}function Z(e,t){let n=t.policy,r=!X(t.policy),i=t.seconds*1e3,a=`sensitivity`in t?1-t.sensitivity/100:void 0;switch(t.basic_event_uuid){case E(`mobileDevice`):e.mobileDetectionEnabled=r,e.mobileDetectionLockDuration=i,e.mobileDetectionMode=n,a!==void 0&&(e.mobileDetectionThreshold=a);break;case E(`twoFacesDetected`):e.multiPersonDetectionEnabled=r,e.multiPersonLockDuration=i,e.multiPersonDetectionMode=n,a!==void 0&&(e.faceDetectionThreshold=a);break;case E(`noFaceDetected`):e.noPersonDetectionEnabled=r,e.noPersonLockDuration=i,e.noPersonDetectionMode=n;break;default:break}}var Q=class e{#e;#t;#n=`anonymous`;#r=`idle`;#i=`idle`;#a;#o;static async init(t){return $=new e(t),$}constructor(e){ce(e);let t=se();this.#t={...e,apiBaseUrl:h(e.apiBaseUrl),confidenceThreshold:l,faceConfidenceThreshold:l,iouThreshold:u,maxDetections:100,inputSize:t?416:640,inputType:`float32`,detectionIntervalMs:e.detectionIntervalMs??300,requiredPassword:!1},this.#e=new J(()=>this.#t),this.#e.onLoginRequired=()=>this.resetLoggedOutState(),Object.freeze(this)}async load(){this.assertUsable(),this.assertAuthenticated(`loading detection`);try{this.updateState({runtime:`loading`,lastError:void 0}),await this.#e.detect.load(),this.updateState({runtime:`idle`,lastError:void 0})}catch(e){let t=this.createSdkError(`MODEL_LOAD_FAILED`,`MonitorDog detection model failed to load.`,e);throw this.transitionToError(t),this.#t.onError?.(t),t}}async login(e){this.assertUsable();let t;try{t=await this.#e.auth.login(e)}catch(e){let t=this.createSdkError(`SESSION_TOKEN_FAILED`,`MonitorDog SDK session token could not be created.`,e);throw this.transitionToError(t),this.#t.onAuthError?.(t),t}try{await this.completeAuthenticatedLogin()}catch(e){let t=this.createSdkError(`ACCOUNT_POLICY_FAILED`,`MonitorDog account or policy could not be loaded.`,e);throw this.rollbackAuthenticatedLogin(),this.transitionToError(t),this.#t.onAuthError?.(t),t}return this.updateState({session:`authenticated`,runtime:this.#r===`stopped`?`stopped`:`idle`,camera:this.#e.webcam.isRunning?`active`:`idle`,lastError:void 0}),t}async logout(){if(this.assertUsable(),this.isDetectorRunning())throw this.lifecycleError(`DETECTOR_RUNNING`,`MonitorDog detector is running. Call stop() before logout().`);if(!this.#e.auth.getToken()){this.clearSessionState();return}try{await this.#e.auth.logout(),this.clearSessionState()}catch(e){let t=this.createSdkError(`LOGOUT_FAILED`,`MonitorDog logout failed.`,e);throw this.transitionToError(t),this.#t.onAuthError?.(t),t}finally{this.#e.auth.getToken()||(this.#n=`anonymous`)}}async start(){this.assertUsable(),this.assertAuthenticated(`starting detection`),!this.isDetectorRunning()&&(this.#o||=this.startRuntime().finally(()=>{this.#o=void 0}),await this.#o)}stop(){this.assertUsable(),this.hasRuntimeToStop()&&(this.stopLocalRuntime(),this.updateState({runtime:this.#n===`authenticated`?`stopped`:`idle`,camera:`idle`,lastError:void 0}))}setRunInBackground(e){this.assertUsable(),this.#t.runInBackground=e,this.#e.webcam.syncBackgroundPreference()}getUserPreferences(){return this.assertUsable(),this.#e.userPreferences}getState(){return Object.freeze({session:this.#n,runtime:this.#r,camera:this.#i,tokenExpiresAt:this.#e.auth.getTokenExpiresAt(),email:this.#e.auth.getSessionEmail(),lastError:this.#a})}dispose(){this.#r!==`disposed`&&(this.stopLocalRuntime(),this.#e.detect.dispose(),this.#e.auth.dispose(),this.#e.resetAuthenticatedState(),this.updateState({session:`anonymous`,runtime:`disposed`,camera:`idle`,lastError:void 0}))}async completeAuthenticatedLogin(){let e=await this.#e.auth.authorizedFetch(`/account/me`,{method:`GET`,headers:{"content-type":`application/json`}});if(!e.ok)throw Error(`MonitorDog account request failed: ${e.status}`);let t=await e.json(),n=await this.#e.auth.authorizedFetch(`/account/${t.uuid}/lock_policy`,{method:`GET`,headers:{"content-type":`application/json`}});if(!n.ok)throw Error(`MonitorDog lock policy request failed: ${n.status}`);let r=await n.json();this.#e.applyPolicyItems(r,t)}resetLoggedOutState(){this.stopLocalRuntime(),this.#e.detect.dispose(),this.#e.resetAuthenticatedState(),this.updateState({session:`anonymous`,runtime:`idle`,camera:`idle`,lastError:void 0})}rollbackAuthenticatedLogin(){this.#e.auth.dispose(),this.#e.resetAuthenticatedState()}async startRuntime(){try{this.updateState({runtime:`loading`,camera:`idle`,lastError:void 0}),await this.#e.detect.load(),this.updateState({runtime:`starting`,camera:`requesting`}),await this.#e.webcam.start(),this.updateState({runtime:`running`,camera:this.#e.shouldPauseDetection?`idle`:`active`,lastError:void 0})}catch(e){let t=this.createSdkError(this.getStartErrorCode(e),this.getStartErrorMessage(e),e);throw this.transitionToError(t,re(t.code)?`blocked`:`idle`),this.#t.onError?.(t),t}}clearSessionState(){this.#e.resetAuthenticatedState(),this.updateState({session:`anonymous`,runtime:`idle`,camera:`idle`,lastError:void 0})}stopLocalRuntime(){this.#e.webcam.stop()}assertUsable(){if(this.#r===`disposed`)throw this.lifecycleError(`ALREADY_DISPOSED`,`MonitorDog detector instance has already been disposed.`,void 0,`disposed`)}assertAuthenticated(e){if(!this.#e.auth.isAuthenticated())throw this.lifecycleError(`NOT_LOGGED_IN`,`MonitorDog login is required before ${e}.`)}lifecycleError(e,t,n,r=`error`){let i=this.createSdkError(e,t,n);return r===`error`?this.transitionToError(i):this.updateState({runtime:r,lastError:i},!0),i}transitionToError(e,t=this.#i){this.updateState({runtime:`error`,camera:t,lastError:e},!0)}updateState(e,t=!1){let n=!1;e.session!==void 0&&e.session!==this.#n&&(this.#n=e.session,n=!0),e.runtime!==void 0&&e.runtime!==this.#r&&(this.#r=e.runtime,n=!0),e.camera!==void 0&&e.camera!==this.#i&&(this.#i=e.camera,n=!0),`lastError`in e&&e.lastError!==this.#a&&(this.#a=e.lastError,n=!0),(n||t)&&this.notifyStatusChange()}notifyStatusChange(){try{this.#t.onStatusChange?.(this.getState())}catch(e){this.#t.onError?.(e)}}createSdkError(e,t,n){return y(n)?n:new v(e,t,n)}isDetectorRunning(){return this.#r===`running`||this.#r===`starting`||!!this.#o||this.#e.webcam.isRunning||this.#e.webcam.isStarting}hasRuntimeToStop(){return this.#r===`running`||this.#r===`starting`||this.#i!==`idle`||!!this.#o||this.#e.webcam.isRunning||this.#e.webcam.isStarting}getStartErrorCode(e){return this.isCameraPermissionError(e)?`CAMERA_PERMISSION_DENIED`:this.isCameraReadError(e)?`CAMERA_READ_FAILED`:this.#r===`loading`?`MODEL_LOAD_FAILED`:`RUNTIME_START_FAILED`}getStartErrorMessage(e){switch(this.getStartErrorCode(e)){case`CAMERA_PERMISSION_DENIED`:return`MonitorDog camera permission was denied.`;case`CAMERA_READ_FAILED`:return`MonitorDog camera could not be read.`;case`MODEL_LOAD_FAILED`:return`MonitorDog detection model failed to load.`;default:return`MonitorDog detector runtime failed to start.`}}isCameraPermissionError(e){return typeof DOMException<`u`&&e instanceof DOMException&&(e.name===`NotAllowedError`||e.name===`SecurityError`)}isCameraReadError(e){return typeof DOMException<`u`&&e instanceof DOMException&&e.name===`NotReadableError`}};function re(e){return e===`CAMERA_PERMISSION_DENIED`||e===`CAMERA_READ_FAILED`}var $;function ie(e){return $=new Q(e),$}async function ae(e){return Q.init(e)}function oe(){if(!$)throw Error(`MonitorDog is not configured. Call MonitorDogDetector.init(), createMonitorDogDetector(), or configureMonitorDogDetector() before using getDetector().`);return $}function se(){if(typeof navigator>`u`)return!1;let e=g();return e===`mobile`||e===`tablet`}function ce(e){if(!e||typeof e.apiBaseUrl!=`string`||e.apiBaseUrl.length===0)throw Error(`MonitorDog apiBaseUrl is required.`);if(typeof e.sessionTokenProvider!=`function`)throw Error(`MonitorDog sessionTokenProvider is required.`);if(typeof e.onDetect!=`function`)throw Error(`MonitorDog onDetect callback is required.`)}e.MonitorDogDetector=Q,e.MonitorDogSdkError=v,e.configureMonitorDogDetector=ie,e.createMonitorDogDetector=ae,e.getDetector=oe,e.isMonitorDogSdkError=y});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("html2canvas")):typeof define==`function`&&define.amd?define([`exports`,`html2canvas`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.MonitorDogDetector={},e.html2canvas))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,o=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,c=(e,t,n,o)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=a(t),l=0,u=c.length,d;l<u;l++)d=c[l],!s.call(e,d)&&d!==n&&r(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(o=i(t,d))||o.enumerable});return e};t=((e,t,i)=>(i=e==null?{}:n(o(e)),c(t||!e||!e.__esModule?r(i,`default`,{value:e,enumerable:!0}):i,e)))(t,1);var l=.8,u=.7,d=3e4;function f(e){return typeof e==`string`?e:e.access_token}function ee(e){if(typeof e!=`string`)return e.expires_in}function p(e){if(typeof e!=`string`)return e.expires_at}function m(e){if(e.expiresAt){let t=Date.parse(e.expiresAt);if(!Number.isNaN(t))return t}if(e.expiresIn)return e.expiresIn>1e9?e.expiresIn*1e3:Date.now()+e.expiresIn*1e3}function h(e){return e.replace(/\/+$/,``)}function g(){if(typeof navigator>`u`)return`none`;let e=navigator.userAgent.toLowerCase();return/ipad|tablet/.test(e)?`tablet`:/mobile|iphone|ipod|android/.test(e)?`mobile`:/macintosh|windows|linux/.test(e)?`desktop`:`other`}function te(){if(typeof navigator>`u`)return`none`;let e=navigator.userAgent.toLowerCase(),t=navigator.platform.toLowerCase();return/win/.test(t)||/windows/.test(e)?`windows`:/mac/.test(t)||/mac os/.test(e)?`macos`:/android/.test(e)?`android`:/iphone|ipad|ipod/.test(e)?`ios`:/linux/.test(t)||/linux/.test(e)?`linux`:`other`}function ne(e){return e===`auto`||e===320||e===416||e===640}function re(e,t){let n=e??`auto`;return n===`auto`?t?416:640:n}function _(e){if(e===void 0)return;let t=e.trim();if(t.length===0)throw Error(`MonitorDog runtimeAssetBaseUrl must be a non-empty string when provided.`);let n=t.replace(/\/+$/,``);return n.length===0?`/`:n}var v=class extends Error{code;cause;constructor(e,t,n){super(t),this.name=`MonitorDogSdkError`,this.code=e,this.cause=n}};function y(e){return e instanceof v}function b(e){if(e.faceCount===0)return C(`noFaceDetected`,e);if(e.faceCount>=2)return C(`twoFacesDetected`,e);if(e.phoneCount>=1)return C(`mobileDevice`,e)}function x(e){return{...w(e,new Date().toISOString()),properties:{},webcam_imgs:[],monitor_imgs:[]}}function S(e){return e.phoneCount===0&&e.faceCount===1}function C(e,t){let n=w(e,new Date().toISOString());switch(e){case`noFaceDetected`:return{type:e,payload:{...n,properties:{confidence:0,spots:[]}}};case`twoFacesDetected`:return{type:e,payload:{...n,properties:{confidence:T(t.faceDetections),spots:t.faceDetections}}};case`mobileDevice`:return{type:e,payload:{...n,properties:{confidence:T(t.phoneDetections),spots:t.phoneDetections}}}}}function w(e,t){return{basic_event_uuid:E(e),occured_at:t,sended_at:new Date().toISOString(),device_type:g(),device_os:te(),device_id:`browser`}}function T(e){return e.reduce((e,t)=>Math.max(e,t.score),0)}function E(e){switch(e){case`logout`:return`12ca646a-d832-4581-b03c-48f95627507f`;case`login`:return`4c6f98ea-88d8-4215-9b6a-9b3ccb753465`;case`mobileDevice`:return`027af5c9-297d-4a64-983f-4199ca4b9dad`;case`twoFacesDetected`:return`d555efac-7465-4067-8056-611e95385807`;case`noFaceDetected`:return`e2c48c23-36e2-4253-82b1-7f6565fdcfc3`;default:return``}}var D=`MonitorDog token refresh was superseded.`,O=300*1e3,k=class{services;refreshBeforeMs=O;periodicRefreshIntervalMs=d;token;tokenExpiresAt;refreshPromise;refreshIntervalId;authSessionId=0;sessionEmail;constructor(e){this.services=e}async login(e){let t=await this.fetchSessionToken(e.email);return this.sessionEmail=e.email,this.setSessionTokenPayload(t),await this.sendUserActivityEvent(`login`),t}async logout(){if(this.token)try{await this.sendUserActivityEvent(`logout`)}finally{this.clearTokens()}}getToken(){return this.token}getTokenExpiresAt(){return this.tokenExpiresAt}getSessionEmail(){return this.sessionEmail}isAuthenticated(){return!!this.token}dispose(){this.clearTokens()}assertAuthenticated(){if(!this.token)throw Error(`MonitorDog login is required before detection.`)}async getValidAccessToken(){if(this.shouldRefreshCurrentToken())try{await this.handleAuthRefresh()}catch(e){if(this.token&&this.tokenExpiresAt&&Date.now()<this.tokenExpiresAt)return this.token;throw e}return this.token}async authorizedFetch(e,t={},n=!0){let r=await this.getValidAccessToken(),i=new Headers(t.headers);r&&(i.set(`authorization`,`Bearer ${r}`),i.set(`Device-Access-Token`,r));let a=await fetch(`${this.services.options.apiBaseUrl}${e}`,{...t,headers:i}),o=await this.getApiErrorCode(a);return a.status===400&&o===4221&&this.handleLoginRequired(),n&&this.shouldRefreshAfterAuthError(a,o)?(await this.handleAuthRefresh(),this.authorizedFetch(e,t,!1)):a}setSessionTokenPayload(e){let t=f(e);if(!t||typeof t!=`string`)throw Error(`MonitorDog SDK token response did not include a token.`);this.setTokens({accessToken:t,expiresIn:ee(e),expiresAt:p(e)})}setTokens(e){this.token=e.accessToken,this.tokenExpiresAt=m(e),this.tokenExpiresAt?this.startPeriodicRefresh():this.stopPeriodicRefresh()}clearTokens(){this.authSessionId+=1,this.token=void 0,this.tokenExpiresAt=void 0,this.refreshPromise=void 0,this.sessionEmail=void 0,this.stopPeriodicRefresh()}async refreshToken(){return this.refreshPromise||=this.refreshAccessToken().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async handleAuthRefresh(){try{return await this.refreshToken()}catch(e){if(!this.isRefreshSupersededError(e)){let t=this.createSdkError(`SESSION_TOKEN_FAILED`,`MonitorDog SDK session token refresh failed.`,e);this.services.options.onAuthError?.(t),this.isCurrentTokenExpired()&&(this.clearTokens(),this.services.onLoginRequired?.())}throw e}}async refreshAccessToken(){let e=this.authSessionId,t=this.sessionEmail;if(!t)throw Error(`MonitorDog login email is required to refresh SDK token.`);let n=await this.fetchSessionToken(t),r=f(n);if(!r||typeof r!=`string`)throw Error(`MonitorDog SDK token response did not include a token.`);if(e!==this.authSessionId)throw Error(D);return this.setSessionTokenPayload(n),r}startPeriodicRefresh(){this.refreshIntervalId||=setInterval(()=>{this.refreshPeriodically()},this.periodicRefreshIntervalMs)}stopPeriodicRefresh(){this.refreshIntervalId&&=(clearInterval(this.refreshIntervalId),void 0)}async refreshPeriodically(){if(!(!this.token||!this.shouldRefreshCurrentToken()))try{await this.handleAuthRefresh()}catch{}}shouldRefreshCurrentToken(){return!!(this.token&&this.tokenExpiresAt&&Date.now()>=this.tokenExpiresAt-this.refreshBeforeMs)}isCurrentTokenExpired(){return!!(this.tokenExpiresAt&&Date.now()>=this.tokenExpiresAt)}isRefreshSupersededError(e){return e instanceof Error&&e.message===D}async fetchSessionToken(e){let t=this.services.options.sessionTokenProvider;if(!t)throw Error(`MonitorDog sessionTokenProvider is required for SDK login.`);return t({email:e})}async getApiErrorCode(e){if(e.status===400)try{let t=await e.clone().json();if(typeof t==`object`&&t&&`code`in t&&typeof t.code==`number`)return t.code}catch{return}}shouldRefreshAfterAuthError(e,t){return e.status===401?!0:e.status===400&&t===422}handleLoginRequired(){this.clearTokens(),this.services.onLoginRequired?.();let e=this.createSdkError(`NOT_LOGGED_IN`,`MonitorDog login is required.`);throw this.services.options.onAuthError?.(e),e}async sendUserActivityEvent(e){try{let t=await this.authorizedFetch(`/event`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(x(e))});if(!t.ok)throw Error(`MonitorDog ${e} event failed: ${t.status}`)}catch(t){let n=this.createSdkError(A(e),`MonitorDog ${e} event failed.`,t);if(this.services.options.onAuthError?.(n),e===`logout`)throw n}}createSdkError(e,t,n){return n instanceof v?n:new v(e,t,n)}};function A(e){return e===`logout`?`LOGOUT_FAILED`:`SESSION_TOKEN_FAILED`}var j=/(obs|virtual|xsplit|manycam|splitcam|webcammax|fake|loopback|camtwist|e2esoft|vcam|droidcam|iriun|epoccam|camo|mmhmm|nvidia broadcast|streamlabs|bandicam|wirecast|chromacam|youcam|cyberlink|altserver|logi capture|elgato|streamfx|screen capture|desktop capture)/i,M=class{async createWebcamStream(e){if(!navigator.mediaDevices?.getUserMedia)throw Error(`getUserMedia is not available in this browser.`);let t=this.getBaseWebcamConstraints(e),n=await this.createFirstCameraConstraints(t);try{return await this.getUserMedia(n)}catch(e){if(this.isPermissionError(e)||this.isCameraRequestTimeoutError(e))throw e;return this.createFallbackWebcamStream(n,e)}}stopStream(e){e.getTracks().forEach(e=>e.stop())}watchStreamDeviceDisconnect(e,t,n=1e3){let r=e.getVideoTracks()[0],i=r?.getSettings().deviceId;if(!r&&!i)return()=>{};let a=!1,o,s=()=>{a||(a=!0,t())},c=()=>{i&&(o&&clearTimeout(o),o=setTimeout(()=>{o=void 0,this.handleDeviceChange(i,s)},n))};return r?.addEventListener(`ended`,s),navigator.mediaDevices?.addEventListener?.(`devicechange`,c),()=>{o&&clearTimeout(o),r?.removeEventListener(`ended`,s),navigator.mediaDevices?.removeEventListener?.(`devicechange`,c)}}isCameraInUse(e){let t=e?.srcObject;return t instanceof MediaStream?t.getTracks().some(e=>e.readyState===`live`):!1}async getVideoInputDevices(){return navigator.mediaDevices?.enumerateDevices?(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`videoinput`):[]}async getRealVideoInputDevices(){let e=await this.getVideoInputDevices(),t=e.filter(e=>!this.isVirtualCamera(e));return t.length>0?t:e}async createFallbackWebcamStream(e,t){let n=await this.getRealVideoInputDevices();if(n.length===0)throw t;let r=n[0],i=t;if(!r?.deviceId)throw i;let a=await this.getWebcamNaturalAspectRatio(r.deviceId),o=this.generateResolutionList(a,720);for(let t of o)try{return await this.getUserMedia(this.createDeviceConstraints(e,r.deviceId,t))}catch(e){i=e}throw i}async handleDeviceChange(e,t){try{(await this.getVideoInputDevices()).some(t=>t.deviceId===e)||t()}catch{}}getBaseWebcamConstraints(e){return e??{audio:!1,video:{facingMode:`user`}}}async createFirstCameraConstraints(e){let t=typeof e.video==`object`?e.video:{};if(`deviceId`in t||`facingMode`in t)return e;let n=(await this.getRealVideoInputDevices())[0];return n?.deviceId?this.createDeviceConstraints(e,n.deviceId):e}async getWebcamNaturalAspectRatio(e){let t;try{t=await this.getUserMedia({audio:!1,video:{deviceId:{exact:e}}});let n=t.getVideoTracks()[0]?.getSettings();if(n?.width&&n.height)return n.width/n.height}catch{}finally{t?.getTracks().forEach(e=>e.stop())}return 16/9}generateResolutionList(e,t){return[t,640,600,480,320,240].map(t=>({width:t,height:Math.max(1,Math.round(t/e))})).filter(e=>e.width<=t&&e.height>=120&&e.height<=1080)}createDeviceConstraints(e,t,n){let r=typeof e.video==`object`?e.video:{};return{...e,audio:e.audio??!1,video:{...r,deviceId:{exact:t},...n?{width:{min:n.width,ideal:n.width},height:{min:n.height,ideal:n.height}}:{}}}}isVirtualCamera(e){let t=e.label.toLowerCase();return t?j.test(t):!1}isPermissionError(e){return e instanceof DOMException&&(e.name===`NotAllowedError`||e.name===`SecurityError`)}getUserMedia(e,t=15e3){let n=!1,r,i=navigator.mediaDevices.getUserMedia(e).then(e=>{if(n)throw this.stopStream(e),Error(`Camera permission request timed out.`);return e}),a=new Promise((e,i)=>{r=setTimeout(()=>{n=!0,i(Error(`Camera permission request timed out.`))},t)});return Promise.race([i,a]).finally(()=>{r&&clearTimeout(r)})}isCameraRequestTimeoutError(e){return e instanceof Error&&e.message===`Camera permission request timed out.`}};function N(e){if(e.videoWidth===0||e.videoHeight===0)throw Error(`Video frame is not ready for capture.`);let t=document.createElement(`canvas`),n=t.getContext(`2d`);if(!n)throw Error(`2D canvas context is not available.`);return t.width=e.videoWidth,t.height=e.videoHeight,n.drawImage(e,0,0,t.width,t.height),new Promise((e,n)=>{t.toBlob(t=>{if(!t){n(Error(`Failed to capture video frame.`));return}e(t)},`image/jpeg`,.9)})}async function P(){if(typeof document>`u`||!document.body)return null;let e=await(0,t.default)(document.body,{backgroundColor:`#ffffff`,useCORS:!0});return new Promise(t=>{e.toBlob(t,`image/jpeg`,.9)})}var F=class e{static NO_FACE_STARTUP_GRACE_MS=1500;services;detectionEventLocked=!1;detectionEventInFlight=!1;detectionEventLockTimeoutId;noFaceStartedAt;suppressNoFaceUntil=0;constructor(e){this.services=e}async handleDetectionResult(e,t){if(S(e)){this.noFaceStartedAt=void 0,this.clearLock();return}if(this.detectionEventLocked||this.detectionEventInFlight)return;let n=b(e);if(!n){this.noFaceStartedAt=void 0;return}if(!(n.type===`noFaceDetected`&&!this.hasNoFaceDelayElapsed())&&(n.type!==`noFaceDetected`&&(this.noFaceStartedAt=void 0),this.shouldSendEvent(n.type,e))){this.lock(n.type),this.detectionEventInFlight=!0;try{let e=await this.uploadWebcamImage(t);e&&(n.payload.webcam_imgs=e);let r=await this.uploadMonitorImage();if(r&&(n.payload.monitor_imgs=r),this.services.options.debug){console.log(n.payload);return}let i=await this.services.auth.authorizedFetch(`/event`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n.payload)});if(!i.ok)throw Error(`MonitorDog event request failed: ${i.status}`)}finally{this.detectionEventInFlight=!1}}}reset(){this.clearLock(),this.noFaceStartedAt=void 0,this.suppressNoFaceUntil=0}resetForWebcamStartup(){this.clearLock(),this.noFaceStartedAt=void 0,this.suppressNoFaceUntil=Date.now()+e.NO_FACE_STARTUP_GRACE_MS}clearTransientState(){this.noFaceStartedAt=void 0}async uploadWebcamImage(e){if(!(e instanceof HTMLVideoElement)||e.videoWidth===0||e.videoHeight===0)return;let t=await N(e);return this.uploadImage(t,`webcam.jpg`)}async uploadMonitorImage(){let e=this.services.options.captureMonitorImage?await this.services.options.captureMonitorImage():await P();if(!e)return;let t=typeof File<`u`&&e instanceof File?e.name:`monitor.jpg`;return this.uploadImage(e,t)}async uploadImage(e,t){let n=new FormData;n.append(`files`,e,t);let r=await this.services.auth.authorizedFetch(`/file/image`,{method:`POST`,body:n});if(!r.ok)throw Error(`MonitorDog image upload failed: ${r.status}`);return r.json()}shouldSendEvent(e,t){switch(e){case`mobileDevice`:return this.services.userPreferences.mobileDetectionEnabled&&I(t.phoneDetections)>=this.services.userPreferences.mobileDetectionThreshold;case`twoFacesDetected`:return this.services.userPreferences.multiPersonDetectionEnabled&&I(t.faceDetections)>=this.services.userPreferences.faceDetectionThreshold;case`noFaceDetected`:return this.services.userPreferences.noPersonDetectionEnabled}}lock(e){this.clearLock(),this.detectionEventLocked=!0;let t=this.getLockDuration(e);if(t<=0){this.detectionEventLocked=!1;return}this.detectionEventLockTimeoutId=setTimeout(()=>{this.detectionEventLocked=!1,this.detectionEventLockTimeoutId=void 0},t)}clearLock(){this.detectionEventLockTimeoutId&&=(clearTimeout(this.detectionEventLockTimeoutId),void 0),this.detectionEventLocked=!1}hasNoFaceDelayElapsed(){if(Date.now()<this.suppressNoFaceUntil)return this.noFaceStartedAt=void 0,!1;if(this.services.noFaceEventDelayMs<=0)return!0;let e=Date.now();return this.noFaceStartedAt===void 0?(this.noFaceStartedAt=e,!1):e-this.noFaceStartedAt>=this.services.noFaceEventDelayMs}getLockDuration(e){switch(e){case`mobileDevice`:return this.services.userPreferences.mobileDetectionLockDuration;case`twoFacesDetected`:return this.services.userPreferences.multiPersonLockDuration;case`noFaceDetected`:return this.services.userPreferences.noPersonLockDuration}}};function I(e){return e.reduce((e,t)=>Math.max(e,t.confidence),0)}var L=``+(typeof document>`u`&&typeof location>`u`?require("url").pathToFileURL(__dirname+`/assets/inference-worker-jrK75m_K.js`).href:new URL(`assets/inference-worker-jrK75m_K.js`,typeof document>`u`?location.href:document.currentScript&&document.currentScript.tagName.toUpperCase()===`SCRIPT`&&document.currentScript.src||document.baseURI).href),R=class{worker;nextRequestId=1;pendingRequests=new Map;async load(e){let t={id:this.nextRequestId,type:`load`,model:e};await this.request(t)}run(e){let t=e.source.kind===`bitmap`?[e.source.bitmap]:[e.source.data.buffer];return this.request({id:this.nextRequestId,type:`run`,source:e.source,inputSize:e.inputSize,inputType:e.inputType,confidenceThreshold:e.confidenceThreshold,faceConfidenceThreshold:e.faceConfidenceThreshold,iouThreshold:e.iouThreshold,maxDetections:e.maxDetections,debug:e.debug},t)}terminate(){this.rejectPendingRequests(Error(`Inference worker was terminated.`)),this.worker?.terminate(),this.worker=void 0}request(e,t=[]){let n=this.getWorker();return this.nextRequestId+=1,new Promise((r,i)=>{this.pendingRequests.set(e.id,{resolve:r,reject:i}),n.postMessage(e,t)})}getWorker(){return this.worker||(this.worker=new Worker(L,{name:`MonitorDogInference`,type:`module`}),this.worker.addEventListener(`message`,this.handleMessage),this.worker.addEventListener(`error`,this.handleError),this.worker.addEventListener(`messageerror`,this.handleError)),this.worker}handleMessage=e=>{let t=e.data,n=this.pendingRequests.get(t.id);if(n){if(this.pendingRequests.delete(t.id),!t.ok){n.reject(Error(t.error));return}n.resolve(t.result)}};handleError=e=>{let t=e instanceof ErrorEvent?e.message:`Inference worker message failed.`;this.rejectPendingRequests(Error(t)),this.worker?.terminate(),this.worker=void 0};rejectPendingRequests(e){for(let t of this.pendingRequests.values())t.reject(e);this.pendingRequests.clear()}};async function z(e){let{sourceWidth:t,sourceHeight:n}=B(e);if(e instanceof ImageData)return{kind:`rgba`,data:new Uint8ClampedArray(e.data),sourceWidth:t,sourceHeight:n};if(V()&&ie())try{return{kind:`bitmap`,bitmap:await createImageBitmap(e),sourceWidth:t,sourceHeight:n}}catch{}return H(e,t,n)}function B(e){return e instanceof ImageData?{sourceWidth:e.width,sourceHeight:e.height}:e instanceof HTMLVideoElement?{sourceWidth:e.videoWidth,sourceHeight:e.videoHeight}:e instanceof HTMLImageElement?{sourceWidth:e.naturalWidth,sourceHeight:e.naturalHeight}:{sourceWidth:e.width,sourceHeight:e.height}}function V(){return typeof createImageBitmap==`function`}function ie(){return typeof OffscreenCanvas==`function`}function H(e,t,n){let r=document.createElement(`canvas`),i=r.getContext(`2d`);if(!i)throw Error(`2D canvas context is not available.`);return r.width=t,r.height=n,i.drawImage(e,0,0,t,n),{kind:`rgba`,data:i.getImageData(0,0,t,n).data,sourceWidth:t,sourceHeight:n}}function U(e){return e.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA&&e.videoWidth>0&&e.videoHeight>0&&!e.paused&&!e.ended}function W(e,t=1e4){return G(e)?Promise.resolve():new Promise((n,r)=>{let i=window.setTimeout(()=>{o(),r(Error(`Timed out waiting for webcam video metadata.`))},t),a=window.setInterval(s,100),o=()=>{window.clearTimeout(i),window.clearInterval(a),e.removeEventListener(`loadedmetadata`,c),e.removeEventListener(`loadeddata`,c),e.removeEventListener(`canplay`,c),e.removeEventListener(`playing`,c),e.removeEventListener(`resize`,c),e.removeEventListener(`error`,l)};function s(){G(e)&&(o(),n())}let c=()=>{s()},l=()=>{o(),r(Error(`Failed to load webcam video stream.`))};e.addEventListener(`loadedmetadata`,c,{once:!0}),e.addEventListener(`loadeddata`,c,{once:!0}),e.addEventListener(`canplay`,c,{once:!0}),e.addEventListener(`playing`,c,{once:!0}),e.addEventListener(`resize`,c,{once:!0}),e.addEventListener(`error`,l,{once:!0})})}function G(e){return e.readyState>=HTMLMediaElement.HAVE_METADATA&&e.videoWidth>0&&e.videoHeight>0}var K=class{services;inferenceWorker;loadPromise;lastInferenceMemoryErrorAt=0;constructor(e){this.services=e}async load(){this.loadPromise||=this.loadInferenceWorker(),await this.loadPromise}async detect(e){await this.load();let t=this.services.options,n=t.debug?performance.now():0,r=t.debug?performance.now():0,i=await z(e),a=t.debug?performance.now():0,o=await this.getInferenceWorker().run({source:i,inputSize:t.inputSize,inputType:t.inputType,confidenceThreshold:t.confidenceThreshold,faceConfidenceThreshold:t.faceConfidenceThreshold,iouThreshold:t.iouThreshold,maxDetections:t.maxDetections,debug:!!t.debug});if(t.debug){let e=performance.now();console.info(`[MonitorDog] detect frame`,{sourceMs:q(a-r),workerRoundtripMs:q(e-a),totalMs:q(e-n)})}return o}toPublicResult(e){return{faceDetected:e.faceDetected,phoneDetected:e.phoneDetected,faceCount:e.faceCount,phoneCount:e.phoneCount,faceDetections:e.faceDetections,phoneDetections:e.phoneDetections}}detectVideo(e){let t=!1,n,r=this.services.options.detectionIntervalMs,i=async()=>{if(!t){try{if(!this.services.shouldPauseDetection&&U(e)){let n=await this.detect(e);if(t)return;try{await this.services.options.onDetect({...this.toPublicResult(n),video:e,timestamp:e.currentTime})}catch(e){this.services.options.onError?.(e)}if(t)return;await this.services.detectionEvents.handleDetectionResult(n,e).catch(e=>{this.services.options.onError?.(e)}),S(n)&&this.services.detectionEvents.clearTransientState()}}catch(e){this.handleDetectionLoopError(e)}t||(n=setTimeout(i,r))}};return i(),{stop(){t=!0,n&&clearTimeout(n)}}}async startWebcamDetection(){let e=this.services.options,t=await this.services.camera.createWebcamStream(e.constraints),n=this.services.camera,r=!e.video,i=e.video??document.createElement(`video`),a=i.muted,o=i.playsInline,s=i.srcObject;i.muted=!0,i.playsInline=!0,i.srcObject=t;try{await Promise.all([i.play(),W(i)])}catch(e){throw n.stopStream(t),i.pause(),r?i.srcObject=null:(i.muted=a,i.playsInline=o,i.srcObject=s),e}this.services.detectionEvents.resetForWebcamStartup();let c=this.detectVideo(i),l=!1,u=n.watchStreamDeviceDisconnect(t,()=>{d(),this.services.onCameraDisconnect?.()}),d=()=>{l||(l=!0,u(),c.stop(),this.services.detectionEvents.reset(),n.stopStream(t),i.pause(),r?i.srcObject=null:(i.muted=a,i.playsInline=o,i.srcObject=s))};return{stream:t,video:i,stop:d}}dispose(){this.inferenceWorker?.terminate(),this.inferenceWorker=void 0,this.loadPromise=void 0,this.services.detectionEvents.reset()}handleDetectionLoopError(e){this.isInferenceMemoryError(e)&&this.recoverFromInferenceMemoryError(),this.services.options.onError?.(e)}recoverFromInferenceMemoryError(){this.degradeModelForMemoryPressure(),this.resetInferenceWorker();let e=Date.now();e-this.lastInferenceMemoryErrorAt<1e4||(this.lastInferenceMemoryErrorAt=e)}resetInferenceWorker(){this.inferenceWorker?.terminate(),this.inferenceWorker=void 0,this.loadPromise=void 0}degradeModelForMemoryPressure(){this.services.degradeInferenceModelForMemoryPressure()}isInferenceMemoryError(e){let t=e instanceof Error?e.message:String(e);return/out of memory|oom|memory access out of bounds|cannot enlarge memory|array buffer allocation|bad allocation|allocation failed/i.test(t)}getInferenceWorker(){return this.inferenceWorker||=new R,this.inferenceWorker}async loadInferenceWorker(){try{await this.loadInferenceWorkerWithOptions()}catch(e){if(!this.isInferenceMemoryError(e))throw e;this.recoverFromInferenceMemoryError();try{await this.loadInferenceWorkerWithOptions()}catch(e){throw this.recoverFromInferenceMemoryError(),e}}}async loadInferenceWorkerWithOptions(){let e=await this.services.auth.getValidAccessToken();if(!e)throw Error(`MonitorDog login is required before loading detection.`);let t=this.services.options;await this.getInferenceWorker().load({apiBaseUrl:t.apiBaseUrl,accessToken:e,inputSize:t.inputSize,runtimeAssetBaseUrl:t.runtimeAssetBaseUrl})}};function q(e){return Math.round(e*10)/10}var J=class{services;isWebcamRunning=!1;stopCurrentWebcam;startPromise;shouldRun=!1;resumeWhenUnpaused=!1;handleVisibilityChange=()=>{this.syncPauseState()};constructor(e){this.services=e,this.services.onCameraDisconnect=()=>this.handleCameraDisconnect()}get isRunning(){return this.isWebcamRunning}get isStarting(){return!!this.startPromise}async start(){if(this.services.auth.assertAuthenticated(),this.shouldRun=!0,this.addVisibilityListener(),!this.isWebcamRunning){if(this.services.shouldPauseDetection){this.resumeWhenUnpaused=!0;return}await this.ensureStarted()}}stop(){this.shouldRun=!1,this.resumeWhenUnpaused=!1,this.removeVisibilityListener(),this.services.detectionEvents.reset(),this.stopWebcam()}async retryConnection(){await this.start()}async syncPauseState(){if(this.shouldRun){if(this.services.shouldPauseDetection){this.isWebcamRunning&&(this.resumeWhenUnpaused=!0,this.stopWebcam());return}if(this.resumeWhenUnpaused&&!this.isWebcamRunning){this.resumeWhenUnpaused=!1;try{await this.ensureStarted()}catch{this.shouldRun=!1}}}}syncBackgroundPreference(){this.services.options.runInBackground?this.removeVisibilityListener():this.shouldRun&&this.addVisibilityListener(),this.syncPauseState()}async ensureStarted(){this.isWebcamRunning||(this.startPromise||=this.startWebcam().finally(()=>{this.startPromise=void 0}),await this.startPromise)}async startWebcam(){try{let e=await this.services.detect.startWebcamDetection();if(!this.shouldRun){e.stop();return}this.isWebcamRunning=!0,this.stopCurrentWebcam=e.stop}catch(e){throw this.services.options.onError?.(e),e}}stopWebcam(){this.stopCurrentWebcam?.(),this.stopCurrentWebcam=void 0,this.isWebcamRunning=!1}async handleCameraDisconnect(){if(this.isWebcamRunning&&(this.stopWebcam(),this.shouldRun)){if(this.services.shouldPauseDetection){this.resumeWhenUnpaused=!0;return}try{await this.ensureStarted()}catch(e){this.services.options.onError?.(e)}}}addVisibilityListener(){this.services.options.runInBackground||typeof document>`u`||document.addEventListener(`visibilitychange`,this.handleVisibilityChange)}removeVisibilityListener(){typeof document>`u`||document.removeEventListener(`visibilitychange`,this.handleVisibilityChange)}},Y=class{auth;camera;detectionEvents;detect;webcam;onCameraDisconnect;onLoginRequired;#e=0;#t=X();#n;constructor(e){this.#n=e,this.camera=new M,this.auth=new k(this),this.detectionEvents=new F(this),this.detect=new K(this),this.webcam=new J(this)}get options(){return Object.freeze({...this.#n()})}get noFaceEventDelayMs(){return this.#e}get userPreferences(){return Object.freeze({...this.#t})}updateNoFaceEventDelayFromServer(e){this.#e=e}updateRequiredPasswordFromServer(e){this.#n().requiredPassword=e}degradeInferenceModelForMemoryPressure(){let e=this.#n();if(e.inputSize>416){e.inputSize=416;return}e.inputSize>320&&(e.inputSize=320)}get shouldPauseForHiddenPage(){return!this.options.runInBackground&&typeof document<`u`&&document.hidden}get shouldPauseDetection(){return this.shouldPauseForHiddenPage}applyPolicyItems(e,t){let n={...this.#t};for(let t of e)oe(n,t);this.#t=n,this.#n().confidenceThreshold=n.mobileDetectionThreshold,this.#n().faceConfidenceThreshold=n.faceDetectionThreshold,this.updateRequiredPasswordFromServer(!1)}resetAuthenticatedState(){this.#e=0,this.#t=X(),this.#n().requiredPassword=!1,this.#n().confidenceThreshold=this.#t.mobileDetectionThreshold,this.#n().faceConfidenceThreshold=this.#t.faceDetectionThreshold}};function X(){return{mobileDetectionThreshold:.8,faceDetectionThreshold:.8,language:`en`,mobileDetectionEnabled:!0,noPersonDetectionEnabled:!0,multiPersonDetectionEnabled:!0,noPersonLockDuration:0,multiPersonLockDuration:0,mobileDetectionLockDuration:0,mobileDetectionMode:`auto_lock`,noPersonDetectionMode:`auto_lock`,multiPersonDetectionMode:`auto_lock`}}function ae(e){return e===`none`}function oe(e,t){let n=t.policy,r=!ae(t.policy),i=t.seconds*1e3,a=`sensitivity`in t?1-t.sensitivity/100:void 0;switch(t.basic_event_uuid){case E(`mobileDevice`):e.mobileDetectionEnabled=r,e.mobileDetectionLockDuration=i,e.mobileDetectionMode=n,a!==void 0&&(e.mobileDetectionThreshold=a);break;case E(`twoFacesDetected`):e.multiPersonDetectionEnabled=r,e.multiPersonLockDuration=i,e.multiPersonDetectionMode=n,a!==void 0&&(e.faceDetectionThreshold=a);break;case E(`noFaceDetected`):e.noPersonDetectionEnabled=r,e.noPersonLockDuration=i,e.noPersonDetectionMode=n;break;default:break}}var Z=class e{#e;#t;#n=`anonymous`;#r=`idle`;#i=`idle`;#a;#o;static async init(t){return Q=new e(t),Q}constructor(e){de(e);let t=ue(),n=_(e.runtimeAssetBaseUrl);this.#t={...e,apiBaseUrl:h(e.apiBaseUrl),runtimeAssetBaseUrl:n,confidenceThreshold:l,faceConfidenceThreshold:l,iouThreshold:u,maxDetections:100,inputSize:re(e.modelInputSize,t),inputType:`float32`,detectionIntervalMs:e.detectionIntervalMs??300,requiredPassword:!1},this.#e=new Y(()=>this.#t),this.#e.onLoginRequired=()=>this.resetLoggedOutState(),Object.freeze(this)}async load(){this.assertUsable(),this.assertAuthenticated(`loading detection`);try{this.updateState({runtime:`loading`,lastError:void 0}),await this.#e.detect.load(),this.updateState({runtime:`idle`,lastError:void 0})}catch(e){let t=this.createSdkError(`MODEL_LOAD_FAILED`,`MonitorDog detection model failed to load.`,e);throw this.transitionToError(t),this.#t.onError?.(t),t}}async login(e){this.assertUsable();let t;try{t=await this.#e.auth.login(e)}catch(e){let t=this.createSdkError(`SESSION_TOKEN_FAILED`,`MonitorDog SDK session token could not be created.`,e);throw this.transitionToError(t),this.#t.onAuthError?.(t),t}try{await this.completeAuthenticatedLogin()}catch(e){let t=this.createSdkError(`ACCOUNT_POLICY_FAILED`,`MonitorDog account or policy could not be loaded.`,e);throw this.rollbackAuthenticatedLogin(),this.transitionToError(t),this.#t.onAuthError?.(t),t}return this.updateState({session:`authenticated`,runtime:this.#r===`stopped`?`stopped`:`idle`,camera:this.#e.webcam.isRunning?`active`:`idle`,lastError:void 0}),t}async logout(){if(this.assertUsable(),this.isDetectorRunning())throw this.lifecycleError(`DETECTOR_RUNNING`,`MonitorDog detector is running. Call stop() before logout().`);if(!this.#e.auth.getToken()){this.clearSessionState();return}try{await this.#e.auth.logout(),this.clearSessionState()}catch(e){let t=this.createSdkError(`LOGOUT_FAILED`,`MonitorDog logout failed.`,e);throw this.transitionToError(t),this.#t.onAuthError?.(t),t}finally{this.#e.auth.getToken()||(this.#n=`anonymous`)}}async start(){this.assertUsable(),this.assertAuthenticated(`starting detection`),!this.isDetectorRunning()&&(this.#o||=this.startRuntime().finally(()=>{this.#o=void 0}),await this.#o)}stop(){this.assertUsable(),this.hasRuntimeToStop()&&(this.stopLocalRuntime(),this.updateState({runtime:this.#n===`authenticated`?`stopped`:`idle`,camera:`idle`,lastError:void 0}))}setRunInBackground(e){this.assertUsable(),this.#t.runInBackground=e,this.#e.webcam.syncBackgroundPreference()}getUserPreferences(){return this.assertUsable(),this.#e.userPreferences}getState(){return Object.freeze({session:this.#n,runtime:this.#r,camera:this.#i,tokenExpiresAt:this.#e.auth.getTokenExpiresAt(),email:this.#e.auth.getSessionEmail(),lastError:this.#a})}dispose(){this.#r!==`disposed`&&(this.stopLocalRuntime(),this.#e.detect.dispose(),this.#e.auth.dispose(),this.#e.resetAuthenticatedState(),this.updateState({session:`anonymous`,runtime:`disposed`,camera:`idle`,lastError:void 0}))}async completeAuthenticatedLogin(){let e=await this.#e.auth.authorizedFetch(`/account/me`,{method:`GET`,headers:{"content-type":`application/json`}});if(!e.ok)throw Error(`MonitorDog account request failed: ${e.status}`);let t=await e.json(),n=await this.#e.auth.authorizedFetch(`/account/${t.uuid}/lock_policy`,{method:`GET`,headers:{"content-type":`application/json`}});if(!n.ok)throw Error(`MonitorDog lock policy request failed: ${n.status}`);let r=await n.json();this.#e.applyPolicyItems(r,t)}resetLoggedOutState(){this.stopLocalRuntime(),this.#e.detect.dispose(),this.#e.resetAuthenticatedState(),this.updateState({session:`anonymous`,runtime:`idle`,camera:`idle`,lastError:void 0})}rollbackAuthenticatedLogin(){this.#e.auth.dispose(),this.#e.resetAuthenticatedState()}async startRuntime(){try{this.updateState({runtime:`loading`,camera:`idle`,lastError:void 0}),await this.#e.detect.load(),this.updateState({runtime:`starting`,camera:`requesting`}),await this.#e.webcam.start(),this.updateState({runtime:`running`,camera:this.#e.shouldPauseDetection?`idle`:`active`,lastError:void 0})}catch(e){let t=this.createSdkError(this.getStartErrorCode(e),this.getStartErrorMessage(e),e);throw this.transitionToError(t,se(t.code)?`blocked`:`idle`),this.#t.onError?.(t),t}}clearSessionState(){this.#e.resetAuthenticatedState(),this.updateState({session:`anonymous`,runtime:`idle`,camera:`idle`,lastError:void 0})}stopLocalRuntime(){this.#e.webcam.stop()}assertUsable(){if(this.#r===`disposed`)throw this.lifecycleError(`ALREADY_DISPOSED`,`MonitorDog detector instance has already been disposed.`,void 0,`disposed`)}assertAuthenticated(e){if(!this.#e.auth.isAuthenticated())throw this.lifecycleError(`NOT_LOGGED_IN`,`MonitorDog login is required before ${e}.`)}lifecycleError(e,t,n,r=`error`){let i=this.createSdkError(e,t,n);return r===`error`?this.transitionToError(i):this.updateState({runtime:r,lastError:i},!0),i}transitionToError(e,t=this.#i){this.updateState({runtime:`error`,camera:t,lastError:e},!0)}updateState(e,t=!1){let n=!1;e.session!==void 0&&e.session!==this.#n&&(this.#n=e.session,n=!0),e.runtime!==void 0&&e.runtime!==this.#r&&(this.#r=e.runtime,n=!0),e.camera!==void 0&&e.camera!==this.#i&&(this.#i=e.camera,n=!0),`lastError`in e&&e.lastError!==this.#a&&(this.#a=e.lastError,n=!0),(n||t)&&this.notifyStatusChange()}notifyStatusChange(){try{this.#t.onStatusChange?.(this.getState())}catch(e){this.#t.onError?.(e)}}createSdkError(e,t,n){return y(n)?n:new v(e,t,n)}isDetectorRunning(){return this.#r===`running`||this.#r===`starting`||!!this.#o||this.#e.webcam.isRunning||this.#e.webcam.isStarting}hasRuntimeToStop(){return this.#r===`running`||this.#r===`starting`||this.#i!==`idle`||!!this.#o||this.#e.webcam.isRunning||this.#e.webcam.isStarting}getStartErrorCode(e){return this.isCameraPermissionError(e)?`CAMERA_PERMISSION_DENIED`:this.isCameraReadError(e)?`CAMERA_READ_FAILED`:this.#r===`loading`?`MODEL_LOAD_FAILED`:`RUNTIME_START_FAILED`}getStartErrorMessage(e){switch(this.getStartErrorCode(e)){case`CAMERA_PERMISSION_DENIED`:return`MonitorDog camera permission was denied.`;case`CAMERA_READ_FAILED`:return`MonitorDog camera could not be read.`;case`MODEL_LOAD_FAILED`:return`MonitorDog detection model failed to load.`;default:return`MonitorDog detector runtime failed to start.`}}isCameraPermissionError(e){return typeof DOMException<`u`&&e instanceof DOMException&&(e.name===`NotAllowedError`||e.name===`SecurityError`)}isCameraReadError(e){return typeof DOMException<`u`&&e instanceof DOMException&&e.name===`NotReadableError`}};function se(e){return e===`CAMERA_PERMISSION_DENIED`||e===`CAMERA_READ_FAILED`}var Q;function ce(e){return Q=new Z(e),Q}async function le(e){return Z.init(e)}function $(){if(!Q)throw Error(`MonitorDog is not configured. Call MonitorDogDetector.init(), createMonitorDogDetector(), or configureMonitorDogDetector() before using getDetector().`);return Q}function ue(){if(typeof navigator>`u`)return!1;let e=g();return e===`mobile`||e===`tablet`}function de(e){if(!e||typeof e.apiBaseUrl!=`string`||e.apiBaseUrl.length===0)throw Error(`MonitorDog apiBaseUrl is required.`);if(typeof e.sessionTokenProvider!=`function`)throw Error(`MonitorDog sessionTokenProvider is required.`);if(typeof e.onDetect!=`function`)throw Error(`MonitorDog onDetect callback is required.`);if(e.runtimeAssetBaseUrl!==void 0&&_(e.runtimeAssetBaseUrl),e.modelInputSize!==void 0&&!ne(e.modelInputSize))throw Error(`MonitorDog modelInputSize must be "auto", 320, 416, or 640.`)}e.MonitorDogDetector=Z,e.MonitorDogSdkError=v,e.configureMonitorDogDetector=ce,e.createMonitorDogDetector=le,e.getDetector=$,e.isMonitorDogSdkError=y});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MonitorDogModelInputSize } from "./types";
|
|
2
|
+
export declare function isMonitorDogModelInputSize(value: unknown): value is MonitorDogModelInputSize;
|
|
3
|
+
export declare function resolveModelInputSize(modelInputSize: MonitorDogModelInputSize | undefined, isMobileOrTablet: boolean): number;
|
|
4
|
+
export declare function normalizeRuntimeAssetBaseUrl(runtimeAssetBaseUrl: string | undefined): string | undefined;
|
|
5
|
+
export declare function resolveRuntimeAssetPath(runtimeAssetBaseUrl: string, assetPath: string): string;
|
|
6
|
+
export declare function resolveRuntimeSdkAssetUrl(filename: string, runtimeAssetBaseUrl: string | undefined, defaultUrl: string): string;
|
|
7
|
+
export declare function resolveRuntimeOrtWasmPath(runtimeAssetBaseUrl: string | undefined, defaultUrl: string): string;
|
package/dist/types.d.ts
CHANGED
|
@@ -62,10 +62,13 @@ export interface MonitorDogWebcamDetectionController extends MonitorDogVideoDete
|
|
|
62
62
|
stream: MediaStream;
|
|
63
63
|
video: HTMLVideoElement;
|
|
64
64
|
}
|
|
65
|
+
export type MonitorDogModelInputSize = "auto" | 320 | 416 | 640;
|
|
65
66
|
export interface MonitorDogDetectorOptions {
|
|
66
67
|
apiBaseUrl: string;
|
|
67
68
|
debug?: boolean;
|
|
68
69
|
detectionIntervalMs?: number;
|
|
70
|
+
runtimeAssetBaseUrl?: string;
|
|
71
|
+
modelInputSize?: MonitorDogModelInputSize;
|
|
69
72
|
sessionTokenProvider: MonitorDogSessionTokenProvider;
|
|
70
73
|
onStatusChange?: (state: MonitorDogDetectorState) => void;
|
|
71
74
|
onAuthError?: (error: unknown) => void;
|