@aiconnect/confidant 1.0.0

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 (103) hide show
  1. package/README.md +570 -0
  2. package/dist/api-client.d.ts +58 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +101 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +69 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/create.d.ts +3 -0
  11. package/dist/commands/create.d.ts.map +1 -0
  12. package/dist/commands/create.js +51 -0
  13. package/dist/commands/create.js.map +1 -0
  14. package/dist/commands/delete.d.ts +3 -0
  15. package/dist/commands/delete.d.ts.map +1 -0
  16. package/dist/commands/delete.js +29 -0
  17. package/dist/commands/delete.js.map +1 -0
  18. package/dist/commands/get-request.d.ts +3 -0
  19. package/dist/commands/get-request.d.ts.map +1 -0
  20. package/dist/commands/get-request.js +89 -0
  21. package/dist/commands/get-request.js.map +1 -0
  22. package/dist/commands/get.d.ts +3 -0
  23. package/dist/commands/get.d.ts.map +1 -0
  24. package/dist/commands/get.js +29 -0
  25. package/dist/commands/get.js.map +1 -0
  26. package/dist/commands/request.d.ts +3 -0
  27. package/dist/commands/request.d.ts.map +1 -0
  28. package/dist/commands/request.js +289 -0
  29. package/dist/commands/request.js.map +1 -0
  30. package/dist/commands/status.d.ts +3 -0
  31. package/dist/commands/status.d.ts.map +1 -0
  32. package/dist/commands/status.js +40 -0
  33. package/dist/commands/status.js.map +1 -0
  34. package/dist/crypto.d.ts +32 -0
  35. package/dist/crypto.d.ts.map +1 -0
  36. package/dist/crypto.js +79 -0
  37. package/dist/crypto.js.map +1 -0
  38. package/dist/crypto.test.d.ts +5 -0
  39. package/dist/crypto.test.d.ts.map +1 -0
  40. package/dist/crypto.test.js +77 -0
  41. package/dist/crypto.test.js.map +1 -0
  42. package/dist/i18n.d.ts +55 -0
  43. package/dist/i18n.d.ts.map +1 -0
  44. package/dist/i18n.js +63 -0
  45. package/dist/i18n.js.map +1 -0
  46. package/dist/index.d.ts +2 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +53 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/network-detection.d.ts +11 -0
  51. package/dist/network-detection.d.ts.map +1 -0
  52. package/dist/network-detection.js +54 -0
  53. package/dist/network-detection.js.map +1 -0
  54. package/dist/network-detection.test.d.ts +2 -0
  55. package/dist/network-detection.test.d.ts.map +1 -0
  56. package/dist/network-detection.test.js +150 -0
  57. package/dist/network-detection.test.js.map +1 -0
  58. package/dist/rate-limiter.d.ts +61 -0
  59. package/dist/rate-limiter.d.ts.map +1 -0
  60. package/dist/rate-limiter.js +128 -0
  61. package/dist/rate-limiter.js.map +1 -0
  62. package/dist/rate-limiter.test.d.ts +5 -0
  63. package/dist/rate-limiter.test.d.ts.map +1 -0
  64. package/dist/rate-limiter.test.js +130 -0
  65. package/dist/rate-limiter.test.js.map +1 -0
  66. package/dist/registry.d.ts +136 -0
  67. package/dist/registry.d.ts.map +1 -0
  68. package/dist/registry.js +182 -0
  69. package/dist/registry.js.map +1 -0
  70. package/dist/registry.test.d.ts +13 -0
  71. package/dist/registry.test.d.ts.map +1 -0
  72. package/dist/registry.test.js +308 -0
  73. package/dist/registry.test.js.map +1 -0
  74. package/dist/routes.d.ts +4 -0
  75. package/dist/routes.d.ts.map +1 -0
  76. package/dist/routes.js +931 -0
  77. package/dist/routes.js.map +1 -0
  78. package/dist/server.d.ts +27 -0
  79. package/dist/server.d.ts.map +1 -0
  80. package/dist/server.js +79 -0
  81. package/dist/server.js.map +1 -0
  82. package/dist/storage.d.ts +150 -0
  83. package/dist/storage.d.ts.map +1 -0
  84. package/dist/storage.js +298 -0
  85. package/dist/storage.js.map +1 -0
  86. package/dist/storage.test.d.ts +5 -0
  87. package/dist/storage.test.d.ts.map +1 -0
  88. package/dist/storage.test.js +466 -0
  89. package/dist/storage.test.js.map +1 -0
  90. package/dist/types.d.ts +144 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +56 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/url-helper.d.ts +16 -0
  95. package/dist/url-helper.d.ts.map +1 -0
  96. package/dist/url-helper.js +27 -0
  97. package/dist/url-helper.js.map +1 -0
  98. package/dist/url-helper.test.d.ts +2 -0
  99. package/dist/url-helper.test.d.ts.map +1 -0
  100. package/dist/url-helper.test.js +70 -0
  101. package/dist/url-helper.test.js.map +1 -0
  102. package/package.json +73 -0
  103. package/public/index.html +352 -0
@@ -0,0 +1,466 @@
1
+ /**
2
+ * Tests for MemoryStorage class
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
+ import { MemoryStorage } from './storage.js';
6
+ describe('MemoryStorage', () => {
7
+ let storage;
8
+ beforeEach(() => {
9
+ // Create a new MemoryStorage instance with auto-cleanup disabled for tests
10
+ storage = new MemoryStorage(60000, false);
11
+ });
12
+ afterEach(() => {
13
+ // Clean up any timers
14
+ storage.stopAutoCleanup();
15
+ });
16
+ describe('Store Method', () => {
17
+ it('should store a secret without options', async () => {
18
+ const secret = 'my-secret-value';
19
+ const id = await storage.store(secret);
20
+ expect(id).toBeDefined();
21
+ expect(typeof id).toBe('string');
22
+ expect(id.length).toBeGreaterThan(0);
23
+ // Verify secret is accessible
24
+ const retrieved = await storage.retrieve(id);
25
+ expect(retrieved).not.toBeNull();
26
+ expect(retrieved?.secret).toBe(secret);
27
+ });
28
+ it('should store a secret with TTL', async () => {
29
+ const secret = 'my-secret-value';
30
+ const ttl = 1000; // 1 second
31
+ const id = await storage.store(secret, { ttl });
32
+ const retrieved = await storage.retrieve(id);
33
+ expect(retrieved).not.toBeNull();
34
+ expect(retrieved?.expiresAt).toBeInstanceOf(Date);
35
+ // Verify expiresAt is approximately now + ttl
36
+ const now = new Date();
37
+ const expectedExpiresAt = new Date(now.getTime() + ttl);
38
+ const timeDiff = Math.abs(retrieved.expiresAt.getTime() - expectedExpiresAt.getTime());
39
+ expect(timeDiff).toBeLessThan(100); // Allow 100ms tolerance
40
+ });
41
+ it('should store a secret with maxAccessCount', async () => {
42
+ const secret = 'my-secret-value';
43
+ const maxAccessCount = 3;
44
+ const id = await storage.store(secret, { maxAccessCount });
45
+ const retrieved = await storage.retrieve(id);
46
+ expect(retrieved).not.toBeNull();
47
+ expect(retrieved?.maxAccessCount).toBe(maxAccessCount);
48
+ expect(retrieved?.accessCount).toBe(1); // First access
49
+ });
50
+ it('should store a secret with both TTL and maxAccessCount', async () => {
51
+ const secret = 'my-secret-value';
52
+ const ttl = 1000;
53
+ const maxAccessCount = 5;
54
+ const id = await storage.store(secret, { ttl, maxAccessCount });
55
+ const retrieved = await storage.retrieve(id);
56
+ expect(retrieved).not.toBeNull();
57
+ expect(retrieved?.maxAccessCount).toBe(maxAccessCount);
58
+ expect(retrieved?.expiresAt).toBeInstanceOf(Date);
59
+ });
60
+ });
61
+ describe('Retrieve Method', () => {
62
+ it('should retrieve an existing secret', async () => {
63
+ const secret = 'my-secret-value';
64
+ const id = await storage.store(secret);
65
+ const retrieved = await storage.retrieve(id);
66
+ expect(retrieved).not.toBeNull();
67
+ expect(retrieved?.id).toBe(id);
68
+ expect(retrieved?.secret).toBe(secret);
69
+ expect(retrieved?.accessCount).toBe(1);
70
+ });
71
+ it('should return null for non-existent secret', async () => {
72
+ const retrieved = await storage.retrieve('non-existent-id');
73
+ expect(retrieved).toBeNull();
74
+ });
75
+ it('should return null for expired secret', async () => {
76
+ const secret = 'my-secret-value';
77
+ const ttl = 10; // 10ms
78
+ const id = await storage.store(secret, { ttl });
79
+ // Wait for secret to expire
80
+ await new Promise(resolve => setTimeout(resolve, 20));
81
+ const retrieved = await storage.retrieve(id);
82
+ expect(retrieved).toBeNull();
83
+ });
84
+ it('should return null for secret with exceeded access count', async () => {
85
+ const secret = 'my-secret-value';
86
+ const maxAccessCount = 2;
87
+ const id = await storage.store(secret, { maxAccessCount });
88
+ // Access the secret twice
89
+ const first = await storage.retrieve(id);
90
+ expect(first).not.toBeNull();
91
+ expect(first?.accessCount).toBe(1);
92
+ const second = await storage.retrieve(id);
93
+ expect(second).not.toBeNull();
94
+ expect(second?.accessCount).toBe(2);
95
+ // Third access should fail
96
+ const third = await storage.retrieve(id);
97
+ expect(third).toBeNull();
98
+ });
99
+ it('should retrieve secret without maxAccessCount unlimited times', async () => {
100
+ const secret = 'my-secret-value';
101
+ const id = await storage.store(secret);
102
+ // Retrieve multiple times
103
+ for (let i = 0; i < 10; i++) {
104
+ const retrieved = await storage.retrieve(id);
105
+ expect(retrieved).not.toBeNull();
106
+ expect(retrieved?.accessCount).toBe(i + 1);
107
+ }
108
+ });
109
+ });
110
+ describe('Delete Method', () => {
111
+ it('should delete an existing secret', async () => {
112
+ const secret = 'my-secret-value';
113
+ const id = await storage.store(secret);
114
+ const deleted = await storage.delete(id);
115
+ expect(deleted).toBe(true);
116
+ // Verify secret is gone
117
+ const retrieved = await storage.retrieve(id);
118
+ expect(retrieved).toBeNull();
119
+ });
120
+ it('should return false for non-existent secret', async () => {
121
+ const deleted = await storage.delete('non-existent-id');
122
+ expect(deleted).toBe(false);
123
+ });
124
+ it('should delete an expired secret', async () => {
125
+ const secret = 'my-secret-value';
126
+ const ttl = 10; // 10ms
127
+ const id = await storage.store(secret, { ttl });
128
+ // Wait for secret to expire
129
+ await new Promise(resolve => setTimeout(resolve, 20));
130
+ const deleted = await storage.delete(id);
131
+ expect(deleted).toBe(true);
132
+ });
133
+ });
134
+ describe('Cleanup Method', () => {
135
+ it('should clean up expired secrets', async () => {
136
+ // Store secrets with different TTLs
137
+ const id1 = await storage.store('secret1', { ttl: 10 });
138
+ const id2 = await storage.store('secret2', { ttl: 10 });
139
+ const id3 = await storage.store('secret3', { ttl: 10000 }); // Long TTL
140
+ // Wait for first two to expire
141
+ await new Promise(resolve => setTimeout(resolve, 20));
142
+ const cleanedCount = await storage.cleanup();
143
+ expect(cleanedCount).toBe(2);
144
+ // Verify expired secrets are gone
145
+ expect(await storage.retrieve(id1)).toBeNull();
146
+ expect(await storage.retrieve(id2)).toBeNull();
147
+ expect(await storage.retrieve(id3)).not.toBeNull();
148
+ });
149
+ it('should return 0 when no expired secrets', async () => {
150
+ await storage.store('secret1', { ttl: 10000 });
151
+ await storage.store('secret2', { ttl: 10000 });
152
+ const cleanedCount = await storage.cleanup();
153
+ expect(cleanedCount).toBe(0);
154
+ });
155
+ it('should clean up only expired secrets from mixed storage', async () => {
156
+ // Store mix of expired and non-expired secrets
157
+ const expired1 = await storage.store('expired1', { ttl: 10 });
158
+ const expired2 = await storage.store('expired2', { ttl: 10 });
159
+ const valid1 = await storage.store('valid1', { ttl: 10000 });
160
+ const valid2 = await storage.store('valid2', { ttl: 10000 });
161
+ const expired3 = await storage.store('expired3', { ttl: 10 });
162
+ // Wait for expired secrets to expire
163
+ await new Promise(resolve => setTimeout(resolve, 20));
164
+ const cleanedCount = await storage.cleanup();
165
+ expect(cleanedCount).toBe(3);
166
+ // Verify only expired secrets are gone
167
+ expect(await storage.retrieve(expired1)).toBeNull();
168
+ expect(await storage.retrieve(expired2)).toBeNull();
169
+ expect(await storage.retrieve(expired3)).toBeNull();
170
+ expect(await storage.retrieve(valid1)).not.toBeNull();
171
+ expect(await storage.retrieve(valid2)).not.toBeNull();
172
+ });
173
+ });
174
+ describe('Secret ID Uniqueness', () => {
175
+ it('should generate unique IDs for multiple secrets', async () => {
176
+ const ids = new Set();
177
+ for (let i = 0; i < 100; i++) {
178
+ const id = await storage.store(`secret-${i}`);
179
+ ids.add(id);
180
+ }
181
+ expect(ids.size).toBe(100);
182
+ });
183
+ it('should generate unique IDs for same secret stored multiple times', async () => {
184
+ const secret = 'my-secret-value';
185
+ const id1 = await storage.store(secret);
186
+ const id2 = await storage.store(secret);
187
+ const id3 = await storage.store(secret);
188
+ expect(id1).not.toBe(id2);
189
+ expect(id2).not.toBe(id3);
190
+ expect(id1).not.toBe(id3);
191
+ // Each should be independently accessible
192
+ expect((await storage.retrieve(id1))?.secret).toBe(secret);
193
+ expect((await storage.retrieve(id2))?.secret).toBe(secret);
194
+ expect((await storage.retrieve(id3))?.secret).toBe(secret);
195
+ });
196
+ });
197
+ describe('Secret Data Integrity', () => {
198
+ it('should include creation timestamp', async () => {
199
+ const beforeStore = new Date();
200
+ const id = await storage.store('my-secret');
201
+ const afterStore = new Date();
202
+ const retrieved = await storage.retrieve(id);
203
+ expect(retrieved).not.toBeNull();
204
+ expect(retrieved?.createdAt).toBeInstanceOf(Date);
205
+ expect(retrieved.createdAt.getTime()).toBeGreaterThanOrEqual(beforeStore.getTime());
206
+ expect(retrieved.createdAt.getTime()).toBeLessThanOrEqual(afterStore.getTime());
207
+ });
208
+ it('should include expiration timestamp when TTL is set', async () => {
209
+ const ttl = 5000;
210
+ const beforeStore = new Date();
211
+ const id = await storage.store('my-secret', { ttl });
212
+ const afterStore = new Date();
213
+ const retrieved = await storage.retrieve(id);
214
+ expect(retrieved).not.toBeNull();
215
+ expect(retrieved?.expiresAt).toBeInstanceOf(Date);
216
+ const expectedMin = new Date(beforeStore.getTime() + ttl);
217
+ const expectedMax = new Date(afterStore.getTime() + ttl);
218
+ expect(retrieved.expiresAt.getTime()).toBeGreaterThanOrEqual(expectedMin.getTime());
219
+ expect(retrieved.expiresAt.getTime()).toBeLessThanOrEqual(expectedMax.getTime());
220
+ });
221
+ it('should include and increment access count', async () => {
222
+ const id = await storage.store('my-secret');
223
+ const first = await storage.retrieve(id);
224
+ expect(first?.accessCount).toBe(1);
225
+ const second = await storage.retrieve(id);
226
+ expect(second?.accessCount).toBe(2);
227
+ const third = await storage.retrieve(id);
228
+ expect(third?.accessCount).toBe(3);
229
+ });
230
+ it('should include maxAccessCount when set', async () => {
231
+ const maxAccessCount = 5;
232
+ const id = await storage.store('my-secret', { maxAccessCount });
233
+ const retrieved = await storage.retrieve(id);
234
+ expect(retrieved?.maxAccessCount).toBe(maxAccessCount);
235
+ });
236
+ });
237
+ describe('Automatic Periodic Cleanup', () => {
238
+ it('should automatically clean up expired secrets', async () => {
239
+ // Create storage with short cleanup interval
240
+ const autoStorage = new MemoryStorage(100, true); // 100ms interval
241
+ // Store secrets with short TTL
242
+ const id1 = await autoStorage.store('secret1', { ttl: 50 });
243
+ const id2 = await autoStorage.store('secret2', { ttl: 50 });
244
+ const id3 = await autoStorage.store('secret3', { ttl: 1000 }); // Long TTL
245
+ // Wait for cleanup to run (interval + buffer)
246
+ await new Promise(resolve => setTimeout(resolve, 200));
247
+ // Verify expired secrets are cleaned up
248
+ expect(await autoStorage.retrieve(id1)).toBeNull();
249
+ expect(await autoStorage.retrieve(id2)).toBeNull();
250
+ expect(await autoStorage.retrieve(id3)).not.toBeNull();
251
+ autoStorage.stopAutoCleanup();
252
+ });
253
+ it('should preserve valid secrets during periodic cleanup', async () => {
254
+ const autoStorage = new MemoryStorage(100, true);
255
+ // Store secrets with long TTL
256
+ const id1 = await autoStorage.store('secret1', { ttl: 10000 });
257
+ const id2 = await autoStorage.store('secret2', { ttl: 10000 });
258
+ // Wait for cleanup to run
259
+ await new Promise(resolve => setTimeout(resolve, 150));
260
+ // Verify secrets are still accessible
261
+ expect(await autoStorage.retrieve(id1)).not.toBeNull();
262
+ expect(await autoStorage.retrieve(id2)).not.toBeNull();
263
+ autoStorage.stopAutoCleanup();
264
+ });
265
+ it('should use configurable cleanup interval', async () => {
266
+ const interval = 50; // 50ms
267
+ const autoStorage = new MemoryStorage(interval, true);
268
+ const id = await autoStorage.store('secret', { ttl: 30 });
269
+ // Wait for cleanup to run
270
+ await new Promise(resolve => setTimeout(resolve, interval + 20));
271
+ // Secret should be cleaned up
272
+ expect(await autoStorage.retrieve(id)).toBeNull();
273
+ autoStorage.stopAutoCleanup();
274
+ });
275
+ });
276
+ describe('Stop Auto Cleanup', () => {
277
+ it('should stop automatic cleanup when called', async () => {
278
+ const autoStorage = new MemoryStorage(50, true);
279
+ // Store secret with long TTL (longer than cleanup interval)
280
+ const id = await autoStorage.store('secret', { ttl: 5000 });
281
+ // Stop auto cleanup
282
+ autoStorage.stopAutoCleanup();
283
+ // Wait for what would be cleanup interval
284
+ await new Promise(resolve => setTimeout(resolve, 70));
285
+ // Secret should still be accessible (cleanup didn't run)
286
+ expect(await autoStorage.retrieve(id)).not.toBeNull();
287
+ });
288
+ });
289
+ // ==================== Secret Request Tests ====================
290
+ describe('Create Request', () => {
291
+ it('should create a request with default expiration', () => {
292
+ const request = storage.createRequest();
293
+ expect(request.id).toBeDefined();
294
+ expect(request.hash).toBeDefined();
295
+ expect(request.hash).toHaveLength(64);
296
+ expect(request.status).toBe('pending');
297
+ expect(request.secret).toBeNull();
298
+ expect(request.createdAt).toBeInstanceOf(Date);
299
+ expect(request.expiresAt).toBeInstanceOf(Date);
300
+ expect(request.retrievedAt).toBeNull();
301
+ });
302
+ it('should create a request with custom expiration', () => {
303
+ const expiresIn = 3600; // 1 hour
304
+ const request = storage.createRequest(expiresIn);
305
+ const now = new Date();
306
+ const expectedExpiresAt = new Date(now.getTime() + expiresIn * 1000);
307
+ const timeDiff = Math.abs(request.expiresAt.getTime() - expectedExpiresAt.getTime());
308
+ expect(timeDiff).toBeLessThan(100); // Allow 100ms tolerance
309
+ });
310
+ it('should generate unique request IDs', () => {
311
+ const request1 = storage.createRequest();
312
+ const request2 = storage.createRequest();
313
+ expect(request1.id).not.toBe(request2.id);
314
+ });
315
+ it('should generate unique request hashes', () => {
316
+ const request1 = storage.createRequest();
317
+ const request2 = storage.createRequest();
318
+ expect(request1.hash).not.toBe(request2.hash);
319
+ });
320
+ });
321
+ describe('Get Request By Hash', () => {
322
+ it('should retrieve a request by hash', () => {
323
+ const request = storage.createRequest();
324
+ const retrieved = storage.getRequestByHash(request.hash);
325
+ expect(retrieved).not.toBeNull();
326
+ expect(retrieved?.id).toBe(request.id);
327
+ expect(retrieved?.hash).toBe(request.hash);
328
+ });
329
+ it('should return null for non-existent hash', () => {
330
+ const retrieved = storage.getRequestByHash('nonexistenthash');
331
+ expect(retrieved).toBeNull();
332
+ });
333
+ it('should mark expired requests as expired', () => {
334
+ const expiresIn = 0.01; // 10ms
335
+ const request = storage.createRequest(expiresIn);
336
+ // Wait for expiration
337
+ // Note: We can't easily test this without async/await in the test
338
+ // The expiration check happens in getRequestByHash
339
+ const retrieved = storage.getRequestByHash(request.hash);
340
+ // The request should be returned but status may be updated to expired
341
+ expect(retrieved).not.toBeNull();
342
+ });
343
+ });
344
+ describe('Get Request By Id', () => {
345
+ it('should retrieve a request by id', () => {
346
+ const request = storage.createRequest();
347
+ const retrieved = storage.getRequestById(request.id);
348
+ expect(retrieved).not.toBeNull();
349
+ expect(retrieved?.id).toBe(request.id);
350
+ expect(retrieved?.hash).toBe(request.hash);
351
+ });
352
+ it('should return null for non-existent id', () => {
353
+ const retrieved = storage.getRequestById('nonexistent-id');
354
+ expect(retrieved).toBeNull();
355
+ });
356
+ });
357
+ describe('Update Request Status', () => {
358
+ it('should update request status', () => {
359
+ const request = storage.createRequest();
360
+ expect(request.status).toBe('pending');
361
+ const updated = storage.updateRequestStatus(request.id, 'completed');
362
+ expect(updated).not.toBeNull();
363
+ expect(updated?.status).toBe('completed');
364
+ });
365
+ it('should return null for non-existent request', () => {
366
+ const updated = storage.updateRequestStatus('nonexistent-id', 'completed');
367
+ expect(updated).toBeNull();
368
+ });
369
+ });
370
+ describe('Submit Secret', () => {
371
+ it('should submit a secret for a pending request', () => {
372
+ const request = storage.createRequest();
373
+ const secret = 'my-secret-value';
374
+ const updated = storage.submitSecret(request.hash, secret);
375
+ expect(updated).not.toBeNull();
376
+ expect(updated?.status).toBe('completed');
377
+ expect(updated?.secret).not.toBeNull();
378
+ });
379
+ it('should return null for non-existent hash', () => {
380
+ const updated = storage.submitSecret('nonexistenthash', 'secret');
381
+ expect(updated).toBeNull();
382
+ });
383
+ it('should not submit secret for completed request', () => {
384
+ const request = storage.createRequest();
385
+ storage.submitSecret(request.hash, 'secret1');
386
+ const updated = storage.submitSecret(request.hash, 'secret2');
387
+ expect(updated).toBeNull();
388
+ });
389
+ it('should not submit secret for expired request', async () => {
390
+ const expiresIn = 0.01; // 10ms
391
+ const request = storage.createRequest(expiresIn);
392
+ // Wait for expiration
393
+ await new Promise(resolve => setTimeout(resolve, 20));
394
+ // The expiration check happens in submitSecret
395
+ const updated = storage.submitSecret(request.hash, 'secret');
396
+ // Should return null since the request is expired
397
+ expect(updated).toBeNull();
398
+ });
399
+ });
400
+ describe('Get And Delete Secret', () => {
401
+ it('should retrieve and delete secret for completed request', () => {
402
+ const request = storage.createRequest();
403
+ const secret = 'my-secret-value';
404
+ storage.submitSecret(request.hash, secret);
405
+ const retrievedSecret = storage.getAndDeleteSecret(request.id);
406
+ expect(retrievedSecret).toBe(secret);
407
+ // Secret should be deleted
408
+ const requestAfter = storage.getRequestById(request.id);
409
+ expect(requestAfter?.status).toBe('retrieved');
410
+ expect(requestAfter?.secret).toBeNull();
411
+ });
412
+ it('should return null for pending request', () => {
413
+ const request = storage.createRequest();
414
+ const secret = storage.getAndDeleteSecret(request.id);
415
+ expect(secret).toBeNull();
416
+ });
417
+ it('should return null for non-existent request', () => {
418
+ const secret = storage.getAndDeleteSecret('nonexistent-id');
419
+ expect(secret).toBeNull();
420
+ });
421
+ it('should return null for already retrieved request', () => {
422
+ const request = storage.createRequest();
423
+ const secret = 'my-secret-value';
424
+ storage.submitSecret(request.hash, secret);
425
+ // First retrieval
426
+ storage.getAndDeleteSecret(request.id);
427
+ // Second retrieval should fail
428
+ const secondSecret = storage.getAndDeleteSecret(request.id);
429
+ expect(secondSecret).toBeNull();
430
+ });
431
+ });
432
+ describe('Cleanup Expired Requests', () => {
433
+ it('should clean up expired requests', async () => {
434
+ const request1 = storage.createRequest(0.01); // 10ms
435
+ const request2 = storage.createRequest(0.01); // 10ms
436
+ const request3 = storage.createRequest(10000); // Long TTL
437
+ // Wait for first two to expire
438
+ await new Promise(resolve => setTimeout(resolve, 20));
439
+ const cleanedCount = storage.cleanupExpiredRequests();
440
+ expect(cleanedCount).toBe(2);
441
+ // Verify expired requests are gone
442
+ expect(storage.getRequestById(request1.id)).toBeNull();
443
+ expect(storage.getRequestById(request2.id)).toBeNull();
444
+ expect(storage.getRequestById(request3.id)).not.toBeNull();
445
+ });
446
+ it('should return 0 when no expired requests', () => {
447
+ storage.createRequest(10000);
448
+ storage.createRequest(10000);
449
+ const cleanedCount = storage.cleanupExpiredRequests();
450
+ expect(cleanedCount).toBe(0);
451
+ });
452
+ });
453
+ describe('Delete Request', () => {
454
+ it('should delete an existing request', () => {
455
+ const request = storage.createRequest();
456
+ const deleted = storage.deleteRequest(request.id);
457
+ expect(deleted).toBe(true);
458
+ expect(storage.getRequestById(request.id)).toBeNull();
459
+ });
460
+ it('should return false for non-existent request', () => {
461
+ const deleted = storage.deleteRequest('nonexistent-id');
462
+ expect(deleted).toBe(false);
463
+ });
464
+ });
465
+ });
466
+ //# sourceMappingURL=storage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../src/storage.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAM,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,OAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,2EAA2E;QAC3E,OAAO,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,sBAAsB;QACtB,OAAO,CAAC,eAAe,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEvC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAErC,8BAA8B;YAC9B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,WAAW;YAC7B,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YAEhD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAElD,8CAA8C;YAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAU,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC;YACxF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,cAAc,GAAG,CAAC,CAAC;YACzB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YAE3D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvD,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,cAAc,GAAG,CAAC,CAAC;YACzB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;YAEhE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvD,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEvC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO;YACvB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YAEhD,4BAA4B;YAC5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAEtD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,cAAc,GAAG,CAAC,CAAC;YACzB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YAE3D,0BAA0B;YAC1B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEpC,2BAA2B;YAC3B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEvC,0BAA0B;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE3B,wBAAwB;YACxB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO;YACvB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YAEhD,4BAA4B;YAC5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAEtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,oCAAoC;YACpC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW;YAEvE,+BAA+B;YAC/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAEtD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,kCAAkC;YAClC,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC/C,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC/C,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/C,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAE/C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,+CAA+C;YAC/C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAE9D,qCAAqC;YACrC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAEtD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,uCAAuC;YACvC,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpD,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpD,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpD,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACtD,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;YAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC9C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACd,CAAC;YAED,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YAChF,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE1B,0CAA0C;YAC1C,MAAM,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;YAE9B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,SAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,MAAM,CAAC,SAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;YAE9B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAElD,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,CAAC;YAC1D,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,CAAC;YACzD,MAAM,CAAC,SAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,MAAM,CAAC,SAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE5C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEpC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,cAAc,GAAG,CAAC,CAAC;YACzB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YAEhE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,6CAA6C;YAC7C,MAAM,WAAW,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,iBAAiB;YAEnE,+BAA+B;YAC/B,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW;YAE1E,8CAA8C;YAC9C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEvD,wCAAwC;YACxC,MAAM,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACnD,MAAM,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACnD,MAAM,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAEvD,WAAW,CAAC,eAAe,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,WAAW,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAEjD,8BAA8B;YAC9B,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAE/D,0BAA0B;YAC1B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEvD,sCAAsC;YACtC,MAAM,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACvD,MAAM,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAEvD,WAAW,CAAC,eAAe,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,OAAO;YAC5B,MAAM,WAAW,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAEtD,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAE1D,0BAA0B;YAC1B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC;YAEjE,8BAA8B;YAC9B,MAAM,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAElD,WAAW,CAAC,eAAe,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,WAAW,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAEhD,4DAA4D;YAC5D,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5D,oBAAoB;YACpB,WAAW,CAAC,eAAe,EAAE,CAAC;YAE9B,0CAA0C;YAC1C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAEtD,yDAAyD;YACzD,MAAM,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,iEAAiE;IAEjE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAExC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,SAAS;YACjC,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAEjD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC;YAErF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAEzC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAEzC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEzD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YAC9D,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAEjD,sBAAsB;YACtB,kEAAkE;YAClE,mDAAmD;YACnD,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEzD,sEAAsE;YACtE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAErD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAC3D,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEvC,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACrE,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAEjC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAE3D,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAClE,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAE9C,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAEjD,sBAAsB;YACtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAEtD,+CAA+C;YAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAE7D,kDAAkD;YAClD,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAE3C,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAErC,2BAA2B;YAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEtD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YACjC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAE3C,kBAAkB;YAClB,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEvC,+BAA+B;YAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;YACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;YACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW;YAE1D,+BAA+B;YAC/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAEtD,MAAM,YAAY,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;YACtD,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,mCAAmC;YACnC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAE7B,MAAM,YAAY,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;YACtD,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAElD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Shared TypeScript Types
3
+ *
4
+ * Common type definitions used throughout the Confidant application.
5
+ */
6
+ /**
7
+ * API Response wrapper
8
+ */
9
+ export interface ApiResponse<T = unknown> {
10
+ success: boolean;
11
+ data?: T;
12
+ error?: string;
13
+ message?: string;
14
+ }
15
+ /**
16
+ * Secret creation request
17
+ */
18
+ export interface CreateSecretRequest {
19
+ secret: string;
20
+ ttl?: number;
21
+ maxAccessCount?: number;
22
+ }
23
+ /**
24
+ * Secret creation response
25
+ */
26
+ export interface CreateSecretResponse {
27
+ id: string;
28
+ expiresAt: string;
29
+ accessUrl: string;
30
+ }
31
+ /**
32
+ * Secret retrieval response
33
+ */
34
+ export interface RetrieveSecretResponse {
35
+ id: string;
36
+ secret: string;
37
+ expiresAt: string;
38
+ remainingAccessCount?: number;
39
+ }
40
+ /**
41
+ * Secret status response
42
+ */
43
+ export interface SecretStatusResponse {
44
+ id: string;
45
+ exists: boolean;
46
+ expired: boolean;
47
+ expiresAt?: string;
48
+ accessCount: number;
49
+ remainingAccessCount?: number;
50
+ }
51
+ /**
52
+ * Error types
53
+ */
54
+ export declare class SecretNotFoundError extends Error {
55
+ constructor(id: string);
56
+ }
57
+ export declare class SecretExpiredError extends Error {
58
+ constructor(id: string);
59
+ }
60
+ export declare class MaxAccessCountExceededError extends Error {
61
+ constructor(id: string);
62
+ }
63
+ /**
64
+ * Secret Request Types
65
+ */
66
+ /**
67
+ * Secret request status
68
+ */
69
+ export type SecretRequestStatus = 'pending' | 'completed' | 'retrieved' | 'expired';
70
+ /**
71
+ * Secret request data model
72
+ */
73
+ export interface SecretRequest {
74
+ id: string;
75
+ hash: string;
76
+ secret: string | null;
77
+ status: SecretRequestStatus;
78
+ createdAt: Date;
79
+ expiresAt: Date;
80
+ retrievedAt: Date | null;
81
+ label?: string;
82
+ }
83
+ /**
84
+ * Secret request creation request
85
+ */
86
+ export interface CreateSecretRequestRequest {
87
+ expiresIn?: number;
88
+ label?: string;
89
+ }
90
+ /**
91
+ * Secret request creation response
92
+ */
93
+ export interface CreateSecretRequestResponse {
94
+ id: string;
95
+ hash: string;
96
+ url: string;
97
+ expiresAt: string;
98
+ status: SecretRequestStatus;
99
+ label?: string;
100
+ }
101
+ /**
102
+ * Secret submission request
103
+ */
104
+ export interface SubmitSecretRequest {
105
+ secret: string;
106
+ }
107
+ /**
108
+ * Secret submission response
109
+ */
110
+ export interface SubmitSecretResponse {
111
+ message: string;
112
+ }
113
+ /**
114
+ * Secret poll response
115
+ */
116
+ export interface PollSecretResponse {
117
+ id: string;
118
+ status: SecretRequestStatus;
119
+ secret: string | null;
120
+ label?: string;
121
+ }
122
+ /**
123
+ * Error types for secret requests
124
+ */
125
+ export declare class SecretRequestNotFoundError extends Error {
126
+ constructor(id: string);
127
+ }
128
+ export declare class SecretRequestExpiredError extends Error {
129
+ constructor(id: string);
130
+ }
131
+ export declare class SecretRequestAlreadyRetrievedError extends Error {
132
+ constructor(id: string);
133
+ }
134
+ export declare class SecretRequestAlreadyCompletedError extends Error {
135
+ constructor(id: string);
136
+ }
137
+ /**
138
+ * Registry Module Types
139
+ * Re-exported from registry.ts for convenience
140
+ */
141
+ export type { Module, StorageModule, ValidatorModule, TransformerModule } from './registry.js';
142
+ export { Registry, storageRegistry, validatorRegistry, transformerRegistry } from './registry.js';
143
+ export { MemoryStorageModule, BasicValidatorModule, UppercaseTransformerModule } from './registry.js';
144
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}