@incodetech/core 2.0.0-alpha.1 → 2.0.0-alpha.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 (104) hide show
  1. package/dist/Manager-6BwbaI_H.d.ts +19 -0
  2. package/dist/StateMachine-7c1gcu94.d.ts +2 -0
  3. package/dist/addEvent-1Mi5CEiq.esm.js +16 -0
  4. package/dist/chunk-C_Yo44FK.esm.js +49 -0
  5. package/dist/email.d.ts +264 -0
  6. package/dist/email.esm.js +479 -0
  7. package/dist/endpoints-D_pUMaqA.esm.js +1701 -0
  8. package/dist/flow.d.ts +578 -0
  9. package/dist/flow.esm.js +628 -0
  10. package/dist/index.d.ts +226 -0
  11. package/dist/index.esm.js +155 -0
  12. package/dist/lib-CyIAFRfr.esm.js +12499 -0
  13. package/dist/permissionServices-CVR0Pq38.esm.js +72 -0
  14. package/dist/phone.d.ts +292 -0
  15. package/dist/phone.esm.js +550 -0
  16. package/dist/selfie.d.ts +758 -0
  17. package/dist/selfie.esm.js +978 -0
  18. package/dist/types-tq1ypYSL.d.ts +5 -0
  19. package/dist/warmup-Dr7OcFND.d.ts +55 -0
  20. package/dist/xstate.esm-B_rda9yU.esm.js +3261 -0
  21. package/package.json +14 -11
  22. package/src/camera/cameraActor.ts +0 -21
  23. package/src/camera/cameraService.test.ts +0 -437
  24. package/src/camera/cameraService.ts +0 -165
  25. package/src/camera/cameraServices.test.ts +0 -66
  26. package/src/camera/cameraServices.ts +0 -26
  27. package/src/camera/cameraStateMachine.test.ts +0 -602
  28. package/src/camera/cameraStateMachine.ts +0 -264
  29. package/src/camera/index.ts +0 -5
  30. package/src/camera/types.ts +0 -17
  31. package/src/device/getBrowser.ts +0 -31
  32. package/src/device/getDeviceClass.ts +0 -29
  33. package/src/device/index.ts +0 -2
  34. package/src/email/__mocks__/emailMocks.ts +0 -59
  35. package/src/email/emailActor.ts +0 -15
  36. package/src/email/emailManager.test.ts +0 -573
  37. package/src/email/emailManager.ts +0 -427
  38. package/src/email/emailServices.ts +0 -66
  39. package/src/email/emailStateMachine.test.ts +0 -741
  40. package/src/email/emailStateMachine.ts +0 -367
  41. package/src/email/index.ts +0 -39
  42. package/src/email/types.ts +0 -60
  43. package/src/events/addEvent.ts +0 -20
  44. package/src/events/types.ts +0 -7
  45. package/src/flow/__mocks__/flowMocks.ts +0 -84
  46. package/src/flow/flowActor.ts +0 -13
  47. package/src/flow/flowAnalyzer.test.ts +0 -266
  48. package/src/flow/flowAnalyzer.ts +0 -37
  49. package/src/flow/flowCompletionService.ts +0 -21
  50. package/src/flow/flowManager.test.ts +0 -560
  51. package/src/flow/flowManager.ts +0 -235
  52. package/src/flow/flowServices.test.ts +0 -109
  53. package/src/flow/flowServices.ts +0 -13
  54. package/src/flow/flowStateMachine.test.ts +0 -334
  55. package/src/flow/flowStateMachine.ts +0 -182
  56. package/src/flow/index.ts +0 -21
  57. package/src/flow/moduleLoader.test.ts +0 -136
  58. package/src/flow/moduleLoader.ts +0 -73
  59. package/src/flow/orchestratedFlowManager.test.ts +0 -240
  60. package/src/flow/orchestratedFlowManager.ts +0 -231
  61. package/src/flow/orchestratedFlowStateMachine.test.ts +0 -199
  62. package/src/flow/orchestratedFlowStateMachine.ts +0 -325
  63. package/src/flow/types.ts +0 -434
  64. package/src/http/__mocks__/api.ts +0 -88
  65. package/src/http/api.test.ts +0 -231
  66. package/src/http/api.ts +0 -90
  67. package/src/http/endpoints.ts +0 -17
  68. package/src/index.ts +0 -33
  69. package/src/permissions/index.ts +0 -2
  70. package/src/permissions/permissionServices.ts +0 -31
  71. package/src/permissions/types.ts +0 -3
  72. package/src/phone/__mocks__/phoneMocks.ts +0 -71
  73. package/src/phone/index.ts +0 -39
  74. package/src/phone/phoneActor.ts +0 -15
  75. package/src/phone/phoneManager.test.ts +0 -393
  76. package/src/phone/phoneManager.ts +0 -458
  77. package/src/phone/phoneServices.ts +0 -98
  78. package/src/phone/phoneStateMachine.test.ts +0 -918
  79. package/src/phone/phoneStateMachine.ts +0 -422
  80. package/src/phone/types.ts +0 -83
  81. package/src/recordings/recordingsRepository.test.ts +0 -87
  82. package/src/recordings/recordingsRepository.ts +0 -48
  83. package/src/recordings/streamingEvents.ts +0 -10
  84. package/src/selfie/__mocks__/selfieMocks.ts +0 -26
  85. package/src/selfie/index.ts +0 -14
  86. package/src/selfie/selfieActor.ts +0 -17
  87. package/src/selfie/selfieErrorUtils.test.ts +0 -116
  88. package/src/selfie/selfieErrorUtils.ts +0 -66
  89. package/src/selfie/selfieManager.test.ts +0 -297
  90. package/src/selfie/selfieManager.ts +0 -301
  91. package/src/selfie/selfieServices.ts +0 -362
  92. package/src/selfie/selfieStateMachine.test.ts +0 -283
  93. package/src/selfie/selfieStateMachine.ts +0 -804
  94. package/src/selfie/selfieUploadService.test.ts +0 -90
  95. package/src/selfie/selfieUploadService.ts +0 -81
  96. package/src/selfie/types.ts +0 -103
  97. package/src/session/index.ts +0 -5
  98. package/src/session/sessionService.ts +0 -78
  99. package/src/setup.test.ts +0 -61
  100. package/src/setup.ts +0 -171
  101. package/tsconfig.json +0 -13
  102. package/tsdown.config.ts +0 -22
  103. package/vitest.config.ts +0 -37
  104. package/vitest.setup.ts +0 -135
@@ -1,283 +0,0 @@
1
- import {
2
- createActor,
3
- type FaceDetectionProvider,
4
- IncodeCanvas,
5
- } from '@incodetech/infra';
6
- import { beforeEach, describe, expect, it, vi } from 'vitest';
7
- import {
8
- mockSelfieConfig,
9
- mockSelfieConfigWithOneAttempt,
10
- } from './__mocks__/selfieMocks';
11
- import { selfieMachine } from './selfieStateMachine';
12
-
13
- vi.mock('../events/addEvent', () => ({
14
- addEvent: vi.fn().mockResolvedValue(undefined),
15
- }));
16
-
17
- vi.mock('../permissions/permissionServices', () => ({
18
- checkPermission: vi.fn().mockResolvedValue('granted'),
19
- requestPermission: vi.fn().mockResolvedValue('granted'),
20
- }));
21
-
22
- vi.mock('./selfieServices', () => ({
23
- encryptSelfieImage: vi.fn().mockResolvedValue('encrypted'),
24
- initializeCamera: vi.fn().mockResolvedValue({
25
- stream: new MediaStream(),
26
- provider: { dispose: vi.fn().mockResolvedValue(undefined), reset: vi.fn() },
27
- }),
28
- startDetection: vi.fn().mockImplementation(() => ({
29
- cleanup: vi.fn(),
30
- reset: vi.fn(),
31
- })),
32
- startRecordingSession: vi.fn().mockResolvedValue(undefined),
33
- stopRecording: vi.fn(),
34
- stopStream: vi.fn(),
35
- uploadSelfie: vi.fn().mockResolvedValue({
36
- age: 0,
37
- confidence: 0,
38
- hasClosedEyes: false,
39
- hasFaceMask: false,
40
- hasHeadCover: false,
41
- hasLenses: false,
42
- isBright: true,
43
- liveness: true,
44
- imageBase64: '',
45
- sessionStatus: 'ok',
46
- }),
47
- }));
48
-
49
- type SelfieActor = ReturnType<typeof createTestActor>;
50
-
51
- function createTestActor(config = mockSelfieConfig) {
52
- return createActor(selfieMachine, { input: { config } }).start();
53
- }
54
-
55
- function createCanvas(): IncodeCanvas {
56
- const raw = document.createElement('canvas');
57
- raw.width = 10;
58
- raw.height = 10;
59
- return new IncodeCanvas(raw);
60
- }
61
-
62
- async function waitForCaptureDetecting(actor: SelfieActor): Promise<void> {
63
- await vi.waitFor(
64
- () => {
65
- if (!actor.getSnapshot().matches({ capture: 'detecting' })) {
66
- throw new Error('Not detecting yet');
67
- }
68
- },
69
- { timeout: 2000 },
70
- );
71
- }
72
-
73
- describe('selfieMachine', () => {
74
- beforeEach(async () => {
75
- vi.clearAllMocks();
76
- const permissionServices = await import(
77
- '../permissions/permissionServices'
78
- );
79
- vi.mocked(permissionServices.checkPermission).mockResolvedValue('granted');
80
- vi.mocked(permissionServices.requestPermission).mockResolvedValue(
81
- 'granted',
82
- );
83
-
84
- const selfieServices = await import('./selfieServices');
85
- const provider = {
86
- dispose: vi.fn().mockResolvedValue(undefined),
87
- reset: vi.fn(),
88
- } as unknown as FaceDetectionProvider;
89
- vi.mocked(selfieServices.initializeCamera).mockResolvedValue({
90
- stream: new MediaStream(),
91
- provider,
92
- });
93
- vi.mocked(selfieServices.startDetection).mockReturnValue({
94
- cleanup: vi.fn(),
95
- reset: vi.fn(),
96
- });
97
- vi.mocked(selfieServices.uploadSelfie).mockResolvedValue({
98
- age: 0,
99
- confidence: 0,
100
- hasClosedEyes: false,
101
- hasFaceMask: false,
102
- hasHeadCover: false,
103
- hasLenses: false,
104
- isBright: true,
105
- liveness: true,
106
- imageBase64: '',
107
- sessionStatus: 'ok',
108
- });
109
- });
110
-
111
- it('starts in idle', () => {
112
- const actor = createTestActor();
113
- expect(actor.getSnapshot().value).toBe('idle');
114
- actor.stop();
115
- });
116
-
117
- it('goes to permissions when permission is not granted', async () => {
118
- const { checkPermission } = await import(
119
- '../permissions/permissionServices'
120
- );
121
- vi.mocked(checkPermission).mockResolvedValue('prompt');
122
-
123
- const actor = createTestActor();
124
- actor.send({ type: 'LOAD' });
125
-
126
- await vi.waitFor(() => {
127
- expect(actor.getSnapshot().matches('permissions')).toBe(true);
128
- });
129
-
130
- actor.stop();
131
- });
132
-
133
- it('goes to capture.detecting when permission is granted and camera initializes', async () => {
134
- const actor = createTestActor();
135
- actor.send({ type: 'LOAD' });
136
-
137
- await waitForCaptureDetecting(actor);
138
-
139
- actor.stop();
140
- });
141
-
142
- it('invokes startRecordingSession when enableFaceRecording is true', async () => {
143
- const selfieServices = await import('./selfieServices');
144
- const startRecordingSession = vi.mocked(
145
- selfieServices.startRecordingSession,
146
- );
147
- startRecordingSession.mockResolvedValueOnce(undefined);
148
-
149
- const actor = createTestActor({
150
- ...mockSelfieConfig,
151
- enableFaceRecording: true,
152
- });
153
- actor.send({ type: 'LOAD' });
154
- await waitForCaptureDetecting(actor);
155
-
156
- expect(startRecordingSession).toHaveBeenCalledTimes(1);
157
-
158
- actor.stop();
159
- });
160
-
161
- it('reaches finished after detection success and upload success', async () => {
162
- const actor = createTestActor();
163
- actor.send({ type: 'LOAD' });
164
- await waitForCaptureDetecting(actor);
165
-
166
- actor.send({
167
- type: 'DETECTION_SUCCESS',
168
- canvas: createCanvas(),
169
- });
170
-
171
- await vi.waitFor(
172
- () => {
173
- if (!actor.getSnapshot().matches('finished')) {
174
- throw new Error('Not finished yet');
175
- }
176
- },
177
- { timeout: 4000 },
178
- );
179
-
180
- actor.stop();
181
- });
182
-
183
- it('goes to uploadError on upload failure and decrements attemptsRemaining', async () => {
184
- const { uploadSelfie } = await import('./selfieServices');
185
- vi.mocked(uploadSelfie).mockRejectedValueOnce(new Error('UPLOAD_FAILED'));
186
-
187
- const actor = createTestActor();
188
- actor.send({ type: 'LOAD' });
189
- await waitForCaptureDetecting(actor);
190
-
191
- actor.send({
192
- type: 'DETECTION_SUCCESS',
193
- canvas: createCanvas(),
194
- });
195
-
196
- await vi.waitFor(() => {
197
- expect(actor.getSnapshot().matches({ capture: 'uploadError' })).toBe(
198
- true,
199
- );
200
- });
201
-
202
- expect(actor.getSnapshot().context.attemptsRemaining).toBe(
203
- mockSelfieConfig.captureAttempts - 1,
204
- );
205
- expect(actor.getSnapshot().context.uploadError).toBe('SERVER_ERROR');
206
-
207
- actor.stop();
208
- });
209
-
210
- it('retries capture when attempts remain', async () => {
211
- const { uploadSelfie } = await import('./selfieServices');
212
- vi.mocked(uploadSelfie).mockRejectedValueOnce(new Error('UPLOAD_FAILED'));
213
-
214
- const actor = createTestActor();
215
- actor.send({ type: 'LOAD' });
216
- await waitForCaptureDetecting(actor);
217
-
218
- actor.send({
219
- type: 'DETECTION_SUCCESS',
220
- canvas: createCanvas(),
221
- });
222
-
223
- await vi.waitFor(() => {
224
- expect(actor.getSnapshot().matches({ capture: 'uploadError' })).toBe(
225
- true,
226
- );
227
- });
228
-
229
- actor.send({ type: 'RETRY_CAPTURE' });
230
-
231
- await waitForCaptureDetecting(actor);
232
-
233
- expect(actor.getSnapshot().context.uploadError).toBeUndefined();
234
- expect(actor.getSnapshot().context.capturedImage).toBeUndefined();
235
-
236
- actor.stop();
237
- });
238
-
239
- it('blocks retry when no attempts remain', async () => {
240
- const { uploadSelfie } = await import('./selfieServices');
241
- vi.mocked(uploadSelfie).mockRejectedValueOnce(new Error('UPLOAD_FAILED'));
242
-
243
- const actor = createTestActor(mockSelfieConfigWithOneAttempt);
244
- actor.send({ type: 'LOAD' });
245
- await waitForCaptureDetecting(actor);
246
-
247
- actor.send({
248
- type: 'DETECTION_SUCCESS',
249
- canvas: createCanvas(),
250
- });
251
-
252
- await vi.waitFor(() => {
253
- expect(actor.getSnapshot().matches({ capture: 'uploadError' })).toBe(
254
- true,
255
- );
256
- });
257
-
258
- expect(actor.getSnapshot().context.attemptsRemaining).toBe(0);
259
-
260
- actor.send({ type: 'RETRY_CAPTURE' });
261
- expect(actor.getSnapshot().matches({ capture: 'uploadError' })).toBe(true);
262
-
263
- actor.stop();
264
- });
265
-
266
- it('goes to uploadError with SERVER_ERROR on manual capture when no frame exists', async () => {
267
- const actor = createTestActor();
268
- actor.send({ type: 'LOAD' });
269
- await waitForCaptureDetecting(actor);
270
-
271
- actor.send({ type: 'MANUAL_CAPTURE' });
272
-
273
- await vi.waitFor(() => {
274
- expect(actor.getSnapshot().matches({ capture: 'uploadError' })).toBe(
275
- true,
276
- );
277
- });
278
-
279
- expect(actor.getSnapshot().context.uploadError).toBe('SERVER_ERROR');
280
-
281
- actor.stop();
282
- });
283
- });