@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.
- package/dist/Manager-6BwbaI_H.d.ts +19 -0
- package/dist/StateMachine-7c1gcu94.d.ts +2 -0
- package/dist/addEvent-1Mi5CEiq.esm.js +16 -0
- package/dist/chunk-C_Yo44FK.esm.js +49 -0
- package/dist/email.d.ts +264 -0
- package/dist/email.esm.js +479 -0
- package/dist/endpoints-D_pUMaqA.esm.js +1701 -0
- package/dist/flow.d.ts +578 -0
- package/dist/flow.esm.js +628 -0
- package/dist/index.d.ts +226 -0
- package/dist/index.esm.js +155 -0
- package/dist/lib-CyIAFRfr.esm.js +12499 -0
- package/dist/permissionServices-CVR0Pq38.esm.js +72 -0
- package/dist/phone.d.ts +292 -0
- package/dist/phone.esm.js +550 -0
- package/dist/selfie.d.ts +758 -0
- package/dist/selfie.esm.js +978 -0
- package/dist/types-tq1ypYSL.d.ts +5 -0
- package/dist/warmup-Dr7OcFND.d.ts +55 -0
- package/dist/xstate.esm-B_rda9yU.esm.js +3261 -0
- package/package.json +14 -11
- package/src/camera/cameraActor.ts +0 -21
- package/src/camera/cameraService.test.ts +0 -437
- package/src/camera/cameraService.ts +0 -165
- package/src/camera/cameraServices.test.ts +0 -66
- package/src/camera/cameraServices.ts +0 -26
- package/src/camera/cameraStateMachine.test.ts +0 -602
- package/src/camera/cameraStateMachine.ts +0 -264
- package/src/camera/index.ts +0 -5
- package/src/camera/types.ts +0 -17
- package/src/device/getBrowser.ts +0 -31
- package/src/device/getDeviceClass.ts +0 -29
- package/src/device/index.ts +0 -2
- package/src/email/__mocks__/emailMocks.ts +0 -59
- package/src/email/emailActor.ts +0 -15
- package/src/email/emailManager.test.ts +0 -573
- package/src/email/emailManager.ts +0 -427
- package/src/email/emailServices.ts +0 -66
- package/src/email/emailStateMachine.test.ts +0 -741
- package/src/email/emailStateMachine.ts +0 -367
- package/src/email/index.ts +0 -39
- package/src/email/types.ts +0 -60
- package/src/events/addEvent.ts +0 -20
- package/src/events/types.ts +0 -7
- package/src/flow/__mocks__/flowMocks.ts +0 -84
- package/src/flow/flowActor.ts +0 -13
- package/src/flow/flowAnalyzer.test.ts +0 -266
- package/src/flow/flowAnalyzer.ts +0 -37
- package/src/flow/flowCompletionService.ts +0 -21
- package/src/flow/flowManager.test.ts +0 -560
- package/src/flow/flowManager.ts +0 -235
- package/src/flow/flowServices.test.ts +0 -109
- package/src/flow/flowServices.ts +0 -13
- package/src/flow/flowStateMachine.test.ts +0 -334
- package/src/flow/flowStateMachine.ts +0 -182
- package/src/flow/index.ts +0 -21
- package/src/flow/moduleLoader.test.ts +0 -136
- package/src/flow/moduleLoader.ts +0 -73
- package/src/flow/orchestratedFlowManager.test.ts +0 -240
- package/src/flow/orchestratedFlowManager.ts +0 -231
- package/src/flow/orchestratedFlowStateMachine.test.ts +0 -199
- package/src/flow/orchestratedFlowStateMachine.ts +0 -325
- package/src/flow/types.ts +0 -434
- package/src/http/__mocks__/api.ts +0 -88
- package/src/http/api.test.ts +0 -231
- package/src/http/api.ts +0 -90
- package/src/http/endpoints.ts +0 -17
- package/src/index.ts +0 -33
- package/src/permissions/index.ts +0 -2
- package/src/permissions/permissionServices.ts +0 -31
- package/src/permissions/types.ts +0 -3
- package/src/phone/__mocks__/phoneMocks.ts +0 -71
- package/src/phone/index.ts +0 -39
- package/src/phone/phoneActor.ts +0 -15
- package/src/phone/phoneManager.test.ts +0 -393
- package/src/phone/phoneManager.ts +0 -458
- package/src/phone/phoneServices.ts +0 -98
- package/src/phone/phoneStateMachine.test.ts +0 -918
- package/src/phone/phoneStateMachine.ts +0 -422
- package/src/phone/types.ts +0 -83
- package/src/recordings/recordingsRepository.test.ts +0 -87
- package/src/recordings/recordingsRepository.ts +0 -48
- package/src/recordings/streamingEvents.ts +0 -10
- package/src/selfie/__mocks__/selfieMocks.ts +0 -26
- package/src/selfie/index.ts +0 -14
- package/src/selfie/selfieActor.ts +0 -17
- package/src/selfie/selfieErrorUtils.test.ts +0 -116
- package/src/selfie/selfieErrorUtils.ts +0 -66
- package/src/selfie/selfieManager.test.ts +0 -297
- package/src/selfie/selfieManager.ts +0 -301
- package/src/selfie/selfieServices.ts +0 -362
- package/src/selfie/selfieStateMachine.test.ts +0 -283
- package/src/selfie/selfieStateMachine.ts +0 -804
- package/src/selfie/selfieUploadService.test.ts +0 -90
- package/src/selfie/selfieUploadService.ts +0 -81
- package/src/selfie/types.ts +0 -103
- package/src/session/index.ts +0 -5
- package/src/session/sessionService.ts +0 -78
- package/src/setup.test.ts +0 -61
- package/src/setup.ts +0 -171
- package/tsconfig.json +0 -13
- package/tsdown.config.ts +0 -22
- package/vitest.config.ts +0 -37
- 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
|
-
});
|