bytekit 0.1.12
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/LICENSE +21 -0
- package/README.md +2241 -0
- package/bin/sutils.js +9 -0
- package/dist/api-client.d.ts +2 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +2 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +401 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/type-generator.d.ts +12 -0
- package/dist/cli/type-generator.d.ts.map +1 -0
- package/dist/cli/type-generator.js +152 -0
- package/dist/cli/type-generator.js.map +1 -0
- package/dist/date-utils.d.ts +2 -0
- package/dist/date-utils.d.ts.map +1 -0
- package/dist/date-utils.js +2 -0
- package/dist/date-utils.js.map +1 -0
- package/dist/debug.d.ts +2 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +2 -0
- package/dist/debug.js.map +1 -0
- package/dist/env-manager.d.ts +2 -0
- package/dist/env-manager.d.ts.map +1 -0
- package/dist/env-manager.js +2 -0
- package/dist/env-manager.js.map +1 -0
- package/dist/file-upload.d.ts +2 -0
- package/dist/file-upload.d.ts.map +1 -0
- package/dist/file-upload.js +2 -0
- package/dist/file-upload.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +2 -0
- package/dist/logger.js.map +1 -0
- package/dist/profiler.d.ts +2 -0
- package/dist/profiler.d.ts.map +1 -0
- package/dist/profiler.js +2 -0
- package/dist/profiler.js.map +1 -0
- package/dist/response-validator.d.ts +2 -0
- package/dist/response-validator.d.ts.map +1 -0
- package/dist/response-validator.js +2 -0
- package/dist/response-validator.js.map +1 -0
- package/dist/retry-policy.d.ts +2 -0
- package/dist/retry-policy.d.ts.map +1 -0
- package/dist/retry-policy.js +2 -0
- package/dist/retry-policy.js.map +1 -0
- package/dist/storage-utils.d.ts +2 -0
- package/dist/storage-utils.d.ts.map +1 -0
- package/dist/storage-utils.js +2 -0
- package/dist/storage-utils.js.map +1 -0
- package/dist/streaming.d.ts +2 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +2 -0
- package/dist/streaming.js.map +1 -0
- package/dist/string-utils.d.ts +2 -0
- package/dist/string-utils.d.ts.map +1 -0
- package/dist/string-utils.js +2 -0
- package/dist/string-utils.js.map +1 -0
- package/dist/utils/core/ApiClient.d.ts +94 -0
- package/dist/utils/core/ApiClient.d.ts.map +1 -0
- package/dist/utils/core/ApiClient.js +291 -0
- package/dist/utils/core/ApiClient.js.map +1 -0
- package/dist/utils/core/ErrorBoundary.d.ts +141 -0
- package/dist/utils/core/ErrorBoundary.d.ts.map +1 -0
- package/dist/utils/core/ErrorBoundary.js +322 -0
- package/dist/utils/core/ErrorBoundary.js.map +1 -0
- package/dist/utils/core/Logger.d.ts +39 -0
- package/dist/utils/core/Logger.d.ts.map +1 -0
- package/dist/utils/core/Logger.js +154 -0
- package/dist/utils/core/Logger.js.map +1 -0
- package/dist/utils/core/Profiler.d.ts +8 -0
- package/dist/utils/core/Profiler.d.ts.map +1 -0
- package/dist/utils/core/Profiler.js +18 -0
- package/dist/utils/core/Profiler.js.map +1 -0
- package/dist/utils/core/RateLimiter.d.ts +74 -0
- package/dist/utils/core/RateLimiter.d.ts.map +1 -0
- package/dist/utils/core/RateLimiter.js +170 -0
- package/dist/utils/core/RateLimiter.js.map +1 -0
- package/dist/utils/core/RequestCache.d.ts +64 -0
- package/dist/utils/core/RequestCache.d.ts.map +1 -0
- package/dist/utils/core/RequestCache.js +139 -0
- package/dist/utils/core/RequestCache.js.map +1 -0
- package/dist/utils/core/RequestDeduplicator.d.ts +41 -0
- package/dist/utils/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/utils/core/RequestDeduplicator.js +83 -0
- package/dist/utils/core/RequestDeduplicator.js.map +1 -0
- package/dist/utils/core/ResponseValidator.d.ts +26 -0
- package/dist/utils/core/ResponseValidator.d.ts.map +1 -0
- package/dist/utils/core/ResponseValidator.js +140 -0
- package/dist/utils/core/ResponseValidator.js.map +1 -0
- package/dist/utils/core/RetryPolicy.d.ts +43 -0
- package/dist/utils/core/RetryPolicy.d.ts.map +1 -0
- package/dist/utils/core/RetryPolicy.js +119 -0
- package/dist/utils/core/RetryPolicy.js.map +1 -0
- package/dist/utils/core/debug.d.ts +46 -0
- package/dist/utils/core/debug.d.ts.map +1 -0
- package/dist/utils/core/debug.js +83 -0
- package/dist/utils/core/debug.js.map +1 -0
- package/dist/utils/core/index.d.ts +11 -0
- package/dist/utils/core/index.d.ts.map +1 -0
- package/dist/utils/core/index.js +11 -0
- package/dist/utils/core/index.js.map +1 -0
- package/dist/utils/helpers/ArrayUtils.d.ts +134 -0
- package/dist/utils/helpers/ArrayUtils.d.ts.map +1 -0
- package/dist/utils/helpers/ArrayUtils.js +301 -0
- package/dist/utils/helpers/ArrayUtils.js.map +1 -0
- package/dist/utils/helpers/CacheManager.d.ts +67 -0
- package/dist/utils/helpers/CacheManager.d.ts.map +1 -0
- package/dist/utils/helpers/CacheManager.js +222 -0
- package/dist/utils/helpers/CacheManager.js.map +1 -0
- package/dist/utils/helpers/CompressionUtils.d.ts +80 -0
- package/dist/utils/helpers/CompressionUtils.d.ts.map +1 -0
- package/dist/utils/helpers/CompressionUtils.js +224 -0
- package/dist/utils/helpers/CompressionUtils.js.map +1 -0
- package/dist/utils/helpers/CryptoUtils.d.ts +70 -0
- package/dist/utils/helpers/CryptoUtils.d.ts.map +1 -0
- package/dist/utils/helpers/CryptoUtils.js +215 -0
- package/dist/utils/helpers/CryptoUtils.js.map +1 -0
- package/dist/utils/helpers/DateUtils.d.ts +31 -0
- package/dist/utils/helpers/DateUtils.d.ts.map +1 -0
- package/dist/utils/helpers/DateUtils.js +104 -0
- package/dist/utils/helpers/DateUtils.js.map +1 -0
- package/dist/utils/helpers/DiffUtils.d.ts +61 -0
- package/dist/utils/helpers/DiffUtils.d.ts.map +1 -0
- package/dist/utils/helpers/DiffUtils.js +249 -0
- package/dist/utils/helpers/DiffUtils.js.map +1 -0
- package/dist/utils/helpers/EnvManager.d.ts +7 -0
- package/dist/utils/helpers/EnvManager.d.ts.map +1 -0
- package/dist/utils/helpers/EnvManager.js +19 -0
- package/dist/utils/helpers/EnvManager.js.map +1 -0
- package/dist/utils/helpers/EventEmitter.d.ts +78 -0
- package/dist/utils/helpers/EventEmitter.d.ts.map +1 -0
- package/dist/utils/helpers/EventEmitter.js +208 -0
- package/dist/utils/helpers/EventEmitter.js.map +1 -0
- package/dist/utils/helpers/FileUploadHelper.d.ts +44 -0
- package/dist/utils/helpers/FileUploadHelper.d.ts.map +1 -0
- package/dist/utils/helpers/FileUploadHelper.js +127 -0
- package/dist/utils/helpers/FileUploadHelper.js.map +1 -0
- package/dist/utils/helpers/FormUtils.d.ts +162 -0
- package/dist/utils/helpers/FormUtils.d.ts.map +1 -0
- package/dist/utils/helpers/FormUtils.js +378 -0
- package/dist/utils/helpers/FormUtils.js.map +1 -0
- package/dist/utils/helpers/ObjectUtils.d.ts +102 -0
- package/dist/utils/helpers/ObjectUtils.d.ts.map +1 -0
- package/dist/utils/helpers/ObjectUtils.js +297 -0
- package/dist/utils/helpers/ObjectUtils.js.map +1 -0
- package/dist/utils/helpers/PaginationHelper.d.ts +127 -0
- package/dist/utils/helpers/PaginationHelper.d.ts.map +1 -0
- package/dist/utils/helpers/PaginationHelper.js +259 -0
- package/dist/utils/helpers/PaginationHelper.js.map +1 -0
- package/dist/utils/helpers/PollingHelper.d.ts +64 -0
- package/dist/utils/helpers/PollingHelper.d.ts.map +1 -0
- package/dist/utils/helpers/PollingHelper.js +131 -0
- package/dist/utils/helpers/PollingHelper.js.map +1 -0
- package/dist/utils/helpers/StorageUtils.d.ts +9 -0
- package/dist/utils/helpers/StorageUtils.d.ts.map +1 -0
- package/dist/utils/helpers/StorageUtils.js +33 -0
- package/dist/utils/helpers/StorageUtils.js.map +1 -0
- package/dist/utils/helpers/StreamingHelper.d.ts +35 -0
- package/dist/utils/helpers/StreamingHelper.d.ts.map +1 -0
- package/dist/utils/helpers/StreamingHelper.js +167 -0
- package/dist/utils/helpers/StreamingHelper.js.map +1 -0
- package/dist/utils/helpers/StringUtils.d.ts +42 -0
- package/dist/utils/helpers/StringUtils.d.ts.map +1 -0
- package/dist/utils/helpers/StringUtils.js +173 -0
- package/dist/utils/helpers/StringUtils.js.map +1 -0
- package/dist/utils/helpers/TimeUtils.d.ts +87 -0
- package/dist/utils/helpers/TimeUtils.d.ts.map +1 -0
- package/dist/utils/helpers/TimeUtils.js +234 -0
- package/dist/utils/helpers/TimeUtils.js.map +1 -0
- package/dist/utils/helpers/Validator.d.ts +31 -0
- package/dist/utils/helpers/Validator.d.ts.map +1 -0
- package/dist/utils/helpers/Validator.js +156 -0
- package/dist/utils/helpers/Validator.js.map +1 -0
- package/dist/utils/helpers/WebSocketHelper.d.ts +63 -0
- package/dist/utils/helpers/WebSocketHelper.d.ts.map +1 -0
- package/dist/utils/helpers/WebSocketHelper.js +200 -0
- package/dist/utils/helpers/WebSocketHelper.js.map +1 -0
- package/dist/utils/helpers/index.d.ts +20 -0
- package/dist/utils/helpers/index.d.ts.map +1 -0
- package/dist/utils/helpers/index.js +20 -0
- package/dist/utils/helpers/index.js.map +1 -0
- package/dist/utils/index.d.ts +21 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validator.d.ts +2 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +2 -0
- package/dist/validator.js.map +1 -0
- package/dist/websocket.d.ts +2 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +2 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +189 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../../src/utils/core/Logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Profiler.d.ts","sourceRoot":"","sources":["../../../src/utils/core/Profiler.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IACjB,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,OAAO,CAA8B;IAE7C,KAAK,CAAC,KAAK,EAAE,MAAM;IAInB,GAAG,CAAC,KAAK,EAAE,MAAM;IAOjB,OAAO;CAGV"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class Profiler {
|
|
2
|
+
stack = [];
|
|
3
|
+
results = {};
|
|
4
|
+
start(label) {
|
|
5
|
+
this.stack.push({ label, start: performance.now() });
|
|
6
|
+
}
|
|
7
|
+
end(label) {
|
|
8
|
+
const entry = this.stack.findLast((e) => e.label === label);
|
|
9
|
+
if (!entry)
|
|
10
|
+
return;
|
|
11
|
+
const duration = performance.now() - entry.start;
|
|
12
|
+
this.results[label] = duration;
|
|
13
|
+
}
|
|
14
|
+
summary() {
|
|
15
|
+
return this.results;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=Profiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Profiler.js","sourceRoot":"","sources":["../../../src/utils/core/Profiler.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAQ;IACT,KAAK,GAAuC,EAAE,CAAC;IAC/C,OAAO,GAA2B,EAAE,CAAC;IAE7C,KAAK,CAAC,KAAa;QACf,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,GAAG,CAAC,KAAa;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;IACnC,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export interface RateLimiterConfig {
|
|
2
|
+
maxRequests?: number;
|
|
3
|
+
windowMs?: number;
|
|
4
|
+
keyGenerator?: (url: string) => string;
|
|
5
|
+
}
|
|
6
|
+
export interface RateLimiterStats {
|
|
7
|
+
remaining: number;
|
|
8
|
+
limit: number;
|
|
9
|
+
resetAt: number;
|
|
10
|
+
retryAfter?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Token bucket rate limiter
|
|
14
|
+
* Allows bursts but maintains average rate
|
|
15
|
+
*/
|
|
16
|
+
export declare class RateLimiter {
|
|
17
|
+
private buckets;
|
|
18
|
+
private readonly maxRequests;
|
|
19
|
+
private readonly windowMs;
|
|
20
|
+
private readonly keyGenerator;
|
|
21
|
+
constructor(config?: RateLimiterConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Check if request is allowed
|
|
24
|
+
*/
|
|
25
|
+
isAllowed(url: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get rate limiter stats for a URL
|
|
28
|
+
*/
|
|
29
|
+
getStats(url: string): RateLimiterStats;
|
|
30
|
+
/**
|
|
31
|
+
* Reset rate limiter for a specific URL
|
|
32
|
+
*/
|
|
33
|
+
reset(url: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Reset all rate limiters
|
|
36
|
+
*/
|
|
37
|
+
resetAll(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Wait until request is allowed (blocking)
|
|
40
|
+
*/
|
|
41
|
+
waitForAllowance(url: string): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Sliding window rate limiter
|
|
45
|
+
* More accurate but uses more memory
|
|
46
|
+
*/
|
|
47
|
+
export declare class SlidingWindowRateLimiter {
|
|
48
|
+
private requests;
|
|
49
|
+
private readonly maxRequests;
|
|
50
|
+
private readonly windowMs;
|
|
51
|
+
private readonly keyGenerator;
|
|
52
|
+
constructor(config?: RateLimiterConfig);
|
|
53
|
+
/**
|
|
54
|
+
* Check if request is allowed
|
|
55
|
+
*/
|
|
56
|
+
isAllowed(url: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get rate limiter stats
|
|
59
|
+
*/
|
|
60
|
+
getStats(url: string): RateLimiterStats;
|
|
61
|
+
/**
|
|
62
|
+
* Reset rate limiter for a specific URL
|
|
63
|
+
*/
|
|
64
|
+
reset(url: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Reset all rate limiters
|
|
67
|
+
*/
|
|
68
|
+
resetAll(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Wait until request is allowed
|
|
71
|
+
*/
|
|
72
|
+
waitForAllowance(url: string): Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=RateLimiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../../src/utils/core/RateLimiter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,OAAO,CACD;IACd,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;gBAE3C,MAAM,GAAE,iBAAsB;IAO1C;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAwB/B;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB;IAgCvC;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKxB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOrD;AAED;;;GAGG;AACH,qBAAa,wBAAwB;IACjC,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;gBAE3C,MAAM,GAAE,iBAAsB;IAO1C;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAuB/B;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB;IAuBvC;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKxB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOrD"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token bucket rate limiter
|
|
3
|
+
* Allows bursts but maintains average rate
|
|
4
|
+
*/
|
|
5
|
+
export class RateLimiter {
|
|
6
|
+
buckets = new Map();
|
|
7
|
+
maxRequests;
|
|
8
|
+
windowMs;
|
|
9
|
+
keyGenerator;
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
this.maxRequests = config.maxRequests ?? 100;
|
|
12
|
+
this.windowMs = config.windowMs ?? 60 * 1000; // 1 minute
|
|
13
|
+
this.keyGenerator =
|
|
14
|
+
config.keyGenerator ?? ((url) => new URL(url).hostname);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if request is allowed
|
|
18
|
+
*/
|
|
19
|
+
isAllowed(url) {
|
|
20
|
+
const key = this.keyGenerator(url);
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
let bucket = this.buckets.get(key);
|
|
23
|
+
if (!bucket) {
|
|
24
|
+
bucket = { tokens: this.maxRequests, lastRefill: now };
|
|
25
|
+
this.buckets.set(key, bucket);
|
|
26
|
+
}
|
|
27
|
+
// Refill tokens based on time elapsed
|
|
28
|
+
const timePassed = now - bucket.lastRefill;
|
|
29
|
+
const tokensToAdd = (timePassed / this.windowMs) * this.maxRequests;
|
|
30
|
+
bucket.tokens = Math.min(this.maxRequests, bucket.tokens + tokensToAdd);
|
|
31
|
+
bucket.lastRefill = now;
|
|
32
|
+
if (bucket.tokens >= 1) {
|
|
33
|
+
bucket.tokens -= 1;
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get rate limiter stats for a URL
|
|
40
|
+
*/
|
|
41
|
+
getStats(url) {
|
|
42
|
+
const key = this.keyGenerator(url);
|
|
43
|
+
const now = Date.now();
|
|
44
|
+
let bucket = this.buckets.get(key);
|
|
45
|
+
if (!bucket) {
|
|
46
|
+
return {
|
|
47
|
+
remaining: this.maxRequests,
|
|
48
|
+
limit: this.maxRequests,
|
|
49
|
+
resetAt: now + this.windowMs,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const timePassed = now - bucket.lastRefill;
|
|
53
|
+
const tokensToAdd = (timePassed / this.windowMs) * this.maxRequests;
|
|
54
|
+
const currentTokens = Math.min(this.maxRequests, bucket.tokens + tokensToAdd);
|
|
55
|
+
const remaining = Math.floor(currentTokens);
|
|
56
|
+
return {
|
|
57
|
+
remaining,
|
|
58
|
+
limit: this.maxRequests,
|
|
59
|
+
resetAt: bucket.lastRefill + this.windowMs,
|
|
60
|
+
retryAfter: remaining === 0
|
|
61
|
+
? Math.ceil((this.windowMs - timePassed) / 1000)
|
|
62
|
+
: undefined,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reset rate limiter for a specific URL
|
|
67
|
+
*/
|
|
68
|
+
reset(url) {
|
|
69
|
+
const key = this.keyGenerator(url);
|
|
70
|
+
this.buckets.delete(key);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Reset all rate limiters
|
|
74
|
+
*/
|
|
75
|
+
resetAll() {
|
|
76
|
+
this.buckets.clear();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Wait until request is allowed (blocking)
|
|
80
|
+
*/
|
|
81
|
+
async waitForAllowance(url) {
|
|
82
|
+
while (!this.isAllowed(url)) {
|
|
83
|
+
const stats = this.getStats(url);
|
|
84
|
+
const waitTime = Math.min(stats.retryAfter ?? 1, 1) * 1000;
|
|
85
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Sliding window rate limiter
|
|
91
|
+
* More accurate but uses more memory
|
|
92
|
+
*/
|
|
93
|
+
export class SlidingWindowRateLimiter {
|
|
94
|
+
requests = new Map();
|
|
95
|
+
maxRequests;
|
|
96
|
+
windowMs;
|
|
97
|
+
keyGenerator;
|
|
98
|
+
constructor(config = {}) {
|
|
99
|
+
this.maxRequests = config.maxRequests ?? 100;
|
|
100
|
+
this.windowMs = config.windowMs ?? 60 * 1000;
|
|
101
|
+
this.keyGenerator =
|
|
102
|
+
config.keyGenerator ?? ((url) => new URL(url).hostname);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if request is allowed
|
|
106
|
+
*/
|
|
107
|
+
isAllowed(url) {
|
|
108
|
+
const key = this.keyGenerator(url);
|
|
109
|
+
const now = Date.now();
|
|
110
|
+
let timestamps = this.requests.get(key);
|
|
111
|
+
if (!timestamps) {
|
|
112
|
+
timestamps = [];
|
|
113
|
+
this.requests.set(key, timestamps);
|
|
114
|
+
}
|
|
115
|
+
// Remove old requests outside the window
|
|
116
|
+
const cutoff = now - this.windowMs;
|
|
117
|
+
const validRequests = timestamps.filter((t) => t > cutoff);
|
|
118
|
+
if (validRequests.length < this.maxRequests) {
|
|
119
|
+
validRequests.push(now);
|
|
120
|
+
this.requests.set(key, validRequests);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get rate limiter stats
|
|
127
|
+
*/
|
|
128
|
+
getStats(url) {
|
|
129
|
+
const key = this.keyGenerator(url);
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
const timestamps = this.requests.get(key) ?? [];
|
|
132
|
+
const cutoff = now - this.windowMs;
|
|
133
|
+
const validRequests = timestamps.filter((t) => t > cutoff);
|
|
134
|
+
const remaining = Math.max(0, this.maxRequests - validRequests.length);
|
|
135
|
+
const oldestRequest = validRequests[0];
|
|
136
|
+
const resetAt = oldestRequest
|
|
137
|
+
? oldestRequest + this.windowMs
|
|
138
|
+
: now + this.windowMs;
|
|
139
|
+
return {
|
|
140
|
+
remaining,
|
|
141
|
+
limit: this.maxRequests,
|
|
142
|
+
resetAt,
|
|
143
|
+
retryAfter: remaining === 0 ? Math.ceil((resetAt - now) / 1000) : undefined,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Reset rate limiter for a specific URL
|
|
148
|
+
*/
|
|
149
|
+
reset(url) {
|
|
150
|
+
const key = this.keyGenerator(url);
|
|
151
|
+
this.requests.delete(key);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Reset all rate limiters
|
|
155
|
+
*/
|
|
156
|
+
resetAll() {
|
|
157
|
+
this.requests.clear();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Wait until request is allowed
|
|
161
|
+
*/
|
|
162
|
+
async waitForAllowance(url) {
|
|
163
|
+
while (!this.isAllowed(url)) {
|
|
164
|
+
const stats = this.getStats(url);
|
|
165
|
+
const waitTime = Math.min(stats.retryAfter ?? 1, 1) * 1000;
|
|
166
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=RateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../../src/utils/core/RateLimiter.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,OAAO,WAAW;IACZ,OAAO,GACX,IAAI,GAAG,EAAE,CAAC;IACG,WAAW,CAAS;IACpB,QAAQ,CAAS;IACjB,YAAY,CAA0B;IAEvD,YAAY,SAA4B,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;QACzD,IAAI,CAAC,YAAY;YACb,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QAED,sCAAsC;QACtC,MAAM,UAAU,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;QAC3C,MAAM,WAAW,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QACpE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;QACxE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;QAExB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YACnB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAW;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;gBACH,SAAS,EAAE,IAAI,CAAC,WAAW;gBAC3B,KAAK,EAAE,IAAI,CAAC,WAAW;gBACvB,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ;aAC/B,CAAC;QACN,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;QAC3C,MAAM,WAAW,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QACpE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC1B,IAAI,CAAC,WAAW,EAChB,MAAM,CAAC,MAAM,GAAG,WAAW,CAC9B,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAE5C,OAAO;YACH,SAAS;YACT,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,OAAO,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ;YAC1C,UAAU,EACN,SAAS,KAAK,CAAC;gBACX,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC;gBAChD,CAAC,CAAC,SAAS;SACtB,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAW;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,GAAW;QAC9B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;YAC3D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IACzB,QAAQ,GAA0B,IAAI,GAAG,EAAE,CAAC;IACnC,WAAW,CAAS;IACpB,QAAQ,CAAS;IACjB,YAAY,CAA0B;IAEvD,YAAY,SAA4B,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC,YAAY;YACb,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,UAAU,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;QAED,yCAAyC;QACzC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAE3D,IAAI,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAW;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAEhD,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAEvE,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,aAAa;YACzB,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ;YAC/B,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE1B,OAAO;YACH,SAAS;YACT,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,OAAO;YACP,UAAU,EACN,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SACtE,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAW;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,GAAW;QAC9B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;YAC3D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export interface CacheEntry<T> {
|
|
2
|
+
data: T;
|
|
3
|
+
timestamp: number;
|
|
4
|
+
ttl: number;
|
|
5
|
+
stale: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface CacheConfig {
|
|
8
|
+
ttl?: number;
|
|
9
|
+
staleWhileRevalidate?: number;
|
|
10
|
+
keyGenerator?: (url: string, options?: Record<string, unknown>) => string;
|
|
11
|
+
}
|
|
12
|
+
export interface CacheStats {
|
|
13
|
+
hits: number;
|
|
14
|
+
misses: number;
|
|
15
|
+
size: number;
|
|
16
|
+
hitRate: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class RequestCache {
|
|
19
|
+
private cache;
|
|
20
|
+
private readonly ttl;
|
|
21
|
+
private readonly staleWhileRevalidate;
|
|
22
|
+
private readonly keyGenerator;
|
|
23
|
+
private stats;
|
|
24
|
+
constructor(config?: CacheConfig);
|
|
25
|
+
/**
|
|
26
|
+
* Get cached data
|
|
27
|
+
*/
|
|
28
|
+
get<T>(url: string, options?: Record<string, unknown>): T | null;
|
|
29
|
+
/**
|
|
30
|
+
* Set cached data
|
|
31
|
+
*/
|
|
32
|
+
set<T>(url: string, data: T, ttl?: number, options?: Record<string, unknown>): void;
|
|
33
|
+
/**
|
|
34
|
+
* Check if data is stale (expired but still usable)
|
|
35
|
+
*/
|
|
36
|
+
isStale(url: string, options?: Record<string, unknown>): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Invalidate cache entry
|
|
39
|
+
*/
|
|
40
|
+
invalidate(url: string, options?: Record<string, unknown>): void;
|
|
41
|
+
/**
|
|
42
|
+
* Invalidate by pattern (e.g., "/users/*")
|
|
43
|
+
*/
|
|
44
|
+
invalidatePattern(pattern: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Clear all cache
|
|
47
|
+
*/
|
|
48
|
+
clear(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Get cache statistics
|
|
51
|
+
*/
|
|
52
|
+
getStats(): CacheStats;
|
|
53
|
+
/**
|
|
54
|
+
* Get cache size in bytes (approximate)
|
|
55
|
+
*/
|
|
56
|
+
getSize(): number;
|
|
57
|
+
/**
|
|
58
|
+
* Prune expired entries
|
|
59
|
+
*/
|
|
60
|
+
prune(): number;
|
|
61
|
+
private defaultKeyGenerator;
|
|
62
|
+
private patternToRegex;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=RequestCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestCache.d.ts","sourceRoot":"","sources":["../../../src/utils/core/RequestCache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;CAC7E;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACrB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAGjB;IACZ,OAAO,CAAC,KAAK,CAA0B;gBAE3B,MAAM,GAAE,WAAgB;IAMpC;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI;IA0BhE;;OAEG;IACH,GAAG,CAAC,CAAC,EACD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,EACP,GAAG,CAAC,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,IAAI;IAYP;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAWhE;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKhE;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IASxC;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,QAAQ,IAAI,UAAU;IAUtB;;OAEG;IACH,OAAO,IAAI,MAAM;IAQjB;;OAEG;IACH,KAAK,IAAI,MAAM;IAef,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,cAAc;CAKzB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
export class RequestCache {
|
|
2
|
+
cache = new Map();
|
|
3
|
+
ttl;
|
|
4
|
+
staleWhileRevalidate;
|
|
5
|
+
keyGenerator;
|
|
6
|
+
stats = { hits: 0, misses: 0 };
|
|
7
|
+
constructor(config = {}) {
|
|
8
|
+
this.ttl = config.ttl ?? 5 * 60 * 1000; // 5 minutes default
|
|
9
|
+
this.staleWhileRevalidate = config.staleWhileRevalidate ?? 60 * 1000; // 1 minute
|
|
10
|
+
this.keyGenerator = config.keyGenerator ?? this.defaultKeyGenerator;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get cached data
|
|
14
|
+
*/
|
|
15
|
+
get(url, options) {
|
|
16
|
+
const key = this.keyGenerator(url, options);
|
|
17
|
+
const entry = this.cache.get(key);
|
|
18
|
+
if (!entry) {
|
|
19
|
+
this.stats.misses++;
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
const age = now - entry.timestamp;
|
|
24
|
+
const isExpired = age > entry.ttl;
|
|
25
|
+
const isBeyondStaleWindow = age > entry.ttl + this.staleWhileRevalidate;
|
|
26
|
+
// If beyond stale window, remove and return null
|
|
27
|
+
if (isBeyondStaleWindow) {
|
|
28
|
+
this.cache.delete(key);
|
|
29
|
+
this.stats.misses++;
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
// If expired but within stale window, still return data
|
|
33
|
+
this.stats.hits++;
|
|
34
|
+
return entry.data;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Set cached data
|
|
38
|
+
*/
|
|
39
|
+
set(url, data, ttl, options) {
|
|
40
|
+
const key = this.keyGenerator(url, options);
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
this.cache.set(key, {
|
|
43
|
+
data,
|
|
44
|
+
timestamp: now,
|
|
45
|
+
ttl: ttl ?? this.ttl,
|
|
46
|
+
stale: false,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if data is stale (expired but still usable)
|
|
51
|
+
*/
|
|
52
|
+
isStale(url, options) {
|
|
53
|
+
const key = this.keyGenerator(url, options);
|
|
54
|
+
const entry = this.cache.get(key);
|
|
55
|
+
if (!entry)
|
|
56
|
+
return false;
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
const age = now - entry.timestamp;
|
|
59
|
+
return age > entry.ttl && age <= entry.ttl + this.staleWhileRevalidate;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Invalidate cache entry
|
|
63
|
+
*/
|
|
64
|
+
invalidate(url, options) {
|
|
65
|
+
const key = this.keyGenerator(url, options);
|
|
66
|
+
this.cache.delete(key);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Invalidate by pattern (e.g., "/users/*")
|
|
70
|
+
*/
|
|
71
|
+
invalidatePattern(pattern) {
|
|
72
|
+
const regex = this.patternToRegex(pattern);
|
|
73
|
+
for (const key of this.cache.keys()) {
|
|
74
|
+
if (regex.test(key)) {
|
|
75
|
+
this.cache.delete(key);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Clear all cache
|
|
81
|
+
*/
|
|
82
|
+
clear() {
|
|
83
|
+
this.cache.clear();
|
|
84
|
+
this.stats = { hits: 0, misses: 0 };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get cache statistics
|
|
88
|
+
*/
|
|
89
|
+
getStats() {
|
|
90
|
+
const total = this.stats.hits + this.stats.misses;
|
|
91
|
+
return {
|
|
92
|
+
hits: this.stats.hits,
|
|
93
|
+
misses: this.stats.misses,
|
|
94
|
+
size: this.cache.size,
|
|
95
|
+
hitRate: total > 0 ? this.stats.hits / total : 0,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get cache size in bytes (approximate)
|
|
100
|
+
*/
|
|
101
|
+
getSize() {
|
|
102
|
+
let size = 0;
|
|
103
|
+
for (const entry of this.cache.values()) {
|
|
104
|
+
size += JSON.stringify(entry.data).length;
|
|
105
|
+
}
|
|
106
|
+
return size;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Prune expired entries
|
|
110
|
+
*/
|
|
111
|
+
prune() {
|
|
112
|
+
const now = Date.now();
|
|
113
|
+
let pruned = 0;
|
|
114
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
115
|
+
const age = now - entry.timestamp;
|
|
116
|
+
if (age > entry.ttl + this.staleWhileRevalidate) {
|
|
117
|
+
this.cache.delete(key);
|
|
118
|
+
pruned++;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return pruned;
|
|
122
|
+
}
|
|
123
|
+
defaultKeyGenerator(url, options) {
|
|
124
|
+
if (!options || Object.keys(options).length === 0) {
|
|
125
|
+
return url;
|
|
126
|
+
}
|
|
127
|
+
const sorted = Object.keys(options)
|
|
128
|
+
.sort()
|
|
129
|
+
.map((k) => `${k}=${JSON.stringify(options[k])}`)
|
|
130
|
+
.join("&");
|
|
131
|
+
return `${url}?${sorted}`;
|
|
132
|
+
}
|
|
133
|
+
patternToRegex(pattern) {
|
|
134
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
135
|
+
const regex = escaped.replace(/\*/g, ".*");
|
|
136
|
+
return new RegExp(`^${regex}$`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=RequestCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestCache.js","sourceRoot":"","sources":["../../../src/utils/core/RequestCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface DeduplicatorConfig {
|
|
2
|
+
keyGenerator?: (url: string, options?: Record<string, unknown>) => string;
|
|
3
|
+
}
|
|
4
|
+
export interface DeduplicatorStats {
|
|
5
|
+
deduplicated: number;
|
|
6
|
+
total: number;
|
|
7
|
+
deduplicationRate: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Deduplicates in-flight requests
|
|
11
|
+
* Multiple consumers of the same request share the same response
|
|
12
|
+
*/
|
|
13
|
+
export declare class RequestDeduplicator {
|
|
14
|
+
private inFlightRequests;
|
|
15
|
+
private readonly keyGenerator;
|
|
16
|
+
private stats;
|
|
17
|
+
constructor(config?: DeduplicatorConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Execute request with deduplication
|
|
20
|
+
* If same request is in-flight, returns the same promise
|
|
21
|
+
*/
|
|
22
|
+
execute<T>(url: string, fn: () => Promise<T>, options?: Record<string, unknown>): Promise<T>;
|
|
23
|
+
/**
|
|
24
|
+
* Get deduplication statistics
|
|
25
|
+
*/
|
|
26
|
+
getStats(): DeduplicatorStats;
|
|
27
|
+
/**
|
|
28
|
+
* Get number of in-flight requests
|
|
29
|
+
*/
|
|
30
|
+
getInFlightCount(): number;
|
|
31
|
+
/**
|
|
32
|
+
* Clear all in-flight requests
|
|
33
|
+
*/
|
|
34
|
+
clear(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Reset statistics
|
|
37
|
+
*/
|
|
38
|
+
resetStats(): void;
|
|
39
|
+
private defaultKeyGenerator;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=RequestDeduplicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestDeduplicator.d.ts","sourceRoot":"","sources":["../../../src/utils/core/RequestDeduplicator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAC/B,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;CAC7E;AAED,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,gBAAgB,CAA4C;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAGjB;IACZ,OAAO,CAAC,KAAK,CAAiC;gBAElC,MAAM,GAAE,kBAAuB;IAI3C;;;OAGG;IACG,OAAO,CAAC,CAAC,EACX,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,CAAC,CAAC;IA8Bb;;OAEG;IACH,QAAQ,IAAI,iBAAiB;IAW7B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,mBAAmB;CAa9B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deduplicates in-flight requests
|
|
3
|
+
* Multiple consumers of the same request share the same response
|
|
4
|
+
*/
|
|
5
|
+
export class RequestDeduplicator {
|
|
6
|
+
inFlightRequests = new Map();
|
|
7
|
+
keyGenerator;
|
|
8
|
+
stats = { deduplicated: 0, total: 0 };
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
this.keyGenerator = config.keyGenerator ?? this.defaultKeyGenerator;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Execute request with deduplication
|
|
14
|
+
* If same request is in-flight, returns the same promise
|
|
15
|
+
*/
|
|
16
|
+
async execute(url, fn, options) {
|
|
17
|
+
const key = this.keyGenerator(url, options);
|
|
18
|
+
this.stats.total++;
|
|
19
|
+
// Check if request is already in-flight
|
|
20
|
+
const inFlight = this.inFlightRequests.get(key);
|
|
21
|
+
if (inFlight) {
|
|
22
|
+
this.stats.deduplicated++;
|
|
23
|
+
return inFlight;
|
|
24
|
+
}
|
|
25
|
+
// Create new request promise
|
|
26
|
+
const promise = fn()
|
|
27
|
+
.then((result) => {
|
|
28
|
+
// Remove from in-flight on success
|
|
29
|
+
this.inFlightRequests.delete(key);
|
|
30
|
+
return result;
|
|
31
|
+
})
|
|
32
|
+
.catch((error) => {
|
|
33
|
+
// Remove from in-flight on error
|
|
34
|
+
this.inFlightRequests.delete(key);
|
|
35
|
+
throw error;
|
|
36
|
+
});
|
|
37
|
+
// Store in-flight request
|
|
38
|
+
this.inFlightRequests.set(key, promise);
|
|
39
|
+
return promise;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get deduplication statistics
|
|
43
|
+
*/
|
|
44
|
+
getStats() {
|
|
45
|
+
return {
|
|
46
|
+
deduplicated: this.stats.deduplicated,
|
|
47
|
+
total: this.stats.total,
|
|
48
|
+
deduplicationRate: this.stats.total > 0
|
|
49
|
+
? this.stats.deduplicated / this.stats.total
|
|
50
|
+
: 0,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get number of in-flight requests
|
|
55
|
+
*/
|
|
56
|
+
getInFlightCount() {
|
|
57
|
+
return this.inFlightRequests.size;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Clear all in-flight requests
|
|
61
|
+
*/
|
|
62
|
+
clear() {
|
|
63
|
+
this.inFlightRequests.clear();
|
|
64
|
+
this.stats = { deduplicated: 0, total: 0 };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Reset statistics
|
|
68
|
+
*/
|
|
69
|
+
resetStats() {
|
|
70
|
+
this.stats = { deduplicated: 0, total: 0 };
|
|
71
|
+
}
|
|
72
|
+
defaultKeyGenerator(url, options) {
|
|
73
|
+
if (!options || Object.keys(options).length === 0) {
|
|
74
|
+
return url;
|
|
75
|
+
}
|
|
76
|
+
const sorted = Object.keys(options)
|
|
77
|
+
.sort()
|
|
78
|
+
.map((k) => `${k}=${JSON.stringify(options[k])}`)
|
|
79
|
+
.join("&");
|
|
80
|
+
return `${url}?${sorted}`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=RequestDeduplicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestDeduplicator.js","sourceRoot":"","sources":["../../../src/utils/core/RequestDeduplicator.ts"],"names":[],"mappings":"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"}
|