xypriss 1.1.4 → 1.2.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.
Files changed (106) hide show
  1. package/dist/cjs/src/index.js +56 -0
  2. package/dist/cjs/src/index.js.map +1 -1
  3. package/dist/cjs/src/plugins/modules/PluginRegistry.js +6 -38
  4. package/dist/cjs/src/plugins/modules/PluginRegistry.js.map +1 -1
  5. package/dist/cjs/src/plugins/modules/builtin/JWTAuthPlugin.js +1 -1
  6. package/dist/cjs/src/plugins/modules/builtin/JWTAuthPlugin.js.map +1 -1
  7. package/dist/cjs/src/plugins/modules/builtin/SmartCachePlugin.js +1 -1
  8. package/dist/cjs/src/plugins/modules/builtin/SmartCachePlugin.js.map +1 -1
  9. package/dist/cjs/src/plugins/modules/core/CachePlugin.js +4 -4
  10. package/dist/cjs/src/plugins/modules/core/CachePlugin.js.map +1 -1
  11. package/dist/cjs/src/plugins/modules/core/PerformancePlugin.js +2 -2
  12. package/dist/cjs/src/plugins/modules/core/PerformancePlugin.js.map +1 -1
  13. package/dist/cjs/src/plugins/modules/core/SecurityPlugin.js +2 -2
  14. package/dist/cjs/src/plugins/modules/core/SecurityPlugin.js.map +1 -1
  15. package/dist/cjs/src/plugins/modules/index.js +304 -0
  16. package/dist/cjs/src/plugins/modules/index.js.map +1 -0
  17. package/dist/cjs/src/plugins/modules/network/builtin/CompressionPlugin.js +410 -0
  18. package/dist/cjs/src/plugins/modules/network/builtin/CompressionPlugin.js.map +1 -0
  19. package/dist/cjs/src/plugins/modules/network/builtin/ConnectionPlugin.js +797 -0
  20. package/dist/cjs/src/plugins/modules/network/builtin/ConnectionPlugin.js.map +1 -0
  21. package/dist/cjs/src/plugins/modules/network/builtin/ProxyPlugin.js +409 -0
  22. package/dist/cjs/src/plugins/modules/network/builtin/ProxyPlugin.js.map +1 -0
  23. package/dist/cjs/src/plugins/modules/network/builtin/RateLimitPlugin.js +606 -0
  24. package/dist/cjs/src/plugins/modules/network/builtin/RateLimitPlugin.js.map +1 -0
  25. package/dist/cjs/src/plugins/modules/network/core/NetworkPlugin.js +225 -0
  26. package/dist/cjs/src/plugins/modules/network/core/NetworkPlugin.js.map +1 -0
  27. package/dist/cjs/src/plugins/modules/network/core/NetworkPluginFactory.js +40 -0
  28. package/dist/cjs/src/plugins/modules/network/core/NetworkPluginFactory.js.map +1 -0
  29. package/dist/cjs/src/plugins/modules/network/index.js +120 -0
  30. package/dist/cjs/src/plugins/modules/network/index.js.map +1 -0
  31. package/dist/cjs/src/plugins/modules/network/types/NetworkTypes.js +24 -0
  32. package/dist/cjs/src/plugins/modules/network/types/NetworkTypes.js.map +1 -0
  33. package/dist/cjs/src/plugins/modules/network/utils/NetworkPluginUtils.js +63 -0
  34. package/dist/cjs/src/plugins/modules/network/utils/NetworkPluginUtils.js.map +1 -0
  35. package/dist/cjs/src/plugins/modules/types/PluginTypes.js +1 -0
  36. package/dist/cjs/src/plugins/modules/types/PluginTypes.js.map +1 -1
  37. package/dist/cjs/src/server/FastServer.js +111 -2
  38. package/dist/cjs/src/server/FastServer.js.map +1 -1
  39. package/dist/cjs/src/server/conf/networkConnectionConf.js +25 -0
  40. package/dist/cjs/src/server/conf/networkConnectionConf.js.map +1 -0
  41. package/dist/cjs/src/server/conf/proxyConfig.js +23 -0
  42. package/dist/cjs/src/server/conf/proxyConfig.js.map +1 -0
  43. package/dist/cjs/src/server/conf/rateLimitConfig.js +35 -0
  44. package/dist/cjs/src/server/conf/rateLimitConfig.js.map +1 -0
  45. package/dist/cjs/src/server/const/default.js +6 -0
  46. package/dist/cjs/src/server/const/default.js.map +1 -1
  47. package/dist/cjs/src/server/handlers/NotFoundHandler.js +217 -0
  48. package/dist/cjs/src/server/handlers/NotFoundHandler.js.map +1 -0
  49. package/dist/cjs/src/server/handlers/templates/notFoundTemp.js +163 -0
  50. package/dist/cjs/src/server/handlers/templates/notFoundTemp.js.map +1 -0
  51. package/dist/esm/mods/security/src/components/cache/UFSIMC.js +5 -5
  52. package/dist/esm/mods/security/src/components/cache/UFSIMC.js.map +1 -1
  53. package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +3 -3
  54. package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
  55. package/dist/esm/src/index.js +18 -0
  56. package/dist/esm/src/index.js.map +1 -1
  57. package/dist/esm/src/plugins/modules/PluginRegistry.js +6 -38
  58. package/dist/esm/src/plugins/modules/PluginRegistry.js.map +1 -1
  59. package/dist/esm/src/plugins/modules/builtin/JWTAuthPlugin.js +1 -1
  60. package/dist/esm/src/plugins/modules/builtin/JWTAuthPlugin.js.map +1 -1
  61. package/dist/esm/src/plugins/modules/builtin/SmartCachePlugin.js +1 -1
  62. package/dist/esm/src/plugins/modules/builtin/SmartCachePlugin.js.map +1 -1
  63. package/dist/esm/src/plugins/modules/core/CachePlugin.js +4 -4
  64. package/dist/esm/src/plugins/modules/core/CachePlugin.js.map +1 -1
  65. package/dist/esm/src/plugins/modules/core/PerformancePlugin.js +2 -2
  66. package/dist/esm/src/plugins/modules/core/PerformancePlugin.js.map +1 -1
  67. package/dist/esm/src/plugins/modules/core/SecurityPlugin.js +2 -2
  68. package/dist/esm/src/plugins/modules/core/SecurityPlugin.js.map +1 -1
  69. package/dist/esm/src/plugins/modules/index.js +275 -0
  70. package/dist/esm/src/plugins/modules/index.js.map +1 -0
  71. package/dist/esm/src/plugins/modules/network/builtin/CompressionPlugin.js +389 -0
  72. package/dist/esm/src/plugins/modules/network/builtin/CompressionPlugin.js.map +1 -0
  73. package/dist/esm/src/plugins/modules/network/builtin/ConnectionPlugin.js +776 -0
  74. package/dist/esm/src/plugins/modules/network/builtin/ConnectionPlugin.js.map +1 -0
  75. package/dist/esm/src/plugins/modules/network/builtin/ProxyPlugin.js +407 -0
  76. package/dist/esm/src/plugins/modules/network/builtin/ProxyPlugin.js.map +1 -0
  77. package/dist/esm/src/plugins/modules/network/builtin/RateLimitPlugin.js +585 -0
  78. package/dist/esm/src/plugins/modules/network/builtin/RateLimitPlugin.js.map +1 -0
  79. package/dist/esm/src/plugins/modules/network/core/NetworkPlugin.js +223 -0
  80. package/dist/esm/src/plugins/modules/network/core/NetworkPlugin.js.map +1 -0
  81. package/dist/esm/src/plugins/modules/network/core/NetworkPluginFactory.js +38 -0
  82. package/dist/esm/src/plugins/modules/network/core/NetworkPluginFactory.js.map +1 -0
  83. package/dist/esm/src/plugins/modules/network/index.js +109 -0
  84. package/dist/esm/src/plugins/modules/network/index.js.map +1 -0
  85. package/dist/esm/src/plugins/modules/network/types/NetworkTypes.js +24 -0
  86. package/dist/esm/src/plugins/modules/network/types/NetworkTypes.js.map +1 -0
  87. package/dist/esm/src/plugins/modules/network/utils/NetworkPluginUtils.js +61 -0
  88. package/dist/esm/src/plugins/modules/network/utils/NetworkPluginUtils.js.map +1 -0
  89. package/dist/esm/src/plugins/modules/types/PluginTypes.js +1 -0
  90. package/dist/esm/src/plugins/modules/types/PluginTypes.js.map +1 -1
  91. package/dist/esm/src/server/FastServer.js +111 -2
  92. package/dist/esm/src/server/FastServer.js.map +1 -1
  93. package/dist/esm/src/server/conf/networkConnectionConf.js +23 -0
  94. package/dist/esm/src/server/conf/networkConnectionConf.js.map +1 -0
  95. package/dist/esm/src/server/conf/proxyConfig.js +21 -0
  96. package/dist/esm/src/server/conf/proxyConfig.js.map +1 -0
  97. package/dist/esm/src/server/conf/rateLimitConfig.js +33 -0
  98. package/dist/esm/src/server/conf/rateLimitConfig.js.map +1 -0
  99. package/dist/esm/src/server/const/default.js +6 -0
  100. package/dist/esm/src/server/const/default.js.map +1 -1
  101. package/dist/esm/src/server/handlers/NotFoundHandler.js +194 -0
  102. package/dist/esm/src/server/handlers/NotFoundHandler.js.map +1 -0
  103. package/dist/esm/src/server/handlers/templates/notFoundTemp.js +161 -0
  104. package/dist/esm/src/server/handlers/templates/notFoundTemp.js.map +1 -0
  105. package/dist/index.d.ts +5085 -14
  106. package/package.json +8 -7
@@ -0,0 +1,606 @@
1
+ 'use strict';
2
+
3
+ var perf_hooks = require('perf_hooks');
4
+ var rateLimit = require('express-rate-limit');
5
+ var NetworkPlugin = require('../core/NetworkPlugin.js');
6
+ var xyprissSecurity = require('xypriss-security');
7
+ var crypto = require('crypto');
8
+ var SecureCacheAdapter = require('../../../../cache/SecureCacheAdapter.js');
9
+ require('../../../../../mods/security/src/components/cache/index.js');
10
+ var NetworkTypes = require('../types/NetworkTypes.js');
11
+ var Logger = require('../../../../../shared/logger/Logger.js');
12
+
13
+ function _interopNamespaceDefault(e) {
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n.default = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var crypto__namespace = /*#__PURE__*/_interopNamespaceDefault(crypto);
31
+
32
+ /**
33
+ * Rate Limit Plugin
34
+ *
35
+ * Advanced rate limiting with multiple strategies, Redis support, and per-route limits
36
+ * Uses express-rate-limit and Redis for distributed rate limiting
37
+ */
38
+ /**
39
+ * Advanced rate limiting plugin with Redis support
40
+ */
41
+ class RateLimitPlugin extends NetworkPlugin.NetworkPlugin {
42
+ constructor(config = {
43
+ enabled: true,
44
+ strategy: "fixed-window",
45
+ global: { requests: 1000, window: "1h" },
46
+ skipSuccessfulRequests: false,
47
+ skipFailedRequests: false,
48
+ }) {
49
+ super(config);
50
+ this.id = "xypriss.network.ratelimit";
51
+ this.name = "XyPriss Rate Limiting Plugin (XPRL)";
52
+ this.version = "1.0.0";
53
+ this.networkCategory = NetworkTypes.NetworkCategory.RATE_LIMIT;
54
+ this.rateLimiters = new Map();
55
+ this.rateLimitStats = {
56
+ totalRequests: 0,
57
+ blockedRequests: 0,
58
+ allowedRequests: 0,
59
+ rateLimitHits: new Map(),
60
+ averageRequestsPerSecond: 0,
61
+ peakRequestsPerSecond: 0,
62
+ lastResetTime: Date.now(),
63
+ securityEvents: new Map(),
64
+ };
65
+ this.logger = new Logger.Logger();
66
+ this.initializeCacheAdapter();
67
+ this.initializeRateLimiting();
68
+ }
69
+ /**
70
+ * Initialize cache adapter for rate limiting storage
71
+ */
72
+ initializeCacheAdapter() {
73
+ const config = this.getRateLimitConfig();
74
+ // Configure cache adapter for rate limiting
75
+ const cacheConfig = {
76
+ strategy: config.redis ? "hybrid" : "memory", // Use memory-only if no Redis config
77
+ memory: {
78
+ maxSize: 50, // 50MB for rate limiting data
79
+ ttl: 3600000, // 1 hour default TTL
80
+ algorithm: "lru",
81
+ evictionPolicy: "ttl",
82
+ },
83
+ performance: {
84
+ compressionThreshold: 1024,
85
+ asyncWrite: true,
86
+ pipeline: true,
87
+ connectionPooling: true,
88
+ },
89
+ security: {
90
+ encryption: true,
91
+ accessMonitoring: true,
92
+ sanitization: true,
93
+ },
94
+ monitoring: {
95
+ enabled: true,
96
+ metricsInterval: 60000, // 1 minute
97
+ detailed: false,
98
+ },
99
+ };
100
+ // Only add Redis config if it exists
101
+ if (config.redis) {
102
+ cacheConfig.redis = {
103
+ host: config.redis.host,
104
+ port: config.redis.port,
105
+ password: config.redis.password,
106
+ db: config.redis.db || 0,
107
+ };
108
+ }
109
+ this.cacheAdapter = new SecureCacheAdapter.SecureCacheAdapter(cacheConfig);
110
+ }
111
+ /**
112
+ * Initialize rate limiting using cache adapter
113
+ */
114
+ async initializeRateLimiting() {
115
+ // Connect to cache backends
116
+ await this.cacheAdapter.connect();
117
+ // Create rate limiters
118
+ this.createRateLimiters();
119
+ // Start statistics tracking
120
+ this.startStatsTracking();
121
+ }
122
+ /**
123
+ * Create rate limiters for different scopes
124
+ */
125
+ createRateLimiters() {
126
+ const config = this.getRateLimitConfig();
127
+ // Global rate limiter
128
+ if (config.global) {
129
+ this.rateLimiters.set("global", this.createRateLimiter("global", config.global));
130
+ }
131
+ // Per-IP rate limiter
132
+ if (config.perIP) {
133
+ this.rateLimiters.set("perIP", this.createRateLimiter("perIP", config.perIP));
134
+ }
135
+ // Per-user rate limiter
136
+ if (config.perUser) {
137
+ this.rateLimiters.set("perUser", this.createRateLimiter("perUser", config.perUser));
138
+ }
139
+ // Per-route rate limiters
140
+ if (config.perRoute) {
141
+ for (const [route, rule] of Object.entries(config.perRoute)) {
142
+ this.rateLimiters.set(`route:${route}`, this.createRateLimiter(`route:${route}`, rule));
143
+ }
144
+ }
145
+ }
146
+ /**
147
+ * Create individual rate limiter
148
+ */
149
+ createRateLimiter(scope, rule) {
150
+ const config = this.getRateLimitConfig();
151
+ const windowMs = this.parseTimeWindow(rule.window);
152
+ const limiterConfig = {
153
+ windowMs,
154
+ max: rule.requests,
155
+ message: {
156
+ error: "Too many requests",
157
+ scope,
158
+ limit: rule.requests,
159
+ window: rule.window,
160
+ retryAfter: Math.ceil(windowMs / 1000),
161
+ },
162
+ standardHeaders: true,
163
+ legacyHeaders: false,
164
+ skipSuccessfulRequests: config.skipSuccessfulRequests || false,
165
+ skipFailedRequests: config.skipFailedRequests || false,
166
+ // Custom key generator based on scope
167
+ keyGenerator: (req) => this.generateRateLimitKey(req, scope),
168
+ // Custom handler for rate limit exceeded
169
+ handler: (req, res) => {
170
+ this.handleRateLimitExceeded(req, res, scope);
171
+ },
172
+ // Skip function for conditional rate limiting
173
+ skip: (req) => this.shouldSkipRateLimit(req, scope),
174
+ };
175
+ // Add cache store for distributed rate limiting
176
+ if (config.strategy !== "fixed-window") {
177
+ limiterConfig.store = this.createCacheStore(scope, windowMs);
178
+ }
179
+ return rateLimit(limiterConfig);
180
+ }
181
+ /**
182
+ * Execute rate limiting logic
183
+ */
184
+ async executeNetwork(context) {
185
+ const startTime = perf_hooks.performance.now();
186
+ const { req, res } = context;
187
+ try {
188
+ if (!this.getRateLimitConfig().enabled) {
189
+ return {
190
+ success: true,
191
+ executionTime: perf_hooks.performance.now() - startTime,
192
+ shouldContinue: true,
193
+ data: {
194
+ rateLimited: false,
195
+ reason: "rate_limiting_disabled",
196
+ },
197
+ };
198
+ }
199
+ // Apply rate limiters in order of specificity
200
+ const rateLimitResults = await this.applyRateLimiters(req, res);
201
+ // Update statistics
202
+ this.updateRateLimitStats(rateLimitResults);
203
+ const executionTime = perf_hooks.performance.now() - startTime;
204
+ const wasBlocked = rateLimitResults.some((result) => result.blocked);
205
+ return {
206
+ success: true,
207
+ executionTime,
208
+ shouldContinue: !wasBlocked,
209
+ data: {
210
+ rateLimited: wasBlocked,
211
+ appliedLimits: rateLimitResults,
212
+ remainingRequests: this.getRemainingRequests(req),
213
+ },
214
+ modifications: wasBlocked
215
+ ? {
216
+ statusCode: 429,
217
+ headers: {
218
+ "Retry-After": "60",
219
+ "X-RateLimit-Limit": this.getRateLimitHeader(req),
220
+ "X-RateLimit-Remaining": "0",
221
+ },
222
+ }
223
+ : undefined,
224
+ networkMetrics: {
225
+ processingTime: executionTime,
226
+ memoryUsage: process.memoryUsage().heapUsed,
227
+ cpuUsage: process.cpuUsage().user,
228
+ },
229
+ };
230
+ }
231
+ catch (error) {
232
+ return {
233
+ success: false,
234
+ executionTime: perf_hooks.performance.now() - startTime,
235
+ shouldContinue: true,
236
+ error,
237
+ };
238
+ }
239
+ }
240
+ /**
241
+ * Apply all configured rate limiters
242
+ */
243
+ async applyRateLimiters(req, res) {
244
+ const results = [];
245
+ for (const [scope, limiter] of this.rateLimiters.entries()) {
246
+ if (this.shouldApplyLimiter(req, scope)) {
247
+ try {
248
+ await new Promise((resolve, reject) => {
249
+ limiter(req, res, (err) => {
250
+ if (err) {
251
+ if (err.status === 429) {
252
+ results.push({
253
+ scope,
254
+ blocked: true,
255
+ error: err,
256
+ });
257
+ resolve(); // Don't reject, just mark as blocked
258
+ }
259
+ else {
260
+ reject(err);
261
+ }
262
+ }
263
+ else {
264
+ results.push({ scope, blocked: false });
265
+ resolve();
266
+ }
267
+ });
268
+ });
269
+ }
270
+ catch (error) {
271
+ results.push({ scope, blocked: true, error });
272
+ }
273
+ }
274
+ }
275
+ return results;
276
+ }
277
+ /**
278
+ * Generate secure rate limit key based on scope using security modules
279
+ */
280
+ generateRateLimitKey(req, scope) {
281
+ let baseKey;
282
+ switch (scope) {
283
+ case "global":
284
+ baseKey = "global";
285
+ break;
286
+ case "perIP":
287
+ baseKey = req.ip || req.socket.remoteAddress || "unknown";
288
+ break;
289
+ case "perUser":
290
+ baseKey = req.user?.id || req.ip || "anonymous";
291
+ break;
292
+ default:
293
+ if (scope.startsWith("route:")) {
294
+ const route = scope.substring(6);
295
+ baseKey = `${route}:${req.ip}`;
296
+ }
297
+ else {
298
+ baseKey = req.ip || "unknown";
299
+ }
300
+ }
301
+ // Use secure hashing for consistent key generation
302
+ return this.generateSecureKey(baseKey, scope);
303
+ }
304
+ /**
305
+ * Generate secure hash key using xypriss-security Hash module
306
+ */
307
+ generateSecureKey(baseKey, scope) {
308
+ try {
309
+ // Use crypto module with secure approach for synchronous operation
310
+ const keyData = `${scope}:${baseKey}:${this.getRateLimitConfig().global?.window || "1h"}`;
311
+ // Use timing-safe comparison approach from security module
312
+ const hash = crypto__namespace
313
+ .createHash("sha256")
314
+ .update(keyData)
315
+ .digest("hex");
316
+ // Add entropy using SecureRandom if available
317
+ const salt = this.generateSecureSalt();
318
+ return crypto__namespace
319
+ .createHash("sha256")
320
+ .update(hash + salt)
321
+ .digest("hex");
322
+ }
323
+ catch (error) {
324
+ // Fallback to crypto hash
325
+ return crypto__namespace
326
+ .createHash("sha256")
327
+ .update(`${scope}:${baseKey}`)
328
+ .digest("hex");
329
+ }
330
+ }
331
+ /**
332
+ * Generate secure salt for key hashing
333
+ */
334
+ generateSecureSalt() {
335
+ try {
336
+ // Use SecureRandom for salt generation
337
+ return xyprissSecurity.RandomTokens.generateSecureToken(16);
338
+ }
339
+ catch (error) {
340
+ // Fallback to crypto random bytes
341
+ return crypto__namespace.randomBytes(16).toString("hex");
342
+ }
343
+ }
344
+ /**
345
+ * Parse time window string to milliseconds
346
+ */
347
+ parseTimeWindow(window) {
348
+ const match = window.match(/^(\d+)([smhd])$/);
349
+ if (!match)
350
+ return 60000; // Default 1 minute
351
+ const value = parseInt(match[1]);
352
+ const unit = match[2];
353
+ switch (unit) {
354
+ case "s":
355
+ return value * 1000;
356
+ case "m":
357
+ return value * 60 * 1000;
358
+ case "h":
359
+ return value * 60 * 60 * 1000;
360
+ case "d":
361
+ return value * 24 * 60 * 60 * 1000;
362
+ default:
363
+ return 60000;
364
+ }
365
+ }
366
+ /**
367
+ * Create cache store for distributed rate limiting using SecureCacheAdapter
368
+ */
369
+ createCacheStore(scope, windowMs) {
370
+ return {
371
+ incr: async (key, cb) => {
372
+ try {
373
+ const fullKey = `ratelimit:${scope}:${key}`;
374
+ // Get current count from cache
375
+ const cached = await this.cacheAdapter.get(fullKey);
376
+ const current = cached ? cached.value + 1 : 1;
377
+ // Store updated count with TTL
378
+ await this.cacheAdapter.set(fullKey, current, {
379
+ ttl: windowMs,
380
+ tags: [`ratelimit`, scope],
381
+ });
382
+ cb(null, {
383
+ totalHits: current,
384
+ resetTime: new Date(Date.now() + windowMs),
385
+ });
386
+ }
387
+ catch (error) {
388
+ cb(error);
389
+ }
390
+ },
391
+ decrement: async (key) => {
392
+ try {
393
+ const fullKey = `ratelimit:${scope}:${key}`;
394
+ const cached = await this.cacheAdapter.get(fullKey);
395
+ const current = cached
396
+ ? Math.max(0, cached.value - 1)
397
+ : 0;
398
+ if (current > 0) {
399
+ await this.cacheAdapter.set(fullKey, current, {
400
+ ttl: windowMs,
401
+ tags: [`ratelimit`, scope],
402
+ });
403
+ }
404
+ else {
405
+ await this.cacheAdapter.delete(fullKey);
406
+ }
407
+ }
408
+ catch (error) {
409
+ this.logger.warn("plugins", "Failed to decrement rate limit key:", error);
410
+ }
411
+ },
412
+ resetKey: async (key) => {
413
+ try {
414
+ const fullKey = `ratelimit:${scope}:${key}`;
415
+ await this.cacheAdapter.delete(fullKey);
416
+ }
417
+ catch (error) {
418
+ this.logger.warn("plugins", "Failed to reset rate limit key:", error);
419
+ }
420
+ },
421
+ };
422
+ }
423
+ /**
424
+ * Handle rate limit exceeded
425
+ */
426
+ handleRateLimitExceeded(req, res, scope) {
427
+ this.rateLimitStats.blockedRequests++;
428
+ const hitCount = this.rateLimitStats.rateLimitHits.get(scope) || 0;
429
+ this.rateLimitStats.rateLimitHits.set(scope, hitCount + 1);
430
+ if (!res.headersSent) {
431
+ res.status(429).json({
432
+ error: "Rate limit exceeded",
433
+ scope,
434
+ message: `Too many requests for ${scope}`,
435
+ retryAfter: 60,
436
+ timestamp: new Date().toISOString(),
437
+ });
438
+ }
439
+ }
440
+ /**
441
+ * Check if rate limiter should be applied
442
+ */
443
+ shouldApplyLimiter(req, scope) {
444
+ if (scope.startsWith("route:")) {
445
+ const route = scope.substring(6);
446
+ return req.path === route || req.path.startsWith(route);
447
+ }
448
+ return true;
449
+ }
450
+ /**
451
+ * Check if request should skip rate limiting
452
+ */
453
+ shouldSkipRateLimit(req, scope) {
454
+ // Skip rate limiting for health checks
455
+ if (req.path === "/health" || req.path === "/ping") {
456
+ return true;
457
+ }
458
+ // Skip for internal requests
459
+ if (req.get("X-Internal-Request")) {
460
+ return true;
461
+ }
462
+ return false;
463
+ }
464
+ /**
465
+ * Update rate limiting statistics
466
+ */
467
+ updateRateLimitStats(results) {
468
+ this.rateLimitStats.totalRequests++;
469
+ const wasBlocked = results.some((result) => result.blocked);
470
+ if (wasBlocked) {
471
+ this.rateLimitStats.blockedRequests++;
472
+ }
473
+ else {
474
+ this.rateLimitStats.allowedRequests++;
475
+ }
476
+ }
477
+ /**
478
+ * Get remaining requests for client using secure key lookup
479
+ */
480
+ getRemainingRequests(req) {
481
+ try {
482
+ const key = this.generateRateLimitKey(req, "perIP");
483
+ // In a real implementation, this would query Redis or memory store
484
+ // For now, return a calculated value based on current stats
485
+ const config = this.getRateLimitConfig();
486
+ const maxRequests = config.perIP?.requests || config.global?.requests || 1000;
487
+ const usedRequests = this.rateLimitStats.totalRequests % maxRequests;
488
+ return Math.max(0, maxRequests - usedRequests);
489
+ }
490
+ catch (error) {
491
+ return 0; // Conservative approach on error
492
+ }
493
+ }
494
+ /**
495
+ * Get rate limit header value based on request context
496
+ */
497
+ getRateLimitHeader(req) {
498
+ const config = this.getRateLimitConfig();
499
+ // Determine which limit applies to this request
500
+ if (config.perIP && req.ip) {
501
+ return config.perIP.requests.toString();
502
+ }
503
+ return config.global?.requests.toString() || "1000";
504
+ }
505
+ /**
506
+ * Start statistics tracking
507
+ */
508
+ startStatsTracking() {
509
+ setInterval(() => {
510
+ this.updateRequestsPerSecond();
511
+ }, 1000);
512
+ }
513
+ /**
514
+ * Update requests per second statistics
515
+ */
516
+ updateRequestsPerSecond() {
517
+ const now = Date.now();
518
+ const timeDiff = (now - this.rateLimitStats.lastResetTime) / 1000;
519
+ if (timeDiff >= 1) {
520
+ const requestsPerSecond = this.rateLimitStats.totalRequests / timeDiff;
521
+ this.rateLimitStats.averageRequestsPerSecond = requestsPerSecond;
522
+ if (requestsPerSecond > this.rateLimitStats.peakRequestsPerSecond) {
523
+ this.rateLimitStats.peakRequestsPerSecond = requestsPerSecond;
524
+ }
525
+ }
526
+ }
527
+ /**
528
+ * Get rate limit configuration
529
+ */
530
+ getRateLimitConfig() {
531
+ return this.config;
532
+ }
533
+ /**
534
+ * Validate rate limit configuration
535
+ */
536
+ validateNetworkConfig(config) {
537
+ if (config.global && config.global.requests <= 0) {
538
+ return false;
539
+ }
540
+ if (config.perIP && config.perIP.requests <= 0) {
541
+ return false;
542
+ }
543
+ return true;
544
+ }
545
+ /**
546
+ * Check network health
547
+ */
548
+ async checkNetworkHealth() {
549
+ const blockRate = this.rateLimitStats.blockedRequests /
550
+ Math.max(this.rateLimitStats.totalRequests, 1);
551
+ const cacheHealthy = await this.checkCacheHealth();
552
+ return {
553
+ healthy: blockRate < 0.5 && cacheHealthy,
554
+ status: blockRate < 0.2 && cacheHealthy
555
+ ? "healthy"
556
+ : blockRate < 0.5 && cacheHealthy
557
+ ? "degraded"
558
+ : "unhealthy",
559
+ metrics: {
560
+ responseTime: this.performanceMetrics.averageExecutionTime,
561
+ errorRate: blockRate,
562
+ throughput: this.rateLimitStats.averageRequestsPerSecond,
563
+ connections: cacheHealthy ? 1 : 0,
564
+ },
565
+ lastCheck: new Date(),
566
+ };
567
+ }
568
+ /**
569
+ * Check cache adapter health
570
+ */
571
+ async checkCacheHealth() {
572
+ try {
573
+ // Test cache connectivity by performing a simple operation
574
+ const testKey = "health_check_test";
575
+ await this.cacheAdapter.set(testKey, "test", { ttl: 1000 });
576
+ const result = await this.cacheAdapter.get(testKey);
577
+ await this.cacheAdapter.delete(testKey);
578
+ return result !== null;
579
+ }
580
+ catch (error) {
581
+ return false;
582
+ }
583
+ }
584
+ /**
585
+ * Get rate limiting statistics
586
+ */
587
+ getRateLimitStats() {
588
+ return {
589
+ ...this.rateLimitStats,
590
+ cacheConnected: true, // Cache adapter handles connection status internally
591
+ activeLimiters: this.rateLimiters.size,
592
+ rateLimitHits: Object.fromEntries(this.rateLimitStats.rateLimitHits),
593
+ };
594
+ }
595
+ /**
596
+ * Cleanup resources
597
+ */
598
+ async destroy() {
599
+ // Disconnect from cache adapter
600
+ await this.cacheAdapter.disconnect();
601
+ await super.destroy();
602
+ }
603
+ }
604
+
605
+ exports.RateLimitPlugin = RateLimitPlugin;
606
+ //# sourceMappingURL=RateLimitPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimitPlugin.js","sources":["../../../../../../../src/plugins/modules/network/builtin/RateLimitPlugin.ts"],"sourcesContent":[null],"names":["NetworkPlugin","NetworkCategory","Logger","SecureCacheAdapter","performance","crypto","RandomTokens"],"mappings":"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"}