@aiconnect/confidant 1.0.0 → 1.0.1
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/package.json +10 -2
- package/dist/crypto.test.d.ts +0 -5
- package/dist/crypto.test.d.ts.map +0 -1
- package/dist/crypto.test.js +0 -77
- package/dist/crypto.test.js.map +0 -1
- package/dist/network-detection.test.d.ts +0 -2
- package/dist/network-detection.test.d.ts.map +0 -1
- package/dist/network-detection.test.js +0 -150
- package/dist/network-detection.test.js.map +0 -1
- package/dist/rate-limiter.test.d.ts +0 -5
- package/dist/rate-limiter.test.d.ts.map +0 -1
- package/dist/rate-limiter.test.js +0 -130
- package/dist/rate-limiter.test.js.map +0 -1
- package/dist/registry.test.d.ts +0 -13
- package/dist/registry.test.d.ts.map +0 -1
- package/dist/registry.test.js +0 -308
- package/dist/registry.test.js.map +0 -1
- package/dist/storage.test.d.ts +0 -5
- package/dist/storage.test.d.ts.map +0 -1
- package/dist/storage.test.js +0 -466
- package/dist/storage.test.js.map +0 -1
- package/dist/url-helper.test.d.ts +0 -2
- package/dist/url-helper.test.d.ts.map +0 -1
- package/dist/url-helper.test.js +0 -70
- package/dist/url-helper.test.js.map +0 -1
package/dist/storage.test.js
DELETED
|
@@ -1,466 +0,0 @@
|
|
|
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
|
package/dist/storage.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../src/storage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"url-helper.test.d.ts","sourceRoot":"","sources":["../src/url-helper.test.ts"],"names":[],"mappings":""}
|
package/dist/url-helper.test.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { generateUrls, formatUrlsForDisplay } from './url-helper.js';
|
|
3
|
-
describe('url-helper', () => {
|
|
4
|
-
describe('generateUrls', () => {
|
|
5
|
-
it('should generate localhost URL', () => {
|
|
6
|
-
const result = generateUrls('http://localhost:3000', 'abc123', null);
|
|
7
|
-
expect(result.localhost).toBe('http://localhost:3000/request/abc123');
|
|
8
|
-
expect(result.network).toBeNull();
|
|
9
|
-
});
|
|
10
|
-
it('should generate network URL when local IP is provided', () => {
|
|
11
|
-
const result = generateUrls('http://localhost:3000', 'abc123', '192.168.1.100');
|
|
12
|
-
expect(result.localhost).toBe('http://localhost:3000/request/abc123');
|
|
13
|
-
expect(result.network).toBe('http://192.168.1.100:3000/request/abc123');
|
|
14
|
-
});
|
|
15
|
-
it('should handle custom port', () => {
|
|
16
|
-
const result = generateUrls('http://localhost:8080', 'abc123', '192.168.1.100');
|
|
17
|
-
expect(result.localhost).toBe('http://localhost:8080/request/abc123');
|
|
18
|
-
expect(result.network).toBe('http://192.168.1.100:8080/request/abc123');
|
|
19
|
-
});
|
|
20
|
-
it('should handle HTTPS', () => {
|
|
21
|
-
const result = generateUrls('https://localhost:443', 'abc123', '192.168.1.100');
|
|
22
|
-
expect(result.localhost).toBe('https://localhost:443/request/abc123');
|
|
23
|
-
expect(result.network).toBe('https://192.168.1.100:443/request/abc123');
|
|
24
|
-
});
|
|
25
|
-
it('should handle API URL with path', () => {
|
|
26
|
-
const result = generateUrls('http://localhost:3000/api', 'abc123', '192.168.1.100');
|
|
27
|
-
expect(result.localhost).toBe('http://localhost:3000/request/abc123');
|
|
28
|
-
expect(result.network).toBe('http://192.168.1.100:3000/request/abc123');
|
|
29
|
-
});
|
|
30
|
-
it('should return null network URL when local IP is null', () => {
|
|
31
|
-
const result = generateUrls('http://localhost:3000', 'abc123', null);
|
|
32
|
-
expect(result.localhost).toBe('http://localhost:3000/request/abc123');
|
|
33
|
-
expect(result.network).toBeNull();
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
describe('formatUrlsForDisplay', () => {
|
|
37
|
-
it('should format both URLs when network URL is available', () => {
|
|
38
|
-
const urls = {
|
|
39
|
-
localhost: 'http://localhost:3000/request/abc123',
|
|
40
|
-
network: 'http://192.168.1.100:3000/request/abc123'
|
|
41
|
-
};
|
|
42
|
-
const result = formatUrlsForDisplay(urls);
|
|
43
|
-
expect(result).toEqual([
|
|
44
|
-
'Network URL (for other devices): http://192.168.1.100:3000/request/abc123',
|
|
45
|
-
'Localhost URL (for this device): http://localhost:3000/request/abc123'
|
|
46
|
-
]);
|
|
47
|
-
});
|
|
48
|
-
it('should format only localhost URL when network URL is null', () => {
|
|
49
|
-
const urls = {
|
|
50
|
-
localhost: 'http://localhost:3000/request/abc123',
|
|
51
|
-
network: null
|
|
52
|
-
};
|
|
53
|
-
const result = formatUrlsForDisplay(urls);
|
|
54
|
-
expect(result).toEqual([
|
|
55
|
-
'Localhost URL (for this device): http://localhost:3000/request/abc123'
|
|
56
|
-
]);
|
|
57
|
-
});
|
|
58
|
-
it('should handle empty network URL', () => {
|
|
59
|
-
const urls = {
|
|
60
|
-
localhost: 'http://localhost:3000/request/abc123',
|
|
61
|
-
network: ''
|
|
62
|
-
};
|
|
63
|
-
const result = formatUrlsForDisplay(urls);
|
|
64
|
-
expect(result).toEqual([
|
|
65
|
-
'Localhost URL (for this device): http://localhost:3000/request/abc123'
|
|
66
|
-
]);
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
//# sourceMappingURL=url-helper.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"url-helper.test.js","sourceRoot":"","sources":["../src/url-helper.test.ts"],"names":[],"mappings":"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"}
|