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