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.
Files changed (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2241 -0
  3. package/bin/sutils.js +9 -0
  4. package/dist/api-client.d.ts +2 -0
  5. package/dist/api-client.d.ts.map +1 -0
  6. package/dist/api-client.js +2 -0
  7. package/dist/api-client.js.map +1 -0
  8. package/dist/cli/index.d.ts +2 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +401 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/cli/type-generator.d.ts +12 -0
  13. package/dist/cli/type-generator.d.ts.map +1 -0
  14. package/dist/cli/type-generator.js +152 -0
  15. package/dist/cli/type-generator.js.map +1 -0
  16. package/dist/date-utils.d.ts +2 -0
  17. package/dist/date-utils.d.ts.map +1 -0
  18. package/dist/date-utils.js +2 -0
  19. package/dist/date-utils.js.map +1 -0
  20. package/dist/debug.d.ts +2 -0
  21. package/dist/debug.d.ts.map +1 -0
  22. package/dist/debug.js +2 -0
  23. package/dist/debug.js.map +1 -0
  24. package/dist/env-manager.d.ts +2 -0
  25. package/dist/env-manager.d.ts.map +1 -0
  26. package/dist/env-manager.js +2 -0
  27. package/dist/env-manager.js.map +1 -0
  28. package/dist/file-upload.d.ts +2 -0
  29. package/dist/file-upload.d.ts.map +1 -0
  30. package/dist/file-upload.js +2 -0
  31. package/dist/file-upload.js.map +1 -0
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +2 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/logger.d.ts +2 -0
  37. package/dist/logger.d.ts.map +1 -0
  38. package/dist/logger.js +2 -0
  39. package/dist/logger.js.map +1 -0
  40. package/dist/profiler.d.ts +2 -0
  41. package/dist/profiler.d.ts.map +1 -0
  42. package/dist/profiler.js +2 -0
  43. package/dist/profiler.js.map +1 -0
  44. package/dist/response-validator.d.ts +2 -0
  45. package/dist/response-validator.d.ts.map +1 -0
  46. package/dist/response-validator.js +2 -0
  47. package/dist/response-validator.js.map +1 -0
  48. package/dist/retry-policy.d.ts +2 -0
  49. package/dist/retry-policy.d.ts.map +1 -0
  50. package/dist/retry-policy.js +2 -0
  51. package/dist/retry-policy.js.map +1 -0
  52. package/dist/storage-utils.d.ts +2 -0
  53. package/dist/storage-utils.d.ts.map +1 -0
  54. package/dist/storage-utils.js +2 -0
  55. package/dist/storage-utils.js.map +1 -0
  56. package/dist/streaming.d.ts +2 -0
  57. package/dist/streaming.d.ts.map +1 -0
  58. package/dist/streaming.js +2 -0
  59. package/dist/streaming.js.map +1 -0
  60. package/dist/string-utils.d.ts +2 -0
  61. package/dist/string-utils.d.ts.map +1 -0
  62. package/dist/string-utils.js +2 -0
  63. package/dist/string-utils.js.map +1 -0
  64. package/dist/utils/core/ApiClient.d.ts +94 -0
  65. package/dist/utils/core/ApiClient.d.ts.map +1 -0
  66. package/dist/utils/core/ApiClient.js +291 -0
  67. package/dist/utils/core/ApiClient.js.map +1 -0
  68. package/dist/utils/core/ErrorBoundary.d.ts +141 -0
  69. package/dist/utils/core/ErrorBoundary.d.ts.map +1 -0
  70. package/dist/utils/core/ErrorBoundary.js +322 -0
  71. package/dist/utils/core/ErrorBoundary.js.map +1 -0
  72. package/dist/utils/core/Logger.d.ts +39 -0
  73. package/dist/utils/core/Logger.d.ts.map +1 -0
  74. package/dist/utils/core/Logger.js +154 -0
  75. package/dist/utils/core/Logger.js.map +1 -0
  76. package/dist/utils/core/Profiler.d.ts +8 -0
  77. package/dist/utils/core/Profiler.d.ts.map +1 -0
  78. package/dist/utils/core/Profiler.js +18 -0
  79. package/dist/utils/core/Profiler.js.map +1 -0
  80. package/dist/utils/core/RateLimiter.d.ts +74 -0
  81. package/dist/utils/core/RateLimiter.d.ts.map +1 -0
  82. package/dist/utils/core/RateLimiter.js +170 -0
  83. package/dist/utils/core/RateLimiter.js.map +1 -0
  84. package/dist/utils/core/RequestCache.d.ts +64 -0
  85. package/dist/utils/core/RequestCache.d.ts.map +1 -0
  86. package/dist/utils/core/RequestCache.js +139 -0
  87. package/dist/utils/core/RequestCache.js.map +1 -0
  88. package/dist/utils/core/RequestDeduplicator.d.ts +41 -0
  89. package/dist/utils/core/RequestDeduplicator.d.ts.map +1 -0
  90. package/dist/utils/core/RequestDeduplicator.js +83 -0
  91. package/dist/utils/core/RequestDeduplicator.js.map +1 -0
  92. package/dist/utils/core/ResponseValidator.d.ts +26 -0
  93. package/dist/utils/core/ResponseValidator.d.ts.map +1 -0
  94. package/dist/utils/core/ResponseValidator.js +140 -0
  95. package/dist/utils/core/ResponseValidator.js.map +1 -0
  96. package/dist/utils/core/RetryPolicy.d.ts +43 -0
  97. package/dist/utils/core/RetryPolicy.d.ts.map +1 -0
  98. package/dist/utils/core/RetryPolicy.js +119 -0
  99. package/dist/utils/core/RetryPolicy.js.map +1 -0
  100. package/dist/utils/core/debug.d.ts +46 -0
  101. package/dist/utils/core/debug.d.ts.map +1 -0
  102. package/dist/utils/core/debug.js +83 -0
  103. package/dist/utils/core/debug.js.map +1 -0
  104. package/dist/utils/core/index.d.ts +11 -0
  105. package/dist/utils/core/index.d.ts.map +1 -0
  106. package/dist/utils/core/index.js +11 -0
  107. package/dist/utils/core/index.js.map +1 -0
  108. package/dist/utils/helpers/ArrayUtils.d.ts +134 -0
  109. package/dist/utils/helpers/ArrayUtils.d.ts.map +1 -0
  110. package/dist/utils/helpers/ArrayUtils.js +301 -0
  111. package/dist/utils/helpers/ArrayUtils.js.map +1 -0
  112. package/dist/utils/helpers/CacheManager.d.ts +67 -0
  113. package/dist/utils/helpers/CacheManager.d.ts.map +1 -0
  114. package/dist/utils/helpers/CacheManager.js +222 -0
  115. package/dist/utils/helpers/CacheManager.js.map +1 -0
  116. package/dist/utils/helpers/CompressionUtils.d.ts +80 -0
  117. package/dist/utils/helpers/CompressionUtils.d.ts.map +1 -0
  118. package/dist/utils/helpers/CompressionUtils.js +224 -0
  119. package/dist/utils/helpers/CompressionUtils.js.map +1 -0
  120. package/dist/utils/helpers/CryptoUtils.d.ts +70 -0
  121. package/dist/utils/helpers/CryptoUtils.d.ts.map +1 -0
  122. package/dist/utils/helpers/CryptoUtils.js +215 -0
  123. package/dist/utils/helpers/CryptoUtils.js.map +1 -0
  124. package/dist/utils/helpers/DateUtils.d.ts +31 -0
  125. package/dist/utils/helpers/DateUtils.d.ts.map +1 -0
  126. package/dist/utils/helpers/DateUtils.js +104 -0
  127. package/dist/utils/helpers/DateUtils.js.map +1 -0
  128. package/dist/utils/helpers/DiffUtils.d.ts +61 -0
  129. package/dist/utils/helpers/DiffUtils.d.ts.map +1 -0
  130. package/dist/utils/helpers/DiffUtils.js +249 -0
  131. package/dist/utils/helpers/DiffUtils.js.map +1 -0
  132. package/dist/utils/helpers/EnvManager.d.ts +7 -0
  133. package/dist/utils/helpers/EnvManager.d.ts.map +1 -0
  134. package/dist/utils/helpers/EnvManager.js +19 -0
  135. package/dist/utils/helpers/EnvManager.js.map +1 -0
  136. package/dist/utils/helpers/EventEmitter.d.ts +78 -0
  137. package/dist/utils/helpers/EventEmitter.d.ts.map +1 -0
  138. package/dist/utils/helpers/EventEmitter.js +208 -0
  139. package/dist/utils/helpers/EventEmitter.js.map +1 -0
  140. package/dist/utils/helpers/FileUploadHelper.d.ts +44 -0
  141. package/dist/utils/helpers/FileUploadHelper.d.ts.map +1 -0
  142. package/dist/utils/helpers/FileUploadHelper.js +127 -0
  143. package/dist/utils/helpers/FileUploadHelper.js.map +1 -0
  144. package/dist/utils/helpers/FormUtils.d.ts +162 -0
  145. package/dist/utils/helpers/FormUtils.d.ts.map +1 -0
  146. package/dist/utils/helpers/FormUtils.js +378 -0
  147. package/dist/utils/helpers/FormUtils.js.map +1 -0
  148. package/dist/utils/helpers/ObjectUtils.d.ts +102 -0
  149. package/dist/utils/helpers/ObjectUtils.d.ts.map +1 -0
  150. package/dist/utils/helpers/ObjectUtils.js +297 -0
  151. package/dist/utils/helpers/ObjectUtils.js.map +1 -0
  152. package/dist/utils/helpers/PaginationHelper.d.ts +127 -0
  153. package/dist/utils/helpers/PaginationHelper.d.ts.map +1 -0
  154. package/dist/utils/helpers/PaginationHelper.js +259 -0
  155. package/dist/utils/helpers/PaginationHelper.js.map +1 -0
  156. package/dist/utils/helpers/PollingHelper.d.ts +64 -0
  157. package/dist/utils/helpers/PollingHelper.d.ts.map +1 -0
  158. package/dist/utils/helpers/PollingHelper.js +131 -0
  159. package/dist/utils/helpers/PollingHelper.js.map +1 -0
  160. package/dist/utils/helpers/StorageUtils.d.ts +9 -0
  161. package/dist/utils/helpers/StorageUtils.d.ts.map +1 -0
  162. package/dist/utils/helpers/StorageUtils.js +33 -0
  163. package/dist/utils/helpers/StorageUtils.js.map +1 -0
  164. package/dist/utils/helpers/StreamingHelper.d.ts +35 -0
  165. package/dist/utils/helpers/StreamingHelper.d.ts.map +1 -0
  166. package/dist/utils/helpers/StreamingHelper.js +167 -0
  167. package/dist/utils/helpers/StreamingHelper.js.map +1 -0
  168. package/dist/utils/helpers/StringUtils.d.ts +42 -0
  169. package/dist/utils/helpers/StringUtils.d.ts.map +1 -0
  170. package/dist/utils/helpers/StringUtils.js +173 -0
  171. package/dist/utils/helpers/StringUtils.js.map +1 -0
  172. package/dist/utils/helpers/TimeUtils.d.ts +87 -0
  173. package/dist/utils/helpers/TimeUtils.d.ts.map +1 -0
  174. package/dist/utils/helpers/TimeUtils.js +234 -0
  175. package/dist/utils/helpers/TimeUtils.js.map +1 -0
  176. package/dist/utils/helpers/Validator.d.ts +31 -0
  177. package/dist/utils/helpers/Validator.d.ts.map +1 -0
  178. package/dist/utils/helpers/Validator.js +156 -0
  179. package/dist/utils/helpers/Validator.js.map +1 -0
  180. package/dist/utils/helpers/WebSocketHelper.d.ts +63 -0
  181. package/dist/utils/helpers/WebSocketHelper.d.ts.map +1 -0
  182. package/dist/utils/helpers/WebSocketHelper.js +200 -0
  183. package/dist/utils/helpers/WebSocketHelper.js.map +1 -0
  184. package/dist/utils/helpers/index.d.ts +20 -0
  185. package/dist/utils/helpers/index.d.ts.map +1 -0
  186. package/dist/utils/helpers/index.js +20 -0
  187. package/dist/utils/helpers/index.js.map +1 -0
  188. package/dist/utils/index.d.ts +21 -0
  189. package/dist/utils/index.d.ts.map +1 -0
  190. package/dist/utils/index.js +21 -0
  191. package/dist/utils/index.js.map +1 -0
  192. package/dist/validator.d.ts +2 -0
  193. package/dist/validator.d.ts.map +1 -0
  194. package/dist/validator.js +2 -0
  195. package/dist/validator.js.map +1 -0
  196. package/dist/websocket.d.ts +2 -0
  197. package/dist/websocket.d.ts.map +1 -0
  198. package/dist/websocket.js +2 -0
  199. package/dist/websocket.js.map +1 -0
  200. 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,8 @@
1
+ export declare class Profiler {
2
+ private stack;
3
+ private results;
4
+ start(label: string): void;
5
+ end(label: string): void;
6
+ summary(): Record<string, number>;
7
+ }
8
+ //# sourceMappingURL=Profiler.d.ts.map
@@ -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":"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"}
@@ -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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"}