@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
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type MediaPipeWasmFileset = {
|
|
2
|
+
wasmLoaderPath: string;
|
|
3
|
+
wasmBinaryPath: string;
|
|
4
|
+
assetLoaderPath?: string;
|
|
5
|
+
assetBinaryPath?: string;
|
|
6
|
+
};
|
|
7
|
+
export type MediaPipeAssetBundle = {
|
|
8
|
+
wasmFileset: MediaPipeWasmFileset;
|
|
9
|
+
poseModelAssetBuffer: Uint8Array;
|
|
10
|
+
dispose: () => void;
|
|
11
|
+
};
|
|
12
|
+
export type MediaPipeAssetLoadOptions = {
|
|
13
|
+
apiBaseUrl: string;
|
|
14
|
+
accessToken: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function loadMediaPipeAssetBundle(options: MediaPipeAssetLoadOptions): Promise<MediaPipeAssetBundle>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export declare const CHECK_INTERVAL_MS = 300;
|
|
2
|
+
export declare const MAX_MISSING_TIME_MS = 650;
|
|
3
|
+
export declare const MAX_MISSING_SAMPLE_COUNT = 2;
|
|
4
|
+
export declare const ACQUIRE_MIN_SHOULDER_WIDTH = 0.2;
|
|
5
|
+
export declare const TRACK_MIN_SHOULDER_WIDTH = 0.08;
|
|
6
|
+
export declare const DISTANCE_THRESHOLD = 0.25;
|
|
7
|
+
export declare const ACQUIRE_MIN_VISIBILITY = 0.5;
|
|
8
|
+
export declare const TRACK_MIN_VISIBILITY = 0.75;
|
|
9
|
+
export declare const TRACK_DISTANCE_THRESHOLD = 0.45;
|
|
10
|
+
export declare const TORSO_OVERLAP_THRESHOLD = 0.15;
|
|
11
|
+
export declare const SHOULDER_SCALE_MIN_RATIO = 0.45;
|
|
12
|
+
export declare const SHOULDER_SCALE_MAX_RATIO = 2.2;
|
|
13
|
+
export declare const landmarkIndexes: {
|
|
14
|
+
readonly leftShoulder: 11;
|
|
15
|
+
readonly rightShoulder: 12;
|
|
16
|
+
readonly leftHip: 23;
|
|
17
|
+
readonly rightHip: 24;
|
|
18
|
+
};
|
|
19
|
+
export type MainUserTrackingState = "INIT" | "TRACKING" | "MISSING" | "AWAY";
|
|
20
|
+
export type NormalizedPoint = {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
};
|
|
24
|
+
export type NormalizedBox = {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
};
|
|
30
|
+
export type MainUserTrackingDebugPose = {
|
|
31
|
+
landmarks: NormalizedPoint[][];
|
|
32
|
+
candidateBoxes: NormalizedBox[];
|
|
33
|
+
lastTrackBox?: NormalizedBox;
|
|
34
|
+
};
|
|
35
|
+
export type MainUserTrackingResult = {
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
disabledReason?: string;
|
|
38
|
+
state: MainUserTrackingState;
|
|
39
|
+
hasTrackedUser: boolean;
|
|
40
|
+
lastCentroid?: NormalizedPoint;
|
|
41
|
+
missingElapsedMs: number;
|
|
42
|
+
poseCount: number;
|
|
43
|
+
candidateCount: number;
|
|
44
|
+
debugPose?: MainUserTrackingDebugPose;
|
|
45
|
+
};
|
|
46
|
+
export type MediaPipeMainUserTrackerOptions = {
|
|
47
|
+
apiBaseUrl?: string;
|
|
48
|
+
accessToken?: string;
|
|
49
|
+
wasmBasePath?: string;
|
|
50
|
+
modelAssetPath?: string;
|
|
51
|
+
numPoses?: number;
|
|
52
|
+
};
|
|
53
|
+
export type CandidateMode = "acquire" | "track";
|
|
54
|
+
export declare class MediaPipeMainUserTracker {
|
|
55
|
+
private readonly wasmBasePath;
|
|
56
|
+
private readonly poseModelAssetPath;
|
|
57
|
+
private readonly numPoses;
|
|
58
|
+
private readonly apiBaseUrl?;
|
|
59
|
+
private readonly accessToken?;
|
|
60
|
+
private assetBundle?;
|
|
61
|
+
private poseLandmarker?;
|
|
62
|
+
private state;
|
|
63
|
+
private lastCentroid?;
|
|
64
|
+
private lastTrack?;
|
|
65
|
+
private hasTrackedUser;
|
|
66
|
+
private missingStartedAt?;
|
|
67
|
+
private missingSampleCount;
|
|
68
|
+
constructor(options?: MediaPipeMainUserTrackerOptions);
|
|
69
|
+
load(): Promise<void>;
|
|
70
|
+
detectForVideo(video: HTMLVideoElement, timestampMs: number): MainUserTrackingResult;
|
|
71
|
+
getSnapshot(nowMs: number): MainUserTrackingResult;
|
|
72
|
+
reset(): void;
|
|
73
|
+
private resetTrackingState;
|
|
74
|
+
dispose(): void;
|
|
75
|
+
private createPoseLandmarkerWithFallback;
|
|
76
|
+
private createPoseLandmarker;
|
|
77
|
+
private loadAssetBundle;
|
|
78
|
+
private hasSelfHostedAssetPath;
|
|
79
|
+
private getSelfHostedWasmBasePath;
|
|
80
|
+
private getSelfHostedModelAssetPath;
|
|
81
|
+
private toPoseCandidates;
|
|
82
|
+
private toPoseCandidate;
|
|
83
|
+
private getPoseCentroid;
|
|
84
|
+
private findMainUser;
|
|
85
|
+
private matchCandidate;
|
|
86
|
+
private setTracking;
|
|
87
|
+
private markMissing;
|
|
88
|
+
private setAway;
|
|
89
|
+
private createResult;
|
|
90
|
+
}
|
package/dist/pose.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NormalizedLandmark } from "@mediapipe/tasks-vision";
|
|
2
|
+
import { type NormalizedPoint, type NormalizedBox, type CandidateMode } from "./pose/mediapipe-main-user-tracker";
|
|
3
|
+
export declare function isVisible(landmark: NormalizedLandmark | undefined, minVisibility: number): landmark is NormalizedLandmark;
|
|
4
|
+
export declare function getVisibleTorsoLandmarks(landmarks: NormalizedLandmark[], minVisibility: number): NormalizedLandmark[];
|
|
5
|
+
export declare function getCandidateThresholds(mode: CandidateMode): {
|
|
6
|
+
minShoulderWidth: number;
|
|
7
|
+
minVisibility: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function averageLandmarks(landmarks: NormalizedLandmark[]): NormalizedPoint;
|
|
10
|
+
export declare function getTorsoBox(landmarks: NormalizedLandmark[]): NormalizedBox;
|
|
11
|
+
export declare function getBoxOverlapRatio(first: NormalizedBox, second: NormalizedBox): number;
|
|
12
|
+
export declare function doesShoulderScaleMatch(previousShoulderWidth: number | undefined, nextShoulderWidth: number | undefined): boolean;
|
|
13
|
+
export declare function getDistance(a: NormalizedPoint, b: NormalizedPoint): number;
|
|
14
|
+
export declare function clampRatio(value: number): number;
|
|
15
|
+
export declare function clampInteger(value: number, min: number, max: number): number;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MonitorDogSdkErrorCode } from "./types";
|
|
2
|
+
export declare class MonitorDogSdkError extends Error {
|
|
3
|
+
readonly code: MonitorDogSdkErrorCode;
|
|
4
|
+
readonly cause?: unknown;
|
|
5
|
+
constructor(code: MonitorDogSdkErrorCode, message: string, cause?: unknown);
|
|
6
|
+
}
|
|
7
|
+
export declare function isMonitorDogSdkError(error: unknown): error is MonitorDogSdkError;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { MonitorDogLoginRequest, MonitorDogSessionToken } from "../types";
|
|
2
|
+
import type { ServiceContainer } from "./container";
|
|
3
|
+
export declare class AuthService {
|
|
4
|
+
private readonly services;
|
|
5
|
+
private readonly refreshBeforeMs;
|
|
6
|
+
private readonly periodicRefreshIntervalMs;
|
|
7
|
+
private token?;
|
|
8
|
+
private tokenExpiresAt?;
|
|
9
|
+
private refreshPromise?;
|
|
10
|
+
private refreshIntervalId?;
|
|
11
|
+
private authSessionId;
|
|
12
|
+
private sessionEmail?;
|
|
13
|
+
constructor(services: ServiceContainer);
|
|
14
|
+
login(request: MonitorDogLoginRequest): Promise<MonitorDogSessionToken>;
|
|
15
|
+
logout(): Promise<void>;
|
|
16
|
+
getToken(): string | undefined;
|
|
17
|
+
getTokenExpiresAt(): number | undefined;
|
|
18
|
+
getSessionEmail(): string | undefined;
|
|
19
|
+
isAuthenticated(): boolean;
|
|
20
|
+
dispose(): void;
|
|
21
|
+
assertAuthenticated(): void;
|
|
22
|
+
getValidAccessToken(): Promise<string | undefined>;
|
|
23
|
+
authorizedFetch(path: string, init?: RequestInit, retry?: boolean): Promise<Response>;
|
|
24
|
+
private setSessionTokenPayload;
|
|
25
|
+
private setTokens;
|
|
26
|
+
private clearTokens;
|
|
27
|
+
private refreshToken;
|
|
28
|
+
private handleAuthRefresh;
|
|
29
|
+
private refreshAccessToken;
|
|
30
|
+
private startPeriodicRefresh;
|
|
31
|
+
private stopPeriodicRefresh;
|
|
32
|
+
private refreshPeriodically;
|
|
33
|
+
private shouldRefreshCurrentToken;
|
|
34
|
+
private isCurrentTokenExpired;
|
|
35
|
+
private isRefreshSupersededError;
|
|
36
|
+
private fetchSessionToken;
|
|
37
|
+
private getApiErrorCode;
|
|
38
|
+
private shouldRefreshAfterAuthError;
|
|
39
|
+
private handleLoginRequired;
|
|
40
|
+
private sendUserActivityEvent;
|
|
41
|
+
private createSdkError;
|
|
42
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare class CameraService {
|
|
2
|
+
createWebcamStream(constraints?: MediaStreamConstraints): Promise<MediaStream>;
|
|
3
|
+
stopStream(stream: MediaStream): void;
|
|
4
|
+
watchStreamDeviceDisconnect(stream: MediaStream, onDisconnect: () => void | Promise<void>, debounceMs?: number): () => void;
|
|
5
|
+
isCameraInUse(video?: HTMLVideoElement): boolean;
|
|
6
|
+
getVideoInputDevices(): Promise<MediaDeviceInfo[]>;
|
|
7
|
+
getRealVideoInputDevices(): Promise<MediaDeviceInfo[]>;
|
|
8
|
+
private createFallbackWebcamStream;
|
|
9
|
+
private handleDeviceChange;
|
|
10
|
+
private getBaseWebcamConstraints;
|
|
11
|
+
private createFirstCameraConstraints;
|
|
12
|
+
private getWebcamNaturalAspectRatio;
|
|
13
|
+
private generateResolutionList;
|
|
14
|
+
private createDeviceConstraints;
|
|
15
|
+
private isVirtualCamera;
|
|
16
|
+
private isPermissionError;
|
|
17
|
+
private getUserMedia;
|
|
18
|
+
private isCameraRequestTimeoutError;
|
|
19
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { AccountResponse, LockPolicyResponse, MonitorDogDetectorOptions, UserPreferences } from "../types";
|
|
2
|
+
import { AuthService } from "./auth-service";
|
|
3
|
+
import { CameraService } from "./camera-service";
|
|
4
|
+
import { DetectionEventService } from "./detection-event-service";
|
|
5
|
+
import { DetectService } from "./detect-service";
|
|
6
|
+
import { OverlayService } from "./overlay-service";
|
|
7
|
+
import { WebcamService } from "./webcam-service";
|
|
8
|
+
export type DetectorOptions = Required<Pick<MonitorDogDetectorOptions, "apiBaseUrl">> & MonitorDogDetectorOptions & {
|
|
9
|
+
confidenceThreshold: number;
|
|
10
|
+
faceConfidenceThreshold: number;
|
|
11
|
+
requiredPassword: boolean;
|
|
12
|
+
iouThreshold: number;
|
|
13
|
+
maxDetections: number;
|
|
14
|
+
inputSize: number;
|
|
15
|
+
inputType: "float32" | "uint8";
|
|
16
|
+
detectionIntervalMs: number;
|
|
17
|
+
modelBuildVersion: string;
|
|
18
|
+
modelBuildNumber: string | number;
|
|
19
|
+
};
|
|
20
|
+
export declare class ServiceContainer {
|
|
21
|
+
#private;
|
|
22
|
+
readonly auth: AuthService;
|
|
23
|
+
readonly overlay: OverlayService;
|
|
24
|
+
readonly camera: CameraService;
|
|
25
|
+
readonly detectionEvents: DetectionEventService;
|
|
26
|
+
readonly detect: DetectService;
|
|
27
|
+
readonly webcam: WebcamService;
|
|
28
|
+
onCameraRetry?: () => void | Promise<void>;
|
|
29
|
+
onCameraDisconnect?: () => void | Promise<void>;
|
|
30
|
+
onRemoteUnlock?: () => void | Promise<void>;
|
|
31
|
+
onRemoteUnlockRequest?: () => void | Promise<void>;
|
|
32
|
+
getRemoteUnlockRequestCooldownMs?: () => number;
|
|
33
|
+
onShutdownRequest?: () => void;
|
|
34
|
+
onLoginRequired?: () => void;
|
|
35
|
+
constructor(getOptions: () => DetectorOptions);
|
|
36
|
+
get options(): Readonly<DetectorOptions>;
|
|
37
|
+
get noFaceEventDelayMs(): number;
|
|
38
|
+
get userPreferences(): Readonly<UserPreferences>;
|
|
39
|
+
updateNoFaceEventDelayFromServer(delayMs: number): void;
|
|
40
|
+
updateRequiredPasswordFromServer(requiredPassword: boolean): void;
|
|
41
|
+
degradeInferenceModelForMemoryPressure(): void;
|
|
42
|
+
get shouldPauseForHiddenPage(): boolean;
|
|
43
|
+
get shouldPauseDetection(): boolean;
|
|
44
|
+
get shouldPauseForResumePassword(): boolean;
|
|
45
|
+
applyPolicyItems(items: LockPolicyResponse[], _account: AccountResponse): void;
|
|
46
|
+
resetAuthenticatedState(): void;
|
|
47
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { InternalDetectionResult, MonitorDogDetectionResult, MonitorDogImageSource, MonitorDogVideoDetectionController, MonitorDogWebcamDetectionController } from "../types";
|
|
2
|
+
import type { ServiceContainer } from "./container";
|
|
3
|
+
export declare class DetectService {
|
|
4
|
+
private readonly services;
|
|
5
|
+
private inferenceWorker?;
|
|
6
|
+
private loadPromise?;
|
|
7
|
+
private lastInferenceMemoryErrorAt;
|
|
8
|
+
private mainUserTracker?;
|
|
9
|
+
private mainUserTrackerLoadPromise?;
|
|
10
|
+
private mainUserTrackerLoadTimeoutId?;
|
|
11
|
+
private mainUserTrackerLoadToken;
|
|
12
|
+
private mainUserTrackerDisabledReason;
|
|
13
|
+
private mainUserTrackingEnabled;
|
|
14
|
+
private webcamFrameAnalyzer?;
|
|
15
|
+
private webcamBlockageDetector?;
|
|
16
|
+
private webcamLightingDetector?;
|
|
17
|
+
private activeLightingOverlayState?;
|
|
18
|
+
private poseDebugCanvas?;
|
|
19
|
+
private baselineRefreshPendingAfterNoFace;
|
|
20
|
+
constructor(services: ServiceContainer);
|
|
21
|
+
load(): Promise<void>;
|
|
22
|
+
detect(source: MonitorDogImageSource): Promise<InternalDetectionResult>;
|
|
23
|
+
toPublicResult(result: InternalDetectionResult): MonitorDogDetectionResult;
|
|
24
|
+
detectVideo(video: HTMLVideoElement): MonitorDogVideoDetectionController;
|
|
25
|
+
startWebcamDetection(): Promise<MonitorDogWebcamDetectionController>;
|
|
26
|
+
isMainUserTrackingEnabled(): boolean;
|
|
27
|
+
setMainUserTrackingEnabled(enabled: boolean): void;
|
|
28
|
+
dispose(): void;
|
|
29
|
+
private ensureMainUserTrackerLoading;
|
|
30
|
+
private scheduleMainUserTrackerLoading;
|
|
31
|
+
private clearMainUserTrackerLoadTimeout;
|
|
32
|
+
private loadMainUserTracker;
|
|
33
|
+
private detectMainUser;
|
|
34
|
+
private isNoUserTrackingState;
|
|
35
|
+
private shouldRefreshBaselineForNormalState;
|
|
36
|
+
private handleWebcamLightingResult;
|
|
37
|
+
private clearWebcamLightingOverlay;
|
|
38
|
+
private renderPoseDebugOverlay;
|
|
39
|
+
private getPoseDebugCanvas;
|
|
40
|
+
private clearPoseDebugOverlay;
|
|
41
|
+
private drawPoseDebug;
|
|
42
|
+
private handleDetectionLoopError;
|
|
43
|
+
private recoverFromInferenceMemoryError;
|
|
44
|
+
private resetInferenceWorker;
|
|
45
|
+
private degradeModelForMemoryPressure;
|
|
46
|
+
private isInferenceMemoryError;
|
|
47
|
+
private getInferenceWorker;
|
|
48
|
+
private getWebcamFrameAnalyzer;
|
|
49
|
+
private getWebcamBlockageDetector;
|
|
50
|
+
private getWebcamLightingDetector;
|
|
51
|
+
private loadInferenceWorker;
|
|
52
|
+
private loadInferenceWorkerWithOptions;
|
|
53
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { WebcamBlockageAnalysis } from "../detect/webcam-blockage-detector";
|
|
2
|
+
import type { MainUserTrackingResult } from "../pose/mediapipe-main-user-tracker";
|
|
3
|
+
import type { InternalDetectionResult, MonitorDogImageSource } from "../types";
|
|
4
|
+
import type { ServiceContainer } from "./container";
|
|
5
|
+
export declare class DetectionEventService {
|
|
6
|
+
private static readonly NO_FACE_STARTUP_GRACE_MS;
|
|
7
|
+
private readonly services;
|
|
8
|
+
private detectionEventLocked;
|
|
9
|
+
private detectionEventInFlight;
|
|
10
|
+
private detectionEventLockTimeoutId?;
|
|
11
|
+
private noFaceStartedAt?;
|
|
12
|
+
private suppressNoFaceUntil;
|
|
13
|
+
constructor(services: ServiceContainer);
|
|
14
|
+
handleDetectionResult(result: InternalDetectionResult, trackingResult: MainUserTrackingResult, source?: MonitorDogImageSource): Promise<void>;
|
|
15
|
+
handleWebcamBlockageResult(analysis: WebcamBlockageAnalysis, source?: MonitorDogImageSource): Promise<void>;
|
|
16
|
+
reset(): void;
|
|
17
|
+
resetForWebcamStartup(): void;
|
|
18
|
+
resetAfterResumePasswordUnlock(): void;
|
|
19
|
+
private uploadWebcamImage;
|
|
20
|
+
private uploadMonitorImage;
|
|
21
|
+
private uploadImage;
|
|
22
|
+
private shouldSendEvent;
|
|
23
|
+
private shouldSendWebcamBlockedEvent;
|
|
24
|
+
private shouldShowOverlay;
|
|
25
|
+
private lock;
|
|
26
|
+
private clearLock;
|
|
27
|
+
private hasNoFaceDelayElapsed;
|
|
28
|
+
private getLockDuration;
|
|
29
|
+
private getOverlayDuration;
|
|
30
|
+
private shouldPauseDetectionAfterCapture;
|
|
31
|
+
private getMode;
|
|
32
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { MonitorDogOverlayMessages, MonitorDogOverlayOptions } from "../types";
|
|
2
|
+
import type { ActiveOverlayJob, OverlayState } from "./overlay-service";
|
|
3
|
+
type OverlayRendererOptions = {
|
|
4
|
+
getOverlayOptions: () => MonitorDogOverlayOptions | undefined;
|
|
5
|
+
getCurrentJob: () => ActiveOverlayJob | undefined;
|
|
6
|
+
getOverlayMessage: (job: ActiveOverlayJob) => string;
|
|
7
|
+
getLanguageMessages: () => MonitorDogOverlayMessages;
|
|
8
|
+
hasInteractiveAction: (state: OverlayState | undefined) => boolean;
|
|
9
|
+
isCameraOverlay: (state: OverlayState | undefined) => boolean;
|
|
10
|
+
isRemoteLockOverlay: (state: OverlayState | undefined) => state is "remoteAdminLocked" | "remoteLocked";
|
|
11
|
+
shouldShowNoFacePasswordInput: (job: ActiveOverlayJob) => boolean;
|
|
12
|
+
getOnCameraRetry: () => (() => void | Promise<void>) | undefined;
|
|
13
|
+
getOnRemoteUnlock: () => (() => void | Promise<void>) | undefined;
|
|
14
|
+
getOnRemoteUnlockRequest: () => (() => void | Promise<void>) | undefined;
|
|
15
|
+
getRemoteUnlockRequestCooldownMs: () => number;
|
|
16
|
+
onNoFacePasswordSubmit: (password: string) => Promise<boolean>;
|
|
17
|
+
getOnError: () => ((error: unknown) => void) | undefined;
|
|
18
|
+
};
|
|
19
|
+
export declare class OverlayRenderer {
|
|
20
|
+
private readonly options;
|
|
21
|
+
private previousBodyOverflow?;
|
|
22
|
+
private remoteUnlockRequestCooldownIntervalId?;
|
|
23
|
+
constructor(options: OverlayRendererOptions);
|
|
24
|
+
ensureIntegrity(job: ActiveOverlayJob): void;
|
|
25
|
+
render(job: ActiveOverlayJob): void;
|
|
26
|
+
hide(): void;
|
|
27
|
+
stop(): void;
|
|
28
|
+
private get overlayOptions();
|
|
29
|
+
private get languageMessages();
|
|
30
|
+
private get rootId();
|
|
31
|
+
private syncActions;
|
|
32
|
+
private lockPageScroll;
|
|
33
|
+
private unlockPageScroll;
|
|
34
|
+
private getOverlayElement;
|
|
35
|
+
private applyOverlayStyle;
|
|
36
|
+
private applyOverlayMessageStyle;
|
|
37
|
+
private getOverlayMessageElement;
|
|
38
|
+
private syncCameraRetryButton;
|
|
39
|
+
private handleCameraRetry;
|
|
40
|
+
private syncRemoteLockButton;
|
|
41
|
+
private handleRemoteLockAction;
|
|
42
|
+
private resetCameraRetryButton;
|
|
43
|
+
private resetRemoteLockButton;
|
|
44
|
+
private syncNoFacePasswordInput;
|
|
45
|
+
private resetNoFacePasswordInput;
|
|
46
|
+
private toggleNoFacePasswordVisibility;
|
|
47
|
+
private updateNoFacePasswordToggleButton;
|
|
48
|
+
private handleNoFacePasswordSubmit;
|
|
49
|
+
private applyCameraRetryButtonStyle;
|
|
50
|
+
private applyRemoteLockButtonStyle;
|
|
51
|
+
private applyNoFacePasswordInputStyle;
|
|
52
|
+
private applyNoFacePasswordInputWrapperStyle;
|
|
53
|
+
private applyNoFacePasswordFormStyle;
|
|
54
|
+
private applyNoFacePasswordSubmitButtonStyle;
|
|
55
|
+
private applyNoFacePasswordToggleButtonStyle;
|
|
56
|
+
private updateRemoteUnlockRequestCooldownButton;
|
|
57
|
+
private startRemoteUnlockRequestCooldownTimer;
|
|
58
|
+
private clearRemoteUnlockRequestCooldownTimer;
|
|
59
|
+
private applyRemoteLockButtonEnabledState;
|
|
60
|
+
private applyRemoteLockButtonDisabledState;
|
|
61
|
+
private applyPointerEvents;
|
|
62
|
+
private getCameraRetryButtonText;
|
|
63
|
+
private getCameraRetryingButtonText;
|
|
64
|
+
private getRemoteLockButtonText;
|
|
65
|
+
private getRemoteLockBusyButtonText;
|
|
66
|
+
private getNoFacePasswordSubmitButtonText;
|
|
67
|
+
private getNoFacePasswordSubmittingButtonText;
|
|
68
|
+
private getNoFacePasswordOpenIconSrc;
|
|
69
|
+
private getNoFacePasswordCloseIconSrc;
|
|
70
|
+
}
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { MonitorDogOverlayType } from "../types";
|
|
2
|
+
import type { ServiceContainer } from "./container";
|
|
3
|
+
export type OverlayState = MonitorDogOverlayType | "inferenceMemoryError" | "remoteAdminLocked" | "remoteLocked";
|
|
4
|
+
export type OverlaySource = "camera" | "detection" | "remote" | "system";
|
|
5
|
+
type OverlayJob = {
|
|
6
|
+
action: "show";
|
|
7
|
+
id: string;
|
|
8
|
+
state: OverlayState;
|
|
9
|
+
source: OverlaySource;
|
|
10
|
+
text?: string;
|
|
11
|
+
durationMs?: number;
|
|
12
|
+
priority?: number;
|
|
13
|
+
} | {
|
|
14
|
+
action: "clear";
|
|
15
|
+
id?: string;
|
|
16
|
+
source?: OverlaySource;
|
|
17
|
+
};
|
|
18
|
+
export interface ActiveOverlayJob {
|
|
19
|
+
id: string;
|
|
20
|
+
state: OverlayState;
|
|
21
|
+
source: OverlaySource;
|
|
22
|
+
text?: string;
|
|
23
|
+
priority: number;
|
|
24
|
+
requiresPasswordInput: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare class OverlayService {
|
|
27
|
+
private readonly services;
|
|
28
|
+
private readonly queue;
|
|
29
|
+
private readonly activeJobs;
|
|
30
|
+
private readonly jobTimeoutIds;
|
|
31
|
+
private readonly renderer;
|
|
32
|
+
private readonly watchdog;
|
|
33
|
+
private currentJob?;
|
|
34
|
+
constructor(services: ServiceContainer);
|
|
35
|
+
private get isDebug();
|
|
36
|
+
private get overlayOptions();
|
|
37
|
+
show(eventType: MonitorDogOverlayType): void;
|
|
38
|
+
hide(): void;
|
|
39
|
+
lock(durationMs: number): void;
|
|
40
|
+
clearLock(): void;
|
|
41
|
+
isLocked(): boolean;
|
|
42
|
+
isShowing(): boolean;
|
|
43
|
+
isShowingDetectionBlocker(): boolean;
|
|
44
|
+
hasActiveSource(source: OverlaySource): boolean;
|
|
45
|
+
hasActiveState(state: OverlayState): boolean;
|
|
46
|
+
hasActiveResumePasswordLock(): boolean;
|
|
47
|
+
enqueue(job: OverlayJob): void;
|
|
48
|
+
showJob(job: Omit<Extract<OverlayJob, {
|
|
49
|
+
action: "show";
|
|
50
|
+
}>, "action">): void;
|
|
51
|
+
clearJob(id: string): void;
|
|
52
|
+
clearSource(source: OverlaySource): void;
|
|
53
|
+
stopWatchdog(): void;
|
|
54
|
+
private startWatchdog;
|
|
55
|
+
private ensureIntegrity;
|
|
56
|
+
private processQueue;
|
|
57
|
+
private clearJobs;
|
|
58
|
+
private syncActiveOverlay;
|
|
59
|
+
private renderHidden;
|
|
60
|
+
private getNextActiveJob;
|
|
61
|
+
private setJobDuration;
|
|
62
|
+
private clearJobDuration;
|
|
63
|
+
private getOverlayMessage;
|
|
64
|
+
private getLanguageMessages;
|
|
65
|
+
private getDefaultSource;
|
|
66
|
+
private getDefaultPriority;
|
|
67
|
+
private handleNoFacePasswordSubmit;
|
|
68
|
+
private isCameraOverlay;
|
|
69
|
+
private isRemoteLockOverlay;
|
|
70
|
+
private shouldRequirePasswordInput;
|
|
71
|
+
private shouldShowNoFacePasswordInput;
|
|
72
|
+
private hasInteractiveAction;
|
|
73
|
+
private isMonitorDogOverlayType;
|
|
74
|
+
}
|
|
75
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MonitorDogOverlayOptions } from "../types";
|
|
2
|
+
interface OverlayWatchdogOptions {
|
|
3
|
+
getOverlayOptions: () => MonitorDogOverlayOptions | undefined;
|
|
4
|
+
ensureIntegrity: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare class OverlayWatchdogService {
|
|
7
|
+
private readonly options;
|
|
8
|
+
private intervalId?;
|
|
9
|
+
constructor(options: OverlayWatchdogOptions);
|
|
10
|
+
start(): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ServiceContainer } from "./container";
|
|
2
|
+
export declare class WebcamService {
|
|
3
|
+
private readonly services;
|
|
4
|
+
private isWebcamRunning;
|
|
5
|
+
private stopCurrentWebcam?;
|
|
6
|
+
private startPromise?;
|
|
7
|
+
private shouldRun;
|
|
8
|
+
private resumeWhenUnpaused;
|
|
9
|
+
private readonly handleVisibilityChange;
|
|
10
|
+
constructor(services: ServiceContainer);
|
|
11
|
+
get isRunning(): boolean;
|
|
12
|
+
get isStarting(): boolean;
|
|
13
|
+
start(): Promise<void>;
|
|
14
|
+
stop(): void;
|
|
15
|
+
retryConnection(): Promise<void>;
|
|
16
|
+
syncPauseState(): Promise<void>;
|
|
17
|
+
syncBackgroundPreference(): void;
|
|
18
|
+
private ensureStarted;
|
|
19
|
+
private startWebcam;
|
|
20
|
+
private stopWebcam;
|
|
21
|
+
private handleCameraDisconnect;
|
|
22
|
+
private addVisibilityListener;
|
|
23
|
+
private removeVisibilityListener;
|
|
24
|
+
private isCameraPermissionError;
|
|
25
|
+
private isCameraReadError;
|
|
26
|
+
}
|