@n24q02m/mcp-relay-server 1.0.5 → 1.0.7
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/build/store.js +1 -1
- package/build/store.js.map +1 -1
- package/package.json +1 -1
- package/src/store.ts +1 -1
- package/tests/rate-limit.test.ts +25 -7
package/build/store.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const SESSION_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
|
2
2
|
const CLEANUP_INTERVAL_MS = 60 * 1000; // 60 seconds
|
|
3
|
-
const MAX_SESSIONS_PER_IP =
|
|
3
|
+
const MAX_SESSIONS_PER_IP = 10;
|
|
4
4
|
const MAX_MESSAGES_PER_SESSION = 50;
|
|
5
5
|
const MAX_RESPONSES_PER_SESSION = 50;
|
|
6
6
|
const sessions = new Map();
|
package/build/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AA+BA,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,aAAa;AACnD,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,aAAa;AACnD,MAAM,mBAAmB,GAAG,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/store.ts
CHANGED
|
@@ -31,7 +31,7 @@ export interface Session {
|
|
|
31
31
|
|
|
32
32
|
const SESSION_TTL_MS = 10 * 60 * 1000 // 10 minutes
|
|
33
33
|
const CLEANUP_INTERVAL_MS = 60 * 1000 // 60 seconds
|
|
34
|
-
const MAX_SESSIONS_PER_IP =
|
|
34
|
+
const MAX_SESSIONS_PER_IP = 10
|
|
35
35
|
const MAX_MESSAGES_PER_SESSION = 50
|
|
36
36
|
const MAX_RESPONSES_PER_SESSION = 50
|
|
37
37
|
|
package/tests/rate-limit.test.ts
CHANGED
|
@@ -30,20 +30,38 @@ afterAll(async () => {
|
|
|
30
30
|
})
|
|
31
31
|
|
|
32
32
|
describe('Rate limiting', () => {
|
|
33
|
-
it('rate limit kicks in after 30 requests per minute', async () => {
|
|
34
|
-
//
|
|
33
|
+
it('mutation rate limit kicks in after 30 POST requests per minute', async () => {
|
|
34
|
+
// POST requests go through mutationLimiter (30/min)
|
|
35
35
|
const results: number[] = []
|
|
36
36
|
for (let i = 0; i < 31; i++) {
|
|
37
|
-
const res = await fetch(`${baseUrl}/api/sessions
|
|
37
|
+
const res = await fetch(`${baseUrl}/api/sessions`, {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: { 'Content-Type': 'application/json' },
|
|
40
|
+
body: JSON.stringify({ serverName: `test-${i}`, schema: {} })
|
|
41
|
+
})
|
|
38
42
|
results.push(res.status)
|
|
39
43
|
}
|
|
40
44
|
|
|
41
|
-
// First 30 should
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
+
// First 30 should succeed (201 created)
|
|
46
|
+
const successCount = results.filter((s) => s === 201).length
|
|
47
|
+
expect(successCount).toBeLessThanOrEqual(30)
|
|
45
48
|
|
|
46
49
|
// 31st should be rate limited
|
|
47
50
|
expect(results[30]).toBe(429)
|
|
48
51
|
})
|
|
52
|
+
|
|
53
|
+
it('polling rate limit allows 120 GET requests per minute', async () => {
|
|
54
|
+
// GET requests go through pollingLimiter (120/min)
|
|
55
|
+
// Send 31 GETs — all should be 404 (no rate limit at this count)
|
|
56
|
+
const results: number[] = []
|
|
57
|
+
for (let i = 0; i < 31; i++) {
|
|
58
|
+
const res = await fetch(`${baseUrl}/api/sessions/poll-test-${i}`)
|
|
59
|
+
results.push(res.status)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// All 31 should be 404 (not rate limited — limit is 120)
|
|
63
|
+
for (const status of results) {
|
|
64
|
+
expect(status).toBe(404)
|
|
65
|
+
}
|
|
66
|
+
})
|
|
49
67
|
})
|