@monitordog/detector 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +10 -0
- package/README.md +129 -0
- package/dist/assets/inference-worker-BqvxPw8S.js +2 -0
- package/dist/auth.d.ts +6 -0
- package/dist/capture.d.ts +2 -0
- package/dist/constants.d.ts +21 -0
- package/dist/detect/inference-worker-client.d.ts +24 -0
- package/dist/detect/model-loader.d.ts +17 -0
- package/dist/detect/preprocess.d.ts +8 -0
- package/dist/detect/wasm/webcam-frame-analysis-wasm-bytes.d.ts +1 -0
- package/dist/detect/webcam-blockage-detector.d.ts +32 -0
- package/dist/detect/webcam-frame-analysis-wasm.d.ts +47 -0
- package/dist/detect/webcam-frame-analysis.d.ts +34 -0
- package/dist/detect/webcam-lighting-detector.d.ts +21 -0
- package/dist/environment.d.ts +11 -0
- package/dist/events.d.ts +8 -0
- package/dist/index.d.ts +41 -0
- package/dist/language.d.ts +6 -0
- package/dist/monitordog-detector.d.ts +41 -0
- package/dist/monitordog-detector.js +12297 -0
- package/dist/monitordog-detector.umd.cjs +54 -0
- package/dist/pose/mediapipe-asset-loader.d.ts +16 -0
- package/dist/pose/mediapipe-main-user-tracker.d.ts +90 -0
- package/dist/pose.d.ts +15 -0
- package/dist/sdk-error.d.ts +7 -0
- package/dist/service/auth-service.d.ts +42 -0
- package/dist/service/camera-service.d.ts +19 -0
- package/dist/service/container.d.ts +47 -0
- package/dist/service/detect-service.d.ts +53 -0
- package/dist/service/detection-event-service.d.ts +32 -0
- package/dist/service/overlay-renderer.d.ts +71 -0
- package/dist/service/overlay-service.d.ts +75 -0
- package/dist/service/overlay-watchdog-service.d.ts +13 -0
- package/dist/service/webcam-service.d.ts +26 -0
- package/dist/types.d.ts +361 -0
- package/dist/video.d.ts +2 -0
- package/package.json +47 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Copyright (c) 2026 Spresto, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
This package is proprietary MonitorDog software.
|
|
4
|
+
|
|
5
|
+
You may install and use this package only to integrate with MonitorDog services
|
|
6
|
+
under a written agreement with Spresto or applicable MonitorDog terms.
|
|
7
|
+
|
|
8
|
+
You may not copy, modify, redistribute, sublicense, reverse engineer, or use this
|
|
9
|
+
package to build a competing product except as expressly permitted by that
|
|
10
|
+
agreement.
|
package/README.md
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# @monitordog/detector
|
|
2
|
+
|
|
3
|
+
Browser SDK for MonitorDog webcam detection. The SDK runs the bundled detector in the browser, uploads evidence images when needed, and sends detection/user-activity events to the MonitorDog API.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @monitordog/detector
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Login Access Token Flow
|
|
12
|
+
|
|
13
|
+
`login({ email })` calls the `sessionTokenProvider` registered in `MonitorDogDetector.init()`. The provider should call your server endpoint and return a short-lived MonitorDog SDK access token to the browser.
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
login({ email }) -> sessionTokenProvider({ email }) -> customer backend -> POST /v1/sdk/sessions -> browser SDK
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Do not put a MonitorDog partner API key in browser code, browser environment variables, local storage, or a frontend-only proxy. The customer backend owns the partner API key and returns only a short-lived SDK access token to the browser.
|
|
20
|
+
|
|
21
|
+
Browser integration:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { MonitorDogDetector } from "@monitordog/detector";
|
|
25
|
+
|
|
26
|
+
async function getMonitorDogAccessToken({ email }: { email: string }) {
|
|
27
|
+
const response = await fetch("/api/monitordog/access-token", {
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: { "content-type": "application/json" },
|
|
30
|
+
credentials: "include",
|
|
31
|
+
body: JSON.stringify({ email }),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
throw new Error("Failed to issue MonitorDog access token.");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return response.json();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const detector = await MonitorDogDetector.init({
|
|
42
|
+
apiBaseUrl: "https://api.monitor.dog/v1",
|
|
43
|
+
sessionTokenProvider: getMonitorDogAccessToken,
|
|
44
|
+
overlay: {
|
|
45
|
+
enabled: true,
|
|
46
|
+
locale: "en",
|
|
47
|
+
},
|
|
48
|
+
onDetect(result) {
|
|
49
|
+
console.log("MonitorDog detection", result);
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
await detector.login({ email: "user@example.com" });
|
|
54
|
+
await detector.start();
|
|
55
|
+
|
|
56
|
+
// Later, before ending the SDK session:
|
|
57
|
+
detector.stop();
|
|
58
|
+
await detector.logout();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Customer backend `/api/monitordog/access-token` example:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
export async function POST(request: Request) {
|
|
65
|
+
const { email } = await request.json();
|
|
66
|
+
|
|
67
|
+
const response = await fetch("https://api.monitor.dog/v1/sdk/sessions", {
|
|
68
|
+
method: "POST",
|
|
69
|
+
headers: {
|
|
70
|
+
"content-type": "application/json",
|
|
71
|
+
authorization: `Bearer ${process.env.MONITORDOG_PARTNER_API_KEY}`,
|
|
72
|
+
},
|
|
73
|
+
body: JSON.stringify({ email }),
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
return new Response(await response.text(), {
|
|
77
|
+
status: response.status,
|
|
78
|
+
headers: { "content-type": "application/json" },
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Public Runtime Calls
|
|
84
|
+
|
|
85
|
+
Across `login({ email })` and `start()`, the SDK runtime is expected to call only these MonitorDog API paths:
|
|
86
|
+
|
|
87
|
+
- `GET /account/me`
|
|
88
|
+
- `GET /account/{uuid}/lock_policy`
|
|
89
|
+
- `GET /auth/sdk-model`
|
|
90
|
+
- `POST /file/image`
|
|
91
|
+
- `POST /event`
|
|
92
|
+
|
|
93
|
+
The browser SDK does not call password login, MFA, refresh-token, cookie-refresh, remote stream, remote unlock, or policy update APIs.
|
|
94
|
+
|
|
95
|
+
## Public API
|
|
96
|
+
|
|
97
|
+
The package entry is `src/index.ts`; generated declarations are copied to `dist/monitordog-detector.d.ts`.
|
|
98
|
+
|
|
99
|
+
Official customer entrypoint:
|
|
100
|
+
|
|
101
|
+
- `MonitorDogDetector.init(options)`
|
|
102
|
+
|
|
103
|
+
Compatibility exports for older integrations:
|
|
104
|
+
|
|
105
|
+
- `configureMonitorDogDetector(options)`
|
|
106
|
+
- `createMonitorDogDetector(options)`
|
|
107
|
+
- `getDetector()`
|
|
108
|
+
|
|
109
|
+
Detector methods:
|
|
110
|
+
|
|
111
|
+
- `login({ email })`
|
|
112
|
+
- `load()`
|
|
113
|
+
- `start()`
|
|
114
|
+
- `stop()`
|
|
115
|
+
- `logout()`
|
|
116
|
+
- `dispose()`
|
|
117
|
+
- `getState()`
|
|
118
|
+
- `setRunInBackground(runInBackground)`
|
|
119
|
+
- `getUserPreferences()`
|
|
120
|
+
- `isMainUserTrackingEnabled()`
|
|
121
|
+
- `setMainUserTrackingEnabled(enabled)`
|
|
122
|
+
|
|
123
|
+
Default lifecycle:
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
init -> login -> start -> stop -> logout -> dispose
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
`login({ email })` only prepares the SDK session, login event, account state, and policy state. `start()` loads the model, requests camera access, and starts the detection loop. `stop()` stops local detection while keeping the SDK token/session alive. `logout()` ends the SDK session and must be called after `stop()` if the detector is running. `dispose()` force-cleans local resources and marks the instance unusable.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(){let e=[`phone_back`,`phone_front`,`phone_back_cam`,`cup`,`hand`,`face`];function t(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),i=t.getUint32(0,!0),a=t.getUint32(4,!0),o=r(e.byteLength,i+a),s=Uint32Array.BYTES_PER_ELEMENT*2,c=n(t,s,i,{classId:5,label:`face`,recordFloatCount:o});s+=i*o*Float32Array.BYTES_PER_ELEMENT;let l=n(t,s,a,{classId:0,label:`phone`,recordFloatCount:o});return{faceDetected:i>0,phoneDetected:a>0,faceCount:i,phoneCount:a,faceDetections:c,phoneDetections:l}}function n(e,t,n,r){let a=[],o=t;for(let t=0;t<n;t+=1){let t=r.recordFloatCount===7,n=t?e.getFloat32(o,!0):r.classId,s=t?o+Float32Array.BYTES_PER_ELEMENT:o;a.push({classId:n,label:t?i(n):r.label,score:e.getFloat32(s,!0),confidence:e.getFloat32(s+4,!0),x:e.getFloat32(s+8,!0),y:e.getFloat32(s+12,!0),width:e.getFloat32(s+16,!0),height:e.getFloat32(s+20,!0)}),o+=r.recordFloatCount*Float32Array.BYTES_PER_ELEMENT}return a}function r(e,t){return t===0||e-Uint32Array.BYTES_PER_ELEMENT*2==t*7*Float32Array.BYTES_PER_ELEMENT?7:6}function i(t){return e[t]??`unknown`}async function a(e){return c({...e,buildVersion:e.modelBuildVersion,buildNumber:e.modelBuildNumber,errorContext:`model`})}async function o(e){let t=await c({...e,buildVersion:e.modelBuildVersion,buildNumber:`ort-js`,errorContext:`ORT JS runtime`});try{return new TextDecoder().decode(t)}finally{t.fill(0)}}async function s(e){return c({...e,buildVersion:e.modelBuildVersion,buildNumber:`ort-wasm`,errorContext:`ORT WASM runtime`})}async function c(e){x();let t=await crypto.subtle.generateKey({name:`RSA-OAEP`,modulusLength:2048,publicExponent:new Uint8Array([1,0,1]),hash:`SHA-256`},!0,[`decrypt`]),n=m(await f(t.publicKey)),r=await l({apiBaseUrl:e.apiBaseUrl,accessToken:e.accessToken,buildVersion:e.buildVersion,buildNumber:e.buildNumber,errorContext:e.errorContext},n),i=await u(r.model_download_url),a=new Uint8Array(await crypto.subtle.decrypt({name:`RSA-OAEP`},t.privateKey,b(h(r.encrypted_dek)))),o=g(a);try{return await d(i,o)}finally{i.fill(0),a.fill(0),o.fill(0)}}async function l(e,t){let n=new URLSearchParams({build_version:e.buildVersion,build_number:String(e.buildNumber),public_key:t}),r=await fetch(`${e.apiBaseUrl}/auth/sdk-model?${n}`,{method:`GET`,headers:{accept:`application/json`,authorization:`Bearer ${e.accessToken}`,"Device-Access-Token":e.accessToken}});if(!r.ok)throw Error(`MonitorDog SDK ${e.errorContext} request failed: ${r.status}`);let i=await r.json();if(!i.encrypted_dek||!i.model_download_url)throw Error(`MonitorDog SDK ${e.errorContext} response is incomplete.`);return{encrypted_dek:i.encrypted_dek,model_download_url:i.model_download_url}}async function u(e){let t=await fetch(e);if(!t.ok)throw Error(`Failed to download MonitorDog model: ${t.status} ${t.statusText}`);return new Uint8Array(await t.arrayBuffer())}async function d(e,t){if(e.byteLength<=12)throw Error(`MonitorDog encrypted model data is too short.`);let n=await crypto.subtle.importKey(`raw`,b(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:b(r)},n,b(i)))}async function f(e){let t=await crypto.subtle.exportKey(`spki`,e);return[`-----BEGIN PUBLIC KEY-----`,...p(new Uint8Array(t)).match(/.{1,64}/g)??[],`-----END PUBLIC KEY-----`].join(`
|
|
2
|
+
`)}function p(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function m(e){return p(new TextEncoder().encode(e))}function h(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 g(e){if(y(e.byteLength))return new Uint8Array(e);let t=new TextDecoder().decode(e).trim(),n=_(t.startsWith(`"`)&&t.endsWith(`"`)?t.slice(1,-1):t);if(n&&y(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 _(e){if(/^[0-9a-f]+$/i.test(e)&&e.length%2==0)return v(e);try{return h(e)}catch{return}}function v(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 y(e){return e===16||e===32}function b(e){let t=new ArrayBuffer(e.byteLength);return new Uint8Array(t).set(e),t}function x(){if(!globalThis.crypto?.subtle)throw Error(`MonitorDog SDK model decryption requires Web Crypto API.`)}var S=class{loadOptions;module;loadPromise;wasmBlobUrl;detectorInputPointer=0;detectorInputByteLength=0;detectorDimsPointer=0;detectorDimsByteLength=0;detectorOutputDataPointerPointer=0;detectorOutputByteLengthPointer=0;constructor(e){this.loadOptions=e}async load(e){this.loadPromise||=this.loadModel(e),await this.loadPromise}async run(e){let t=await this.getModule();if(e.input.type!==`float32`)throw Error(`ort-detector PoC only supports float32 input tensors.`);if(!(e.input.data instanceof Float32Array))throw Error(`ort-detector PoC expected Float32Array input data.`);let n=e.input.data,r=t._malloc(n.byteLength),i=t._malloc(e.input.dims.length*8),a=t._malloc(4),o=t._malloc(4),s=t._malloc(4),c=t._malloc(4);try{t.HEAPF32.set(n,r/Float32Array.BYTES_PER_ELEMENT),C(t,i,e.input.dims),T(t,t._md_ort_run_float32_nchw(r,n.length,i,e.input.dims.length,a,o,s,c),`ort-detector inference failed`);let l=t.getValue(a,`*`),u=t.getValue(o,`i32`),d=t.getValue(s,`*`),f=t.getValue(c,`i32`);try{let n=new Float32Array(u);return n.set(t.HEAPF32.subarray(l/Float32Array.BYTES_PER_ELEMENT,l/Float32Array.BYTES_PER_ELEMENT+u)),{output:{type:`float32`,data:n,dims:w(t,d,f)},input:e.metadata}}finally{t._md_ort_free(l),t._md_ort_free(d)}}finally{t.HEAPU8.fill(0,r,r+n.byteLength),t._free(r),t._free(i),t._free(a),t._free(o),t._free(s),t._free(c)}}async runDetector(e){let n=await this.getModule();if(e.input.type!==`float32`)throw Error(`ort-detector only supports float32 input tensors.`);if(!(e.input.data instanceof Float32Array))throw Error(`ort-detector expected Float32Array input data.`);let r=e.input.data,i=this.ensureDetectorBuffers(n,r.byteLength,e.input.dims.length*BigInt64Array.BYTES_PER_ELEMENT);n.HEAPF32.set(r,i.inputPointer/Float32Array.BYTES_PER_ELEMENT),C(n,i.dimsPointer,e.input.dims),T(n,n._md_ort_run_detector_float32_nchw(i.inputPointer,r.length,i.dimsPointer,e.input.dims.length,e.metadata.sourceWidth,e.metadata.sourceHeight,e.metadata.ratio,e.metadata.padX,e.metadata.padY,e.confidenceThreshold,e.faceConfidenceThreshold,e.iouThreshold,e.maxDetections,i.outputDataPointerPointer,i.outputByteLengthPointer),`ort-detector run failed`);let a=n.getValue(i.outputDataPointerPointer,`*`),o=n.getValue(i.outputByteLengthPointer,`i32`);try{return t(n.HEAPU8.subarray(a,a+o))}finally{n._md_ort_free(a)}}dispose(){this.releaseDetectorBuffers(),this.module?._md_ort_dispose(),this.module=void 0,this.loadPromise=void 0,this.revokeWasmBlobUrl()}async loadModel(e){let t=await this.getModule();try{let n=t._malloc(e.byteLength);try{t.HEAPU8.set(e,n),T(t,t._md_ort_load_model(n,e.byteLength),`ort-detector model load failed`)}finally{t.HEAPU8.fill(0,n,n+e.byteLength),t._free(n)}}finally{e.fill(0)}}async getModule(){if(!this.module){let[e,t]=await Promise.all([o(this.loadOptions),s(this.loadOptions)]),n=new Blob([e],{type:`text/javascript`}),r=URL.createObjectURL(n),i=URL.createObjectURL(new Blob([E(t)],{type:`application/wasm`})),a;try{a=(await import(r)).default}finally{t.fill(0),URL.revokeObjectURL(r)}this.revokeWasmBlobUrl(),this.wasmBlobUrl=i,this.module=await a({locateFile:e=>e.endsWith(`.wasm`)?i:e});let c=this.module._md_ort_init();T(this.module,c,`ort-detector initialization failed`)}return this.module}ensureDetectorBuffers(e,t,n){return this.detectorInputByteLength<t&&(this.detectorInputPointer&&(e.HEAPU8.fill(0,this.detectorInputPointer,this.detectorInputPointer+this.detectorInputByteLength),e._free(this.detectorInputPointer)),this.detectorInputPointer=e._malloc(t),this.detectorInputByteLength=t),this.detectorDimsByteLength<n&&(this.detectorDimsPointer&&e._free(this.detectorDimsPointer),this.detectorDimsPointer=e._malloc(n),this.detectorDimsByteLength=n),this.detectorOutputDataPointerPointer||=e._malloc(4),this.detectorOutputByteLengthPointer||=e._malloc(4),{inputPointer:this.detectorInputPointer,dimsPointer:this.detectorDimsPointer,outputDataPointerPointer:this.detectorOutputDataPointerPointer,outputByteLengthPointer:this.detectorOutputByteLengthPointer}}releaseDetectorBuffers(){let e=this.module;if(!e){this.resetDetectorBuffers();return}this.detectorInputPointer&&(e.HEAPU8.fill(0,this.detectorInputPointer,this.detectorInputPointer+this.detectorInputByteLength),e._free(this.detectorInputPointer)),this.detectorDimsPointer&&e._free(this.detectorDimsPointer),this.detectorOutputDataPointerPointer&&e._free(this.detectorOutputDataPointerPointer),this.detectorOutputByteLengthPointer&&e._free(this.detectorOutputByteLengthPointer),this.resetDetectorBuffers()}resetDetectorBuffers(){this.detectorInputPointer=0,this.detectorInputByteLength=0,this.detectorDimsPointer=0,this.detectorDimsByteLength=0,this.detectorOutputDataPointerPointer=0,this.detectorOutputByteLengthPointer=0}revokeWasmBlobUrl(){this.wasmBlobUrl&&=(URL.revokeObjectURL(this.wasmBlobUrl),void 0)}};function C(e,t,n){let r=t/BigInt64Array.BYTES_PER_ELEMENT;for(let t=0;t<n.length;t+=1)e.HEAP64[r+t]=BigInt(n[t])}function w(e,t,n){let r=t/BigInt64Array.BYTES_PER_ELEMENT,i=[];for(let t=0;t<n;t+=1)i.push(Number(e.HEAP64[r+t]));return i}function T(e,t,n){if(t===0)return;let r=e._md_ort_get_last_error(),i=r?e.UTF8ToString(r):``;throw Error(i||n)}function E(e){let t=new ArrayBuffer(e.byteLength);return new Uint8Array(t).set(e),t}let D=self,O,k=Promise.resolve();D.addEventListener(`message`,e=>{A(e.data)});async function A(e){try{if(e.type===`load`){O?.dispose(),O=new S(e.model),await O.load(await a(e.model)),z({id:e.id,ok:!0});return}let t=await j(e);z({id:e.id,ok:!0,result:t})}catch(t){z({id:e.id,ok:!1,error:t instanceof Error?t.message:String(t)})}}function j(e){let t=k.then(()=>M(e));return k=t.then(()=>void 0,()=>void 0),t}async function M(e){return N(e)}async function N(e){if(!O)throw Error(`ort-detector runtime is not loaded.`);let t=e.debug?performance.now():0,n=e.debug?performance.now():0,{input:r,metadata:i}=e.source.kind===`bitmap`?P(e.source,e.inputSize,e.inputType):F(e.source,e.inputSize,e.inputType),a=e.debug?performance.now():0,o=await O.runDetector({input: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:B(a-n),ortMs:B(r-a),totalMs:B(r-t)})}return o}function P(e,t,n){try{if(typeof OffscreenCanvas>`u`)throw Error(`OffscreenCanvas is not available.`);let r=I(e.sourceWidth,e.sourceHeight,t),i=new OffscreenCanvas(t,t).getContext(`2d`);if(!i)throw Error(`2D canvas context is not available.`);return i.fillStyle=`rgb(114, 114, 114)`,i.fillRect(0,0,t,t),i.drawImage(e.bitmap,r.padX,r.padY,Math.round(e.sourceWidth*r.ratio),Math.round(e.sourceHeight*r.ratio)),{input:R(i.getImageData(0,0,t,t).data,n,t),metadata:r}}finally{e.bitmap.close()}}function F(e,t,n){let r=I(e.sourceWidth,e.sourceHeight,t);return{input:L(e.data,e.sourceWidth,e.sourceHeight,r,t,n),metadata:r}}function I(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 L(e,t,n,r,i,a){let o=i*i,s=[1,3,i,i],c=a===`uint8`?new Uint8Array(o*3):new Float32Array(o*3);for(let s=0;s<i;s+=1)for(let l=0;l<i;l+=1){let u=s*i+l,d=Math.floor((l-r.padX)/r.ratio),f=Math.floor((s-r.padY)/r.ratio),p=d>=0&&f>=0&&d<t&&f<n,m=(f*t+d)*4,h=p?e[m]:114,g=p?e[m+1]:114,_=p?e[m+2]:114;a===`uint8`?(c[u]=h,c[u+o]=g,c[u+o*2]=_):(c[u]=h/255,c[u+o]=g/255,c[u+o*2]=_/255)}return{type:a,data:c,dims:s}}function R(e,t,n){let r=n*n,i=[1,3,n,n];if(t===`uint8`){let t=new Uint8Array(r*3);for(let n=0;n<r;n+=1){let i=n*4;t[n]=e[i],t[n+r]=e[i+1],t[n+r*2]=e[i+2]}return{type:`uint8`,data:t,dims:i}}let a=new Float32Array(r*3);for(let t=0;t<r;t+=1){let n=t*4;a[t]=e[n]/255,a[t+r]=e[n+1]/255,a[t+r*2]=e[n+2]/255}return{type:`float32`,data:a,dims:i}}function z(e,t){D.postMessage(e,t??[])}function B(e){return Math.round(e*10)/10}})();
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MonitorDogSessionToken, MonitorDogTokenSet } from "./types";
|
|
2
|
+
export declare function getAccessToken(payload: MonitorDogSessionToken): string | undefined;
|
|
3
|
+
export declare function getExpiresIn(payload: MonitorDogSessionToken): number | undefined;
|
|
4
|
+
export declare function getExpiresAt(payload: MonitorDogSessionToken): string | undefined;
|
|
5
|
+
export declare function getTokenExpiresAt(tokens: MonitorDogTokenSet): number | undefined;
|
|
6
|
+
export declare function normalizeBaseUrl(baseUrl: string): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const DEFAULT_INPUT_SIZE = 640;
|
|
2
|
+
export declare const DEFAULT_CONFIDENCE_THRESHOLD = 0.8;
|
|
3
|
+
export declare const DEFAULT_IOU_THRESHOLD = 0.7;
|
|
4
|
+
export declare const DEFAULT_MAX_DETECTIONS = 100;
|
|
5
|
+
export declare const DEFAULT_DETECTION_INTERVAL_MS = 300;
|
|
6
|
+
export declare const DEFAULT_MOBILE_INPUT_SIZE = 416;
|
|
7
|
+
export declare const DEFAULT_LOW_MEMORY_INPUT_SIZE = 320;
|
|
8
|
+
export declare const DEFAULT_REFRESH_BEFORE_MS = 60000;
|
|
9
|
+
export declare const DEFAULT_PERIODIC_REFRESH_INTERVAL_MS = 30000;
|
|
10
|
+
export declare const DEFAULT_MODEL_BUILD_VERSION = "0.0.2";
|
|
11
|
+
export declare const MAIN_USER_TRACKING_ENABLED_STORAGE_KEY = "monitordog.mainUserTracking.enabled";
|
|
12
|
+
export declare const ORT_JS_BUILD_NUMBER = "ort-js";
|
|
13
|
+
export declare const ORT_WASM_BUILD_NUMBER = "ort-wasm";
|
|
14
|
+
export declare const DEFAULT_MEDIAPIPE_BUILD_VERSION = "0.0.1";
|
|
15
|
+
export declare const MEDIAPIPE_POSE_LANDMARKER_BUILD_NUMBER = "pose_landmarker_lite.task";
|
|
16
|
+
export declare const MEDIAPIPE_VISION_WASM_INTERNAL_JS_BUILD_NUMBER = "vision_wasm_internal.js";
|
|
17
|
+
export declare const MEDIAPIPE_VISION_WASM_INTERNAL_WASM_BUILD_NUMBER = "vision_wasm_internal.wasm";
|
|
18
|
+
export declare const MEDIAPIPE_VISION_WASM_MODULE_INTERNAL_JS_BUILD_NUMBER = "vision_wasm_module_internal.js";
|
|
19
|
+
export declare const MEDIAPIPE_VISION_WASM_MODULE_INTERNAL_WASM_BUILD_NUMBER = "vision_wasm_module_internal.wasm";
|
|
20
|
+
export declare const MEDIAPIPE_VISION_WASM_NOSIMD_INTERNAL_JS_BUILD_NUMBER = "vision_wasm_nosimd_internal.js";
|
|
21
|
+
export declare const MEDIAPIPE_VISION_WASM_NOSIMD_INTERNAL_WASM_BUILD_NUMBER = "vision_wasm_nosimd_internal.wasm";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { MonitorDogInferenceSource, InternalDetectionResult } from "../types";
|
|
2
|
+
import type { WorkerModelLoadOptions } from "./model-loader";
|
|
3
|
+
export declare class InferenceWorkerClient {
|
|
4
|
+
private worker?;
|
|
5
|
+
private nextRequestId;
|
|
6
|
+
private readonly pendingRequests;
|
|
7
|
+
load(options: WorkerModelLoadOptions): Promise<void>;
|
|
8
|
+
run(options: {
|
|
9
|
+
source: MonitorDogInferenceSource;
|
|
10
|
+
inputSize: number;
|
|
11
|
+
inputType: "float32" | "uint8";
|
|
12
|
+
confidenceThreshold: number;
|
|
13
|
+
faceConfidenceThreshold: number;
|
|
14
|
+
iouThreshold: number;
|
|
15
|
+
maxDetections: number;
|
|
16
|
+
debug: boolean;
|
|
17
|
+
}): Promise<InternalDetectionResult>;
|
|
18
|
+
terminate(): void;
|
|
19
|
+
private request;
|
|
20
|
+
private getWorker;
|
|
21
|
+
private readonly handleMessage;
|
|
22
|
+
private readonly handleError;
|
|
23
|
+
private rejectPendingRequests;
|
|
24
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type WorkerModelLoadOptions = {
|
|
2
|
+
apiBaseUrl: string;
|
|
3
|
+
accessToken: string;
|
|
4
|
+
modelBuildVersion: string;
|
|
5
|
+
modelBuildNumber: string | number;
|
|
6
|
+
};
|
|
7
|
+
export type SdkAssetLoadOptions = {
|
|
8
|
+
apiBaseUrl: string;
|
|
9
|
+
accessToken: string;
|
|
10
|
+
buildVersion: string;
|
|
11
|
+
buildNumber: string | number;
|
|
12
|
+
errorContext: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function downloadAndDecryptModel(options: WorkerModelLoadOptions): Promise<Uint8Array>;
|
|
15
|
+
export declare function downloadAndDecryptOrtJs(options: WorkerModelLoadOptions): Promise<string>;
|
|
16
|
+
export declare function downloadAndDecryptOrtWasm(options: WorkerModelLoadOptions): Promise<Uint8Array>;
|
|
17
|
+
export declare function downloadAndDecryptSdkAsset(options: SdkAssetLoadOptions): Promise<Uint8Array>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MonitorDogImageSource, LetterboxResult, MonitorDogTensorDataPayload, MonitorDogInferenceSource } from "../types";
|
|
2
|
+
export declare function preprocessImage(source: MonitorDogImageSource, inputSize: number): LetterboxResult;
|
|
3
|
+
export declare function createInputTensor(imageData: ImageData, inputType: "float32" | "uint8", inputSize: number): MonitorDogTensorDataPayload;
|
|
4
|
+
export declare function createInferenceSource(source: MonitorDogImageSource): Promise<MonitorDogInferenceSource>;
|
|
5
|
+
export declare function getSourceSize(source: MonitorDogImageSource): {
|
|
6
|
+
sourceWidth: number;
|
|
7
|
+
sourceHeight: number;
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const WEBCAM_FRAME_ANALYSIS_WASM_BYTES: Uint8Array<ArrayBuffer>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type WebcamFrameAnalysis } from "./webcam-frame-analysis";
|
|
2
|
+
export interface WebcamBlockageAnalysis {
|
|
3
|
+
blocked: boolean;
|
|
4
|
+
suspected: boolean;
|
|
5
|
+
likelyCovered: boolean;
|
|
6
|
+
changedCoverage: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class WebcamBlockageDetector {
|
|
9
|
+
private previousFrameData?;
|
|
10
|
+
private baselineFrameData?;
|
|
11
|
+
private baselineEdgeDensity?;
|
|
12
|
+
private baselineEdgeDensityUpdatedAt?;
|
|
13
|
+
private baselineColorVariance?;
|
|
14
|
+
private baselineLuminanceHistogram?;
|
|
15
|
+
private smoothedEdgeDensity?;
|
|
16
|
+
private smoothedEdgeDensityUpdatedAt?;
|
|
17
|
+
private blocked;
|
|
18
|
+
private blockedStartedAt?;
|
|
19
|
+
private baselineRefreshPending;
|
|
20
|
+
private clearSampleCount;
|
|
21
|
+
private startedAt;
|
|
22
|
+
private calibrated;
|
|
23
|
+
private calibrationNoiseSamples;
|
|
24
|
+
private adaptivePixelChangeThreshold;
|
|
25
|
+
analyze(frame: WebcamFrameAnalysis): WebcamBlockageAnalysis;
|
|
26
|
+
reset(): void;
|
|
27
|
+
needsBaselineRefresh(): boolean;
|
|
28
|
+
refreshBaseline(frame: WebcamFrameAnalysis): void;
|
|
29
|
+
private finalizeCalibration;
|
|
30
|
+
private smoothEdgeDensity;
|
|
31
|
+
private updateBaselineEdgeDensity;
|
|
32
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare const WEBCAM_ANALYSIS_LIGHTING_NONE = 0;
|
|
2
|
+
export declare const WEBCAM_ANALYSIS_LIGHTING_TOO_DARK = 1;
|
|
3
|
+
export declare const WEBCAM_ANALYSIS_LIGHTING_TOO_BRIGHT = 2;
|
|
4
|
+
export interface WebcamFrameWasmAnalysis {
|
|
5
|
+
edgeDensity: number;
|
|
6
|
+
coverage: number;
|
|
7
|
+
colorVariance: number;
|
|
8
|
+
averageLuminance: number;
|
|
9
|
+
luminanceSpread: number;
|
|
10
|
+
luminanceHistogram: Uint16Array;
|
|
11
|
+
normalizedLuminanceHistogram: Float32Array;
|
|
12
|
+
darkRatio: number;
|
|
13
|
+
brightRatio: number;
|
|
14
|
+
blackout: boolean;
|
|
15
|
+
lightingIssueCode: number;
|
|
16
|
+
}
|
|
17
|
+
export interface WebcamBlockageWasmInput {
|
|
18
|
+
image: ImageData;
|
|
19
|
+
previousFrameData?: Uint8ClampedArray;
|
|
20
|
+
baselineFrameData?: Uint8ClampedArray;
|
|
21
|
+
pixelChangeThreshold: number;
|
|
22
|
+
edgeDensity: number;
|
|
23
|
+
baselineEdgeDensity?: number;
|
|
24
|
+
colorVariance: number;
|
|
25
|
+
baselineColorVariance?: number;
|
|
26
|
+
luminanceEntropy: number;
|
|
27
|
+
luminanceSpread: number;
|
|
28
|
+
normalizedLuminanceHistogram: Float32Array;
|
|
29
|
+
baselineLuminanceHistogram?: Float32Array;
|
|
30
|
+
blackout: boolean;
|
|
31
|
+
currentlyBlocked: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface WebcamBlockageWasmAnalysis {
|
|
34
|
+
changedCoverage: number;
|
|
35
|
+
previousChangedCoverage: number;
|
|
36
|
+
frameNoiseAverage: number;
|
|
37
|
+
hasCoveredArea: boolean;
|
|
38
|
+
detected: boolean;
|
|
39
|
+
likelyCovered: boolean;
|
|
40
|
+
}
|
|
41
|
+
export declare class WebcamFrameAnalysisWasm {
|
|
42
|
+
private readonly exports;
|
|
43
|
+
constructor();
|
|
44
|
+
analyze(image: ImageData): WebcamFrameWasmAnalysis;
|
|
45
|
+
analyzeBlockage(input: WebcamBlockageWasmInput): WebcamBlockageWasmAnalysis;
|
|
46
|
+
}
|
|
47
|
+
export declare const webcamFrameAnalysisWasm: WebcamFrameAnalysisWasm;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface WebcamFrameAnalysis {
|
|
2
|
+
image: ImageData;
|
|
3
|
+
pixelCount: number;
|
|
4
|
+
edgeDensity: number;
|
|
5
|
+
coverage: number;
|
|
6
|
+
colorVariance: number;
|
|
7
|
+
averageLuminance: number;
|
|
8
|
+
luminanceSpread: number;
|
|
9
|
+
luminanceEntropy: number;
|
|
10
|
+
luminanceHistogram: Uint16Array;
|
|
11
|
+
normalizedLuminanceHistogram: Float32Array;
|
|
12
|
+
darkRatio: number;
|
|
13
|
+
brightRatio: number;
|
|
14
|
+
blackout: boolean;
|
|
15
|
+
lightingIssueCode: number;
|
|
16
|
+
}
|
|
17
|
+
export declare const WEBCAM_ANALYSIS_SAMPLE_WIDTH = 40;
|
|
18
|
+
export declare const WEBCAM_ANALYSIS_SAMPLE_HEIGHT = 30;
|
|
19
|
+
export declare const LUMINANCE_HISTOGRAM_BINS = 16;
|
|
20
|
+
export declare class WebcamFrameAnalyzer {
|
|
21
|
+
private readonly context;
|
|
22
|
+
constructor();
|
|
23
|
+
analyze(video: HTMLVideoElement): WebcamFrameAnalysis;
|
|
24
|
+
}
|
|
25
|
+
export declare function analyzeWebcamFrame(image: ImageData): WebcamFrameAnalysis;
|
|
26
|
+
export declare function captureWebcamFrame(context: CanvasRenderingContext2D, video: HTMLVideoElement): ImageData;
|
|
27
|
+
export declare function createWebcamAnalysisCanvas(errorMessage: string): {
|
|
28
|
+
canvas: HTMLCanvasElement;
|
|
29
|
+
context: CanvasRenderingContext2D;
|
|
30
|
+
};
|
|
31
|
+
export declare function getPixelLuminance(data: Uint8ClampedArray, index: number): number;
|
|
32
|
+
export declare function normalizeHistogram(histogram: Uint16Array, pixelCount: number): Float32Array;
|
|
33
|
+
export declare function getHistogramDistance(current: Float32Array, baseline: Float32Array): number;
|
|
34
|
+
export declare function isWebcamBlackoutFrame(frame: WebcamFrameAnalysis): boolean;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type WebcamFrameAnalysis } from "./webcam-frame-analysis";
|
|
2
|
+
export type WebcamLightingIssue = "tooDark" | "tooBright";
|
|
3
|
+
export interface WebcamLightingAnalysis {
|
|
4
|
+
issue?: WebcamLightingIssue;
|
|
5
|
+
active: boolean;
|
|
6
|
+
averageLuminance: number;
|
|
7
|
+
luminanceSpread: number;
|
|
8
|
+
luminanceEntropy: number;
|
|
9
|
+
darkRatio: number;
|
|
10
|
+
brightRatio: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class WebcamLightingDetector {
|
|
13
|
+
private startedAt;
|
|
14
|
+
private issueStartedAt?;
|
|
15
|
+
private clearStartedAt?;
|
|
16
|
+
private pendingIssue?;
|
|
17
|
+
private activeIssue?;
|
|
18
|
+
analyze(frame: WebcamFrameAnalysis): WebcamLightingAnalysis;
|
|
19
|
+
reset(): void;
|
|
20
|
+
private detectIssue;
|
|
21
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DeviceOs, DeviceType } from "./types";
|
|
2
|
+
export type MainUserTrackerSupport = {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
reason?: string;
|
|
5
|
+
deviceType: DeviceType;
|
|
6
|
+
cpuCores: number;
|
|
7
|
+
deviceMemoryGb?: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function getDeviceType(): DeviceType;
|
|
10
|
+
export declare function getDeviceOs(): DeviceOs;
|
|
11
|
+
export declare function getMainUserTrackerSupport(): MainUserTrackerSupport;
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CreateEventPayload, DetectionEvent, DetectionReasonEnum, InternalDetectionResult, MonitorDogUserActivityEventType } from "./types";
|
|
2
|
+
import type { MainUserTrackingResult } from "./pose/mediapipe-main-user-tracker";
|
|
3
|
+
import type { WebcamBlockageAnalysis } from "./detect/webcam-blockage-detector";
|
|
4
|
+
export declare function createDetectionEvent(result: InternalDetectionResult, trackingResult: MainUserTrackingResult): DetectionEvent | undefined;
|
|
5
|
+
export declare function createWebcamBlockedEvent(analysis: WebcamBlockageAnalysis): DetectionEvent;
|
|
6
|
+
export declare function createUserActivityEvent(eventType: MonitorDogUserActivityEventType): CreateEventPayload;
|
|
7
|
+
export declare function isNormalDetectionState(result: InternalDetectionResult, trackingResult: MainUserTrackingResult): boolean;
|
|
8
|
+
export declare function getActivityId(event: DetectionReasonEnum): string;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { MonitorDogDetectorOptions, MonitorDogDetectorState, MonitorDogLoginRequest, MonitorDogSessionToken, UserPreferences } from "./types";
|
|
2
|
+
export declare class MonitorDogDetector {
|
|
3
|
+
#private;
|
|
4
|
+
static init(options: MonitorDogDetectorOptions): Promise<MonitorDogDetector>;
|
|
5
|
+
constructor(options: MonitorDogDetectorOptions);
|
|
6
|
+
load(): Promise<void>;
|
|
7
|
+
login(request: MonitorDogLoginRequest): Promise<MonitorDogSessionToken>;
|
|
8
|
+
private completeAuthenticatedLogin;
|
|
9
|
+
logout(): Promise<void>;
|
|
10
|
+
start(): Promise<void>;
|
|
11
|
+
stop(): void;
|
|
12
|
+
setRunInBackground(runInBackground: boolean): void;
|
|
13
|
+
getUserPreferences(): Readonly<UserPreferences>;
|
|
14
|
+
isMainUserTrackingEnabled(): boolean;
|
|
15
|
+
setMainUserTrackingEnabled(enabled: boolean): void;
|
|
16
|
+
getState(): MonitorDogDetectorState;
|
|
17
|
+
dispose(): void;
|
|
18
|
+
private resetLoggedOutState;
|
|
19
|
+
private rollbackAuthenticatedLogin;
|
|
20
|
+
private startRuntime;
|
|
21
|
+
private clearSessionState;
|
|
22
|
+
private stopLocalRuntime;
|
|
23
|
+
private assertUsable;
|
|
24
|
+
private assertAuthenticated;
|
|
25
|
+
private lifecycleError;
|
|
26
|
+
private transitionToError;
|
|
27
|
+
private updateState;
|
|
28
|
+
private notifyStatusChange;
|
|
29
|
+
private createSdkError;
|
|
30
|
+
private isDetectorRunning;
|
|
31
|
+
private hasRuntimeToStop;
|
|
32
|
+
private getStartErrorCode;
|
|
33
|
+
private getStartErrorMessage;
|
|
34
|
+
private isCameraPermissionError;
|
|
35
|
+
private isCameraReadError;
|
|
36
|
+
}
|
|
37
|
+
export declare function configureMonitorDogDetector(options: MonitorDogDetectorOptions): MonitorDogDetector;
|
|
38
|
+
export declare function createMonitorDogDetector(options: MonitorDogDetectorOptions): Promise<MonitorDogDetector>;
|
|
39
|
+
export declare function getDetector(): MonitorDogDetector;
|
|
40
|
+
export { MonitorDogSdkError, isMonitorDogSdkError } from "./sdk-error";
|
|
41
|
+
export type { AccountResponse, LockPolicyResponse, MonitorDogDetection, MonitorDogDetectionResult, MonitorDogDetectorCameraStatus, MonitorDogDetectorOptions, MonitorDogDetectorSessionStatus, MonitorDogDetectorState, MonitorDogDetectorStatus, MonitorDogLoginRequest, MonitorDogSdkErrorCode, MonitorDogSdkTokenResponse, MonitorDogSessionToken, MonitorDogSessionTokenProvider, MonitorDogVideoDetectionResult, UserPreferences, } from "./types";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MonitorDogLanguage, MonitorDogOverlayMessages } from "./types";
|
|
2
|
+
export declare const DEFAULT_MONITORDOG_LANGUAGE: MonitorDogLanguage;
|
|
3
|
+
export declare const MONITORDOG_OVERLAY_MESSAGES: Record<MonitorDogLanguage, MonitorDogOverlayMessages>;
|
|
4
|
+
export declare function resolveMonitorDogLanguage(language: string | undefined): MonitorDogLanguage;
|
|
5
|
+
export declare function getMonitorDogOverlayMessages(language: string | undefined): MonitorDogOverlayMessages;
|
|
6
|
+
export declare function getBrowserMonitorDogLanguage(): MonitorDogLanguage;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { MonitorDogDetectorOptions, MonitorDogDetectorState, MonitorDogLoginRequest, MonitorDogSessionToken, UserPreferences } from "./types";
|
|
2
|
+
export declare class MonitorDogDetector {
|
|
3
|
+
#private;
|
|
4
|
+
static init(options: MonitorDogDetectorOptions): Promise<MonitorDogDetector>;
|
|
5
|
+
constructor(options: MonitorDogDetectorOptions);
|
|
6
|
+
load(): Promise<void>;
|
|
7
|
+
login(request: MonitorDogLoginRequest): Promise<MonitorDogSessionToken>;
|
|
8
|
+
private completeAuthenticatedLogin;
|
|
9
|
+
logout(): Promise<void>;
|
|
10
|
+
start(): Promise<void>;
|
|
11
|
+
stop(): void;
|
|
12
|
+
setRunInBackground(runInBackground: boolean): void;
|
|
13
|
+
getUserPreferences(): Readonly<UserPreferences>;
|
|
14
|
+
isMainUserTrackingEnabled(): boolean;
|
|
15
|
+
setMainUserTrackingEnabled(enabled: boolean): void;
|
|
16
|
+
getState(): MonitorDogDetectorState;
|
|
17
|
+
dispose(): void;
|
|
18
|
+
private resetLoggedOutState;
|
|
19
|
+
private rollbackAuthenticatedLogin;
|
|
20
|
+
private startRuntime;
|
|
21
|
+
private clearSessionState;
|
|
22
|
+
private stopLocalRuntime;
|
|
23
|
+
private assertUsable;
|
|
24
|
+
private assertAuthenticated;
|
|
25
|
+
private lifecycleError;
|
|
26
|
+
private transitionToError;
|
|
27
|
+
private updateState;
|
|
28
|
+
private notifyStatusChange;
|
|
29
|
+
private createSdkError;
|
|
30
|
+
private isDetectorRunning;
|
|
31
|
+
private hasRuntimeToStop;
|
|
32
|
+
private getStartErrorCode;
|
|
33
|
+
private getStartErrorMessage;
|
|
34
|
+
private isCameraPermissionError;
|
|
35
|
+
private isCameraReadError;
|
|
36
|
+
}
|
|
37
|
+
export declare function configureMonitorDogDetector(options: MonitorDogDetectorOptions): MonitorDogDetector;
|
|
38
|
+
export declare function createMonitorDogDetector(options: MonitorDogDetectorOptions): Promise<MonitorDogDetector>;
|
|
39
|
+
export declare function getDetector(): MonitorDogDetector;
|
|
40
|
+
export { MonitorDogSdkError, isMonitorDogSdkError } from "./sdk-error";
|
|
41
|
+
export type { AccountResponse, LockPolicyResponse, MonitorDogDetection, MonitorDogDetectionResult, MonitorDogDetectorCameraStatus, MonitorDogDetectorOptions, MonitorDogDetectorSessionStatus, MonitorDogDetectorState, MonitorDogDetectorStatus, MonitorDogLoginRequest, MonitorDogSdkErrorCode, MonitorDogSdkTokenResponse, MonitorDogSessionToken, MonitorDogSessionTokenProvider, MonitorDogVideoDetectionResult, UserPreferences, } from "./types";
|