@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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiconnect/confidant",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Secure secret handoff system with time-limited access",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"dist",
|
|
20
|
+
"!dist/**/*.test.*",
|
|
20
21
|
"public",
|
|
21
22
|
"README.md"
|
|
22
23
|
],
|
|
@@ -27,7 +28,14 @@
|
|
|
27
28
|
"test": "vitest",
|
|
28
29
|
"test:ui": "vitest --ui",
|
|
29
30
|
"test:run": "vitest run",
|
|
30
|
-
"prepublishOnly": "npm run build"
|
|
31
|
+
"prepublishOnly": "npm run build",
|
|
32
|
+
"preversion": "npm run test:run",
|
|
33
|
+
"version": "npm run build",
|
|
34
|
+
"postversion": "git push && git push --tags",
|
|
35
|
+
"release:patch": "npm version patch",
|
|
36
|
+
"release:minor": "npm version minor",
|
|
37
|
+
"release:major": "npm version major",
|
|
38
|
+
"publish:npm": "npm publish --access public"
|
|
31
39
|
},
|
|
32
40
|
"keywords": [
|
|
33
41
|
"secret",
|
package/dist/crypto.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.test.d.ts","sourceRoot":"","sources":["../src/crypto.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/crypto.test.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for crypto utilities
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect } from 'vitest';
|
|
5
|
-
import { generateHash, encryptSecret, decryptSecret, generateUUID } from './crypto.js';
|
|
6
|
-
describe('crypto', () => {
|
|
7
|
-
describe('generateHash', () => {
|
|
8
|
-
it('should generate a 64-character hex string', () => {
|
|
9
|
-
const hash = generateHash();
|
|
10
|
-
expect(hash).toHaveLength(64);
|
|
11
|
-
expect(hash).toMatch(/^[a-f0-9]{64}$/);
|
|
12
|
-
});
|
|
13
|
-
it('should generate unique hashes', () => {
|
|
14
|
-
const hash1 = generateHash();
|
|
15
|
-
const hash2 = generateHash();
|
|
16
|
-
expect(hash1).not.toBe(hash2);
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
describe('encryptSecret and decryptSecret', () => {
|
|
20
|
-
it('should encrypt and decrypt a secret correctly', () => {
|
|
21
|
-
const secret = 'my-secret-password';
|
|
22
|
-
const hash = generateHash();
|
|
23
|
-
const encrypted = encryptSecret(secret, hash);
|
|
24
|
-
const decrypted = decryptSecret(encrypted, hash);
|
|
25
|
-
expect(decrypted).toBe(secret);
|
|
26
|
-
});
|
|
27
|
-
it('should produce different encrypted values for the same secret with different hashes', () => {
|
|
28
|
-
const secret = 'my-secret-password';
|
|
29
|
-
const hash1 = generateHash();
|
|
30
|
-
const hash2 = generateHash();
|
|
31
|
-
const encrypted1 = encryptSecret(secret, hash1);
|
|
32
|
-
const encrypted2 = encryptSecret(secret, hash2);
|
|
33
|
-
expect(encrypted1).not.toBe(encrypted2);
|
|
34
|
-
});
|
|
35
|
-
it('should encrypt multi-line secrets', () => {
|
|
36
|
-
const secret = 'line1\nline2\nline3';
|
|
37
|
-
const hash = generateHash();
|
|
38
|
-
const encrypted = encryptSecret(secret, hash);
|
|
39
|
-
const decrypted = decryptSecret(encrypted, hash);
|
|
40
|
-
expect(decrypted).toBe(secret);
|
|
41
|
-
});
|
|
42
|
-
it('should encrypt special characters', () => {
|
|
43
|
-
const secret = '!@#$%^&*()_+-=[]{}|;:,.<>?';
|
|
44
|
-
const hash = generateHash();
|
|
45
|
-
const encrypted = encryptSecret(secret, hash);
|
|
46
|
-
const decrypted = decryptSecret(encrypted, hash);
|
|
47
|
-
expect(decrypted).toBe(secret);
|
|
48
|
-
});
|
|
49
|
-
it('should throw error when decrypting with wrong hash', () => {
|
|
50
|
-
const secret = 'my-secret-password';
|
|
51
|
-
const hash1 = generateHash();
|
|
52
|
-
const hash2 = generateHash();
|
|
53
|
-
const encrypted = encryptSecret(secret, hash1);
|
|
54
|
-
expect(() => {
|
|
55
|
-
decryptSecret(encrypted, hash2);
|
|
56
|
-
}).toThrow();
|
|
57
|
-
});
|
|
58
|
-
it('should throw error when decrypting invalid format', () => {
|
|
59
|
-
const hash = generateHash();
|
|
60
|
-
expect(() => {
|
|
61
|
-
decryptSecret('invalid-format', hash);
|
|
62
|
-
}).toThrow();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
describe('generateUUID', () => {
|
|
66
|
-
it('should generate a valid UUID v4 format', () => {
|
|
67
|
-
const uuid = generateUUID();
|
|
68
|
-
expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
|
|
69
|
-
});
|
|
70
|
-
it('should generate unique UUIDs', () => {
|
|
71
|
-
const uuid1 = generateUUID();
|
|
72
|
-
const uuid2 = generateUUID();
|
|
73
|
-
expect(uuid1).not.toBe(uuid2);
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
//# sourceMappingURL=crypto.test.js.map
|
package/dist/crypto.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.test.js","sourceRoot":"","sources":["../src/crypto.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"network-detection.test.d.ts","sourceRoot":"","sources":["../src/network-detection.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import * as os from 'os';
|
|
3
|
-
import { isPrivateIp, detectLocalIp } from './network-detection.js';
|
|
4
|
-
// Mock the os module
|
|
5
|
-
vi.mock('os', () => ({
|
|
6
|
-
networkInterfaces: vi.fn(),
|
|
7
|
-
}));
|
|
8
|
-
describe('network detection', () => {
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
vi.clearAllMocks();
|
|
11
|
-
});
|
|
12
|
-
afterEach(() => {
|
|
13
|
-
vi.restoreAllMocks();
|
|
14
|
-
});
|
|
15
|
-
describe('isPrivateIp', () => {
|
|
16
|
-
it('should return true for 10.x.x.x addresses', () => {
|
|
17
|
-
expect(isPrivateIp('10.0.0.1')).toBe(true);
|
|
18
|
-
expect(isPrivateIp('10.255.255.255')).toBe(true);
|
|
19
|
-
expect(isPrivateIp('10.128.64.32')).toBe(true);
|
|
20
|
-
});
|
|
21
|
-
it('should return true for 172.16.x.x to 172.31.x.x addresses', () => {
|
|
22
|
-
expect(isPrivateIp('172.16.0.1')).toBe(true);
|
|
23
|
-
expect(isPrivateIp('172.31.255.255')).toBe(true);
|
|
24
|
-
expect(isPrivateIp('172.20.128.64')).toBe(true);
|
|
25
|
-
});
|
|
26
|
-
it('should return false for 172.15.x.x addresses', () => {
|
|
27
|
-
expect(isPrivateIp('172.15.255.255')).toBe(false);
|
|
28
|
-
});
|
|
29
|
-
it('should return false for 172.32.x.x addresses', () => {
|
|
30
|
-
expect(isPrivateIp('172.32.0.1')).toBe(false);
|
|
31
|
-
});
|
|
32
|
-
it('should return true for 192.168.x.x addresses', () => {
|
|
33
|
-
expect(isPrivateIp('192.168.0.1')).toBe(true);
|
|
34
|
-
expect(isPrivateIp('192.168.255.255')).toBe(true);
|
|
35
|
-
expect(isPrivateIp('192.168.128.64')).toBe(true);
|
|
36
|
-
});
|
|
37
|
-
it('should return false for public IP addresses', () => {
|
|
38
|
-
expect(isPrivateIp('8.8.8.8')).toBe(false);
|
|
39
|
-
expect(isPrivateIp('1.1.1.1')).toBe(false);
|
|
40
|
-
expect(isPrivateIp('172.32.0.1')).toBe(false);
|
|
41
|
-
expect(isPrivateIp('192.169.0.1')).toBe(false);
|
|
42
|
-
});
|
|
43
|
-
it('should return false for invalid IP addresses', () => {
|
|
44
|
-
expect(isPrivateIp('')).toBe(false);
|
|
45
|
-
expect(isPrivateIp('invalid')).toBe(false);
|
|
46
|
-
expect(isPrivateIp('192.168')).toBe(false);
|
|
47
|
-
expect(isPrivateIp('192.168.1.1.1')).toBe(false);
|
|
48
|
-
expect(isPrivateIp('256.168.1.1')).toBe(false);
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
describe('detectLocalIp', () => {
|
|
52
|
-
it('should return first private IP address found', () => {
|
|
53
|
-
const mockInterfaces = [
|
|
54
|
-
{ address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '192.168.1.100/24' },
|
|
55
|
-
{ address: '10.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '10.0.0.1/8' },
|
|
56
|
-
];
|
|
57
|
-
vi.mocked(os.networkInterfaces).mockReturnValue({
|
|
58
|
-
'eth0': mockInterfaces,
|
|
59
|
-
});
|
|
60
|
-
const result = detectLocalIp();
|
|
61
|
-
expect(result).toBe('192.168.1.100');
|
|
62
|
-
});
|
|
63
|
-
it('should skip internal addresses', () => {
|
|
64
|
-
const mockInterfaces = [
|
|
65
|
-
{ address: '127.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: true, cidr: '127.0.0.1/8' },
|
|
66
|
-
{ address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '192.168.1.100/24' },
|
|
67
|
-
];
|
|
68
|
-
vi.mocked(os.networkInterfaces).mockReturnValue({
|
|
69
|
-
'lo': [mockInterfaces[0]],
|
|
70
|
-
'eth0': [mockInterfaces[1]],
|
|
71
|
-
});
|
|
72
|
-
const result = detectLocalIp();
|
|
73
|
-
expect(result).toBe('192.168.1.100');
|
|
74
|
-
});
|
|
75
|
-
it('should skip IPv6 addresses', () => {
|
|
76
|
-
const mockInterfaces = [
|
|
77
|
-
{ address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::', family: 'IPv6', mac: '00:00:00:00:00:00', internal: false, cidr: 'fe80::1/64', scopeid: 1 },
|
|
78
|
-
{ address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '192.168.1.100/24' },
|
|
79
|
-
];
|
|
80
|
-
vi.mocked(os.networkInterfaces).mockReturnValue({
|
|
81
|
-
'eth0': mockInterfaces,
|
|
82
|
-
});
|
|
83
|
-
const result = detectLocalIp();
|
|
84
|
-
expect(result).toBe('192.168.1.100');
|
|
85
|
-
});
|
|
86
|
-
it('should skip public IP addresses', () => {
|
|
87
|
-
const mockInterfaces = [
|
|
88
|
-
{ address: '8.8.8.8', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '8.8.8.8/24' },
|
|
89
|
-
{ address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '192.168.1.100/24' },
|
|
90
|
-
];
|
|
91
|
-
vi.mocked(os.networkInterfaces).mockReturnValue({
|
|
92
|
-
'eth0': mockInterfaces,
|
|
93
|
-
});
|
|
94
|
-
const result = detectLocalIp();
|
|
95
|
-
expect(result).toBe('192.168.1.100');
|
|
96
|
-
});
|
|
97
|
-
it('should return null when no private IP is found', () => {
|
|
98
|
-
const mockInterfaces = [
|
|
99
|
-
{ address: '8.8.8.8', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '8.8.8.8/24' },
|
|
100
|
-
{ address: '127.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: true, cidr: '127.0.0.1/8' },
|
|
101
|
-
];
|
|
102
|
-
vi.mocked(os.networkInterfaces).mockReturnValue({
|
|
103
|
-
'eth0': [mockInterfaces[0]],
|
|
104
|
-
'lo': [mockInterfaces[1]],
|
|
105
|
-
});
|
|
106
|
-
const result = detectLocalIp();
|
|
107
|
-
expect(result).toBeNull();
|
|
108
|
-
});
|
|
109
|
-
it('should return null when networkInterfaces returns empty object', () => {
|
|
110
|
-
vi.mocked(os.networkInterfaces).mockReturnValue({});
|
|
111
|
-
const result = detectLocalIp();
|
|
112
|
-
expect(result).toBeNull();
|
|
113
|
-
});
|
|
114
|
-
it('should return null when networkInterfaces throws error', () => {
|
|
115
|
-
vi.mocked(os.networkInterfaces).mockImplementation(() => {
|
|
116
|
-
throw new Error('Network error');
|
|
117
|
-
});
|
|
118
|
-
const result = detectLocalIp();
|
|
119
|
-
expect(result).toBeNull();
|
|
120
|
-
});
|
|
121
|
-
it('should handle multiple network interfaces', () => {
|
|
122
|
-
const mockInterfaces = {
|
|
123
|
-
'eth0': [
|
|
124
|
-
{ address: '8.8.8.8', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '8.8.8.8/24' },
|
|
125
|
-
],
|
|
126
|
-
'wlan0': [
|
|
127
|
-
{ address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '192.168.1.100/24' },
|
|
128
|
-
],
|
|
129
|
-
'lo': [
|
|
130
|
-
{ address: '127.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:02', internal: true, cidr: '127.0.0.1/8' },
|
|
131
|
-
],
|
|
132
|
-
};
|
|
133
|
-
vi.mocked(os.networkInterfaces).mockReturnValue(mockInterfaces);
|
|
134
|
-
const result = detectLocalIp();
|
|
135
|
-
expect(result).toBe('192.168.1.100');
|
|
136
|
-
});
|
|
137
|
-
it('should prefer 10.x.x.x over 192.168.x.x when both present', () => {
|
|
138
|
-
const mockInterfaces = [
|
|
139
|
-
{ address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '192.168.1.100/24' },
|
|
140
|
-
{ address: '10.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '10.0.0.1/8' },
|
|
141
|
-
];
|
|
142
|
-
vi.mocked(os.networkInterfaces).mockReturnValue({
|
|
143
|
-
'eth0': mockInterfaces,
|
|
144
|
-
});
|
|
145
|
-
const result = detectLocalIp();
|
|
146
|
-
expect(result).toBe('192.168.1.100'); // First one found
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
//# sourceMappingURL=network-detection.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"network-detection.test.js","sourceRoot":"","sources":["../src/network-detection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.test.d.ts","sourceRoot":"","sources":["../src/rate-limiter.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for rate limiter
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
5
|
-
import { RateLimiter } from './rate-limiter.js';
|
|
6
|
-
describe('RateLimiter', () => {
|
|
7
|
-
let rateLimiter;
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
rateLimiter = new RateLimiter({
|
|
10
|
-
maxRequests: 5,
|
|
11
|
-
windowMs: 1000
|
|
12
|
-
});
|
|
13
|
-
});
|
|
14
|
-
describe('check', () => {
|
|
15
|
-
it('should allow requests within the limit', () => {
|
|
16
|
-
const result1 = rateLimiter.check('127.0.0.1');
|
|
17
|
-
const result2 = rateLimiter.check('127.0.0.1');
|
|
18
|
-
const result3 = rateLimiter.check('127.0.0.1');
|
|
19
|
-
expect(result1.allowed).toBe(true);
|
|
20
|
-
expect(result1.remaining).toBe(4);
|
|
21
|
-
expect(result2.allowed).toBe(true);
|
|
22
|
-
expect(result2.remaining).toBe(3);
|
|
23
|
-
expect(result3.allowed).toBe(true);
|
|
24
|
-
expect(result3.remaining).toBe(2);
|
|
25
|
-
});
|
|
26
|
-
it('should block requests exceeding the limit', () => {
|
|
27
|
-
// Make 5 requests (within limit)
|
|
28
|
-
for (let i = 0; i < 5; i++) {
|
|
29
|
-
const result = rateLimiter.check('127.0.0.1');
|
|
30
|
-
expect(result.allowed).toBe(true);
|
|
31
|
-
}
|
|
32
|
-
// 6th request should be blocked
|
|
33
|
-
const result = rateLimiter.check('127.0.0.1');
|
|
34
|
-
expect(result.allowed).toBe(false);
|
|
35
|
-
expect(result.remaining).toBe(0);
|
|
36
|
-
});
|
|
37
|
-
it('should track requests separately for different IPs', () => {
|
|
38
|
-
// Make 5 requests from IP1
|
|
39
|
-
for (let i = 0; i < 5; i++) {
|
|
40
|
-
rateLimiter.check('127.0.0.1');
|
|
41
|
-
}
|
|
42
|
-
// IP1 should be blocked
|
|
43
|
-
const result1 = rateLimiter.check('127.0.0.1');
|
|
44
|
-
expect(result1.allowed).toBe(false);
|
|
45
|
-
// IP2 should still be allowed
|
|
46
|
-
const result2 = rateLimiter.check('192.168.1.1');
|
|
47
|
-
expect(result2.allowed).toBe(true);
|
|
48
|
-
});
|
|
49
|
-
it('should reset the window after it expires', async () => {
|
|
50
|
-
// Make 5 requests (within limit)
|
|
51
|
-
for (let i = 0; i < 5; i++) {
|
|
52
|
-
rateLimiter.check('127.0.0.1');
|
|
53
|
-
}
|
|
54
|
-
// 6th request should be blocked
|
|
55
|
-
let result = rateLimiter.check('127.0.0.1');
|
|
56
|
-
expect(result.allowed).toBe(false);
|
|
57
|
-
// Wait for window to expire
|
|
58
|
-
await new Promise(resolve => setTimeout(resolve, 1100));
|
|
59
|
-
// Should be allowed again
|
|
60
|
-
result = rateLimiter.check('127.0.0.1');
|
|
61
|
-
expect(result.allowed).toBe(true);
|
|
62
|
-
expect(result.remaining).toBe(4);
|
|
63
|
-
});
|
|
64
|
-
it('should provide correct reset time', () => {
|
|
65
|
-
const result = rateLimiter.check('127.0.0.1');
|
|
66
|
-
const now = Date.now();
|
|
67
|
-
expect(result.resetTime).toBeGreaterThan(now);
|
|
68
|
-
expect(result.resetTime).toBeLessThanOrEqual(now + 1000);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
describe('reset', () => {
|
|
72
|
-
it('should reset the rate limit for a specific IP', () => {
|
|
73
|
-
// Make 5 requests (within limit)
|
|
74
|
-
for (let i = 0; i < 5; i++) {
|
|
75
|
-
rateLimiter.check('127.0.0.1');
|
|
76
|
-
}
|
|
77
|
-
// 6th request should be blocked
|
|
78
|
-
let result = rateLimiter.check('127.0.0.1');
|
|
79
|
-
expect(result.allowed).toBe(false);
|
|
80
|
-
// Reset the IP
|
|
81
|
-
rateLimiter.reset('127.0.0.1');
|
|
82
|
-
// Should be allowed again
|
|
83
|
-
result = rateLimiter.check('127.0.0.1');
|
|
84
|
-
expect(result.allowed).toBe(true);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
describe('cleanup', () => {
|
|
88
|
-
it('should remove old records', async () => {
|
|
89
|
-
// Make requests from two IPs
|
|
90
|
-
rateLimiter.check('127.0.0.1');
|
|
91
|
-
rateLimiter.check('192.168.1.1');
|
|
92
|
-
// Wait for records to become old
|
|
93
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
94
|
-
// Cleanup with max age of 50ms
|
|
95
|
-
rateLimiter.cleanup(50);
|
|
96
|
-
// Both records should be removed (old enough)
|
|
97
|
-
const status1 = rateLimiter.getStatus('127.0.0.1');
|
|
98
|
-
const status2 = rateLimiter.getStatus('192.168.1.1');
|
|
99
|
-
expect(status1.remaining).toBe(5); // Reset to full limit
|
|
100
|
-
expect(status2.remaining).toBe(5); // Reset to full limit
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
describe('getStatus', () => {
|
|
104
|
-
it('should return status without incrementing count', () => {
|
|
105
|
-
const status1 = rateLimiter.getStatus('127.0.0.1');
|
|
106
|
-
expect(status1.allowed).toBe(true);
|
|
107
|
-
expect(status1.remaining).toBe(5);
|
|
108
|
-
const status2 = rateLimiter.getStatus('127.0.0.1');
|
|
109
|
-
expect(status2.allowed).toBe(true);
|
|
110
|
-
expect(status2.remaining).toBe(5); // Still 5, not decremented
|
|
111
|
-
});
|
|
112
|
-
it('should return correct status for IPs that have made requests', () => {
|
|
113
|
-
rateLimiter.check('127.0.0.1');
|
|
114
|
-
rateLimiter.check('127.0.0.1');
|
|
115
|
-
const status = rateLimiter.getStatus('127.0.0.1');
|
|
116
|
-
expect(status.allowed).toBe(true);
|
|
117
|
-
expect(status.remaining).toBe(3);
|
|
118
|
-
});
|
|
119
|
-
it('should return not allowed for IPs that have exceeded the limit', () => {
|
|
120
|
-
// Make 5 requests (within limit)
|
|
121
|
-
for (let i = 0; i < 5; i++) {
|
|
122
|
-
rateLimiter.check('127.0.0.1');
|
|
123
|
-
}
|
|
124
|
-
const status = rateLimiter.getStatus('127.0.0.1');
|
|
125
|
-
expect(status.allowed).toBe(false);
|
|
126
|
-
expect(status.remaining).toBe(0);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
//# sourceMappingURL=rate-limiter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.test.js","sourceRoot":"","sources":["../src/rate-limiter.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAM,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,WAAwB,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,IAAI,WAAW,CAAC;YAC5B,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE/C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAElC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAElC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;YAED,gCAAgC;YAChC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,2BAA2B;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAED,wBAAwB;YACxB,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEpC,8BAA8B;YAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAED,gCAAgC;YAChC,IAAI,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnC,4BAA4B;YAC5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAExD,0BAA0B;YAC1B,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAED,gCAAgC;YAChC,IAAI,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnC,eAAe;YACf,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE/B,0BAA0B;YAC1B,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,6BAA6B;YAC7B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAEjC,iCAAiC;YACjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEvD,+BAA+B;YAC/B,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAExB,8CAA8C;YAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAErD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;YACzD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAElC,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/registry.test.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Registry System Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for the generic registry system including:
|
|
5
|
-
* - Basic registry operations
|
|
6
|
-
* - Register/unregister functionality
|
|
7
|
-
* - Get/has/list methods
|
|
8
|
-
* - Lifecycle hooks (init/destroy)
|
|
9
|
-
* - Error handling
|
|
10
|
-
* - Typed registry instances
|
|
11
|
-
*/
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=registry.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../src/registry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|