@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.
Files changed (120) hide show
  1. package/README.md +697 -46
  2. package/dist/cjs/api.js +34 -0
  3. package/dist/cjs/api.js.map +1 -0
  4. package/dist/cjs/error.js +29 -0
  5. package/dist/cjs/error.js.map +1 -0
  6. package/dist/cjs/http.js +75 -0
  7. package/dist/cjs/http.js.map +1 -0
  8. package/dist/cjs/index.js +48 -0
  9. package/dist/cjs/index.js.map +1 -0
  10. package/dist/cjs/resources/aml.js +88 -0
  11. package/dist/cjs/resources/aml.js.map +1 -0
  12. package/dist/cjs/resources/documents.js +170 -0
  13. package/dist/cjs/resources/documents.js.map +1 -0
  14. package/dist/cjs/resources/form-templates.js +117 -0
  15. package/dist/cjs/resources/form-templates.js.map +1 -0
  16. package/dist/cjs/resources/kyc/index.js +32 -0
  17. package/dist/cjs/resources/kyc/index.js.map +1 -0
  18. package/dist/cjs/resources/kyc/sessions.js +103 -0
  19. package/dist/cjs/resources/kyc/sessions.js.map +1 -0
  20. package/dist/cjs/resources/kyc/workflows.js +150 -0
  21. package/dist/cjs/resources/kyc/workflows.js.map +1 -0
  22. package/dist/cjs/resources/media.js +62 -0
  23. package/dist/cjs/resources/media.js.map +1 -0
  24. package/dist/cjs/schemas/index.js +9 -0
  25. package/dist/cjs/schemas/index.js.map +1 -0
  26. package/dist/cjs/schemas/kyc/workflow-steps.js +145 -0
  27. package/dist/cjs/schemas/kyc/workflow-steps.js.map +1 -0
  28. package/dist/cjs/service.js +132 -0
  29. package/dist/cjs/service.js.map +1 -0
  30. package/dist/cjs/session.js +379 -0
  31. package/dist/cjs/session.js.map +1 -0
  32. package/dist/cjs/types.js +36 -0
  33. package/dist/cjs/types.js.map +1 -0
  34. package/dist/cjs/webhooks.js +93 -0
  35. package/dist/cjs/webhooks.js.map +1 -0
  36. package/dist/esm/api.js +33 -0
  37. package/dist/esm/api.js.map +1 -0
  38. package/dist/esm/error.js +25 -0
  39. package/dist/esm/error.js.map +1 -0
  40. package/dist/esm/http.js +71 -0
  41. package/dist/esm/http.js.map +1 -0
  42. package/dist/esm/index.js +19 -0
  43. package/dist/esm/index.js.map +1 -0
  44. package/dist/esm/resources/aml.js +84 -0
  45. package/dist/esm/resources/aml.js.map +1 -0
  46. package/dist/esm/resources/documents.js +166 -0
  47. package/dist/esm/resources/documents.js.map +1 -0
  48. package/dist/esm/resources/form-templates.js +113 -0
  49. package/dist/esm/resources/form-templates.js.map +1 -0
  50. package/dist/esm/resources/kyc/index.js +26 -0
  51. package/dist/esm/resources/kyc/index.js.map +1 -0
  52. package/dist/esm/resources/kyc/sessions.js +99 -0
  53. package/dist/esm/resources/kyc/sessions.js.map +1 -0
  54. package/dist/esm/resources/kyc/workflows.js +146 -0
  55. package/dist/esm/resources/kyc/workflows.js.map +1 -0
  56. package/dist/esm/resources/media.js +58 -0
  57. package/dist/esm/resources/media.js.map +1 -0
  58. package/dist/esm/schemas/index.js +2 -0
  59. package/dist/esm/schemas/index.js.map +1 -0
  60. package/dist/esm/schemas/kyc/workflow-steps.js +142 -0
  61. package/dist/esm/schemas/kyc/workflow-steps.js.map +1 -0
  62. package/dist/esm/service.js +127 -0
  63. package/dist/esm/service.js.map +1 -0
  64. package/dist/esm/session.js +375 -0
  65. package/dist/esm/session.js.map +1 -0
  66. package/dist/{types.js → esm/types.js} +11 -27
  67. package/dist/esm/types.js.map +1 -0
  68. package/dist/{webhooks.js → esm/webhooks.js} +10 -11
  69. package/dist/esm/webhooks.js.map +1 -0
  70. package/dist/{api.d.ts → types/api.d.ts} +297 -166
  71. package/dist/types/api.d.ts.map +1 -0
  72. package/dist/types/error.d.ts +24 -0
  73. package/dist/types/error.d.ts.map +1 -0
  74. package/dist/types/http.d.ts +17 -0
  75. package/dist/types/http.d.ts.map +1 -0
  76. package/dist/types/index.d.ts +15 -0
  77. package/dist/types/index.d.ts.map +1 -0
  78. package/dist/types/resources/aml.d.ts +79 -0
  79. package/dist/types/resources/aml.d.ts.map +1 -0
  80. package/dist/types/resources/documents.d.ts +153 -0
  81. package/dist/types/resources/documents.d.ts.map +1 -0
  82. package/dist/types/resources/form-templates.d.ts +104 -0
  83. package/dist/types/resources/form-templates.d.ts.map +1 -0
  84. package/dist/types/resources/kyc/index.d.ts +34 -0
  85. package/dist/types/resources/kyc/index.d.ts.map +1 -0
  86. package/dist/types/resources/kyc/sessions.d.ts +92 -0
  87. package/dist/types/resources/kyc/sessions.d.ts.map +1 -0
  88. package/dist/types/resources/kyc/workflows.d.ts +135 -0
  89. package/dist/types/resources/kyc/workflows.d.ts.map +1 -0
  90. package/dist/types/resources/media.d.ts +56 -0
  91. package/dist/types/resources/media.d.ts.map +1 -0
  92. package/dist/types/schemas/index.d.ts +3 -0
  93. package/dist/types/schemas/index.d.ts.map +1 -0
  94. package/dist/types/schemas/kyc/workflow-steps.d.ts +5113 -0
  95. package/dist/types/schemas/kyc/workflow-steps.d.ts.map +1 -0
  96. package/dist/types/service.d.ts +143 -0
  97. package/dist/types/service.d.ts.map +1 -0
  98. package/dist/types/session.d.ts +176 -0
  99. package/dist/types/session.d.ts.map +1 -0
  100. package/dist/{types.d.ts → types/types.d.ts} +100 -2
  101. package/dist/types/types.d.ts.map +1 -0
  102. package/dist/{webhooks.d.ts → types/webhooks.d.ts} +5 -5
  103. package/dist/types/webhooks.d.ts.map +1 -0
  104. package/package.json +26 -32
  105. package/dist/api.d.ts.map +0 -1
  106. package/dist/api.js +0 -22
  107. package/dist/api.js.map +0 -1
  108. package/dist/index.d.ts +0 -6
  109. package/dist/index.d.ts.map +0 -1
  110. package/dist/index.js +0 -5
  111. package/dist/index.js.map +0 -1
  112. package/dist/service.d.ts +0 -39
  113. package/dist/service.d.ts.map +0 -1
  114. package/dist/service.js +0 -150
  115. package/dist/service.js.map +0 -1
  116. package/dist/types.d.ts.map +0 -1
  117. package/dist/types.js.map +0 -1
  118. package/dist/webhooks.d.ts.map +0 -1
  119. package/dist/webhooks.js.map +0 -1
  120. 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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA6B9C;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,OAAO,kBAAkB;IAO3B,YAAY,OAAkC;QAC1C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,2BAA2B,CAAC;QAC9D,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IACvD,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAI,CACP,MAAiC,EACjC,IAAuE;QAEvE,OAAO,IAAI,kBAAkB,CAAC;YAC1B,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;YAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;SACpB,CAAC,CAAC;IACP,CAAC;IAED,6EAA6E;IAErE,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,MAA+B;QAC3D,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,EAAE,CAAC;YACT,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEO,UAAU,CAAC,SAAiB,EAAE,MAAM,GAAG,EAAE;QAC7C,MAAM,CAAC,GAAG,IAAI,GAAG,CACb,GAAG,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,SAAS,YAAY,SAAS,GAAG,MAAM,EAAE,CAChF,CAAC;QACF,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAED,IAAY,WAAW;QACnB,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,GAAW,EAAE,IAAiB;QACnD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAY,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,OAAO,GACT,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM;gBACxD,CAAC,CAAC,MAAM,CAAE,MAA+B,CAAC,OAAO,CAAC;gBAClD,CAAC,CAAC,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,MAAM,IAAI,KAAK,YAAY,GAAG,CAAC,MAAM,EAAE,CAAC;YAC/E,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAW,CAAC;IACvB,CAAC;IAEO,GAAG,CAAI,GAAW;QACtB,OAAO,IAAI,CAAC,OAAO,CAAI,GAAG,EAAE;YACxB,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE;SAC/D,CAAC,CAAC;IACP,CAAC;IAEO,IAAI,CAAI,GAAW,EAAE,IAAa;QACtC,OAAO,IAAI,CAAC,OAAO,CAAI,GAAG,EAAE;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,GAAG,IAAI,CAAC,WAAW;gBACnB,MAAM,EAAE,kBAAkB;gBAC1B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxE;YACD,IAAI;SACP,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAI,GAAW,EAAE,IAAY;QACtC,OAAO,IAAI,CAAC,OAAO,CAAI,GAAG,EAAE;YACxB,MAAM,EAAE,OAAO;YACf,OAAO,EAAE;gBACL,GAAG,IAAI,CAAC,WAAW;gBACnB,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC7B;YACD,IAAI;SACP,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,aAAa,CAAI,GAAW,EAAE,IAAa;QACrD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAI,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,6EAA6E;IAE7E;;;OAGG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,GAAG,CAA4B,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAClE,CAAC;IAED;;;OAGG;IACH,SAAS;QACL,OAAO,IAAI,CAAC,GAAG,CAA2B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,GAAG,CAA0B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,6EAA6E;IAE7E;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,KAAK,GAAG,KAAK;QACvC,MAAM,IAAI,CAAC,aAAa,CACpB,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EACnE,EAAE,KAAK,EAAE,CACZ,CAAC;IACN,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,IAAI,CAAuB,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,6EAA6E;IAE7E;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,IAA6B;QACtC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CACb,IAAI,CAAC,UAAU,EAAE,EACjB,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAC9B,CAAC;IACN,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,IAAI,CAA4B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED;;;;;;OAMG;IACH,cAAc,CACV,MAAc,EACd,QAAiC,EACjC,SAAS,GAAG,KAAK;QAEjB,OAAO,IAAI,CAAC,aAAa,CACrB,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAC5E,EAAE,MAAM,EAAE,QAAQ,EAAE,CACvB,CAAC;IACN,CAAC;IAED,6EAA6E;IAE7E;;;OAGG;IACH,aAAa;QACT,OAAO,IAAI,CAAC,IAAI,CAAmB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;;OAOG;IACH,YAAY,CAAC,SAAiB,EAAE,MAAiB;QAC7C,OAAO,IAAI,CAAC,aAAa,CACrB,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,EACrC,MAAM,CACT,CAAC;IACN,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,KAA0B;QAC3D,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,sBAAsB,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,KAAK,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC,OAAO,CAAkB,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;YACvE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACH,kBAAkB,CAAC,SAAiB,EAAE,MAAgB;QAClD,OAAO,IAAI,CAAC,aAAa,CACrB,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAC5C,EAAE,MAAM,EAAE,CACb,CAAC;IACN,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,SAAiB;QAC7B,OAAO,IAAI,CAAC,GAAG,CAAoB,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,6EAA6E;IAE7E;;;OAGG;IACH,kBAAkB,CAAC,aAAqB;QACpC,OAAO,IAAI,CAAC,aAAa,CACrB,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,EACxC,EAAE,aAAa,EAAE,CACpB,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,GAAW,EAAE,WAAmB;QAC7C,OAAO,IAAI,CAAC,aAAa,CACrB,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,EACtC,EAAE,GAAG,EAAE,WAAW,EAAE,CACvB,CAAC;IACN,CAAC;CACJ;AAED,6EAA6E;AAC7E,EAAE;AACF,6FAA6F;AAC7F,4FAA4F;AAC5F,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,EAAE;AACF,2EAA2E;AAE3E,KAAK,UAAU,UAAU,CAAC,IAAa,EAAE,UAAkB;IACvD,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;IAEhE,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CACtD,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,CACtD,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,UAAU,CAC7B,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAClC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EACvB,SAAS,EACT,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CACnC,CACJ,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa;IAC/D,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjB,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAExB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,2EAA2E;AAC3E,+EAA+E;AAC/E,4CAA4C;AAC5C,SAAS,aAAa,CAAC,IAAgB,EAAE,IAAgB;IACrD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO;QACH,GAAG,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,EAAE,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;KAC7C,CAAC;AACN,CAAC;AAED,4DAA4D;AAC5D,sCAAsC;AACtC,MAAM,KAAK,GAAG;IACV,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1D,CAAC,EAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAG,CAAC,EAAE,EAAE,EAAE,EAAE;IAC1D,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1D,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;CAC7D,CAAC;AACF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACpB,EAAE,MAAM,EAAE,EAAE,EAAE,EACd,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAClE,CAAC;AAEF,SAAS,GAAG,CAAC,IAAgB;IACzB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IACpD,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAEpE,IAAI,EAAE,GAAG,UAAU,CAAC;IACpB,IAAI,EAAE,GAAG,UAAU,CAAC;IACpB,IAAI,EAAE,GAAG,UAAU,CAAC;IACpB,IAAI,EAAE,GAAG,UAAU,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAS,EAAE,CAAS,CAAC;YACzB,IAAI,CAAC,GAAG,EAAE,EAAO,CAAC;gBAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAC,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;iBAC9C,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;iBAC7D,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;iBACjD,CAAC;gBAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;YAEhE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QAED,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1B,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1B,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1B,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAC9B,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,GAAG,CAAC;IAAC,CAAC;AACzD,CAAC"}
@@ -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 Dossiers to time out the webhook and retry.
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 Dossiers retry — you own retries
24
- * inside the handler. Failures are logged via `console.error`.
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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"}