@jaak.ai/stamps 2.0.0-beta.2 → 2.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +216 -212
  2. package/dist/cjs/{index-DGM9-FNg.js → index-BfhtOB0D.js} +5 -2
  3. package/dist/cjs/index-BfhtOB0D.js.map +1 -0
  4. package/dist/cjs/jaak-stamps-webcomponent.cjs.js +2 -2
  5. package/dist/cjs/jaak-stamps.cjs.entry.js +1860 -783
  6. package/dist/cjs/jaak-stamps.cjs.entry.js.map +1 -1
  7. package/dist/cjs/jaak-stamps.entry.cjs.js.map +1 -1
  8. package/dist/cjs/loader.cjs.js +2 -2
  9. package/dist/collection/components/my-component/my-component.css +629 -72
  10. package/dist/collection/components/my-component/my-component.js +896 -781
  11. package/dist/collection/components/my-component/my-component.js.map +1 -1
  12. package/dist/collection/services/CameraService.js +453 -0
  13. package/dist/collection/services/CameraService.js.map +1 -0
  14. package/dist/collection/services/DetectionService.js +369 -0
  15. package/dist/collection/services/DetectionService.js.map +1 -0
  16. package/dist/collection/services/EventBusService.js +42 -0
  17. package/dist/collection/services/EventBusService.js.map +1 -0
  18. package/dist/collection/services/LoggerService.js +40 -0
  19. package/dist/collection/services/LoggerService.js.map +1 -0
  20. package/dist/collection/services/ServiceContainer.js +66 -0
  21. package/dist/collection/services/ServiceContainer.js.map +1 -0
  22. package/dist/collection/services/StateManagerService.js +109 -0
  23. package/dist/collection/services/StateManagerService.js.map +1 -0
  24. package/dist/collection/services/factories/DeviceStrategyFactory.js +16 -0
  25. package/dist/collection/services/factories/DeviceStrategyFactory.js.map +1 -0
  26. package/dist/collection/services/interfaces/ICameraService.js +2 -0
  27. package/dist/collection/services/interfaces/ICameraService.js.map +1 -0
  28. package/dist/collection/services/interfaces/IDetectionService.js +2 -0
  29. package/dist/collection/services/interfaces/IDetectionService.js.map +1 -0
  30. package/dist/collection/services/interfaces/IEventBus.js +2 -0
  31. package/dist/collection/services/interfaces/IEventBus.js.map +1 -0
  32. package/dist/collection/services/interfaces/ILogger.js +2 -0
  33. package/dist/collection/services/interfaces/ILogger.js.map +1 -0
  34. package/dist/collection/services/interfaces/IStateManager.js +2 -0
  35. package/dist/collection/services/interfaces/IStateManager.js.map +1 -0
  36. package/dist/collection/services/strategies/HighPerformanceDeviceStrategy.js +30 -0
  37. package/dist/collection/services/strategies/HighPerformanceDeviceStrategy.js.map +1 -0
  38. package/dist/collection/services/strategies/IDeviceStrategy.js +2 -0
  39. package/dist/collection/services/strategies/IDeviceStrategy.js.map +1 -0
  40. package/dist/collection/services/strategies/LowMemoryDeviceStrategy.js +30 -0
  41. package/dist/collection/services/strategies/LowMemoryDeviceStrategy.js.map +1 -0
  42. package/dist/collection/types/component-types.js +2 -0
  43. package/dist/collection/types/component-types.js.map +1 -0
  44. package/dist/components/index.js +3 -0
  45. package/dist/components/index.js.map +1 -1
  46. package/dist/components/jaak-stamps.js +1873 -797
  47. package/dist/components/jaak-stamps.js.map +1 -1
  48. package/dist/esm/{index-DqoVMnc7.js → index-BP1Q4KOg.js} +5 -2
  49. package/dist/esm/index-BP1Q4KOg.js.map +1 -0
  50. package/dist/esm/jaak-stamps-webcomponent.js +3 -3
  51. package/dist/esm/jaak-stamps.entry.js +1860 -783
  52. package/dist/esm/jaak-stamps.entry.js.map +1 -1
  53. package/dist/esm/loader.js +3 -3
  54. package/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js +1 -1
  55. package/dist/jaak-stamps-webcomponent/jaak-stamps.entry.esm.js.map +1 -1
  56. package/dist/jaak-stamps-webcomponent/p-10ee2dab.entry.js +2 -0
  57. package/dist/jaak-stamps-webcomponent/p-10ee2dab.entry.js.map +1 -0
  58. package/dist/jaak-stamps-webcomponent/p-BP1Q4KOg.js +3 -0
  59. package/dist/jaak-stamps-webcomponent/p-BP1Q4KOg.js.map +1 -0
  60. package/dist/types/components/my-component/my-component.d.ts +90 -79
  61. package/dist/types/components.d.ts +32 -8
  62. package/dist/types/services/CameraService.d.ts +46 -0
  63. package/dist/types/services/DetectionService.d.ts +35 -0
  64. package/dist/types/services/EventBusService.d.ts +9 -0
  65. package/dist/types/services/LoggerService.d.ts +12 -0
  66. package/dist/types/services/ServiceContainer.d.ts +27 -0
  67. package/dist/types/services/StateManagerService.d.ts +15 -0
  68. package/dist/types/services/factories/DeviceStrategyFactory.d.ts +4 -0
  69. package/dist/types/services/interfaces/ICameraService.d.ts +34 -0
  70. package/dist/types/services/interfaces/IDetectionService.d.ts +31 -0
  71. package/dist/types/services/interfaces/IEventBus.d.ts +16 -0
  72. package/dist/types/services/interfaces/ILogger.d.ts +8 -0
  73. package/dist/types/services/interfaces/IStateManager.d.ts +35 -0
  74. package/dist/types/services/strategies/HighPerformanceDeviceStrategy.d.ts +6 -0
  75. package/dist/types/services/strategies/IDeviceStrategy.d.ts +21 -0
  76. package/dist/types/services/strategies/LowMemoryDeviceStrategy.d.ts +6 -0
  77. package/dist/types/types/component-types.d.ts +36 -0
  78. package/package.json +3 -3
  79. package/dist/cjs/index-DGM9-FNg.js.map +0 -1
  80. package/dist/esm/index-DqoVMnc7.js.map +0 -1
  81. package/dist/jaak-stamps-webcomponent/p-DqoVMnc7.js +0 -3
  82. package/dist/jaak-stamps-webcomponent/p-DqoVMnc7.js.map +0 -1
  83. package/dist/jaak-stamps-webcomponent/p-f1172b06.entry.js +0 -2
  84. package/dist/jaak-stamps-webcomponent/p-f1172b06.entry.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter } from '../../stencil-public-runtime';
2
+ import { CameraInfoResponse, CapturedImagesResponse, StatusResponse } from '../../types/component-types';
2
3
  export declare class JaakStamps {
3
4
  el: HTMLElement;
4
5
  debug: boolean;
@@ -6,94 +7,87 @@ export declare class JaakStamps {
6
7
  maskSize: number;
7
8
  cropMargin: number;
8
9
  useDocumentClassification: boolean;
10
+ preferredCamera: 'auto' | 'front' | 'back';
11
+ captureDelay: number;
9
12
  captureCompleted: EventEmitter<any>;
10
13
  isReady: EventEmitter<boolean>;
11
- isVideoActive: boolean;
12
- statusMessage: string;
13
- statusColor: string;
14
- bestScore: number;
15
- capturedFullFrame: string | null;
16
- capturedCroppedId: string | null;
17
- capturedBackFullFrame: string | null;
18
- capturedBackCroppedId: string | null;
19
- captureStep: 'front' | 'back' | 'completed';
20
- isCapturing: boolean;
21
- showFlipAnimation: boolean;
22
- showSuccessAnimation: boolean;
23
- shouldMirrorVideo: boolean;
14
+ detectionBoxes: Array<{
15
+ x: number;
16
+ y: number;
17
+ w: number;
18
+ h: number;
19
+ score: number;
20
+ }>;
24
21
  sideAlignment: {
25
22
  top: boolean;
26
23
  right: boolean;
27
24
  bottom: boolean;
28
25
  left: boolean;
29
26
  };
30
- isDetectionPaused: boolean;
31
- isLoading: boolean;
32
- isModelPreloaded: boolean;
33
27
  isMaskReady: boolean;
28
+ shouldMirrorVideo: boolean;
29
+ showCameraSelector: boolean;
30
+ isSwitchingCamera: boolean;
31
+ hasDocumentDetected: boolean;
32
+ currentStatus: {
33
+ message: string;
34
+ description?: string;
35
+ type: 'initializing' | 'ready' | 'loading' | 'active' | 'error';
36
+ isInitialized: boolean;
37
+ };
38
+ performanceData: {
39
+ fps: number;
40
+ inferenceTime: number;
41
+ memoryUsage: number;
42
+ onnxLoadTime: number;
43
+ frameProcessingTime: number;
44
+ totalDetections: number;
45
+ successfulDetections: number;
46
+ detectionRate: number;
47
+ };
48
+ private serviceContainer;
49
+ private logger;
50
+ private eventBus;
51
+ private stateManager;
52
+ private cameraService;
53
+ private detectionService;
34
54
  private videoRef?;
35
- private canvasRef?;
36
- private session?;
37
- private startTime?;
55
+ private detectionContainer?;
38
56
  private videoStream?;
39
57
  private animationId?;
40
- private hasScreenshotTaken;
41
58
  private lastDetectedBox?;
42
- private mobileNetSession?;
43
- private mobileNetClassMap?;
59
+ private startTime?;
60
+ private hasScreenshotTaken;
61
+ private alignmentStartTime?;
62
+ private alignmentTimer?;
63
+ private performanceMetrics;
64
+ private performanceUpdateInterval?;
44
65
  private frameSkipCounter;
45
66
  private readonly FRAME_SKIP;
46
67
  private consecutiveFailures;
47
68
  private readonly MAX_FAILURES;
48
69
  private lastInferenceTime;
49
70
  private readonly MIN_INFERENCE_INTERVAL;
50
- private preprocessCanvas?;
51
- private preprocessCtx?;
52
- private captureCanvas?;
53
- private captureCtx?;
54
- private readonly MODEL_PATH;
55
- private readonly MOBILENET_MODEL_PATH;
56
- private readonly MOBILENET_CLASSES_PATH;
57
- private readonly INPUT_SIZE;
58
- private readonly CONFIDENCE_THRESHOLD;
59
- private readonly ID1_ASPECT_RATIO;
60
- private debugLog;
61
- private validateMaskSize;
62
- private validateCropMargin;
63
- private emitReadyEvent;
64
- private isRearCamera;
65
71
  componentDidLoad(): Promise<void>;
66
- private setupResizeObserver;
72
+ private initializeServices;
73
+ private setupEventListeners;
74
+ private initializeComponent;
75
+ private validateProps;
76
+ private loadOnnxRuntime;
77
+ private finalizeInitialization;
78
+ private updateStatus;
79
+ private emitReadyEvent;
80
+ private handleStateChange;
81
+ private initializeResizeObserver;
67
82
  private handleResize;
68
83
  private updateMaskDimensions;
69
- private initializeCanvasPool;
70
- disconnectedCallback(): void;
71
- getCapturedImages(): Promise<{
72
- front: {
73
- fullFrame: string;
74
- cropped: string;
75
- };
76
- back: {
77
- fullFrame: string;
78
- cropped: string;
79
- };
80
- metadata: {
81
- hasBackCapture: boolean;
82
- totalImages: number;
83
- };
84
- }>;
84
+ getCapturedImages(): Promise<CapturedImagesResponse>;
85
85
  isProcessCompleted(): Promise<boolean>;
86
86
  startCapture(): Promise<void>;
87
87
  stopCapture(): Promise<void>;
88
88
  resetCapture(): Promise<void>;
89
- getStatus(): Promise<{
90
- isVideoActive: boolean;
91
- captureStep: "front" | "back" | "completed";
92
- statusMessage: string;
93
- hasImages: boolean;
94
- isProcessCompleted: boolean;
95
- isModelPreloaded: boolean;
96
- }>;
89
+ skipBackCapture(): Promise<void>;
90
+ getStatus(): Promise<StatusResponse>;
97
91
  preloadModel(): Promise<{
98
92
  success: boolean;
99
93
  message: string;
@@ -103,29 +97,46 @@ export declare class JaakStamps {
103
97
  error: any;
104
98
  message?: undefined;
105
99
  }>;
106
- skipBackCapture(): Promise<void>;
107
- private loadMobileNetModel;
108
- private preprocessMobileNet;
109
- private classifyDocument;
110
- private cleanup;
111
- private cleanupCanvasPool;
112
- private getMaxResolution;
113
- private setupCamera;
114
- private preprocess;
115
- private getSessionOptions;
100
+ getCameraInfo(): Promise<CameraInfoResponse>;
101
+ setPreferredCamera(camera: 'auto' | 'front' | 'back'): Promise<{
102
+ success: boolean;
103
+ selectedCamera: string;
104
+ availableCameras: number;
105
+ }>;
106
+ setCaptureDelay(delay: number): Promise<{
107
+ success: boolean;
108
+ captureDelay: number;
109
+ }>;
110
+ getCaptureDelay(): Promise<number>;
111
+ setTorchEnabled(enabled: boolean): Promise<{
112
+ success: boolean;
113
+ enabled: boolean;
114
+ }>;
115
+ focusAtPoint(x: number, y: number): Promise<{
116
+ success: boolean;
117
+ coordinates: {
118
+ x: number;
119
+ y: number;
120
+ };
121
+ }>;
116
122
  private startDetection;
123
+ private initializeVideoStream;
117
124
  private detectFrame;
118
- private isCardInFrame;
119
- private checkSideAlignment;
120
- private areAllSidesAligned;
125
+ disconnectedCallback(): void;
126
+ private cleanup;
127
+ render(): any;
128
+ private updateDetectionBoxes;
121
129
  private updateMaskColor;
122
- private updateGuidanceStatus;
123
- private drawDetections;
124
130
  private takeScreenshot;
125
131
  private triggerCaptureAnimation;
132
+ private completeProcess;
126
133
  private stopDetection;
134
+ private toggleCameraSelector;
135
+ private handleCameraSwitch;
127
136
  private resetDetection;
128
- private completeProcess;
129
137
  private exitSession;
130
- render(): any;
138
+ private initializePerformanceMonitor;
139
+ private updatePerformanceMetrics;
140
+ private recordOnnxPerformance;
141
+ private recordFrameProcessing;
131
142
  }
@@ -5,29 +5,45 @@
5
5
  * It contains typing information for all components that exist in this project.
6
6
  */
7
7
  import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
8
+ import { CameraInfoResponse, CapturedImagesResponse, StatusResponse } from "./types/component-types";
9
+ export { CameraInfoResponse, CapturedImagesResponse, StatusResponse } from "./types/component-types";
8
10
  export namespace Components {
9
11
  interface JaakStamps {
10
12
  /**
11
- * @default 10
13
+ * @default 15
12
14
  */
13
15
  "alignmentTolerance": number;
14
16
  /**
15
- * @default 0
17
+ * @default 1500
18
+ */
19
+ "captureDelay": number;
20
+ /**
21
+ * @default 20
16
22
  */
17
23
  "cropMargin": number;
18
24
  /**
19
25
  * @default false
20
26
  */
21
27
  "debug": boolean;
22
- "getCapturedImages": () => Promise<{ front: { fullFrame: string; cropped: string; }; back: { fullFrame: string; cropped: string; }; metadata: { hasBackCapture: boolean; totalImages: number; }; }>;
23
- "getStatus": () => Promise<{ isVideoActive: boolean; captureStep: "front" | "back" | "completed"; statusMessage: string; hasImages: boolean; isProcessCompleted: boolean; isModelPreloaded: boolean; }>;
28
+ "focusAtPoint": (x: number, y: number) => Promise<{ success: boolean; coordinates: { x: number; y: number; }; }>;
29
+ "getCameraInfo": () => Promise<CameraInfoResponse>;
30
+ "getCaptureDelay": () => Promise<number>;
31
+ "getCapturedImages": () => Promise<CapturedImagesResponse>;
32
+ "getStatus": () => Promise<StatusResponse>;
24
33
  "isProcessCompleted": () => Promise<boolean>;
25
34
  /**
26
- * @default 90
35
+ * @default 80
27
36
  */
28
37
  "maskSize": number;
38
+ /**
39
+ * @default 'auto'
40
+ */
41
+ "preferredCamera": 'auto' | 'front' | 'back';
29
42
  "preloadModel": () => Promise<{ success: boolean; message: string; error?: undefined; } | { success: boolean; error: any; message?: undefined; }>;
30
43
  "resetCapture": () => Promise<void>;
44
+ "setCaptureDelay": (delay: number) => Promise<{ success: boolean; captureDelay: number; }>;
45
+ "setPreferredCamera": (camera: "auto" | "front" | "back") => Promise<{ success: boolean; selectedCamera: string; availableCameras: number; }>;
46
+ "setTorchEnabled": (enabled: boolean) => Promise<{ success: boolean; enabled: boolean; }>;
31
47
  "skipBackCapture": () => Promise<void>;
32
48
  "startCapture": () => Promise<void>;
33
49
  "stopCapture": () => Promise<void>;
@@ -67,11 +83,15 @@ declare global {
67
83
  declare namespace LocalJSX {
68
84
  interface JaakStamps {
69
85
  /**
70
- * @default 10
86
+ * @default 15
71
87
  */
72
88
  "alignmentTolerance"?: number;
73
89
  /**
74
- * @default 0
90
+ * @default 1500
91
+ */
92
+ "captureDelay"?: number;
93
+ /**
94
+ * @default 20
75
95
  */
76
96
  "cropMargin"?: number;
77
97
  /**
@@ -79,11 +99,15 @@ declare namespace LocalJSX {
79
99
  */
80
100
  "debug"?: boolean;
81
101
  /**
82
- * @default 90
102
+ * @default 80
83
103
  */
84
104
  "maskSize"?: number;
85
105
  "onCaptureCompleted"?: (event: JaakStampsCustomEvent<any>) => void;
86
106
  "onIsReady"?: (event: JaakStampsCustomEvent<boolean>) => void;
107
+ /**
108
+ * @default 'auto'
109
+ */
110
+ "preferredCamera"?: 'auto' | 'front' | 'back';
87
111
  /**
88
112
  * @default false
89
113
  */
@@ -0,0 +1,46 @@
1
+ import { ICameraService, CameraInfo } from './interfaces/ICameraService';
2
+ import { ILogger } from './interfaces/ILogger';
3
+ import { IEventBus } from './interfaces/IEventBus';
4
+ export declare class CameraService implements ICameraService {
5
+ private logger;
6
+ private eventBus;
7
+ private availableCameras;
8
+ private selectedCameraId;
9
+ private deviceType;
10
+ private preferredCameraFacing;
11
+ private preferredCamera;
12
+ constructor(logger: ILogger, eventBus: IEventBus, preferredCamera?: 'auto' | 'front' | 'back');
13
+ detectDeviceType(): Promise<'mobile' | 'desktop' | 'tablet'>;
14
+ enumerateDevices(): Promise<MediaDeviceInfo[]>;
15
+ getAvailableCameras(): MediaDeviceInfo[];
16
+ isMultipleCamerasAvailable(): boolean;
17
+ getSelectedCameraId(): string | null;
18
+ setSelectedCamera(cameraId: string): Promise<void>;
19
+ getPreferredFacing(): 'environment' | 'user' | null;
20
+ setupCamera(constraints?: MediaTrackConstraints): Promise<MediaStream>;
21
+ switchCamera(cameraId: string): Promise<void>;
22
+ flipToNextCamera(): Promise<void>;
23
+ savePreference(): void;
24
+ loadPreference(): void;
25
+ isRearCamera(stream: MediaStream): boolean;
26
+ getCameraInfo(): {
27
+ availableCameras: CameraInfo[];
28
+ selectedCameraId: string | null;
29
+ deviceType: string;
30
+ isMultipleCamerasAvailable: boolean;
31
+ preferredFacing: 'environment' | 'user' | null;
32
+ };
33
+ private checkCameraPermission;
34
+ private handleCameraPermissionError;
35
+ private setInitialCameraPreference;
36
+ private selectFrontCamera;
37
+ private selectBackCamera;
38
+ private selectAutoCamera;
39
+ private updatePreferredFacing;
40
+ private getMaxResolution;
41
+ private applyAdvancedCameraSettings;
42
+ private applyBasicFocusSettings;
43
+ private getCapabilitiesSummary;
44
+ setTorchEnabled(enabled: boolean, stream?: MediaStream): Promise<boolean>;
45
+ focusAtPoint(x: number, y: number, stream?: MediaStream): Promise<boolean>;
46
+ }
@@ -0,0 +1,35 @@
1
+ import { IDetectionService, DetectionBox, SideAlignment, ClassificationResult } from './interfaces/IDetectionService';
2
+ import { ILogger } from './interfaces/ILogger';
3
+ export declare class DetectionService implements IDetectionService {
4
+ private logger;
5
+ private debug;
6
+ private useDocumentClassification;
7
+ private session?;
8
+ private mobileNetSession?;
9
+ private mobileNetClassMap?;
10
+ private modelLoaded;
11
+ private deviceStrategy;
12
+ private readonly MODEL_PATH;
13
+ private readonly MOBILENET_MODEL_PATH;
14
+ private readonly MOBILENET_CLASSES_PATH;
15
+ private readonly INPUT_SIZE;
16
+ private readonly CONFIDENCE_THRESHOLD;
17
+ private preprocessCanvas?;
18
+ private preprocessCtx?;
19
+ private captureCanvas?;
20
+ constructor(logger: ILogger, debug?: boolean, useDocumentClassification?: boolean);
21
+ loadModel(): Promise<void>;
22
+ loadClassificationModel(): Promise<void>;
23
+ isModelLoaded(): boolean;
24
+ preprocess(video: HTMLVideoElement): any;
25
+ runInference(inputTensor: any): Promise<DetectionBox[]>;
26
+ classifyDocument(canvas: HTMLCanvasElement): Promise<ClassificationResult | null>;
27
+ checkSideAlignment(box: DetectionBox, maskConfig: any): SideAlignment;
28
+ isCardInFrame(box: DetectionBox): boolean;
29
+ areAllSidesAligned(alignment: SideAlignment): boolean;
30
+ cleanup(): void;
31
+ private initializeCanvasPool;
32
+ private cleanupCanvasPool;
33
+ private float32ToFloat16;
34
+ private preprocessMobileNet;
35
+ }
@@ -0,0 +1,9 @@
1
+ import { IEventBus, EventCallback } from './interfaces/IEventBus';
2
+ export declare class EventBusService implements IEventBus {
3
+ private events;
4
+ on<T = any>(event: string, callback: EventCallback<T>): void;
5
+ off(event: string, callback: EventCallback): void;
6
+ emit<T = any>(event: string, data?: T): void;
7
+ once<T = any>(event: string, callback: EventCallback<T>): void;
8
+ clear(): void;
9
+ }
@@ -0,0 +1,12 @@
1
+ import { ILogger } from './interfaces/ILogger';
2
+ export declare class LoggerService implements ILogger {
3
+ private debugMode;
4
+ constructor(debug?: boolean);
5
+ setDebugMode(debug: boolean): void;
6
+ info(...args: any[]): void;
7
+ warn(...args: any[]): void;
8
+ error(...args: any[]): void;
9
+ debug(...args: any[]): void;
10
+ state(state: string, data?: any): void;
11
+ performance(operation: string, duration: number): void;
12
+ }
@@ -0,0 +1,27 @@
1
+ import { ILogger } from './interfaces/ILogger';
2
+ import { ICameraService } from './interfaces/ICameraService';
3
+ import { IDetectionService } from './interfaces/IDetectionService';
4
+ import { IStateManager } from './interfaces/IStateManager';
5
+ import { IEventBus } from './interfaces/IEventBus';
6
+ export interface ComponentConfig {
7
+ debug: boolean;
8
+ alignmentTolerance: number;
9
+ maskSize: number;
10
+ cropMargin: number;
11
+ useDocumentClassification: boolean;
12
+ preferredCamera: 'auto' | 'front' | 'back';
13
+ captureDelay: number;
14
+ }
15
+ export declare class ServiceContainer {
16
+ private services;
17
+ constructor(config: ComponentConfig);
18
+ private initializeServices;
19
+ get<T>(serviceName: string): T;
20
+ getLogger(): ILogger;
21
+ getEventBus(): IEventBus;
22
+ getStateManager(): IStateManager;
23
+ getCameraService(): ICameraService;
24
+ getDetectionService(): IDetectionService;
25
+ updateConfig(config: Partial<ComponentConfig>): void;
26
+ cleanup(): void;
27
+ }
@@ -0,0 +1,15 @@
1
+ import { IStateManager, CaptureState, CapturedImages } from './interfaces/IStateManager';
2
+ import { IEventBus } from './interfaces/IEventBus';
3
+ export declare class StateManagerService implements IStateManager {
4
+ private eventBus;
5
+ private captureState;
6
+ private capturedImages;
7
+ constructor(eventBus: IEventBus);
8
+ getCaptureState(): CaptureState;
9
+ updateCaptureState(updates: Partial<CaptureState>): void;
10
+ getCapturedImages(): CapturedImages;
11
+ setCapturedImages(images: Partial<CapturedImages>): void;
12
+ reset(): void;
13
+ isProcessCompleted(): boolean;
14
+ canProceedToBack(): boolean;
15
+ }
@@ -0,0 +1,4 @@
1
+ import { IDeviceStrategy } from '../strategies/IDeviceStrategy';
2
+ export declare class DeviceStrategyFactory {
3
+ static createStrategy(): IDeviceStrategy;
4
+ }
@@ -0,0 +1,34 @@
1
+ export interface CameraInfo {
2
+ id: string;
3
+ label: string;
4
+ selected: boolean;
5
+ }
6
+ export interface CameraPreference {
7
+ cameraId: string;
8
+ facing: 'environment' | 'user' | null;
9
+ timestamp: number;
10
+ }
11
+ export interface ICameraService {
12
+ detectDeviceType(): Promise<'mobile' | 'desktop' | 'tablet'>;
13
+ enumerateDevices(): Promise<MediaDeviceInfo[]>;
14
+ getAvailableCameras(): MediaDeviceInfo[];
15
+ isMultipleCamerasAvailable(): boolean;
16
+ getSelectedCameraId(): string | null;
17
+ setSelectedCamera(cameraId: string): Promise<void>;
18
+ getPreferredFacing(): 'environment' | 'user' | null;
19
+ setupCamera(constraints?: MediaTrackConstraints): Promise<MediaStream>;
20
+ switchCamera(cameraId: string): Promise<void>;
21
+ flipToNextCamera(): Promise<void>;
22
+ savePreference(): void;
23
+ loadPreference(): void;
24
+ isRearCamera(stream: MediaStream): boolean;
25
+ setTorchEnabled(enabled: boolean, stream?: MediaStream): Promise<boolean>;
26
+ focusAtPoint(x: number, y: number, stream?: MediaStream): Promise<boolean>;
27
+ getCameraInfo(): {
28
+ availableCameras: CameraInfo[];
29
+ selectedCameraId: string | null;
30
+ deviceType: string;
31
+ isMultipleCamerasAvailable: boolean;
32
+ preferredFacing: 'environment' | 'user' | null;
33
+ };
34
+ }
@@ -0,0 +1,31 @@
1
+ export interface DetectionBox {
2
+ x: number;
3
+ y: number;
4
+ w: number;
5
+ h: number;
6
+ score: number;
7
+ classId?: number;
8
+ }
9
+ export interface SideAlignment {
10
+ top: boolean;
11
+ right: boolean;
12
+ bottom: boolean;
13
+ left: boolean;
14
+ }
15
+ export interface ClassificationResult {
16
+ class: string;
17
+ confidence: number;
18
+ classIndex: number;
19
+ }
20
+ export interface IDetectionService {
21
+ loadModel(): Promise<void>;
22
+ loadClassificationModel(): Promise<void>;
23
+ isModelLoaded(): boolean;
24
+ preprocess(video: HTMLVideoElement): any;
25
+ runInference(inputTensor: any): Promise<DetectionBox[]>;
26
+ classifyDocument(canvas: HTMLCanvasElement): Promise<ClassificationResult | null>;
27
+ checkSideAlignment(box: DetectionBox, maskConfig: any): SideAlignment;
28
+ isCardInFrame(box: DetectionBox): boolean;
29
+ areAllSidesAligned(alignment: SideAlignment): boolean;
30
+ cleanup(): void;
31
+ }
@@ -0,0 +1,16 @@
1
+ export type EventCallback<T = any> = (data: T) => void;
2
+ export interface IEventBus {
3
+ on<T = any>(event: string, callback: EventCallback<T>): void;
4
+ off(event: string, callback: EventCallback): void;
5
+ emit<T = any>(event: string, data?: T): void;
6
+ once<T = any>(event: string, callback: EventCallback<T>): void;
7
+ clear(): void;
8
+ }
9
+ export interface ComponentEvents {
10
+ 'capture-completed': any;
11
+ 'ready': boolean;
12
+ 'camera-changed': string;
13
+ 'detection-updated': any[];
14
+ 'state-changed': any;
15
+ 'error': Error;
16
+ }
@@ -0,0 +1,8 @@
1
+ export interface ILogger {
2
+ info(...args: any[]): void;
3
+ warn(...args: any[]): void;
4
+ error(...args: any[]): void;
5
+ debug(...args: any[]): void;
6
+ state(state: string, data?: any): void;
7
+ performance(operation: string, duration: number): void;
8
+ }
@@ -0,0 +1,35 @@
1
+ export interface CaptureState {
2
+ step: 'front' | 'back' | 'completed';
3
+ isCapturing: boolean;
4
+ isDetectionPaused: boolean;
5
+ isVideoActive: boolean;
6
+ isLoading: boolean;
7
+ showFlipAnimation: boolean;
8
+ showSuccessAnimation: boolean;
9
+ bestScore: number;
10
+ hasScreenshotTaken: boolean;
11
+ }
12
+ export interface CapturedImages {
13
+ front: {
14
+ fullFrame: string | null;
15
+ cropped: string | null;
16
+ };
17
+ back: {
18
+ fullFrame: string | null;
19
+ cropped: string | null;
20
+ };
21
+ metadata: {
22
+ totalImages: number;
23
+ processCompleted: boolean;
24
+ backCaptureSkipped: boolean;
25
+ };
26
+ }
27
+ export interface IStateManager {
28
+ getCaptureState(): CaptureState;
29
+ updateCaptureState(updates: Partial<CaptureState>): void;
30
+ getCapturedImages(): CapturedImages;
31
+ setCapturedImages(images: Partial<CapturedImages>): void;
32
+ reset(): void;
33
+ isProcessCompleted(): boolean;
34
+ canProceedToBack(): boolean;
35
+ }
@@ -0,0 +1,6 @@
1
+ import { IDeviceStrategy, DeviceInfo, SessionOptions } from './IDeviceStrategy';
2
+ export declare class HighPerformanceDeviceStrategy implements IDeviceStrategy {
3
+ getDeviceInfo(): DeviceInfo;
4
+ getSessionOptions(debug: boolean): SessionOptions;
5
+ shouldUseSequentialLoading(): boolean;
6
+ }
@@ -0,0 +1,21 @@
1
+ export interface DeviceInfo {
2
+ estimatedRAM: number;
3
+ isLowMemory: boolean;
4
+ isSlowConnection: boolean;
5
+ }
6
+ export interface SessionOptions {
7
+ executionProviders: string[];
8
+ graphOptimizationLevel: string;
9
+ logSeverityLevel: number;
10
+ logVerbosityLevel?: number;
11
+ enableCpuMemArena: boolean;
12
+ enableMemPattern: boolean;
13
+ executionMode: string;
14
+ interOpNumThreads: number;
15
+ intraOpNumThreads: number;
16
+ }
17
+ export interface IDeviceStrategy {
18
+ getDeviceInfo(): DeviceInfo;
19
+ getSessionOptions(debug: boolean): SessionOptions;
20
+ shouldUseSequentialLoading(): boolean;
21
+ }
@@ -0,0 +1,6 @@
1
+ import { IDeviceStrategy, DeviceInfo, SessionOptions } from './IDeviceStrategy';
2
+ export declare class LowMemoryDeviceStrategy implements IDeviceStrategy {
3
+ getDeviceInfo(): DeviceInfo;
4
+ getSessionOptions(_debug: boolean): SessionOptions;
5
+ shouldUseSequentialLoading(): boolean;
6
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Type definitions for component methods to avoid absolute paths in components.d.ts
3
+ */
4
+ export interface CameraInfoResponse {
5
+ availableCameras: Array<{
6
+ id: string;
7
+ label: string;
8
+ selected: boolean;
9
+ }>;
10
+ selectedCameraId: string | null;
11
+ deviceType: string;
12
+ isMultipleCamerasAvailable: boolean;
13
+ preferredFacing: 'environment' | 'user' | null;
14
+ }
15
+ export interface CapturedImagesResponse {
16
+ front: {
17
+ fullFrame: string | null;
18
+ cropped: string | null;
19
+ };
20
+ back: {
21
+ fullFrame: string | null;
22
+ cropped: string | null;
23
+ };
24
+ metadata: {
25
+ totalImages: number;
26
+ processCompleted: boolean;
27
+ backCaptureSkipped: boolean;
28
+ };
29
+ }
30
+ export interface StatusResponse {
31
+ isVideoActive: boolean;
32
+ captureStep: 'front' | 'back' | 'completed';
33
+ hasImages: boolean;
34
+ isProcessCompleted: boolean;
35
+ isModelPreloaded: boolean;
36
+ }