@incodetech/core 2.0.0-alpha.13 → 2.0.0-alpha.14

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 (39) hide show
  1. package/dist/{OpenViduLogger-CRbRNZA7.esm.js → OpenViduLogger-BLxxXoyF.esm.js} +1 -1
  2. package/dist/OpenViduLogger-DyqID_-7.esm.js +3 -0
  3. package/dist/api-DfRLAneb.esm.js +53 -0
  4. package/dist/deepsightLoader-BMT0FSg6.esm.js +24 -0
  5. package/dist/deepsightService-j5zMt6wf.esm.js +236 -0
  6. package/dist/email.d.ts +5 -5
  7. package/dist/email.esm.js +16 -17
  8. package/dist/{xstate.esm-2hDiAXvZ.esm.js → endpoints-BUsSVoJV.esm.js} +28 -1
  9. package/dist/events-B8ZkhAZo.esm.js +285 -0
  10. package/dist/flow.d.ts +2 -3
  11. package/dist/flow.esm.js +18 -7
  12. package/dist/getDeviceClass-DkfbtsIJ.esm.js +41 -0
  13. package/dist/{id-DHVSW_wJ.esm.js → id-r1mw9zBM.esm.js} +38 -36
  14. package/dist/id.d.ts +4 -5
  15. package/dist/id.esm.js +7 -6
  16. package/dist/{index-CbF_uI-x.d.ts → index-CJMK8K5u.d.ts} +3 -7
  17. package/dist/index.d.ts +220 -6
  18. package/dist/index.esm.js +12 -8
  19. package/dist/{lib-BJoLTN_W.esm.js → lib-CbAibJlt.esm.js} +2 -2
  20. package/dist/phone.d.ts +5 -5
  21. package/dist/phone.esm.js +16 -14
  22. package/dist/selfie.d.ts +119 -46
  23. package/dist/selfie.esm.js +284 -161
  24. package/dist/{endpoints-D9TGnxRK.esm.js → src-DYtpbFY5.esm.js} +242 -111
  25. package/dist/stats-DnU4uUFv.esm.js +16 -0
  26. package/dist/stats.d.ts +12 -0
  27. package/dist/stats.esm.js +4 -0
  28. package/dist/{streamingEvents-B3hNanPl.esm.js → streamingEvents-CfEJv3xH.esm.js} +35 -36
  29. package/dist/{types-BpCrZLU6.d.ts → types-CMR6NkxW.d.ts} +58 -1
  30. package/dist/{types-DZbrbPgj.d.ts → types-CRVSv38Q.d.ts} +10 -1
  31. package/package.json +2 -2
  32. package/dist/OpenViduLogger-Dy5P806a.esm.js +0 -3
  33. package/dist/StateMachine-pi8byl8C.d.ts +0 -58
  34. package/dist/addEvent-BGKc_lHF.esm.js +0 -16
  35. package/dist/deepsightLoader-B36_XZ7r.esm.js +0 -25
  36. package/dist/deepsightService-BWxcc4OC.esm.js +0 -225
  37. package/dist/recordingsRepository-D5MURoVB.esm.js +0 -40
  38. /package/dist/{Manager-BZUZTRPx.d.ts → Manager-Co-PsiG9.d.ts} +0 -0
  39. /package/dist/{chunk-FbsBJI8u.esm.js → chunk-V5DOKNPJ.esm.js} +0 -0
@@ -1,4 +1,4 @@
1
- import { t as __commonJS } from "./chunk-FbsBJI8u.esm.js";
1
+ import { t as __commonJS } from "./chunk-V5DOKNPJ.esm.js";
2
2
 
3
3
  //#region ../../node_modules/.pnpm/jsnlog@2.30.0/node_modules/jsnlog/jsnlog.js
4
4
  var require_jsnlog = /* @__PURE__ */ __commonJS({ "../../node_modules/.pnpm/jsnlog@2.30.0/node_modules/jsnlog/jsnlog.js": ((exports) => {
@@ -0,0 +1,3 @@
1
+ import { t as require_OpenViduLogger } from "./OpenViduLogger-BLxxXoyF.esm.js";
2
+
3
+ export default require_OpenViduLogger();
@@ -0,0 +1,53 @@
1
+ //#region src/internal/http/api.ts
2
+ let client = null;
3
+ let currentToken = null;
4
+ function setClient(httpClient) {
5
+ client = httpClient;
6
+ }
7
+ function setToken(token) {
8
+ currentToken = token;
9
+ }
10
+ function getToken() {
11
+ return currentToken;
12
+ }
13
+ function getApi() {
14
+ if (!client) throw new Error("SDK not configured. Call setup({ apiURL: \"...\" }) first.");
15
+ return client;
16
+ }
17
+ function isApiConfigured() {
18
+ return client !== null;
19
+ }
20
+ function resetApi() {
21
+ client = null;
22
+ currentToken = null;
23
+ }
24
+ function addTokenHeader(config) {
25
+ if (!currentToken) return config ?? {};
26
+ return {
27
+ ...config,
28
+ headers: {
29
+ ...config?.headers,
30
+ "X-Incode-Hardware-Id": currentToken
31
+ }
32
+ };
33
+ }
34
+ const api = {
35
+ get(url, config) {
36
+ return getApi().get(url, addTokenHeader(config));
37
+ },
38
+ post(url, data, config) {
39
+ return getApi().post(url, data, addTokenHeader(config));
40
+ },
41
+ put(url, data, config) {
42
+ return getApi().put(url, data, addTokenHeader(config));
43
+ },
44
+ patch(url, data, config) {
45
+ return getApi().patch(url, data, addTokenHeader(config));
46
+ },
47
+ delete(url, config) {
48
+ return getApi().delete(url, addTokenHeader(config));
49
+ }
50
+ };
51
+
52
+ //#endregion
53
+ export { resetApi as a, isApiConfigured as i, getApi as n, setClient as o, getToken as r, setToken as s, api as t };
@@ -0,0 +1,24 @@
1
+ import { l as MotionSensorProvider, p as BrowserEnvironmentProvider, r as WasmUtilProvider, s as VisibilityProvider } from "./src-DYtpbFY5.esm.js";
2
+ import "./getDeviceClass-DkfbtsIJ.esm.js";
3
+ import "./api-DfRLAneb.esm.js";
4
+ import { t as createDeepsightService } from "./deepsightService-j5zMt6wf.esm.js";
5
+ import "./stats-DnU4uUFv.esm.js";
6
+
7
+ //#region src/modules/selfie/deepsightLoader.ts
8
+ const SDK_VERSION = "2.0.0";
9
+ async function loadDeepsightSession() {
10
+ const service = createDeepsightService({
11
+ sdkVersion: SDK_VERSION,
12
+ wasmUtil: await WasmUtilProvider.getInstance(),
13
+ visibility: new VisibilityProvider(),
14
+ browserEnv: new BrowserEnvironmentProvider(),
15
+ motionSensor: new MotionSensorProvider()
16
+ });
17
+ await service.initialize();
18
+ await service.requestMotionPermission();
19
+ await service.startMotionSensors();
20
+ return service;
21
+ }
22
+
23
+ //#endregion
24
+ export { loadDeepsightSession };
@@ -0,0 +1,236 @@
1
+ import { S as stopCameraStream, _ as createHiddenVideoElement, v as IncodeCanvas, x as requestCameraAccess } from "./src-DYtpbFY5.esm.js";
2
+ import { r as getUserAgent, t as getDeviceInfo } from "./getDeviceClass-DkfbtsIJ.esm.js";
3
+ import { t as api } from "./api-DfRLAneb.esm.js";
4
+ import { t as addDeviceStats } from "./stats-DnU4uUFv.esm.js";
5
+
6
+ //#region src/internal/deepsight/metadataService.ts
7
+ const AUTOMATION_MARKERS = {
8
+ window: [
9
+ "callPhantom",
10
+ "_phantom",
11
+ "phantom",
12
+ "__nightmare",
13
+ "domAutomation",
14
+ "domAutomationController"
15
+ ],
16
+ navigator: ["webdriver"]
17
+ };
18
+ const IP_PROVIDER_URL = "https://api.ipify.org?format=json";
19
+ function isBrowserSimulation(browserEnv) {
20
+ for (const prop of AUTOMATION_MARKERS.window) if (browserEnv.getWindowProperty(prop)) return true;
21
+ for (const prop of AUTOMATION_MARKERS.navigator) if (browserEnv.getNavigatorProperty(prop)) return true;
22
+ return false;
23
+ }
24
+ async function fetchPublicIp(browserEnv) {
25
+ return (await browserEnv.fetchJson(IP_PROVIDER_URL, 3e3))?.ip || "";
26
+ }
27
+ function createMetadataService(wasmUtil, visibility, browserEnv) {
28
+ return {
29
+ async initialize(sdkVersion, disableIpify = false) {
30
+ wasmUtil.setSdkPlatform("WEBAPP");
31
+ wasmUtil.setSdkVersion(sdkVersion);
32
+ const ua = getUserAgent();
33
+ const isMobile = /Android|iPhone|iPad|iPod/i.test(ua);
34
+ const deviceInfo = getDeviceInfo();
35
+ const visitorId = browserEnv.generateCanvasFingerprint();
36
+ const ip = disableIpify ? "" : await fetchPublicIp(browserEnv);
37
+ const screenDimensions = browserEnv.getScreenDimensions();
38
+ const deviceMetadata = {
39
+ kind: isMobile ? "mobile" : "desktop",
40
+ model: "",
41
+ os: void 0,
42
+ osVersion: void 0,
43
+ screenDimensions,
44
+ numTouchPoints: deviceInfo.maxTouchPoints,
45
+ fingerprintHash: visitorId,
46
+ ip,
47
+ backgroundMode: false
48
+ };
49
+ wasmUtil.setDeviceInfo(deviceMetadata);
50
+ const navigatorPrefixes = browserEnv.getNavigatorPrefixes();
51
+ const browserInfo = {
52
+ userAgent: ua,
53
+ getUserMediaAvailability: {
54
+ webkit: navigatorPrefixes.webkit,
55
+ moz: navigatorPrefixes.moz,
56
+ o: navigatorPrefixes.o,
57
+ ms: navigatorPrefixes.ms
58
+ },
59
+ webglFingerprint: browserEnv.getWebGLRenderer(),
60
+ inspectorOpened: false,
61
+ isMockedBrowser: isBrowserSimulation(browserEnv)
62
+ };
63
+ wasmUtil.setBrowserInfo(browserInfo, false);
64
+ },
65
+ updateCameraInfo(videoTrack) {
66
+ const settings = videoTrack.getSettings();
67
+ const capabilities = videoTrack.getCapabilities?.() ?? {};
68
+ const labels = videoTrack.label ? [videoTrack.label] : [];
69
+ const cameraInfo = {
70
+ facingMode: settings.facingMode === "user" ? "frontal" : settings.facingMode === "environment" ? "back" : settings.facingMode || "unknown",
71
+ settings,
72
+ capabilities,
73
+ labels
74
+ };
75
+ wasmUtil.setCameraInfo(cameraInfo);
76
+ },
77
+ async checkForVirtualCameraByLabel(videoTrack = null) {
78
+ try {
79
+ if (!videoTrack) {
80
+ const labels = await browserEnv.enumerateVideoDeviceLabels();
81
+ for (const label of labels) if (wasmUtil.isVirtualCamera(label)) return true;
82
+ }
83
+ if (videoTrack && wasmUtil.isVirtualCamera(videoTrack.label)) return true;
84
+ return false;
85
+ } catch {
86
+ return false;
87
+ }
88
+ },
89
+ async analyzeFrame(imageData) {
90
+ await wasmUtil.analyzeFrame(imageData);
91
+ },
92
+ setMotionStatus(status) {
93
+ wasmUtil.setMotionStatus(status);
94
+ },
95
+ setBackgroundMode(backgroundMode) {
96
+ wasmUtil.setBackgroundMode(backgroundMode || visibility.wasBackgrounded);
97
+ visibility.reset();
98
+ },
99
+ estimatePerformance() {
100
+ return wasmUtil.estimatePerformance();
101
+ },
102
+ getMetadata() {
103
+ return wasmUtil.getMetadata();
104
+ },
105
+ getCheck() {
106
+ return wasmUtil.getCheck();
107
+ }
108
+ };
109
+ }
110
+
111
+ //#endregion
112
+ //#region src/internal/deepsight/motionStatusService.ts
113
+ function createMotionStatusService(motionSensor) {
114
+ return {
115
+ async requestPermission() {
116
+ return motionSensor.requestPermission();
117
+ },
118
+ async start() {
119
+ await motionSensor.start();
120
+ },
121
+ stop() {
122
+ motionSensor.stop();
123
+ },
124
+ check() {
125
+ return motionSensor.check();
126
+ },
127
+ get isRunning() {
128
+ return motionSensor.isRunning;
129
+ },
130
+ get hasPermission() {
131
+ return motionSensor.hasPermission;
132
+ }
133
+ };
134
+ }
135
+
136
+ //#endregion
137
+ //#region src/internal/virtualCameraCheck.ts
138
+ /**
139
+ * Sends the analyzed frame image to the backend for logging.
140
+ */
141
+ async function logFrame({ source, base64Image, token }) {
142
+ try {
143
+ return (await api.post("/omni/log/frame/v2", { base64Image }, {
144
+ query: { source },
145
+ headers: { "X-Incode-Hardware-Id": token }
146
+ })).data;
147
+ } catch {
148
+ return;
149
+ }
150
+ }
151
+ /**
152
+ * Runs the WASM virtual camera check and handles logging and stats.
153
+ */
154
+ async function runVirtualCameraCheck({ wasmUtil, source, token }) {
155
+ const output = {
156
+ canvas: null,
157
+ itr: null,
158
+ skipped: null
159
+ };
160
+ await wasmUtil.poc(output);
161
+ if (output.skipped !== false) return;
162
+ if (output.canvas && token) {
163
+ const base64Image = new IncodeCanvas(output.canvas).getBase64Image();
164
+ if (base64Image) await logFrame({
165
+ source,
166
+ base64Image,
167
+ token
168
+ });
169
+ }
170
+ if (output.itr === true) {
171
+ addDeviceStats({ virtualCameraDetected: true });
172
+ wasmUtil.setZc("FAIL");
173
+ } else if (output.itr === false) wasmUtil.setZc("PASS");
174
+ }
175
+
176
+ //#endregion
177
+ //#region src/internal/deepsight/deepsightService.ts
178
+ function createDeepsightService(config) {
179
+ const metadata = createMetadataService(config.wasmUtil, config.visibility, config.browserEnv);
180
+ const motion = createMotionStatusService(config.motionSensor);
181
+ return {
182
+ metadata,
183
+ motion,
184
+ async initialize(disableIpify = false) {
185
+ await metadata.initialize(config.sdkVersion, disableIpify);
186
+ metadata.estimatePerformance();
187
+ },
188
+ async requestMotionPermission() {
189
+ return motion.requestPermission();
190
+ },
191
+ async startMotionSensors() {
192
+ await motion.start();
193
+ },
194
+ stopMotionSensors() {
195
+ motion.stop();
196
+ },
197
+ async checkVirtualCamera(videoTrack) {
198
+ metadata.updateCameraInfo(videoTrack);
199
+ return metadata.checkForVirtualCameraByLabel(videoTrack);
200
+ },
201
+ async performVirtualCameraCheck(sessionToken, source) {
202
+ await runVirtualCameraCheck({
203
+ wasmUtil: config.wasmUtil,
204
+ source,
205
+ token: sessionToken
206
+ });
207
+ },
208
+ async performPrcCheck(params) {
209
+ await params.storage.set("ds", params.ds ? 1 : 0);
210
+ const prcStream = await requestCameraAccess(params.constraints);
211
+ const hiddenVideo = createHiddenVideoElement(prcStream);
212
+ try {
213
+ await config.wasmUtil.prc();
214
+ } finally {
215
+ hiddenVideo.dispose();
216
+ stopCameraStream(prcStream);
217
+ }
218
+ },
219
+ async analyzeFrame(imageData) {
220
+ await metadata.analyzeFrame(imageData);
221
+ const motionStatus = motion.check();
222
+ metadata.setMotionStatus(motionStatus);
223
+ metadata.getCheck();
224
+ metadata.setBackgroundMode(false);
225
+ },
226
+ getMetadata() {
227
+ return metadata.getMetadata();
228
+ },
229
+ cleanup() {
230
+ motion.stop();
231
+ }
232
+ };
233
+ }
234
+
235
+ //#endregion
236
+ export { createDeepsightService as t };
package/dist/email.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as Manager } from "./Manager-BZUZTRPx.js";
1
+ import { t as Manager } from "./Manager-Co-PsiG9.js";
2
2
 
3
3
  //#region src/modules/email/types.d.ts
4
4
 
@@ -110,9 +110,9 @@ type EmailOtpErrorState = {
110
110
  error: string;
111
111
  attemptsRemaining: number;
112
112
  };
113
- /** Email verification completed successfully - call `reset()` to start over */
114
- type EmailSuccessState = {
115
- status: 'success';
113
+ /** Email verification completed successfully */
114
+ type EmailFinishedState = {
115
+ status: 'finished';
116
116
  };
117
117
  /**
118
118
  * Fatal error occurred - call `reset()` to start over
@@ -135,7 +135,7 @@ type EmailErrorState = {
135
135
  * }
136
136
  * ```
137
137
  */
138
- type EmailState = EmailIdleState | EmailLoadingPrefillState | EmailInputtingState | EmailSubmittingState | EmailSendingOtpState | EmailAwaitingOtpState | EmailVerifyingOtpState | EmailOtpErrorState | EmailSuccessState | EmailErrorState;
138
+ type EmailState = EmailIdleState | EmailLoadingPrefillState | EmailInputtingState | EmailSubmittingState | EmailSendingOtpState | EmailAwaitingOtpState | EmailVerifyingOtpState | EmailOtpErrorState | EmailFinishedState | EmailErrorState;
139
139
  /**
140
140
  * Creates an email verification manager for headless or UI-driven usage.
141
141
  *
package/dist/email.esm.js CHANGED
@@ -1,6 +1,7 @@
1
- import { E as createManager, n as api, t as endpoints } from "./endpoints-D9TGnxRK.esm.js";
2
- import { a as createActor, i as fromPromise, n as assign, r as fromCallback, t as setup } from "./xstate.esm-2hDiAXvZ.esm.js";
3
- import { t as addEvent } from "./addEvent-BGKc_lHF.esm.js";
1
+ import { d as addEvent, n as eventModuleNames, r as eventScreenNames } from "./events-B8ZkhAZo.esm.js";
2
+ import { C as createManager, d as BrowserTimerProvider } from "./src-DYtpbFY5.esm.js";
3
+ import { a as fromPromise, i as fromCallback, n as setup, o as createActor, r as assign, t as endpoints } from "./endpoints-BUsSVoJV.esm.js";
4
+ import { t as api } from "./api-DfRLAneb.esm.js";
4
5
 
5
6
  //#region src/modules/email/emailServices.ts
6
7
  async function fetchEmail(signal) {
@@ -46,13 +47,14 @@ const emailMachine = setup({
46
47
  return verifyEmailOtp(input.code, signal);
47
48
  }),
48
49
  resendTimer: fromCallback(({ sendBack }) => {
50
+ const timer = BrowserTimerProvider.getInstance();
49
51
  let seconds = RESEND_TIMER_SECONDS;
50
- const interval = setInterval(() => {
52
+ const interval = timer.setInterval(() => {
51
53
  seconds -= 1;
52
54
  sendBack({ type: "TICK" });
53
- if (seconds <= 0) clearInterval(interval);
55
+ if (seconds <= 0) timer.clearInterval(interval);
54
56
  }, 1e3);
55
- return () => clearInterval(interval);
57
+ return () => timer.clearInterval(interval);
56
58
  })
57
59
  },
58
60
  actions: {
@@ -115,8 +117,8 @@ const emailMachine = setup({
115
117
  sendEmailSubmitEvent: () => {
116
118
  addEvent({
117
119
  code: "continue",
118
- module: "email",
119
- screen: "emailInput"
120
+ module: eventModuleNames.email,
121
+ screen: eventScreenNames.emailInput
120
122
  });
121
123
  }
122
124
  },
@@ -176,7 +178,7 @@ const emailMachine = setup({
176
178
  guard: "hasOtpVerification",
177
179
  actions: "sendEmailSubmitEvent"
178
180
  }, {
179
- target: "success",
181
+ target: "finished",
180
182
  actions: "sendEmailSubmitEvent"
181
183
  }],
182
184
  onError: {
@@ -216,7 +218,7 @@ const emailMachine = setup({
216
218
  input: ({ context }) => ({ code: context.otpCode }),
217
219
  onDone: [
218
220
  {
219
- target: "success",
221
+ target: "finished",
220
222
  guard: ({ event }) => event.output.success === true
221
223
  },
222
224
  {
@@ -252,10 +254,7 @@ const emailMachine = setup({
252
254
  },
253
255
  BACK: { target: "inputting" }
254
256
  } },
255
- success: { on: { RESET: {
256
- target: "idle",
257
- actions: "resetContext"
258
- } } },
257
+ finished: { type: "final" },
259
258
  error: { on: { RESET: {
260
259
  target: "idle",
261
260
  actions: "resetContext"
@@ -302,7 +301,7 @@ function createEmailActor(options) {
302
301
  * // 3. Subscribe to state changes (optional but recommended)
303
302
  * emailManager.subscribe((state) => {
304
303
  * console.log('Email state:', state.status);
305
- * if (state.status === 'success') {
304
+ * if (state.status === 'finished') {
306
305
  * console.log('Email verified successfully!');
307
306
  * }
308
307
  * if (state.status === 'error') {
@@ -345,7 +344,7 @@ function createEmailActor(options) {
345
344
  * // Get OTP from user or external source
346
345
  * emailManager.submitOtp(otpCode);
347
346
  * break;
348
- * case 'success':
347
+ * case 'finished':
349
348
  * clearInterval(interval);
350
349
  * emailManager.stop();
351
350
  * break;
@@ -382,7 +381,7 @@ function mapState(snapshot) {
382
381
  error: context.otpError ?? "Invalid OTP code",
383
382
  attemptsRemaining: context.attemptsRemaining
384
383
  };
385
- if (typedSnapshot.matches("success")) return { status: "success" };
384
+ if (typedSnapshot.matches("finished")) return { status: "finished" };
386
385
  if (typedSnapshot.matches("error")) return {
387
386
  status: "error",
388
387
  error: context.error ?? "An error occurred"
@@ -3258,4 +3258,31 @@ function setup({ schemas, actors, actions, guards, delays }) {
3258
3258
  }
3259
3259
 
3260
3260
  //#endregion
3261
- export { createActor as a, fromPromise as i, assign as n, fromCallback as r, setup as t };
3261
+ //#region src/internal/http/endpoints.ts
3262
+ const endpoints = {
3263
+ createSession: "/omni/start",
3264
+ flow: "/omni/onboarding/flow",
3265
+ events: "/omni/interview-events",
3266
+ selfie: "/omni/add/face",
3267
+ recordingCreateSessionV2: "/omni/recordings/create-session/v2",
3268
+ recordingStartV2: "/omni/recordings/record-start/v2",
3269
+ recordingStopV2: "/omni/recordings/record-stop/v2",
3270
+ deepsightVideoImport: "/omni/recordings/import",
3271
+ phone: "/omni/add/phone",
3272
+ phoneInstant: "/omni/instant/add/phone",
3273
+ getPhone: "/omni/get/phone",
3274
+ startInfo: "/omni/start-info",
3275
+ sendSmsOtp: "/omni/send/sms-otp",
3276
+ compareOtp: "/omni/compare/otp",
3277
+ email: "/omni/add/email",
3278
+ getEmail: "/omni/get/email",
3279
+ frontId: "/omni/add/front-id/v2",
3280
+ backId: "/omni/add/back-id/v2",
3281
+ getImages: "/omni/get/images",
3282
+ processId: "/omni/process/id",
3283
+ processSecondId: "/omni/process/second-id",
3284
+ processFace: "/omni/process/face"
3285
+ };
3286
+
3287
+ //#endregion
3288
+ export { fromPromise as a, fromCallback as i, setup as n, createActor as o, assign as r, endpoints as t };