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,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CameraManager = void 0;
4
+ class CameraManager {
5
+ constructor() {
6
+ this.stream = null;
7
+ }
8
+ async open(constraints) {
9
+ const defaults = {
10
+ video: {
11
+ facingMode: "user",
12
+ width: { ideal: 1280 },
13
+ height: { ideal: 720 },
14
+ },
15
+ audio: false,
16
+ };
17
+ this.stream = await navigator.mediaDevices.getUserMedia(constraints || defaults);
18
+ return this.stream;
19
+ }
20
+ getStream() {
21
+ return this.stream;
22
+ }
23
+ stop() {
24
+ if (this.stream) {
25
+ this.stream.getTracks().forEach((track) => track.stop());
26
+ this.stream = null;
27
+ }
28
+ }
29
+ }
30
+ exports.CameraManager = CameraManager;
31
+ //# sourceMappingURL=CameraManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraManager.js","sourceRoot":"","sources":["../../src/camera/CameraManager.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;IAA1B;QACU,WAAM,GAAuB,IAAI,CAAC;IA6B5C,CAAC;IA3BC,KAAK,CAAC,IAAI,CAAC,WAAoC;QAC7C,MAAM,QAAQ,GAA2B;YACvC,KAAK,EAAE;gBACL,UAAU,EAAE,MAAM;gBAClB,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;gBACtB,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;aACvB;YACD,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CACrD,WAAW,IAAI,QAAQ,CACxB,CAAC;QAEF,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AA9BD,sCA8BC"}
@@ -0,0 +1,12 @@
1
+ export interface FaceDetectionResult {
2
+ faceDetected: boolean;
3
+ blendshapes: Map<string, number>;
4
+ transformMatrix: number[] | null;
5
+ }
6
+ export declare class FaceDetectorEngine {
7
+ private landmarker;
8
+ init(): Promise<void>;
9
+ detect(video: HTMLVideoElement, timestamp: number): FaceDetectionResult;
10
+ destroy(): void;
11
+ }
12
+ //# sourceMappingURL=FaceDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FaceDetector.d.ts","sourceRoot":"","sources":["../../src/camera/FaceDetector.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAClC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAA+B;IAE3C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB;IA4BvE,OAAO,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FaceDetectorEngine = void 0;
4
+ const tasks_vision_1 = require("@mediapipe/tasks-vision");
5
+ const WASM_CDN = "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm";
6
+ const MODEL_URL = "https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/latest/face_landmarker.task";
7
+ class FaceDetectorEngine {
8
+ constructor() {
9
+ this.landmarker = null;
10
+ }
11
+ async init() {
12
+ const vision = await tasks_vision_1.FilesetResolver.forVisionTasks(WASM_CDN);
13
+ // Fetch model ourselves to avoid MediaPipe internal path resolution issues
14
+ const modelResponse = await fetch(MODEL_URL);
15
+ if (!modelResponse.ok) {
16
+ throw new Error(`Failed to download face model (${modelResponse.status})`);
17
+ }
18
+ const modelBuffer = await modelResponse.arrayBuffer();
19
+ this.landmarker = await tasks_vision_1.FaceLandmarker.createFromOptions(vision, {
20
+ baseOptions: {
21
+ modelAssetBuffer: new Uint8Array(modelBuffer),
22
+ },
23
+ runningMode: "VIDEO",
24
+ outputFaceBlendshapes: true,
25
+ outputFacialTransformationMatrixes: true,
26
+ numFaces: 1,
27
+ });
28
+ }
29
+ detect(video, timestamp) {
30
+ if (!this.landmarker) {
31
+ return { faceDetected: false, blendshapes: new Map(), transformMatrix: null };
32
+ }
33
+ const result = this.landmarker.detectForVideo(video, timestamp);
34
+ if (!result.faceBlendshapes || result.faceBlendshapes.length === 0) {
35
+ return { faceDetected: false, blendshapes: new Map(), transformMatrix: null };
36
+ }
37
+ const blendshapes = new Map();
38
+ for (const bs of result.faceBlendshapes[0].categories) {
39
+ blendshapes.set(bs.categoryName, bs.score);
40
+ }
41
+ const transformMatrix = result.facialTransformationMatrixes &&
42
+ result.facialTransformationMatrixes.length > 0
43
+ ? Array.from(result.facialTransformationMatrixes[0].data)
44
+ : null;
45
+ return { faceDetected: true, blendshapes, transformMatrix };
46
+ }
47
+ destroy() {
48
+ if (this.landmarker) {
49
+ this.landmarker.close();
50
+ this.landmarker = null;
51
+ }
52
+ }
53
+ }
54
+ exports.FaceDetectorEngine = FaceDetectorEngine;
55
+ //# sourceMappingURL=FaceDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FaceDetector.js","sourceRoot":"","sources":["../../src/camera/FaceDetector.ts"],"names":[],"mappings":";;;AAAA,0DAIiC;AAEjC,MAAM,QAAQ,GACZ,kEAAkE,CAAC;AACrE,MAAM,SAAS,GACb,qHAAqH,CAAC;AAQxH,MAAa,kBAAkB;IAA/B;QACU,eAAU,GAA0B,IAAI,CAAC;IAyDnD,CAAC;IAvDC,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,MAAM,8BAAe,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE9D,2EAA2E;QAC3E,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,kCAAkC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC;QAEtD,IAAI,CAAC,UAAU,GAAG,MAAM,6BAAc,CAAC,iBAAiB,CAAC,MAAM,EAAE;YAC/D,WAAW,EAAE;gBACX,gBAAgB,EAAE,IAAI,UAAU,CAAC,WAAW,CAAC;aAC9C;YACD,WAAW,EAAE,OAAO;YACpB,qBAAqB,EAAE,IAAI;YAC3B,kCAAkC,EAAE,IAAI;YACxC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAuB,EAAE,SAAiB;QAC/C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QAChF,CAAC;QAED,MAAM,MAAM,GAAyB,IAAI,CAAC,UAAU,CAAC,cAAc,CACjE,KAAK,EACL,SAAS,CACV,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QAChF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;YACtD,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,eAAe,GACnB,MAAM,CAAC,4BAA4B;YACnC,MAAM,CAAC,4BAA4B,CAAC,MAAM,GAAG,CAAC;YAC5C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAa;YACrE,CAAC,CAAC,IAAI,CAAC;QAEX,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AA1DD,gDA0DC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Camera permission utilities.
3
+ *
4
+ * Provides helpers to check, request and handle camera permissions in a
5
+ * browser-consistent way. All functions are purely async and do NOT throw —
6
+ * they return a typed result so callers can handle each case explicitly.
7
+ */
8
+ export type PermissionStatus = "granted" | "prompt" | "denied" | "unsupported" | "unknown";
9
+ export interface CameraPermissionResult {
10
+ status: PermissionStatus;
11
+ /** Human-readable reason (populated on denied / unsupported). */
12
+ reason?: string;
13
+ }
14
+ /**
15
+ * Query the current camera permission state without prompting the user.
16
+ *
17
+ * Uses the Permissions API when available, falls back to "unknown" on older
18
+ * browsers (e.g. Safari < 16).
19
+ */
20
+ export declare function queryCameraPermission(): Promise<CameraPermissionResult>;
21
+ /**
22
+ * Request camera access and return the resulting MediaStream.
23
+ *
24
+ * Maps browser-specific errors onto actionable `CameraPermissionResult`
25
+ * values so callers can show the right UI instead of catching raw DOMExceptions.
26
+ *
27
+ * @param constraints - Optional MediaStreamConstraints override.
28
+ */
29
+ export declare function requestCameraAccess(constraints?: MediaStreamConstraints): Promise<{
30
+ stream: MediaStream;
31
+ permission: CameraPermissionResult;
32
+ }>;
33
+ /**
34
+ * Stop all tracks on a MediaStream and release the camera.
35
+ * Safe to call with null/undefined.
36
+ */
37
+ export declare function releaseCameraStream(stream: MediaStream | null | undefined): void;
38
+ /**
39
+ * Returns true if the browser supports the camera APIs needed by the SDK.
40
+ */
41
+ export declare function isCameraSupported(): boolean;
42
+ //# sourceMappingURL=Permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Permission.d.ts","sourceRoot":"","sources":["../../src/camera/Permission.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,gBAAgB,CAAC;IACzB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAe7E;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,CAAC,EAAE,sBAAsB,GACnC,OAAO,CAAC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAkDtE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAGhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /**
3
+ * Camera permission utilities.
4
+ *
5
+ * Provides helpers to check, request and handle camera permissions in a
6
+ * browser-consistent way. All functions are purely async and do NOT throw —
7
+ * they return a typed result so callers can handle each case explicitly.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.queryCameraPermission = queryCameraPermission;
11
+ exports.requestCameraAccess = requestCameraAccess;
12
+ exports.releaseCameraStream = releaseCameraStream;
13
+ exports.isCameraSupported = isCameraSupported;
14
+ /**
15
+ * Query the current camera permission state without prompting the user.
16
+ *
17
+ * Uses the Permissions API when available, falls back to "unknown" on older
18
+ * browsers (e.g. Safari < 16).
19
+ */
20
+ async function queryCameraPermission() {
21
+ if (typeof navigator === "undefined" || !navigator.mediaDevices) {
22
+ return { status: "unsupported", reason: "getUserMedia is not supported in this browser." };
23
+ }
24
+ if (!navigator.permissions?.query) {
25
+ return { status: "unknown" };
26
+ }
27
+ try {
28
+ const result = await navigator.permissions.query({ name: "camera" });
29
+ return { status: result.state };
30
+ }
31
+ catch {
32
+ return { status: "unknown" };
33
+ }
34
+ }
35
+ /**
36
+ * Request camera access and return the resulting MediaStream.
37
+ *
38
+ * Maps browser-specific errors onto actionable `CameraPermissionResult`
39
+ * values so callers can show the right UI instead of catching raw DOMExceptions.
40
+ *
41
+ * @param constraints - Optional MediaStreamConstraints override.
42
+ */
43
+ async function requestCameraAccess(constraints) {
44
+ const defaults = {
45
+ video: { facingMode: "user", width: { ideal: 640 }, height: { ideal: 480 } },
46
+ audio: false,
47
+ };
48
+ try {
49
+ const stream = await navigator.mediaDevices.getUserMedia(constraints ?? defaults);
50
+ return { stream, permission: { status: "granted" } };
51
+ }
52
+ catch (err) {
53
+ const name = err?.name ?? "";
54
+ if (name === "NotAllowedError" || name === "PermissionDeniedError") {
55
+ return {
56
+ stream: null,
57
+ permission: {
58
+ status: "denied",
59
+ reason: "Camera access was denied. Please allow camera permissions in your browser settings and try again.",
60
+ },
61
+ };
62
+ }
63
+ if (name === "NotFoundError" || name === "DevicesNotFoundError") {
64
+ return {
65
+ stream: null,
66
+ permission: {
67
+ status: "unsupported",
68
+ reason: "No camera was found. Please connect a camera and try again.",
69
+ },
70
+ };
71
+ }
72
+ if (name === "NotReadableError" || name === "TrackStartError") {
73
+ return {
74
+ stream: null,
75
+ permission: {
76
+ status: "unknown",
77
+ reason: "Camera is already in use by another application. Please close it and try again.",
78
+ },
79
+ };
80
+ }
81
+ return {
82
+ stream: null,
83
+ permission: {
84
+ status: "unknown",
85
+ reason: err?.message ?? "Unable to access the camera.",
86
+ },
87
+ };
88
+ }
89
+ }
90
+ /**
91
+ * Stop all tracks on a MediaStream and release the camera.
92
+ * Safe to call with null/undefined.
93
+ */
94
+ function releaseCameraStream(stream) {
95
+ if (!stream)
96
+ return;
97
+ stream.getTracks().forEach((t) => t.stop());
98
+ }
99
+ /**
100
+ * Returns true if the browser supports the camera APIs needed by the SDK.
101
+ */
102
+ function isCameraSupported() {
103
+ return (typeof navigator !== "undefined" &&
104
+ !!navigator.mediaDevices?.getUserMedia &&
105
+ typeof MediaRecorder !== "undefined");
106
+ }
107
+ //# sourceMappingURL=Permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Permission.js","sourceRoot":"","sources":["../../src/camera/Permission.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAqBH,sDAeC;AAUD,kDAoDC;AAMD,kDAGC;AAKD,8CAMC;AAvGD;;;;;GAKG;AACI,KAAK,UAAU,qBAAqB;IACzC,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAC;IAC7F,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAClC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAA0B,EAAE,CAAC,CAAC;QACvF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAyB,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,mBAAmB,CACvC,WAAoC;IAEpC,MAAM,QAAQ,GAA2B;QACvC,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5E,KAAK,EAAE,KAAK;KACb,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,IAAI,QAAQ,CAAC,CAAC;QAClF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;IACvD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,GAAW,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;QAErC,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,uBAAuB,EAAE,CAAC;YACnE,OAAO;gBACL,MAAM,EAAE,IAAW;gBACnB,UAAU,EAAE;oBACV,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,mGAAmG;iBAC5G;aACF,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAChE,OAAO;gBACL,MAAM,EAAE,IAAW;gBACnB,UAAU,EAAE;oBACV,MAAM,EAAE,aAAa;oBACrB,MAAM,EAAE,6DAA6D;iBACtE;aACF,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC9D,OAAO;gBACL,MAAM,EAAE,IAAW;gBACnB,UAAU,EAAE;oBACV,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,iFAAiF;iBAC1F;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAW;YACnB,UAAU,EAAE;gBACV,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,GAAG,EAAE,OAAO,IAAI,8BAA8B;aACvD;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAAsC;IACxE,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,CACL,OAAO,SAAS,KAAK,WAAW;QAChC,CAAC,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY;QACtC,OAAO,aAAa,KAAK,WAAW,CACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare class VideoRecorder {
2
+ private recorder;
3
+ private chunks;
4
+ private startedAt;
5
+ start(stream: MediaStream): void;
6
+ stop(): Promise<{
7
+ blob: Blob;
8
+ durationSeconds: number;
9
+ }>;
10
+ isRecording(): boolean;
11
+ }
12
+ //# sourceMappingURL=VideoRecorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoRecorder.d.ts","sourceRoot":"","sources":["../../src/camera/VideoRecorder.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAa;IAE9B,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAsBhC,IAAI,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BxD,WAAW,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VideoRecorder = void 0;
4
+ class VideoRecorder {
5
+ constructor() {
6
+ this.recorder = null;
7
+ this.chunks = [];
8
+ this.startedAt = 0;
9
+ }
10
+ start(stream) {
11
+ this.chunks = [];
12
+ const mimeType = MediaRecorder.isTypeSupported("video/webm;codecs=vp9")
13
+ ? "video/webm;codecs=vp9"
14
+ : "video/webm";
15
+ this.recorder = new MediaRecorder(stream, {
16
+ mimeType,
17
+ videoBitsPerSecond: 250000, // ~1.4 MB for 45s — keeps file under server upload limit
18
+ });
19
+ this.recorder.ondataavailable = (e) => {
20
+ if (e.data.size > 0) {
21
+ this.chunks.push(e.data);
22
+ }
23
+ };
24
+ this.startedAt = Date.now();
25
+ this.recorder.start();
26
+ }
27
+ stop() {
28
+ return new Promise((resolve, reject) => {
29
+ if (!this.recorder || this.recorder.state === "inactive") {
30
+ reject(new Error("Recorder is not active"));
31
+ return;
32
+ }
33
+ const stoppedAt = Date.now();
34
+ this.recorder.onstop = () => {
35
+ const blob = new Blob(this.chunks, { type: "video/webm" });
36
+ const durationSeconds = parseFloat(((stoppedAt - this.startedAt) / 1000).toFixed(2));
37
+ this.chunks = [];
38
+ resolve({ blob, durationSeconds });
39
+ };
40
+ this.recorder.onerror = () => {
41
+ reject(new Error("Recording failed"));
42
+ };
43
+ this.recorder.stop();
44
+ });
45
+ }
46
+ isRecording() {
47
+ return this.recorder?.state === "recording";
48
+ }
49
+ }
50
+ exports.VideoRecorder = VideoRecorder;
51
+ //# sourceMappingURL=VideoRecorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoRecorder.js","sourceRoot":"","sources":["../../src/camera/VideoRecorder.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;IAA1B;QACU,aAAQ,GAAyB,IAAI,CAAC;QACtC,WAAM,GAAW,EAAE,CAAC;QACpB,cAAS,GAAW,CAAC,CAAC;IAqDhC,CAAC;IAnDC,KAAK,CAAC,MAAmB;QACvB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAEjB,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,CAAC,uBAAuB,CAAC;YACrE,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,YAAY,CAAC;QAEjB,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE;YACxC,QAAQ;YACR,kBAAkB,EAAE,MAAO,EAAE,yDAAyD;SACvF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,EAAE;YACpC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBACzD,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;gBAC1B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;gBAC3D,MAAM,eAAe,GAAG,UAAU,CAChC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CACjD,CAAC;gBACF,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YACrC,CAAC,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE;gBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACxC,CAAC,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,WAAW,CAAC;IAC9C,CAAC;CACF;AAxDD,sCAwDC"}
@@ -0,0 +1,9 @@
1
+ export type Environment = "sandbox" | "production";
2
+ export declare const BASE_URLS: Record<Environment, string>;
3
+ export interface SDKConfig {
4
+ apiKey: string;
5
+ clientId: string;
6
+ environment?: Environment;
7
+ timeout?: number;
8
+ }
9
+ //# sourceMappingURL=Config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/client/Config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC;AAEnD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAGjD,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BASE_URLS = void 0;
4
+ exports.BASE_URLS = {
5
+ sandbox: "https://dev-adhere.smartcomply.com",
6
+ production: "https://api.smartcomply.com"
7
+ };
8
+ //# sourceMappingURL=Config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/client/Config.ts"],"names":[],"mappings":";;;AAEa,QAAA,SAAS,GAAgC;IACpD,OAAO,EAAE,oCAAoC;IAC7C,UAAU,EAAE,6BAA6B;CAC1C,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { SDKConfig } from "./Config";
2
+ /**
3
+ * HTTP client aligned with Adhere backend contract.
4
+ *
5
+ * Two auth modes:
6
+ * - request() → Authorization: Bearer <apiKey> (session creation)
7
+ * - sessionRequest() → x-access-token: <sessionToken> (all other endpoints)
8
+ * - uploadWithSession() → multipart + x-access-token (file uploads)
9
+ */
10
+ export declare class HttpClient {
11
+ private baseUrl;
12
+ private apiKey;
13
+ private timeout;
14
+ private sessionToken;
15
+ constructor(config: SDKConfig);
16
+ setSessionToken(token: string): void;
17
+ /**
18
+ * API-key authenticated request (used for session creation only).
19
+ * Header: Authorization: Bearer <apiKey>
20
+ */
21
+ request<T>(method: string, path: string, body?: unknown): Promise<T>;
22
+ /**
23
+ * Session-token authenticated request (used for all endpoints after session creation).
24
+ * Header: x-access-token: <sessionToken>
25
+ */
26
+ sessionRequest<T>(method: string, path: string, body?: unknown): Promise<T>;
27
+ /**
28
+ * Multipart file upload with session-token auth.
29
+ * Header: x-access-token: <sessionToken>
30
+ * NOTE: Do NOT set Content-Type — browser sets it with boundary automatically.
31
+ */
32
+ uploadWithSession<T>(path: string, formData: FormData): Promise<T>;
33
+ /**
34
+ * Unauthenticated GET — used for public endpoints (e.g. status polling after session revoke).
35
+ */
36
+ publicGet<T>(path: string): Promise<T>;
37
+ /**
38
+ * Legacy upload with API key (kept for backward compatibility if needed).
39
+ */
40
+ upload<T>(path: string, formData: FormData): Promise<T>;
41
+ private requireToken;
42
+ private _fetch;
43
+ }
44
+ //# sourceMappingURL=HttpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/client/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,UAAU,CAAC;AAMhD;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAuB;gBAE/B,MAAM,EAAE,SAAS;IAM7B,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;;OAGG;IACG,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC;IAWb;;;OAGG;IACG,cAAc,CAAC,CAAC,EACpB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC;IAab;;;;OAIG;IACG,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IAYxE;;OAEG;IACG,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAO5C;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IAY7D,OAAO,CAAC,YAAY;YASN,MAAM;CAyErB"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpClient = void 0;
4
+ const Config_1 = require("./Config");
5
+ const SDKError_1 = require("../errors/SDKError");
6
+ const AuthError_1 = require("../errors/AuthError");
7
+ const NetworkError_1 = require("../errors/NetworkError");
8
+ /**
9
+ * HTTP client aligned with Adhere backend contract.
10
+ *
11
+ * Two auth modes:
12
+ * - request() → Authorization: Bearer <apiKey> (session creation)
13
+ * - sessionRequest() → x-access-token: <sessionToken> (all other endpoints)
14
+ * - uploadWithSession() → multipart + x-access-token (file uploads)
15
+ */
16
+ class HttpClient {
17
+ constructor(config) {
18
+ this.sessionToken = null;
19
+ this.baseUrl = Config_1.BASE_URLS[config.environment || "sandbox"];
20
+ this.apiKey = config.apiKey;
21
+ this.timeout = config.timeout || 30000;
22
+ }
23
+ setSessionToken(token) {
24
+ this.sessionToken = token;
25
+ }
26
+ /**
27
+ * API-key authenticated request (used for session creation only).
28
+ * Header: Authorization: Bearer <apiKey>
29
+ */
30
+ async request(method, path, body) {
31
+ return this._fetch(path, {
32
+ method,
33
+ headers: {
34
+ "Authorization": `Bearer ${this.apiKey}`,
35
+ "Content-Type": "application/json",
36
+ },
37
+ body: body ? JSON.stringify(body) : undefined,
38
+ });
39
+ }
40
+ /**
41
+ * Session-token authenticated request (used for all endpoints after session creation).
42
+ * Header: x-access-token: <sessionToken>
43
+ */
44
+ async sessionRequest(method, path, body) {
45
+ this.requireToken();
46
+ return this._fetch(path, {
47
+ method,
48
+ headers: {
49
+ "x-access-token": this.sessionToken,
50
+ "Content-Type": "application/json",
51
+ },
52
+ body: body ? JSON.stringify(body) : undefined,
53
+ });
54
+ }
55
+ /**
56
+ * Multipart file upload with session-token auth.
57
+ * Header: x-access-token: <sessionToken>
58
+ * NOTE: Do NOT set Content-Type — browser sets it with boundary automatically.
59
+ */
60
+ async uploadWithSession(path, formData) {
61
+ this.requireToken();
62
+ return this._fetch(path, {
63
+ method: "POST",
64
+ headers: {
65
+ "x-access-token": this.sessionToken,
66
+ },
67
+ body: formData,
68
+ });
69
+ }
70
+ /**
71
+ * Unauthenticated GET — used for public endpoints (e.g. status polling after session revoke).
72
+ */
73
+ async publicGet(path) {
74
+ return this._fetch(path, {
75
+ method: "GET",
76
+ headers: { "Content-Type": "application/json" },
77
+ });
78
+ }
79
+ /**
80
+ * Legacy upload with API key (kept for backward compatibility if needed).
81
+ */
82
+ async upload(path, formData) {
83
+ return this._fetch(path, {
84
+ method: "POST",
85
+ headers: {
86
+ "Authorization": `Bearer ${this.apiKey}`,
87
+ },
88
+ body: formData,
89
+ });
90
+ }
91
+ // ---- Internal ----
92
+ requireToken() {
93
+ if (!this.sessionToken) {
94
+ throw new AuthError_1.AuthError("No session token set. Call sdk.createSession() first.", "NO_SESSION_TOKEN");
95
+ }
96
+ }
97
+ async _fetch(path, init, retries = 2) {
98
+ const controller = new AbortController();
99
+ const timer = setTimeout(() => controller.abort(), this.timeout);
100
+ try {
101
+ const response = await fetch(`${this.baseUrl}${path}`, {
102
+ ...init,
103
+ signal: controller.signal,
104
+ });
105
+ const contentType = response.headers.get("content-type") || "";
106
+ if (!contentType.includes("application/json")) {
107
+ throw new SDKError_1.SDKError(`Unexpected response from ${path} (${response.status})`, response.status);
108
+ }
109
+ // Parse the backend's standard response envelope
110
+ const envelope = await response.json();
111
+ if (!response.ok || envelope.status === "error") {
112
+ const statusCode = response.status;
113
+ // Map specific HTTP statuses to error types
114
+ if (statusCode === 401 || statusCode === 403) {
115
+ throw new AuthError_1.AuthError(envelope.message || "Authentication failed", envelope.code);
116
+ }
117
+ throw new SDKError_1.SDKError(envelope.message || `Request to ${path} failed`, statusCode, envelope.code, envelope.data);
118
+ }
119
+ // Return the full envelope for verify responses (so SDK can check status)
120
+ // For other endpoints, return unwrapped data
121
+ if (path.includes("/verify/")) {
122
+ return envelope;
123
+ }
124
+ return envelope.data;
125
+ }
126
+ catch (err) {
127
+ if (err instanceof SDKError_1.SDKError || err instanceof AuthError_1.AuthError)
128
+ throw err;
129
+ // C5: Retry on network errors (not auth/validation errors)
130
+ if (retries > 0 && (err.name === "AbortError" || err.name === "TypeError")) {
131
+ clearTimeout(timer);
132
+ await new Promise((r) => setTimeout(r, 1000)); // wait 1s before retry
133
+ return this._fetch(path, init, retries - 1);
134
+ }
135
+ if (err.name === "AbortError") {
136
+ throw new NetworkError_1.NetworkError("Request timeout. Please check your connection and try again.");
137
+ }
138
+ if (err.name === "TypeError" && err.message?.includes("fetch")) {
139
+ throw new NetworkError_1.NetworkError(`Network error: ${err.message}`);
140
+ }
141
+ throw new SDKError_1.SDKError(err.message || "Unknown error", 0, "UNKNOWN_ERROR");
142
+ }
143
+ finally {
144
+ clearTimeout(timer);
145
+ }
146
+ }
147
+ }
148
+ exports.HttpClient = HttpClient;
149
+ //# sourceMappingURL=HttpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../src/client/HttpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { SDKConfig } from "./Config";
2
+ import { OnboardingModule } from "../modules/onboarding/onboarding";
3
+ import { LivenessModule } from "../modules/liveness/liveness";
4
+ import { SessionResponse, SDKInitConfig } from "../types/onboarding";
5
+ /**
6
+ * SmartComply SDK — main entry point.
7
+ *
8
+ * Usage:
9
+ * const sdk = new SmartComply({ apiKey: "pk_...", clientId: "uuid-...", environment: "sandbox" });
10
+ * const session = await sdk.createSession();
11
+ * const config = await sdk.initializeConfig();
12
+ * // ... use sdk.onboarding and sdk.liveness modules
13
+ */
14
+ export declare class SmartComply {
15
+ private http;
16
+ private clientId;
17
+ private _sessionToken;
18
+ private _sessionExpiresAt;
19
+ private _sdkConfig;
20
+ onboarding: OnboardingModule;
21
+ liveness: LivenessModule;
22
+ constructor(config: SDKConfig);
23
+ /** Current session token (null if not created yet) */
24
+ get sessionToken(): string | null;
25
+ /** Session expiration ISO timestamp */
26
+ get sessionExpiresAt(): string | null;
27
+ /** SDK config fetched from backend (null until initializeConfig() is called) */
28
+ get sdkConfig(): SDKInitConfig | null;
29
+ /**
30
+ * Create a new SDK session.
31
+ *
32
+ * POST /v1/sdk/session/create/
33
+ * Auth: Authorization: Bearer <apiKey>
34
+ * Body: { client_id: "<uuid>" }
35
+ *
36
+ * Returns: { token: "...", expires_at: "..." }
37
+ */
38
+ createSession(): Promise<SessionResponse>;
39
+ /**
40
+ * Fetch SDK configuration from the backend.
41
+ * Must be called after createSession().
42
+ *
43
+ * GET /v1/sdk/initialize/
44
+ * Auth: x-access-token: <sessionToken>
45
+ *
46
+ * Returns: { brand_name, theme, verification_type, channels, redirect_url, ... }
47
+ */
48
+ initializeConfig(): Promise<SDKInitConfig>;
49
+ }
50
+ //# sourceMappingURL=Smartcomply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Smartcomply.d.ts","sourceRoot":"","sources":["../../src/client/Smartcomply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,UAAU,CAA8B;IAEzC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,EAAE,cAAc,CAAC;gBAEpB,MAAM,EAAE,SAAS;IAe7B,sDAAsD;IACtD,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAEhC;IAED,uCAAuC;IACvC,IAAI,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEpC;IAED,gFAAgF;IAChF,IAAI,SAAS,IAAI,aAAa,GAAG,IAAI,CAEpC;IAED;;;;;;;;OAQG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;IAgB/C;;;;;;;;OAQG;IACG,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;CASjD"}