smartcomply-web-sdk 1.0.3

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 (133) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +482 -0
  3. package/dist/camera/ActionDetector.d.ts +26 -0
  4. package/dist/camera/ActionDetector.d.ts.map +1 -0
  5. package/dist/camera/ActionDetector.js +114 -0
  6. package/dist/camera/ActionDetector.js.map +1 -0
  7. package/dist/camera/CameraManager.d.ts +7 -0
  8. package/dist/camera/CameraManager.d.ts.map +1 -0
  9. package/dist/camera/CameraManager.js +31 -0
  10. package/dist/camera/CameraManager.js.map +1 -0
  11. package/dist/camera/FaceDetector.d.ts +12 -0
  12. package/dist/camera/FaceDetector.d.ts.map +1 -0
  13. package/dist/camera/FaceDetector.js +55 -0
  14. package/dist/camera/FaceDetector.js.map +1 -0
  15. package/dist/camera/Permission.d.ts +42 -0
  16. package/dist/camera/Permission.d.ts.map +1 -0
  17. package/dist/camera/Permission.js +107 -0
  18. package/dist/camera/Permission.js.map +1 -0
  19. package/dist/camera/VideoRecorder.d.ts +12 -0
  20. package/dist/camera/VideoRecorder.d.ts.map +1 -0
  21. package/dist/camera/VideoRecorder.js +51 -0
  22. package/dist/camera/VideoRecorder.js.map +1 -0
  23. package/dist/client/Config.d.ts +9 -0
  24. package/dist/client/Config.d.ts.map +1 -0
  25. package/dist/client/Config.js +8 -0
  26. package/dist/client/Config.js.map +1 -0
  27. package/dist/client/HttpClient.d.ts +44 -0
  28. package/dist/client/HttpClient.d.ts.map +1 -0
  29. package/dist/client/HttpClient.js +149 -0
  30. package/dist/client/HttpClient.js.map +1 -0
  31. package/dist/client/Smartcomply.d.ts +50 -0
  32. package/dist/client/Smartcomply.d.ts.map +1 -0
  33. package/dist/client/Smartcomply.js +77 -0
  34. package/dist/client/Smartcomply.js.map +1 -0
  35. package/dist/components/CameraView.d.ts +59 -0
  36. package/dist/components/CameraView.d.ts.map +1 -0
  37. package/dist/components/CameraView.js +242 -0
  38. package/dist/components/CameraView.js.map +1 -0
  39. package/dist/components/DocumentUpload.d.ts +21 -0
  40. package/dist/components/DocumentUpload.d.ts.map +1 -0
  41. package/dist/components/DocumentUpload.js +220 -0
  42. package/dist/components/DocumentUpload.js.map +1 -0
  43. package/dist/errors/AuthError.d.ts +8 -0
  44. package/dist/errors/AuthError.d.ts.map +1 -0
  45. package/dist/errors/AuthError.js +15 -0
  46. package/dist/errors/AuthError.js.map +1 -0
  47. package/dist/errors/NetworkError.d.ts +8 -0
  48. package/dist/errors/NetworkError.d.ts.map +1 -0
  49. package/dist/errors/NetworkError.js +15 -0
  50. package/dist/errors/NetworkError.js.map +1 -0
  51. package/dist/errors/SDKError.d.ts +7 -0
  52. package/dist/errors/SDKError.d.ts.map +1 -0
  53. package/dist/errors/SDKError.js +14 -0
  54. package/dist/errors/SDKError.js.map +1 -0
  55. package/dist/flow/DocumentCapture.d.ts +54 -0
  56. package/dist/flow/DocumentCapture.d.ts.map +1 -0
  57. package/dist/flow/DocumentCapture.js +801 -0
  58. package/dist/flow/DocumentCapture.js.map +1 -0
  59. package/dist/flow/SmartComplyFlow.d.ts +104 -0
  60. package/dist/flow/SmartComplyFlow.d.ts.map +1 -0
  61. package/dist/flow/SmartComplyFlow.js +1726 -0
  62. package/dist/flow/SmartComplyFlow.js.map +1 -0
  63. package/dist/flow/theme.d.ts +30 -0
  64. package/dist/flow/theme.d.ts.map +1 -0
  65. package/dist/flow/theme.js +103 -0
  66. package/dist/flow/theme.js.map +1 -0
  67. package/dist/index.d.ts +20 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +29 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/modules/liveness/LivenessUI.d.ts +46 -0
  72. package/dist/modules/liveness/LivenessUI.d.ts.map +1 -0
  73. package/dist/modules/liveness/LivenessUI.js +609 -0
  74. package/dist/modules/liveness/LivenessUI.js.map +1 -0
  75. package/dist/modules/liveness/index.d.ts +5 -0
  76. package/dist/modules/liveness/index.d.ts.map +1 -0
  77. package/dist/modules/liveness/index.js +10 -0
  78. package/dist/modules/liveness/index.js.map +1 -0
  79. package/dist/modules/liveness/liveness.d.ts +85 -0
  80. package/dist/modules/liveness/liveness.d.ts.map +1 -0
  81. package/dist/modules/liveness/liveness.js +425 -0
  82. package/dist/modules/liveness/liveness.js.map +1 -0
  83. package/dist/modules/liveness/uploader.d.ts +34 -0
  84. package/dist/modules/liveness/uploader.d.ts.map +1 -0
  85. package/dist/modules/liveness/uploader.js +106 -0
  86. package/dist/modules/liveness/uploader.js.map +1 -0
  87. package/dist/modules/onboarding/index.d.ts +2 -0
  88. package/dist/modules/onboarding/index.d.ts.map +1 -0
  89. package/dist/modules/onboarding/index.js +6 -0
  90. package/dist/modules/onboarding/index.js.map +1 -0
  91. package/dist/modules/onboarding/onboarding.d.ts +25 -0
  92. package/dist/modules/onboarding/onboarding.d.ts.map +1 -0
  93. package/dist/modules/onboarding/onboarding.js +33 -0
  94. package/dist/modules/onboarding/onboarding.js.map +1 -0
  95. package/dist/smartcomply.browser.js +8147 -0
  96. package/dist/smartcomply.browser.js.map +7 -0
  97. package/dist/types/common.d.ts +27 -0
  98. package/dist/types/common.d.ts.map +1 -0
  99. package/dist/types/common.js +3 -0
  100. package/dist/types/common.js.map +1 -0
  101. package/dist/types/liveness.d.ts +142 -0
  102. package/dist/types/liveness.d.ts.map +1 -0
  103. package/dist/types/liveness.js +3 -0
  104. package/dist/types/liveness.js.map +1 -0
  105. package/dist/types/onboarding.d.ts +53 -0
  106. package/dist/types/onboarding.d.ts.map +1 -0
  107. package/dist/types/onboarding.js +3 -0
  108. package/dist/types/onboarding.js.map +1 -0
  109. package/dist/types/quality.d.ts +23 -0
  110. package/dist/types/quality.d.ts.map +1 -0
  111. package/dist/types/quality.js +6 -0
  112. package/dist/types/quality.js.map +1 -0
  113. package/dist/utils/ImageQuality.d.ts +48 -0
  114. package/dist/utils/ImageQuality.d.ts.map +1 -0
  115. package/dist/utils/ImageQuality.js +186 -0
  116. package/dist/utils/ImageQuality.js.map +1 -0
  117. package/dist/utils/constants.d.ts +59 -0
  118. package/dist/utils/constants.d.ts.map +1 -0
  119. package/dist/utils/constants.js +70 -0
  120. package/dist/utils/constants.js.map +1 -0
  121. package/dist/utils/device.d.ts +14 -0
  122. package/dist/utils/device.d.ts.map +1 -0
  123. package/dist/utils/device.js +55 -0
  124. package/dist/utils/device.js.map +1 -0
  125. package/dist/utils/logger.d.ts +28 -0
  126. package/dist/utils/logger.d.ts.map +1 -0
  127. package/dist/utils/logger.js +67 -0
  128. package/dist/utils/logger.js.map +1 -0
  129. package/dist/utils/validator.d.ts +35 -0
  130. package/dist/utils/validator.d.ts.map +1 -0
  131. package/dist/utils/validator.js +116 -0
  132. package/dist/utils/validator.js.map +1 -0
  133. package/package.json +51 -0
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SmartComply = void 0;
4
+ const HttpClient_1 = require("./HttpClient");
5
+ const onboarding_1 = require("../modules/onboarding/onboarding");
6
+ const liveness_1 = require("../modules/liveness/liveness");
7
+ /**
8
+ * SmartComply SDK — main entry point.
9
+ *
10
+ * Usage:
11
+ * const sdk = new SmartComply({ apiKey: "pk_...", clientId: "uuid-...", environment: "sandbox" });
12
+ * const session = await sdk.createSession();
13
+ * const config = await sdk.initializeConfig();
14
+ * // ... use sdk.onboarding and sdk.liveness modules
15
+ */
16
+ class SmartComply {
17
+ constructor(config) {
18
+ this._sessionToken = null;
19
+ this._sessionExpiresAt = null;
20
+ this._sdkConfig = null;
21
+ if (!config.apiKey) {
22
+ throw new Error("SmartComply: apiKey is required");
23
+ }
24
+ if (!config.clientId) {
25
+ throw new Error("SmartComply: clientId is required (UUID from your SDK config)");
26
+ }
27
+ this.clientId = config.clientId;
28
+ this.http = new HttpClient_1.HttpClient(config);
29
+ this.onboarding = new onboarding_1.OnboardingModule(this.http);
30
+ this.liveness = new liveness_1.LivenessModule(this.http);
31
+ }
32
+ /** Current session token (null if not created yet) */
33
+ get sessionToken() {
34
+ return this._sessionToken;
35
+ }
36
+ /** Session expiration ISO timestamp */
37
+ get sessionExpiresAt() {
38
+ return this._sessionExpiresAt;
39
+ }
40
+ /** SDK config fetched from backend (null until initializeConfig() is called) */
41
+ get sdkConfig() {
42
+ return this._sdkConfig;
43
+ }
44
+ /**
45
+ * Create a new SDK session.
46
+ *
47
+ * POST /v1/sdk/session/create/
48
+ * Auth: Authorization: Bearer <apiKey>
49
+ * Body: { client_id: "<uuid>" }
50
+ *
51
+ * Returns: { token: "...", expires_at: "..." }
52
+ */
53
+ async createSession() {
54
+ const response = await this.http.request("POST", "/v1/sdk/session/create/", { client_id: this.clientId });
55
+ this._sessionToken = response.token;
56
+ this._sessionExpiresAt = response.expires_at;
57
+ // Set the session token on the HTTP client for subsequent requests
58
+ this.http.setSessionToken(response.token);
59
+ return response;
60
+ }
61
+ /**
62
+ * Fetch SDK configuration from the backend.
63
+ * Must be called after createSession().
64
+ *
65
+ * GET /v1/sdk/initialize/
66
+ * Auth: x-access-token: <sessionToken>
67
+ *
68
+ * Returns: { brand_name, theme, verification_type, channels, redirect_url, ... }
69
+ */
70
+ async initializeConfig() {
71
+ const config = await this.http.sessionRequest("GET", "/v1/sdk/initialize/");
72
+ this._sdkConfig = config;
73
+ return config;
74
+ }
75
+ }
76
+ exports.SmartComply = SmartComply;
77
+ //# sourceMappingURL=Smartcomply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Smartcomply.js","sourceRoot":"","sources":["../../src/client/Smartcomply.ts"],"names":[],"mappings":";;;AACA,6CAA0C;AAC1C,iEAAoE;AACpE,2DAA8D;AAM9D;;;;;;;;GAQG;AACH,MAAa,WAAW;IAUtB,YAAY,MAAiB;QAPrB,kBAAa,GAAkB,IAAI,CAAC;QACpC,sBAAiB,GAAkB,IAAI,CAAC;QACxC,eAAU,GAAyB,IAAI,CAAC;QAM9C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,uBAAU,CAAC,MAAM,CAAC,CAAC;QAEnC,IAAI,CAAC,UAAU,GAAG,IAAI,6BAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,GAAG,IAAI,yBAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,sDAAsD;IACtD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,uCAAuC;IACvC,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,gFAAgF;IAChF,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CACtC,MAAM,EACN,yBAAyB,EACzB,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC7B,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC;QAE7C,mEAAmE;QACnE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,gBAAgB;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAC3C,KAAK,EACL,qBAAqB,CACtB,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAnFD,kCAmFC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Camera View with Real-time Quality Feedback
3
+ * Shows live quality indicators before capture
4
+ */
5
+ import { QualityFeedback } from "../utils/ImageQuality";
6
+ export interface CameraOptions {
7
+ width?: number;
8
+ height?: number;
9
+ facingMode?: "user" | "environment";
10
+ isDocumentCapture?: boolean;
11
+ }
12
+ export interface CaptureResult {
13
+ blob: Blob;
14
+ quality: QualityFeedback;
15
+ selectedFrom: number;
16
+ }
17
+ export declare class CameraView {
18
+ private container;
19
+ private video;
20
+ private canvas;
21
+ private stream;
22
+ private qualityOverlay;
23
+ private feedbackText;
24
+ private isAnalyzing;
25
+ private qualityCheckInterval;
26
+ onQualityUpdate?: (feedback: QualityFeedback) => void;
27
+ onCapture?: (result: CaptureResult) => void;
28
+ onError?: (error: Error) => void;
29
+ constructor(container: HTMLElement);
30
+ /**
31
+ * Initialize camera
32
+ */
33
+ initialize(options?: CameraOptions): Promise<void>;
34
+ /**
35
+ * Create camera UI with quality overlay
36
+ */
37
+ private createUI;
38
+ /**
39
+ * Start real-time quality monitoring
40
+ */
41
+ private startQualityMonitoring;
42
+ /**
43
+ * Update quality overlay UI
44
+ */
45
+ private updateQualityUI;
46
+ /**
47
+ * Capture multiple frames and select best
48
+ */
49
+ captureMultipleFrames(count?: number): Promise<CaptureResult>;
50
+ /**
51
+ * Single capture (for manual mode)
52
+ */
53
+ captureSingle(): Promise<CaptureResult>;
54
+ /**
55
+ * Stop camera and cleanup
56
+ */
57
+ stop(): void;
58
+ }
59
+ //# sourceMappingURL=CameraView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraView.d.ts","sourceRoot":"","sources":["../../src/components/CameraView.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,UAAU;IAcT,OAAO,CAAC,SAAS;IAb7B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,oBAAoB,CAAuB;IAGnD,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACtD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;gBAEb,SAAS,EAAE,WAAW;IAE1C;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyD5D;;OAEG;IACH,OAAO,CAAC,QAAQ;IAiDhB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACG,qBAAqB,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAkDtE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IAI7C;;OAEG;IACH,IAAI,IAAI,IAAI;CAuBb"}
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ /**
3
+ * Camera View with Real-time Quality Feedback
4
+ * Shows live quality indicators before capture
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.CameraView = void 0;
8
+ const ImageQuality_1 = require("../utils/ImageQuality");
9
+ class CameraView {
10
+ constructor(container) {
11
+ this.container = container;
12
+ this.video = null;
13
+ this.canvas = null;
14
+ this.stream = null;
15
+ this.qualityOverlay = null;
16
+ this.feedbackText = null;
17
+ this.isAnalyzing = false;
18
+ this.qualityCheckInterval = null;
19
+ }
20
+ /**
21
+ * Initialize camera
22
+ */
23
+ async initialize(options = {}) {
24
+ try {
25
+ const { isDocumentCapture = false, facingMode = "environment" } = options;
26
+ // Use landscape dimensions for documents (1920x1080), portrait for selfie (1280x720)
27
+ const width = isDocumentCapture ? 1920 : 1280;
28
+ const height = isDocumentCapture ? 1080 : 720;
29
+ // Get camera stream with landscape constraints for documents
30
+ const videoConstraints = {
31
+ width: { ideal: width },
32
+ height: { ideal: height },
33
+ facingMode: { ideal: facingMode },
34
+ };
35
+ // For documents, force aspect ratio to landscape
36
+ if (isDocumentCapture) {
37
+ videoConstraints.aspectRatio = { ideal: 1.77 }; // 16:9 landscape
38
+ }
39
+ this.stream = await navigator.mediaDevices.getUserMedia({
40
+ video: videoConstraints,
41
+ audio: false,
42
+ });
43
+ // Create video element
44
+ this.video = document.createElement("video");
45
+ this.video.srcObject = this.stream;
46
+ this.video.autoplay = true;
47
+ this.video.playsInline = true;
48
+ // Create canvas for analysis
49
+ this.canvas = document.createElement("canvas");
50
+ this.canvas.width = width;
51
+ this.canvas.height = height;
52
+ // Create UI
53
+ this.createUI();
54
+ // Wait for video to be ready
55
+ await new Promise((resolve) => {
56
+ this.video.onloadedmetadata = () => {
57
+ this.video.play();
58
+ resolve(null);
59
+ };
60
+ });
61
+ // Start quality monitoring
62
+ this.startQualityMonitoring();
63
+ }
64
+ catch (error) {
65
+ console.error("Camera initialization failed:", error);
66
+ this.onError?.(error);
67
+ throw error;
68
+ }
69
+ }
70
+ /**
71
+ * Create camera UI with quality overlay
72
+ */
73
+ createUI() {
74
+ if (!this.container || !this.video)
75
+ return;
76
+ // Clear container
77
+ this.container.innerHTML = "";
78
+ this.container.style.position = "relative";
79
+ this.container.style.overflow = "hidden";
80
+ this.container.style.borderRadius = "12px";
81
+ // Add video
82
+ this.video.style.width = "100%";
83
+ this.video.style.height = "100%";
84
+ this.video.style.objectFit = "cover";
85
+ this.container.appendChild(this.video);
86
+ // Create quality overlay
87
+ this.qualityOverlay = document.createElement("div");
88
+ this.qualityOverlay.style.cssText = `
89
+ position: absolute;
90
+ top: 0;
91
+ left: 0;
92
+ right: 0;
93
+ bottom: 0;
94
+ border: 4px solid transparent;
95
+ border-radius: 12px;
96
+ transition: border-color 0.3s ease;
97
+ pointer-events: none;
98
+ `;
99
+ this.container.appendChild(this.qualityOverlay);
100
+ // Create feedback text
101
+ this.feedbackText = document.createElement("div");
102
+ this.feedbackText.style.cssText = `
103
+ position: absolute;
104
+ bottom: 20px;
105
+ left: 50%;
106
+ transform: translateX(-50%);
107
+ background: rgba(0, 0, 0, 0.7);
108
+ color: white;
109
+ padding: 8px 16px;
110
+ border-radius: 20px;
111
+ font-size: 14px;
112
+ font-weight: 500;
113
+ white-space: nowrap;
114
+ transition: all 0.3s ease;
115
+ `;
116
+ this.container.appendChild(this.feedbackText);
117
+ }
118
+ /**
119
+ * Start real-time quality monitoring
120
+ */
121
+ startQualityMonitoring() {
122
+ if (!this.video || !this.canvas)
123
+ return;
124
+ const ctx = this.canvas.getContext("2d", { willReadFrequently: true });
125
+ if (!ctx)
126
+ return;
127
+ const canvas = this.canvas; // Local reference for closure
128
+ this.qualityCheckInterval = window.setInterval(() => {
129
+ if (this.isAnalyzing || !this.video || this.video.paused || !this.canvas)
130
+ return;
131
+ this.isAnalyzing = true;
132
+ try {
133
+ // Draw video frame to canvas
134
+ ctx.drawImage(this.video, 0, 0, canvas.width, canvas.height);
135
+ // Get image data
136
+ const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
137
+ // Assess quality
138
+ const feedback = (0, ImageQuality_1.assessQuality)(imageData);
139
+ // Update UI
140
+ this.updateQualityUI(feedback);
141
+ // Notify callback
142
+ this.onQualityUpdate?.(feedback);
143
+ }
144
+ catch (error) {
145
+ console.error("Quality analysis error:", error);
146
+ }
147
+ finally {
148
+ this.isAnalyzing = false;
149
+ }
150
+ }, 500); // Check every 500ms
151
+ }
152
+ /**
153
+ * Update quality overlay UI
154
+ */
155
+ updateQualityUI(feedback) {
156
+ if (!this.qualityOverlay || !this.feedbackText || !this.video)
157
+ return;
158
+ const color = (0, ImageQuality_1.getQualityColor)(feedback.quality.overallScore);
159
+ const message = (0, ImageQuality_1.getQualityMessage)(feedback.quality.overallScore);
160
+ // Update border color
161
+ this.qualityOverlay.style.borderColor = color;
162
+ this.qualityOverlay.style.boxShadow = `0 0 20px ${color}40`;
163
+ // Update text
164
+ this.feedbackText.textContent = message;
165
+ this.feedbackText.style.background = feedback.isValid
166
+ ? "rgba(34, 197, 94, 0.8)" // Green
167
+ : "rgba(239, 68, 68, 0.8)"; // Red
168
+ }
169
+ /**
170
+ * Capture multiple frames and select best
171
+ */
172
+ async captureMultipleFrames(count = 3) {
173
+ if (!this.video || !this.canvas) {
174
+ throw new Error("Camera not initialized");
175
+ }
176
+ const ctx = this.canvas.getContext("2d");
177
+ if (!ctx)
178
+ throw new Error("Canvas context not available");
179
+ const frames = [];
180
+ // Capture multiple frames rapidly
181
+ for (let i = 0; i < count; i++) {
182
+ // Draw current frame
183
+ ctx.drawImage(this.video, 0, 0, this.canvas.width, this.canvas.height);
184
+ // Get image data for quality check
185
+ const imageData = ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
186
+ const quality = (0, ImageQuality_1.assessQuality)(imageData);
187
+ // Convert to blob
188
+ const blob = await new Promise((resolve) => {
189
+ this.canvas.toBlob((b) => resolve(b), "image/jpeg", 0.95);
190
+ });
191
+ frames.push({
192
+ blob,
193
+ quality,
194
+ timestamp: Date.now(),
195
+ });
196
+ // Small delay between captures
197
+ if (i < count - 1) {
198
+ await new Promise(r => setTimeout(r, 200));
199
+ }
200
+ }
201
+ // Select best frame by quality score
202
+ const best = frames.reduce((prev, current) => current.quality.quality.overallScore > prev.quality.quality.overallScore
203
+ ? current
204
+ : prev);
205
+ return {
206
+ blob: best.blob,
207
+ quality: best.quality,
208
+ selectedFrom: count,
209
+ };
210
+ }
211
+ /**
212
+ * Single capture (for manual mode)
213
+ */
214
+ async captureSingle() {
215
+ return this.captureMultipleFrames(1);
216
+ }
217
+ /**
218
+ * Stop camera and cleanup
219
+ */
220
+ stop() {
221
+ // Stop quality monitoring
222
+ if (this.qualityCheckInterval) {
223
+ clearInterval(this.qualityCheckInterval);
224
+ this.qualityCheckInterval = null;
225
+ }
226
+ // Stop video stream
227
+ if (this.stream) {
228
+ this.stream.getTracks().forEach(track => track.stop());
229
+ this.stream = null;
230
+ }
231
+ // Stop video element
232
+ if (this.video) {
233
+ this.video.pause();
234
+ this.video.srcObject = null;
235
+ this.video = null;
236
+ }
237
+ // Clear container
238
+ this.container.innerHTML = "";
239
+ }
240
+ }
241
+ exports.CameraView = CameraView;
242
+ //# sourceMappingURL=CameraView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraView.js","sourceRoot":"","sources":["../../src/components/CameraView.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Simple document upload component
3
+ * Shows file input immediately without camera permission
4
+ */
5
+ export interface UploadOptions {
6
+ onFileSelect?: (file: File) => void;
7
+ onError?: (error: string) => void;
8
+ onUseCamera?: () => void;
9
+ }
10
+ export declare class DocumentUpload {
11
+ private container;
12
+ private options;
13
+ private previewImage;
14
+ constructor(container: HTMLElement, options?: UploadOptions);
15
+ render(theme: any): void;
16
+ private handleFile;
17
+ private showPreview;
18
+ private getTheme;
19
+ destroy(): void;
20
+ }
21
+ //# sourceMappingURL=DocumentUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentUpload.d.ts","sourceRoot":"","sources":["../../src/components/DocumentUpload.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAiC;gBAEzC,SAAS,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB;IAK/D,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAgJxB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IA2DnB,OAAO,CAAC,QAAQ;IAWhB,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ /**
3
+ * Simple document upload component
4
+ * Shows file input immediately without camera permission
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DocumentUpload = void 0;
8
+ class DocumentUpload {
9
+ constructor(container, options = {}) {
10
+ this.previewImage = null;
11
+ this.container = container;
12
+ this.options = options;
13
+ }
14
+ render(theme) {
15
+ // Clear container
16
+ this.container.innerHTML = "";
17
+ // Upload area
18
+ const uploadArea = document.createElement("div");
19
+ uploadArea.style.cssText = `
20
+ width: 100%;
21
+ height: 100%;
22
+ display: flex;
23
+ flex-direction: column;
24
+ align-items: center;
25
+ justify-content: center;
26
+ border: 2px dashed ${theme.border};
27
+ border-radius: 12px;
28
+ background: ${theme.cardBg};
29
+ padding: 40px 20px;
30
+ cursor: pointer;
31
+ transition: border-color 0.2s, background 0.2s;
32
+ `;
33
+ // Hover effect
34
+ uploadArea.addEventListener("mouseenter", () => {
35
+ uploadArea.style.borderColor = theme.primary;
36
+ uploadArea.style.background = theme.surface || theme.cardBg;
37
+ });
38
+ uploadArea.addEventListener("mouseleave", () => {
39
+ uploadArea.style.borderColor = theme.border;
40
+ uploadArea.style.background = theme.cardBg;
41
+ });
42
+ // Icon
43
+ const icon = document.createElement("div");
44
+ icon.textContent = "📁";
45
+ icon.style.cssText = `
46
+ font-size: 48px;
47
+ margin-bottom: 16px;
48
+ `;
49
+ uploadArea.appendChild(icon);
50
+ // Title
51
+ const title = document.createElement("div");
52
+ title.textContent = "Upload Document";
53
+ title.style.cssText = `
54
+ font-size: 16px;
55
+ font-weight: 600;
56
+ color: ${theme.text};
57
+ margin-bottom: 8px;
58
+ `;
59
+ uploadArea.appendChild(title);
60
+ // Subtitle
61
+ const subtitle = document.createElement("div");
62
+ subtitle.textContent = "Click to select or drag & drop";
63
+ subtitle.style.cssText = `
64
+ font-size: 13px;
65
+ color: ${theme.textSecondary};
66
+ margin-bottom: 16px;
67
+ `;
68
+ uploadArea.appendChild(subtitle);
69
+ // Or divider
70
+ const divider = document.createElement("div");
71
+ divider.style.cssText = `
72
+ width: 100%;
73
+ max-width: 200px;
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 12px;
77
+ margin: 8px 0 16px;
78
+ `;
79
+ divider.innerHTML = `
80
+ <span style="flex:1;height:1px;background:${theme.border};"></span>
81
+ <span style="color:${theme.textSecondary};font-size:12px;">OR</span>
82
+ <span style="flex:1;height:1px;background:${theme.border};"></span>
83
+ `;
84
+ uploadArea.appendChild(divider);
85
+ // Camera button
86
+ const cameraBtn = document.createElement("button");
87
+ cameraBtn.textContent = "📷 Use Camera";
88
+ cameraBtn.style.cssText = `
89
+ padding: 10px 20px;
90
+ border-radius: 8px;
91
+ border: 1px solid ${theme.primary};
92
+ background: transparent;
93
+ color: ${theme.primary};
94
+ font-size: 14px;
95
+ cursor: pointer;
96
+ font-weight: 500;
97
+ `;
98
+ cameraBtn.addEventListener("click", (e) => {
99
+ e.stopPropagation();
100
+ this.options.onUseCamera?.();
101
+ });
102
+ uploadArea.appendChild(cameraBtn);
103
+ // Hidden file input
104
+ const fileInput = document.createElement("input");
105
+ fileInput.type = "file";
106
+ fileInput.accept = "image/*";
107
+ fileInput.style.display = "none";
108
+ uploadArea.appendChild(fileInput);
109
+ // Click handlers
110
+ uploadArea.addEventListener("click", (e) => {
111
+ if (e.target !== cameraBtn) {
112
+ fileInput.click();
113
+ }
114
+ });
115
+ // Drag and drop
116
+ uploadArea.addEventListener("dragover", (e) => {
117
+ e.preventDefault();
118
+ uploadArea.style.borderColor = theme.primary;
119
+ uploadArea.style.background = theme.surface || theme.cardBg;
120
+ });
121
+ uploadArea.addEventListener("dragleave", () => {
122
+ uploadArea.style.borderColor = theme.border;
123
+ uploadArea.style.background = theme.cardBg;
124
+ });
125
+ uploadArea.addEventListener("drop", (e) => {
126
+ e.preventDefault();
127
+ uploadArea.style.borderColor = theme.border;
128
+ uploadArea.style.background = theme.cardBg;
129
+ const files = e.dataTransfer?.files;
130
+ if (files && files.length > 0) {
131
+ this.handleFile(files[0]);
132
+ }
133
+ });
134
+ // File select
135
+ fileInput.addEventListener("change", () => {
136
+ if (fileInput.files && fileInput.files[0]) {
137
+ this.handleFile(fileInput.files[0]);
138
+ }
139
+ });
140
+ this.container.appendChild(uploadArea);
141
+ }
142
+ handleFile(file) {
143
+ if (!file.type.startsWith("image/")) {
144
+ this.options.onError?.("Please select an image file");
145
+ return;
146
+ }
147
+ // Show preview
148
+ this.showPreview(file);
149
+ // Notify
150
+ this.options.onFileSelect?.(file);
151
+ }
152
+ showPreview(file) {
153
+ const reader = new FileReader();
154
+ reader.onload = (e) => {
155
+ // Clear and show preview
156
+ this.container.innerHTML = "";
157
+ const previewContainer = document.createElement("div");
158
+ previewContainer.style.cssText = `
159
+ width: 100%;
160
+ height: 100%;
161
+ display: flex;
162
+ flex-direction: column;
163
+ align-items: center;
164
+ gap: 12px;
165
+ `;
166
+ // Image
167
+ const img = document.createElement("img");
168
+ img.src = e.target?.result;
169
+ img.style.cssText = `
170
+ max-width: 100%;
171
+ max-height: 70%;
172
+ object-fit: contain;
173
+ border-radius: 8px;
174
+ border: 1px solid ${this.getTheme().border};
175
+ `;
176
+ previewContainer.appendChild(img);
177
+ // File name
178
+ const name = document.createElement("div");
179
+ name.textContent = file.name;
180
+ name.style.cssText = `
181
+ font-size: 13px;
182
+ color: ${this.getTheme().textSecondary};
183
+ `;
184
+ previewContainer.appendChild(name);
185
+ // Change button
186
+ const changeBtn = document.createElement("button");
187
+ changeBtn.textContent = "Change File";
188
+ changeBtn.style.cssText = `
189
+ padding: 8px 16px;
190
+ border-radius: 6px;
191
+ border: 1px solid ${this.getTheme().border};
192
+ background: ${this.getTheme().cardBg};
193
+ color: ${this.getTheme().text};
194
+ font-size: 13px;
195
+ cursor: pointer;
196
+ `;
197
+ changeBtn.addEventListener("click", () => {
198
+ this.render(this.getTheme());
199
+ });
200
+ previewContainer.appendChild(changeBtn);
201
+ this.container.appendChild(previewContainer);
202
+ };
203
+ reader.readAsDataURL(file);
204
+ }
205
+ getTheme() {
206
+ // Default theme fallback
207
+ return {
208
+ primary: "#3b82f6",
209
+ text: "#1f2937",
210
+ textSecondary: "#6b7280",
211
+ border: "#e5e7eb",
212
+ cardBg: "#ffffff",
213
+ };
214
+ }
215
+ destroy() {
216
+ this.container.innerHTML = "";
217
+ }
218
+ }
219
+ exports.DocumentUpload = DocumentUpload;
220
+ //# sourceMappingURL=DocumentUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentUpload.js","sourceRoot":"","sources":["../../src/components/DocumentUpload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { SDKError } from "./SDKError";
2
+ /**
3
+ * Thrown when authentication fails (invalid API key, expired session, etc).
4
+ */
5
+ export declare class AuthError extends SDKError {
6
+ constructor(message: string, errorCode?: string);
7
+ }
8
+ //# sourceMappingURL=AuthError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthError.d.ts","sourceRoot":"","sources":["../../src/errors/AuthError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;GAEG;AACH,qBAAa,SAAU,SAAQ,QAAQ;gBACzB,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAIhD"}