@dossier-wiki/cloud-sdk 0.1.0 → 0.2.0-staging.3dda5e6
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/README.md +697 -46
- package/dist/cjs/api.js +34 -0
- package/dist/cjs/api.js.map +1 -0
- package/dist/cjs/error.js +29 -0
- package/dist/cjs/error.js.map +1 -0
- package/dist/cjs/http.js +75 -0
- package/dist/cjs/http.js.map +1 -0
- package/dist/cjs/index.js +48 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/resources/aml.js +88 -0
- package/dist/cjs/resources/aml.js.map +1 -0
- package/dist/cjs/resources/documents.js +170 -0
- package/dist/cjs/resources/documents.js.map +1 -0
- package/dist/cjs/resources/form-templates.js +117 -0
- package/dist/cjs/resources/form-templates.js.map +1 -0
- package/dist/cjs/resources/kyc/index.js +32 -0
- package/dist/cjs/resources/kyc/index.js.map +1 -0
- package/dist/cjs/resources/kyc/sessions.js +103 -0
- package/dist/cjs/resources/kyc/sessions.js.map +1 -0
- package/dist/cjs/resources/kyc/workflows.js +150 -0
- package/dist/cjs/resources/kyc/workflows.js.map +1 -0
- package/dist/cjs/resources/media.js +62 -0
- package/dist/cjs/resources/media.js.map +1 -0
- package/dist/cjs/schemas/index.js +9 -0
- package/dist/cjs/schemas/index.js.map +1 -0
- package/dist/cjs/schemas/kyc/workflow-steps.js +145 -0
- package/dist/cjs/schemas/kyc/workflow-steps.js.map +1 -0
- package/dist/cjs/service.js +132 -0
- package/dist/cjs/service.js.map +1 -0
- package/dist/cjs/session.js +379 -0
- package/dist/cjs/session.js.map +1 -0
- package/dist/cjs/types.js +36 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/webhooks.js +93 -0
- package/dist/cjs/webhooks.js.map +1 -0
- package/dist/esm/api.js +33 -0
- package/dist/esm/api.js.map +1 -0
- package/dist/esm/error.js +25 -0
- package/dist/esm/error.js.map +1 -0
- package/dist/esm/http.js +71 -0
- package/dist/esm/http.js.map +1 -0
- package/dist/esm/index.js +19 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/resources/aml.js +84 -0
- package/dist/esm/resources/aml.js.map +1 -0
- package/dist/esm/resources/documents.js +166 -0
- package/dist/esm/resources/documents.js.map +1 -0
- package/dist/esm/resources/form-templates.js +113 -0
- package/dist/esm/resources/form-templates.js.map +1 -0
- package/dist/esm/resources/kyc/index.js +26 -0
- package/dist/esm/resources/kyc/index.js.map +1 -0
- package/dist/esm/resources/kyc/sessions.js +99 -0
- package/dist/esm/resources/kyc/sessions.js.map +1 -0
- package/dist/esm/resources/kyc/workflows.js +146 -0
- package/dist/esm/resources/kyc/workflows.js.map +1 -0
- package/dist/esm/resources/media.js +58 -0
- package/dist/esm/resources/media.js.map +1 -0
- package/dist/esm/schemas/index.js +2 -0
- package/dist/esm/schemas/index.js.map +1 -0
- package/dist/esm/schemas/kyc/workflow-steps.js +142 -0
- package/dist/esm/schemas/kyc/workflow-steps.js.map +1 -0
- package/dist/esm/service.js +127 -0
- package/dist/esm/service.js.map +1 -0
- package/dist/esm/session.js +375 -0
- package/dist/esm/session.js.map +1 -0
- package/dist/{types.js → esm/types.js} +11 -27
- package/dist/esm/types.js.map +1 -0
- package/dist/{webhooks.js → esm/webhooks.js} +10 -11
- package/dist/esm/webhooks.js.map +1 -0
- package/dist/{api.d.ts → types/api.d.ts} +297 -166
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/error.d.ts +24 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/http.d.ts +17 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/resources/aml.d.ts +79 -0
- package/dist/types/resources/aml.d.ts.map +1 -0
- package/dist/types/resources/documents.d.ts +153 -0
- package/dist/types/resources/documents.d.ts.map +1 -0
- package/dist/types/resources/form-templates.d.ts +104 -0
- package/dist/types/resources/form-templates.d.ts.map +1 -0
- package/dist/types/resources/kyc/index.d.ts +34 -0
- package/dist/types/resources/kyc/index.d.ts.map +1 -0
- package/dist/types/resources/kyc/sessions.d.ts +92 -0
- package/dist/types/resources/kyc/sessions.d.ts.map +1 -0
- package/dist/types/resources/kyc/workflows.d.ts +135 -0
- package/dist/types/resources/kyc/workflows.d.ts.map +1 -0
- package/dist/types/resources/media.d.ts +56 -0
- package/dist/types/resources/media.d.ts.map +1 -0
- package/dist/types/schemas/index.d.ts +3 -0
- package/dist/types/schemas/index.d.ts.map +1 -0
- package/dist/types/schemas/kyc/workflow-steps.d.ts +5113 -0
- package/dist/types/schemas/kyc/workflow-steps.d.ts.map +1 -0
- package/dist/types/service.d.ts +143 -0
- package/dist/types/service.d.ts.map +1 -0
- package/dist/types/session.d.ts +176 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/{types.d.ts → types/types.d.ts} +100 -2
- package/dist/types/types.d.ts.map +1 -0
- package/dist/{webhooks.d.ts → types/webhooks.d.ts} +5 -5
- package/dist/types/webhooks.d.ts.map +1 -0
- package/package.json +26 -32
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -22
- package/dist/api.js.map +0 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -5
- package/dist/index.js.map +0 -1
- package/dist/service.d.ts +0 -39
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -150
- package/dist/service.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/webhooks.d.ts.map +0 -1
- package/dist/webhooks.js.map +0 -1
- package/docs/REFERENCE.md +0 -114
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { DossiersAPIError } from './error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Customer-facing KYC session client.
|
|
4
|
+
*
|
|
5
|
+
* Use this in onboarding / customer applications to drive the KYC flow.
|
|
6
|
+
* Handles payload encryption, multipart media uploads, and the session JWT
|
|
7
|
+
* automatically — so callers work with plain TypeScript objects.
|
|
8
|
+
*
|
|
9
|
+
* Unlike `DossiersAPIService` (which uses an org-level API key), this class
|
|
10
|
+
* authenticates as the session's customer using a short-lived JWT.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // Server side: create a session and get the token
|
|
14
|
+
* const result = await adminService.kyc.sessions.create({ workflowId: 'wf_abc' });
|
|
15
|
+
*
|
|
16
|
+
* // Client side (onboarding app)
|
|
17
|
+
* const session = DossiersKycSession.from(result, {
|
|
18
|
+
* encryptionKey: process.env.KYC_PAYLOAD_ENCRYPTION_KEY,
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* const state = await session.getState();
|
|
22
|
+
* const attempt = await session.createAttempt();
|
|
23
|
+
* await session.uploadMedia(attempt.id, {
|
|
24
|
+
* file: capturedBlob,
|
|
25
|
+
* mediaType: 'document-front',
|
|
26
|
+
* mimeType: 'image/jpeg',
|
|
27
|
+
* filename: 'front.jpg',
|
|
28
|
+
* });
|
|
29
|
+
*/
|
|
30
|
+
export class DossiersKycSession {
|
|
31
|
+
constructor(options) {
|
|
32
|
+
this.sessionId = options.sessionId;
|
|
33
|
+
this.token = options.token;
|
|
34
|
+
this.encryptionKey = options.encryptionKey;
|
|
35
|
+
this.baseUrl = options.baseUrl ?? 'https://api.dossiers.wiki';
|
|
36
|
+
this.fetchImpl = options.fetch ?? globalThis.fetch;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a `DossiersKycSession` from the result of
|
|
40
|
+
* `DossiersAPIService.kyc.sessions.create()`.
|
|
41
|
+
*/
|
|
42
|
+
static from(result, opts) {
|
|
43
|
+
return new DossiersKycSession({
|
|
44
|
+
sessionId: result.session.id,
|
|
45
|
+
token: result.token,
|
|
46
|
+
encryptionKey: opts.encryptionKey,
|
|
47
|
+
baseUrl: opts.baseUrl,
|
|
48
|
+
fetch: opts.fetch,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// ── Internal helpers ──────────────────────────────────────────────────────
|
|
52
|
+
sessionUrl(suffix = '', params) {
|
|
53
|
+
const u = new URL(`${this.baseUrl}/api/session/${this.sessionId}${suffix}`);
|
|
54
|
+
u.searchParams.set('token', this.token);
|
|
55
|
+
if (params) {
|
|
56
|
+
for (const [k, v] of Object.entries(params))
|
|
57
|
+
u.searchParams.set(k, v);
|
|
58
|
+
}
|
|
59
|
+
return u.toString();
|
|
60
|
+
}
|
|
61
|
+
attemptUrl(attemptId, suffix = '') {
|
|
62
|
+
const u = new URL(`${this.baseUrl}/api/session/${this.sessionId}/attempt/${attemptId}${suffix}`);
|
|
63
|
+
u.searchParams.set('token', this.token);
|
|
64
|
+
return u.toString();
|
|
65
|
+
}
|
|
66
|
+
get authHeaders() {
|
|
67
|
+
return { Authorization: `Bearer ${this.token}` };
|
|
68
|
+
}
|
|
69
|
+
async doFetch(url, init) {
|
|
70
|
+
const res = await this.fetchImpl(url, init);
|
|
71
|
+
const raw = await res.text();
|
|
72
|
+
const parsed = raw.length > 0 ? safeJsonParse(raw) : undefined;
|
|
73
|
+
if (!res.ok) {
|
|
74
|
+
const message = (parsed && typeof parsed === 'object' && 'message' in parsed
|
|
75
|
+
? String(parsed.message)
|
|
76
|
+
: null) ?? `KYC session ${init.method ?? 'GET'} failed: ${res.status}`;
|
|
77
|
+
throw new DossiersAPIError(res.status, message, parsed ?? raw);
|
|
78
|
+
}
|
|
79
|
+
return parsed;
|
|
80
|
+
}
|
|
81
|
+
get(url) {
|
|
82
|
+
return this.doFetch(url, {
|
|
83
|
+
method: 'GET',
|
|
84
|
+
headers: { ...this.authHeaders, Accept: 'application/json' },
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
post(url, body) {
|
|
88
|
+
return this.doFetch(url, {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers: {
|
|
91
|
+
...this.authHeaders,
|
|
92
|
+
Accept: 'application/json',
|
|
93
|
+
...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
94
|
+
},
|
|
95
|
+
body,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
patch(url, body) {
|
|
99
|
+
return this.doFetch(url, {
|
|
100
|
+
method: 'PATCH',
|
|
101
|
+
headers: {
|
|
102
|
+
...this.authHeaders,
|
|
103
|
+
'Content-Type': 'application/json',
|
|
104
|
+
Accept: 'application/json',
|
|
105
|
+
},
|
|
106
|
+
body,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async postEncrypted(url, data) {
|
|
110
|
+
const payload = await aesEncrypt(data, this.encryptionKey);
|
|
111
|
+
return this.post(url, JSON.stringify({ payload }));
|
|
112
|
+
}
|
|
113
|
+
// ── Session state ─────────────────────────────────────────────────────────
|
|
114
|
+
/**
|
|
115
|
+
* Retrieve the full session state: workflow snapshot, step preview data,
|
|
116
|
+
* and user progress checkpoint.
|
|
117
|
+
*/
|
|
118
|
+
getState() {
|
|
119
|
+
return this.get(this.sessionUrl());
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Retrieve lightweight session status. Cheaper than `getState()` — use this
|
|
123
|
+
* to poll session validity, completion, and expiry without fetching all data.
|
|
124
|
+
*/
|
|
125
|
+
getStatus() {
|
|
126
|
+
return this.get(this.sessionUrl('/status'));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Retrieve which tab or user currently holds the session activation lock.
|
|
130
|
+
*/
|
|
131
|
+
getOwner() {
|
|
132
|
+
return this.get(this.sessionUrl('/owner'));
|
|
133
|
+
}
|
|
134
|
+
// ── Tab activation ────────────────────────────────────────────────────────
|
|
135
|
+
/**
|
|
136
|
+
* Claim the session for the given tab. Throws `DossiersAPIError` with status
|
|
137
|
+
* 409 if the session is already active in another tab (unless `force` is true).
|
|
138
|
+
*
|
|
139
|
+
* @param tabId Unique identifier for this browser tab or device.
|
|
140
|
+
* @param force Evict the current holder and take ownership.
|
|
141
|
+
*/
|
|
142
|
+
async activate(tabId, force = false) {
|
|
143
|
+
await this.postEncrypted(this.sessionUrl('/activate', force ? { force: 'true' } : undefined), { tabId });
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Release the session activation lock for the given tab.
|
|
147
|
+
*
|
|
148
|
+
* @param tabId The tab ID to deactivate (passed as a query parameter).
|
|
149
|
+
*/
|
|
150
|
+
deactivate(tabId) {
|
|
151
|
+
return this.post(this.sessionUrl('/deactivate', { tabId }));
|
|
152
|
+
}
|
|
153
|
+
// ── Session mutations ─────────────────────────────────────────────────────
|
|
154
|
+
/**
|
|
155
|
+
* Update the session's user progress checkpoint.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* await session.update({ checkpoint: 'dv-document-selection' });
|
|
159
|
+
*/
|
|
160
|
+
async update(data) {
|
|
161
|
+
const payload = await aesEncrypt(data, this.encryptionKey);
|
|
162
|
+
return this.patch(this.sessionUrl(), JSON.stringify({ payload }));
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Mark the session as complete. Call this after all required workflow steps pass.
|
|
166
|
+
*/
|
|
167
|
+
complete() {
|
|
168
|
+
return this.post(this.sessionUrl('/complete'));
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Submit form data for a form collection workflow step.
|
|
172
|
+
*
|
|
173
|
+
* @param stepId Workflow step ID (from the workflow snapshot).
|
|
174
|
+
* @param formData Key-value map of form field IDs to submitted values.
|
|
175
|
+
* @param unordered Skip step-ordering enforcement when `true`.
|
|
176
|
+
*/
|
|
177
|
+
submitFormStep(stepId, formData, unordered = false) {
|
|
178
|
+
return this.postEncrypted(this.sessionUrl('/form-step', unordered ? { unordered: 'true' } : undefined), { stepId, formData });
|
|
179
|
+
}
|
|
180
|
+
// ── Attempts ──────────────────────────────────────────────────────────────
|
|
181
|
+
/**
|
|
182
|
+
* Create a new verification attempt. Each document capture or liveness check
|
|
183
|
+
* starts a fresh attempt.
|
|
184
|
+
*/
|
|
185
|
+
createAttempt() {
|
|
186
|
+
return this.post(this.sessionUrl('/attempt'));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Append telemetry events to an attempt. Used to record UI events, errors,
|
|
190
|
+
* and timing data for fraud detection and audit logs.
|
|
191
|
+
*
|
|
192
|
+
* @param attemptId The attempt ID from `createAttempt()`.
|
|
193
|
+
* @param events Array of event objects with `category`, `description`,
|
|
194
|
+
* `timestamp` (Unix ms), and optionally `currentState`.
|
|
195
|
+
*/
|
|
196
|
+
appendEvents(attemptId, events) {
|
|
197
|
+
return this.postEncrypted(this.attemptUrl(attemptId, '/events'), events);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Upload a media file to an attempt using `multipart/form-data`.
|
|
201
|
+
*
|
|
202
|
+
* Do not set `Content-Type` manually — it is set automatically by
|
|
203
|
+
* `FormData` with the correct boundary.
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* const attempt = await session.createAttempt();
|
|
207
|
+
* const media = await session.uploadMedia(attempt.id, {
|
|
208
|
+
* file: capturedBlob,
|
|
209
|
+
* mediaType: 'document-front',
|
|
210
|
+
* mimeType: 'image/jpeg',
|
|
211
|
+
* filename: 'front.jpg',
|
|
212
|
+
* stepId: 'id-verification',
|
|
213
|
+
* });
|
|
214
|
+
*/
|
|
215
|
+
async uploadMedia(attemptId, input) {
|
|
216
|
+
const form = new FormData();
|
|
217
|
+
form.append('file', input.file, input.filename);
|
|
218
|
+
form.append('mediaType', input.mediaType);
|
|
219
|
+
if (input.selectedDocumentTypeId) {
|
|
220
|
+
form.append('selectedDocumentTypeId', input.selectedDocumentTypeId);
|
|
221
|
+
}
|
|
222
|
+
if (input.stepId)
|
|
223
|
+
form.append('stepId', input.stepId);
|
|
224
|
+
if (input.metadata)
|
|
225
|
+
form.append('metadata', JSON.stringify(input.metadata));
|
|
226
|
+
return this.doFetch(this.attemptUrl(attemptId, '/media'), {
|
|
227
|
+
method: 'POST',
|
|
228
|
+
headers: this.authHeaders,
|
|
229
|
+
body: form,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Upload random liveness frames for anti-spoofing checks.
|
|
234
|
+
* Frames are appended to the attempt — existing frames are never replaced.
|
|
235
|
+
*
|
|
236
|
+
* @param attemptId The attempt ID.
|
|
237
|
+
* @param frames Base64-encoded JPEG strings (data URLs or raw base64).
|
|
238
|
+
*/
|
|
239
|
+
uploadRandomFrames(attemptId, frames) {
|
|
240
|
+
return this.postEncrypted(this.attemptUrl(attemptId, '/random-frames'), { frames });
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Retrieve all media items associated with an attempt.
|
|
244
|
+
*/
|
|
245
|
+
getAttemptMedia(attemptId) {
|
|
246
|
+
return this.get(this.attemptUrl(attemptId, '/media'));
|
|
247
|
+
}
|
|
248
|
+
// ── Aadhaar verification ──────────────────────────────────────────────────
|
|
249
|
+
/**
|
|
250
|
+
* Initiate Aadhaar OTP generation for a 12-digit Aadhaar number.
|
|
251
|
+
* Returns a `referenceId` to pass to `verifyAadhaarOtp()`.
|
|
252
|
+
*/
|
|
253
|
+
generateAadhaarOtp(aadhaarNumber) {
|
|
254
|
+
return this.postEncrypted(this.sessionUrl('/aadhaar/generate-otp'), { aadhaarNumber });
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Verify the OTP received on the Aadhaar-registered mobile number.
|
|
258
|
+
*
|
|
259
|
+
* @param otp The 6-digit OTP from the SMS.
|
|
260
|
+
* @param referenceId The `referenceId` returned by `generateAadhaarOtp()`.
|
|
261
|
+
*/
|
|
262
|
+
verifyAadhaarOtp(otp, referenceId) {
|
|
263
|
+
return this.postEncrypted(this.sessionUrl('/aadhaar/verify-otp'), { otp, referenceId });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// ── CryptoJS-compatible AES-CBC encryption ────────────────────────────────
|
|
267
|
+
//
|
|
268
|
+
// Produces output matching CryptoJS.AES.encrypt(JSON.stringify(data), passphrase).toString()
|
|
269
|
+
// so the server can decrypt with CryptoJS.AES.decrypt(payload, KYC_PAYLOAD_DECRYPTION_KEY).
|
|
270
|
+
//
|
|
271
|
+
// Uses Web Crypto (available in Node.js 18+ and all modern browsers) plus an
|
|
272
|
+
// inline MD5 implementation for EVP_BytesToKey — no additional dependencies.
|
|
273
|
+
//
|
|
274
|
+
// Output format: base64("Salted__" + 8-byte-salt + AES-256-CBC-ciphertext)
|
|
275
|
+
async function aesEncrypt(data, passphrase) {
|
|
276
|
+
const enc = new TextEncoder();
|
|
277
|
+
const salt = globalThis.crypto.getRandomValues(new Uint8Array(8));
|
|
278
|
+
const { key, iv } = evpBytesToKey(enc.encode(passphrase), salt);
|
|
279
|
+
const cryptoKey = await globalThis.crypto.subtle.importKey('raw', key, { name: 'AES-CBC' }, false, ['encrypt']);
|
|
280
|
+
const ciphertext = new Uint8Array(await globalThis.crypto.subtle.encrypt({ name: 'AES-CBC', iv }, cryptoKey, enc.encode(JSON.stringify(data))));
|
|
281
|
+
const out = new Uint8Array(16 + ciphertext.length);
|
|
282
|
+
out.set([83, 97, 108, 116, 101, 100, 95, 95], 0); // "Salted__"
|
|
283
|
+
out.set(salt, 8);
|
|
284
|
+
out.set(ciphertext, 16);
|
|
285
|
+
return btoa(Array.from(out, b => String.fromCharCode(b)).join(''));
|
|
286
|
+
}
|
|
287
|
+
// EVP_BytesToKey: CryptoJS's key+IV derivation from a passphrase and salt.
|
|
288
|
+
// Iterates: D_n = MD5(D_{n-1} || passphrase || salt) until 48 bytes collected.
|
|
289
|
+
// key = first 32 bytes, iv = next 16 bytes.
|
|
290
|
+
function evpBytesToKey(pass, salt) {
|
|
291
|
+
const material = [];
|
|
292
|
+
let prev = new Uint8Array(0);
|
|
293
|
+
while (material.length < 48) {
|
|
294
|
+
const block = new Uint8Array([...prev, ...pass, ...salt]);
|
|
295
|
+
prev = md5(block);
|
|
296
|
+
material.push(...prev);
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
key: new Uint8Array(material.slice(0, 32)),
|
|
300
|
+
iv: new Uint8Array(material.slice(32, 48)),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
// RFC 1321 MD5 — compact implementation for EVP_BytesToKey.
|
|
304
|
+
// Only used internally; not exported.
|
|
305
|
+
const MD5_S = [
|
|
306
|
+
7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
|
|
307
|
+
5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
|
|
308
|
+
4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
|
|
309
|
+
6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,
|
|
310
|
+
];
|
|
311
|
+
const MD5_K = Array.from({ length: 64 }, (_, i) => Math.floor(Math.abs(Math.sin(i + 1)) * 2 ** 32) >>> 0);
|
|
312
|
+
function md5(data) {
|
|
313
|
+
const r = data.length % 64;
|
|
314
|
+
const padZeros = (55 - r + 64) % 64;
|
|
315
|
+
const padded = new Uint8Array(data.length + 1 + padZeros + 8);
|
|
316
|
+
padded.set(data);
|
|
317
|
+
padded[data.length] = 0x80;
|
|
318
|
+
const dv = new DataView(padded.buffer);
|
|
319
|
+
const bitLen = data.length * 8;
|
|
320
|
+
dv.setUint32(padded.length - 8, bitLen >>> 0, true);
|
|
321
|
+
dv.setUint32(padded.length - 4, Math.floor(bitLen / 2 ** 32), true);
|
|
322
|
+
let h0 = 0x67452301;
|
|
323
|
+
let h1 = 0xefcdab89;
|
|
324
|
+
let h2 = 0x98badcfe;
|
|
325
|
+
let h3 = 0x10325476;
|
|
326
|
+
for (let i = 0; i < padded.length; i += 64) {
|
|
327
|
+
const M = Array.from({ length: 16 }, (_, j) => dv.getUint32(i + j * 4, true));
|
|
328
|
+
let a = h0, b = h1, c = h2, d = h3;
|
|
329
|
+
for (let j = 0; j < 64; j++) {
|
|
330
|
+
let f, g;
|
|
331
|
+
if (j < 16) {
|
|
332
|
+
f = (b & c) | (~b & d);
|
|
333
|
+
g = j;
|
|
334
|
+
}
|
|
335
|
+
else if (j < 32) {
|
|
336
|
+
f = (d & b) | (~d & c);
|
|
337
|
+
g = (5 * j + 1) % 16;
|
|
338
|
+
}
|
|
339
|
+
else if (j < 48) {
|
|
340
|
+
f = b ^ c ^ d;
|
|
341
|
+
g = (3 * j + 5) % 16;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
f = c ^ (b | ~d);
|
|
345
|
+
g = (7 * j) % 16;
|
|
346
|
+
}
|
|
347
|
+
const t = (a + (f >>> 0) + MD5_K[j] + M[g]) >>> 0;
|
|
348
|
+
const s = MD5_S[j];
|
|
349
|
+
a = d;
|
|
350
|
+
d = c;
|
|
351
|
+
c = b;
|
|
352
|
+
b = (b + ((t << s) | (t >>> (32 - s)))) >>> 0;
|
|
353
|
+
}
|
|
354
|
+
h0 = (h0 + a) >>> 0;
|
|
355
|
+
h1 = (h1 + b) >>> 0;
|
|
356
|
+
h2 = (h2 + c) >>> 0;
|
|
357
|
+
h3 = (h3 + d) >>> 0;
|
|
358
|
+
}
|
|
359
|
+
const result = new Uint8Array(16);
|
|
360
|
+
const rv = new DataView(result.buffer);
|
|
361
|
+
rv.setUint32(0, h0, true);
|
|
362
|
+
rv.setUint32(4, h1, true);
|
|
363
|
+
rv.setUint32(8, h2, true);
|
|
364
|
+
rv.setUint32(12, h3, true);
|
|
365
|
+
return result;
|
|
366
|
+
}
|
|
367
|
+
function safeJsonParse(raw) {
|
|
368
|
+
try {
|
|
369
|
+
return JSON.parse(raw);
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return raw;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +1,3 @@
|
|
|
1
|
-
/*
|
|
2
|
-
WEBHOOK EVENTS (https://docs.dossiers.wiki/webhooks):
|
|
3
|
-
|
|
4
|
-
// document verification
|
|
5
|
-
documentVerification.instance.created A new processing instance has been created
|
|
6
|
-
documentVerification.instance.updated The instance status or result has changed
|
|
7
|
-
documentVerification.instance.completed Processing finished successfully (terminal updated)
|
|
8
|
-
documentVerification.instance.deleted The instance has been deleted
|
|
9
|
-
|
|
10
|
-
// aml screening
|
|
11
|
-
amlScreening.screeningRequest.created Screening request submitted
|
|
12
|
-
amlScreening.screeningRequest.completed Screening finished
|
|
13
|
-
amlScreening.screeningAlert.triggered High-risk match found
|
|
14
|
-
amlScreening.screeningAlert.statusChanged Alert status updated
|
|
15
|
-
amlScreening.screeningAlert.commentAdded Comment added to an alert
|
|
16
|
-
amlScreening.screeningAlert.commentDeleted Comment removed from an alert
|
|
17
|
-
amlScreening.screeningAlert.deleted Alert deleted
|
|
18
|
-
|
|
19
|
-
// system
|
|
20
|
-
system.testEvent Test event for verifying webhook connectivity
|
|
21
|
-
system.product.accessGranted Product enabled for the organization
|
|
22
|
-
system.product.accessRevoked Product disabled for the organization
|
|
23
|
-
system.apiKey.created API key created
|
|
24
|
-
system.apiKey.invalidated API key revoked
|
|
25
|
-
system.usage.limitReached Credit limit reached
|
|
26
|
-
system.usage.limitWarning Approaching credit limit
|
|
27
|
-
*/
|
|
28
1
|
export var DossiersWebhookEventTypes;
|
|
29
2
|
(function (DossiersWebhookEventTypes) {
|
|
30
3
|
DossiersWebhookEventTypes["DOCUMENT_VERIFICATION_INSTANCE_CREATED"] = "documentVerification.instance.created";
|
|
@@ -36,8 +9,19 @@ export var DossiersWebhookEventTypes;
|
|
|
36
9
|
DossiersWebhookEventTypes["AML_SCREENING_ALERT_TRIGGERED"] = "amlScreening.screeningAlert.triggered";
|
|
37
10
|
DossiersWebhookEventTypes["AML_SCREENING_ALERT_STATUS_CHANGED"] = "amlScreening.screeningAlert.statusChanged";
|
|
38
11
|
DossiersWebhookEventTypes["AML_SCREENING_ALERT_COMMENT_ADDED"] = "amlScreening.screeningAlert.commentAdded";
|
|
12
|
+
DossiersWebhookEventTypes["AML_SCREENING_ALERT_COMMENT_UPDATED"] = "amlScreening.screeningAlert.commentUpdated";
|
|
39
13
|
DossiersWebhookEventTypes["AML_SCREENING_ALERT_COMMENT_DELETED"] = "amlScreening.screeningAlert.commentDeleted";
|
|
40
14
|
DossiersWebhookEventTypes["AML_SCREENING_ALERT_DELETED"] = "amlScreening.screeningAlert.deleted";
|
|
15
|
+
DossiersWebhookEventTypes["KYC_SESSION_CREATED"] = "kycSessions.session.created";
|
|
16
|
+
DossiersWebhookEventTypes["KYC_SESSION_UPDATED"] = "kycSessions.session.updated";
|
|
17
|
+
DossiersWebhookEventTypes["KYC_SESSION_COMPLETED"] = "kycSessions.session.completed";
|
|
18
|
+
DossiersWebhookEventTypes["KYC_SESSION_REVIEWED"] = "kycSessions.session.reviewed";
|
|
19
|
+
DossiersWebhookEventTypes["KYC_SESSION_DELETED"] = "kycSessions.session.deleted";
|
|
20
|
+
DossiersWebhookEventTypes["KYC_STEP_COMPLETED"] = "kycSessions.step.completed";
|
|
21
|
+
DossiersWebhookEventTypes["KYC_STEP_FAILED"] = "kycSessions.step.failed";
|
|
22
|
+
DossiersWebhookEventTypes["KYC_SESSION_COMMENT_ADDED"] = "kycSessions.session.commentAdded";
|
|
23
|
+
DossiersWebhookEventTypes["KYC_SESSION_COMMENT_UPDATED"] = "kycSessions.session.commentUpdated";
|
|
24
|
+
DossiersWebhookEventTypes["KYC_SESSION_COMMENT_DELETED"] = "kycSessions.session.commentDeleted";
|
|
41
25
|
DossiersWebhookEventTypes["SYSTEM_TEST_EVENT"] = "system.testEvent";
|
|
42
26
|
DossiersWebhookEventTypes["SYSTEM_PRODUCT_ACCESS_GRANTED"] = "system.product.accessGranted";
|
|
43
27
|
DossiersWebhookEventTypes["SYSTEM_PRODUCT_ACCESS_REVOKED"] = "system.product.accessRevoked";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,yBAiCX;AAjCD,WAAY,yBAAyB;IACjC,6GAAgF,CAAA;IAChF,6GAAgF,CAAA;IAChF,iHAAoF,CAAA;IACpF,6GAAgF,CAAA;IAEhF,oGAAuE,CAAA;IACvE,wGAA2E,CAAA;IAC3E,oGAAuE,CAAA;IACvE,6GAAgF,CAAA;IAChF,2GAA8E,CAAA;IAC9E,+GAAkF,CAAA;IAClF,+GAAkF,CAAA;IAClF,gGAAmE,CAAA;IAEnE,gFAAmD,CAAA;IACnD,gFAAmD,CAAA;IACnD,oFAAuD,CAAA;IACvD,kFAAqD,CAAA;IACrD,gFAAmD,CAAA;IACnD,8EAAiD,CAAA;IACjD,wEAA2C,CAAA;IAC3C,2FAA8D,CAAA;IAC9D,+FAAkE,CAAA;IAClE,+FAAkE,CAAA;IAElE,mEAAsC,CAAA;IACtC,2FAA8D,CAAA;IAC9D,2FAA8D,CAAA;IAC9D,6EAAgD,CAAA;IAChD,qFAAwD,CAAA;IACxD,qFAAwD,CAAA;IACxD,qFAAwD,CAAA;AAC5D,CAAC,EAjCW,yBAAyB,KAAzB,yBAAyB,QAiCpC"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
import { DossiersWebhookEventTypes } from './types';
|
|
1
|
+
import { DossiersWebhookEventTypes } from './types.js';
|
|
2
2
|
export class DossiersWebhookRouter {
|
|
3
|
-
static encoder = new TextEncoder();
|
|
4
|
-
static SIGNATURE_HEADER = 'x-webhook-signature';
|
|
5
|
-
static EVENT_ID_HEADER = 'x-webhook-event-id';
|
|
6
|
-
static EVENT_TYPE_HEADER = 'x-webhook-event-type';
|
|
7
|
-
static RETRY_COUNT_HEADER = 'x-webhook-retry-count';
|
|
8
|
-
keyPromise;
|
|
9
|
-
handlers = new Map();
|
|
10
3
|
constructor(secret) {
|
|
4
|
+
this.handlers = new Map();
|
|
11
5
|
this.keyPromise = crypto.subtle.importKey('raw', DossiersWebhookRouter.encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
12
6
|
}
|
|
13
7
|
on(eventType, handler) {
|
|
@@ -17,11 +11,11 @@ export class DossiersWebhookRouter {
|
|
|
17
11
|
/**
|
|
18
12
|
* Verify the signature and acknowledge the webhook with `200 ok` *before*
|
|
19
13
|
* the handler runs. The handler is dispatched asynchronously so a slow
|
|
20
|
-
* downstream call cannot cause
|
|
14
|
+
* downstream call cannot cause a timeout and retry.
|
|
21
15
|
*
|
|
22
16
|
* Trade-off: because we ack before the handler executes, a handler that
|
|
23
|
-
* throws will NOT trigger an automatic
|
|
24
|
-
*
|
|
17
|
+
* throws will NOT trigger an automatic retry — you own retries inside the
|
|
18
|
+
* handler. Failures are logged via `console.error`.
|
|
25
19
|
*
|
|
26
20
|
* On serverless runtimes that freeze execution after the response is sent
|
|
27
21
|
* (Vercel Functions, Cloudflare Workers), pass `opts.waitUntil` so the
|
|
@@ -87,4 +81,9 @@ export class DossiersWebhookRouter {
|
|
|
87
81
|
return mismatch === 0;
|
|
88
82
|
}
|
|
89
83
|
}
|
|
84
|
+
DossiersWebhookRouter.encoder = new TextEncoder();
|
|
85
|
+
DossiersWebhookRouter.SIGNATURE_HEADER = 'x-webhook-signature';
|
|
86
|
+
DossiersWebhookRouter.EVENT_ID_HEADER = 'x-webhook-event-id';
|
|
87
|
+
DossiersWebhookRouter.EVENT_TYPE_HEADER = 'x-webhook-event-type';
|
|
88
|
+
DossiersWebhookRouter.RETRY_COUNT_HEADER = 'x-webhook-retry-count';
|
|
90
89
|
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"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"}
|