@skillsmith/core 0.1.2 → 0.2.0

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 (325) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/analysis/CodebaseAnalyzer.d.ts +4 -134
  3. package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
  4. package/dist/src/analysis/CodebaseAnalyzer.js +7 -315
  5. package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
  6. package/dist/src/analysis/framework-detector.d.ts +47 -0
  7. package/dist/src/analysis/framework-detector.d.ts.map +1 -0
  8. package/dist/src/analysis/framework-detector.js +151 -0
  9. package/dist/src/analysis/framework-detector.js.map +1 -0
  10. package/dist/src/analysis/index.d.ts +6 -1
  11. package/dist/src/analysis/index.d.ts.map +1 -1
  12. package/dist/src/analysis/index.js +10 -1
  13. package/dist/src/analysis/index.js.map +1 -1
  14. package/dist/src/analysis/parsers.d.ts +43 -0
  15. package/dist/src/analysis/parsers.d.ts.map +1 -0
  16. package/dist/src/analysis/parsers.js +219 -0
  17. package/dist/src/analysis/parsers.js.map +1 -0
  18. package/dist/src/analysis/types.d.ts +138 -0
  19. package/dist/src/analysis/types.d.ts.map +1 -0
  20. package/dist/src/analysis/types.js +25 -0
  21. package/dist/src/analysis/types.js.map +1 -0
  22. package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
  23. package/dist/src/analytics/AnalyticsRepository.js +4 -4
  24. package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
  25. package/dist/src/api/cache.d.ts +108 -0
  26. package/dist/src/api/cache.d.ts.map +1 -0
  27. package/dist/src/api/cache.js +216 -0
  28. package/dist/src/api/cache.js.map +1 -0
  29. package/dist/src/api/client.d.ts +152 -0
  30. package/dist/src/api/client.d.ts.map +1 -0
  31. package/dist/src/api/client.js +221 -0
  32. package/dist/src/api/client.js.map +1 -0
  33. package/dist/src/api/index.d.ts +10 -0
  34. package/dist/src/api/index.d.ts.map +1 -0
  35. package/dist/src/api/index.js +10 -0
  36. package/dist/src/api/index.js.map +1 -0
  37. package/dist/src/benchmarks/BenchmarkRunner.d.ts +6 -175
  38. package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
  39. package/dist/src/benchmarks/BenchmarkRunner.js +6 -123
  40. package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
  41. package/dist/src/benchmarks/MemoryProfiler.d.ts +4 -262
  42. package/dist/src/benchmarks/MemoryProfiler.d.ts.map +1 -1
  43. package/dist/src/benchmarks/MemoryProfiler.js +4 -400
  44. package/dist/src/benchmarks/MemoryProfiler.js.map +1 -1
  45. package/dist/src/benchmarks/comparator.d.ts +38 -0
  46. package/dist/src/benchmarks/comparator.d.ts.map +1 -0
  47. package/dist/src/benchmarks/comparator.js +81 -0
  48. package/dist/src/benchmarks/comparator.js.map +1 -0
  49. package/dist/src/benchmarks/formatters.d.ts +30 -0
  50. package/dist/src/benchmarks/formatters.d.ts.map +1 -0
  51. package/dist/src/benchmarks/formatters.js +88 -0
  52. package/dist/src/benchmarks/formatters.js.map +1 -0
  53. package/dist/src/benchmarks/index.d.ts +5 -1
  54. package/dist/src/benchmarks/index.d.ts.map +1 -1
  55. package/dist/src/benchmarks/index.js +9 -2
  56. package/dist/src/benchmarks/index.js.map +1 -1
  57. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts +165 -0
  58. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -0
  59. package/dist/src/benchmarks/memory/MemoryProfiler.js +312 -0
  60. package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -0
  61. package/dist/src/benchmarks/memory/baseline-manager.d.ts +64 -0
  62. package/dist/src/benchmarks/memory/baseline-manager.d.ts.map +1 -0
  63. package/dist/src/benchmarks/memory/baseline-manager.js +95 -0
  64. package/dist/src/benchmarks/memory/baseline-manager.js.map +1 -0
  65. package/dist/src/benchmarks/memory/index.d.ts +12 -0
  66. package/dist/src/benchmarks/memory/index.d.ts.map +1 -0
  67. package/dist/src/benchmarks/memory/index.js +12 -0
  68. package/dist/src/benchmarks/memory/index.js.map +1 -0
  69. package/dist/src/benchmarks/memory/leak-detector.d.ts +23 -0
  70. package/dist/src/benchmarks/memory/leak-detector.d.ts.map +1 -0
  71. package/dist/src/benchmarks/memory/leak-detector.js +46 -0
  72. package/dist/src/benchmarks/memory/leak-detector.js.map +1 -0
  73. package/dist/src/benchmarks/memory/regression-detector.d.ts +17 -0
  74. package/dist/src/benchmarks/memory/regression-detector.d.ts.map +1 -0
  75. package/dist/src/benchmarks/memory/regression-detector.js +56 -0
  76. package/dist/src/benchmarks/memory/regression-detector.js.map +1 -0
  77. package/dist/src/benchmarks/memory/types.d.ts +111 -0
  78. package/dist/src/benchmarks/memory/types.d.ts.map +1 -0
  79. package/dist/src/benchmarks/memory/types.js +7 -0
  80. package/dist/src/benchmarks/memory/types.js.map +1 -0
  81. package/dist/src/benchmarks/memory/utils.d.ts +17 -0
  82. package/dist/src/benchmarks/memory/utils.d.ts.map +1 -0
  83. package/dist/src/benchmarks/memory/utils.js +29 -0
  84. package/dist/src/benchmarks/memory/utils.js.map +1 -0
  85. package/dist/src/benchmarks/types.d.ts +175 -0
  86. package/dist/src/benchmarks/types.d.ts.map +1 -0
  87. package/dist/src/benchmarks/types.js +20 -0
  88. package/dist/src/benchmarks/types.js.map +1 -0
  89. package/dist/src/index.d.ts +4 -2
  90. package/dist/src/index.d.ts.map +1 -1
  91. package/dist/src/index.js +7 -3
  92. package/dist/src/index.js.map +1 -1
  93. package/dist/src/repositories/QuarantineRepository.d.ts +4 -251
  94. package/dist/src/repositories/QuarantineRepository.d.ts.map +1 -1
  95. package/dist/src/repositories/QuarantineRepository.js +4 -441
  96. package/dist/src/repositories/QuarantineRepository.js.map +1 -1
  97. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +168 -0
  98. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -0
  99. package/dist/src/repositories/quarantine/QuarantineRepository.js +341 -0
  100. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -0
  101. package/dist/src/repositories/quarantine/index.d.ts +10 -0
  102. package/dist/src/repositories/quarantine/index.d.ts.map +1 -0
  103. package/dist/src/repositories/quarantine/index.js +10 -0
  104. package/dist/src/repositories/quarantine/index.js.map +1 -0
  105. package/dist/src/repositories/quarantine/queries.d.ts +58 -0
  106. package/dist/src/repositories/quarantine/queries.d.ts.map +1 -0
  107. package/dist/src/repositories/quarantine/queries.js +88 -0
  108. package/dist/src/repositories/quarantine/queries.js.map +1 -0
  109. package/dist/src/repositories/quarantine/query-builder.d.ts +44 -0
  110. package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -0
  111. package/dist/src/repositories/quarantine/query-builder.js +87 -0
  112. package/dist/src/repositories/quarantine/query-builder.js.map +1 -0
  113. package/dist/src/repositories/quarantine/types.d.ts +155 -0
  114. package/dist/src/repositories/quarantine/types.d.ts.map +1 -0
  115. package/dist/src/repositories/quarantine/types.js +13 -0
  116. package/dist/src/repositories/quarantine/types.js.map +1 -0
  117. package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts +1 -0
  118. package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts.map +1 -1
  119. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +7 -43
  120. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  121. package/dist/src/scripts/github-import/checkpoint.d.ts +21 -0
  122. package/dist/src/scripts/github-import/checkpoint.d.ts.map +1 -0
  123. package/dist/src/scripts/github-import/checkpoint.js +52 -0
  124. package/dist/src/scripts/github-import/checkpoint.js.map +1 -0
  125. package/dist/src/scripts/github-import/deduplication.d.ts +15 -0
  126. package/dist/src/scripts/github-import/deduplication.d.ts.map +1 -0
  127. package/dist/src/scripts/github-import/deduplication.js +33 -0
  128. package/dist/src/scripts/github-import/deduplication.js.map +1 -0
  129. package/dist/src/scripts/github-import/github-client.d.ts +29 -0
  130. package/dist/src/scripts/github-import/github-client.d.ts.map +1 -0
  131. package/dist/src/scripts/github-import/github-client.js +184 -0
  132. package/dist/src/scripts/github-import/github-client.js.map +1 -0
  133. package/dist/src/scripts/github-import/index.d.ts +29 -0
  134. package/dist/src/scripts/github-import/index.d.ts.map +1 -0
  135. package/dist/src/scripts/github-import/index.js +198 -0
  136. package/dist/src/scripts/github-import/index.js.map +1 -0
  137. package/dist/src/scripts/github-import/output.d.ts +12 -0
  138. package/dist/src/scripts/github-import/output.d.ts.map +1 -0
  139. package/dist/src/scripts/github-import/output.js +34 -0
  140. package/dist/src/scripts/github-import/output.js.map +1 -0
  141. package/dist/src/scripts/github-import/types.d.ts +108 -0
  142. package/dist/src/scripts/github-import/types.d.ts.map +1 -0
  143. package/dist/src/scripts/github-import/types.js +44 -0
  144. package/dist/src/scripts/github-import/types.js.map +1 -0
  145. package/dist/src/scripts/github-import/utils.d.ts +13 -0
  146. package/dist/src/scripts/github-import/utils.d.ts.map +1 -0
  147. package/dist/src/scripts/github-import/utils.js +28 -0
  148. package/dist/src/scripts/github-import/utils.js.map +1 -0
  149. package/dist/src/scripts/import-github-skills.d.ts +3 -12
  150. package/dist/src/scripts/import-github-skills.d.ts.map +1 -1
  151. package/dist/src/scripts/import-github-skills.js +18 -398
  152. package/dist/src/scripts/import-github-skills.js.map +1 -1
  153. package/dist/src/scripts/scan-imported-skills.d.ts +7 -7
  154. package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
  155. package/dist/src/scripts/scan-imported-skills.js +8 -397
  156. package/dist/src/scripts/scan-imported-skills.js.map +1 -1
  157. package/dist/src/scripts/skill-scanner/categorizer.d.ts +43 -0
  158. package/dist/src/scripts/skill-scanner/categorizer.d.ts.map +1 -0
  159. package/dist/src/scripts/skill-scanner/categorizer.js +61 -0
  160. package/dist/src/scripts/skill-scanner/categorizer.js.map +1 -0
  161. package/dist/src/scripts/skill-scanner/file-scanner.d.ts +43 -0
  162. package/dist/src/scripts/skill-scanner/file-scanner.d.ts.map +1 -0
  163. package/dist/src/scripts/skill-scanner/file-scanner.js +90 -0
  164. package/dist/src/scripts/skill-scanner/file-scanner.js.map +1 -0
  165. package/dist/src/scripts/skill-scanner/index.d.ts +22 -0
  166. package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -0
  167. package/dist/src/scripts/skill-scanner/index.js +43 -0
  168. package/dist/src/scripts/skill-scanner/index.js.map +1 -0
  169. package/dist/src/scripts/skill-scanner/logger.d.ts +59 -0
  170. package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -0
  171. package/dist/src/scripts/skill-scanner/logger.js +104 -0
  172. package/dist/src/scripts/skill-scanner/logger.js.map +1 -0
  173. package/dist/src/scripts/skill-scanner/reporter.d.ts +56 -0
  174. package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -0
  175. package/dist/src/scripts/skill-scanner/reporter.js +166 -0
  176. package/dist/src/scripts/skill-scanner/reporter.js.map +1 -0
  177. package/dist/src/scripts/skill-scanner/scanner.d.ts +44 -0
  178. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -0
  179. package/dist/src/scripts/skill-scanner/scanner.js +140 -0
  180. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -0
  181. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts +59 -0
  182. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -0
  183. package/dist/src/scripts/skill-scanner/trust-scorer.js +62 -0
  184. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -0
  185. package/dist/src/scripts/skill-scanner/types.d.ts +98 -0
  186. package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -0
  187. package/dist/src/scripts/skill-scanner/types.js +7 -0
  188. package/dist/src/scripts/skill-scanner/types.js.map +1 -0
  189. package/dist/src/scripts/validate-skills.d.ts +3 -172
  190. package/dist/src/scripts/validate-skills.d.ts.map +1 -1
  191. package/dist/src/scripts/validate-skills.js +6 -519
  192. package/dist/src/scripts/validate-skills.js.map +1 -1
  193. package/dist/src/scripts/validation/deduplication.d.ts +23 -0
  194. package/dist/src/scripts/validation/deduplication.d.ts.map +1 -0
  195. package/dist/src/scripts/validation/deduplication.js +127 -0
  196. package/dist/src/scripts/validation/deduplication.js.map +1 -0
  197. package/dist/src/scripts/validation/field-validators.d.ts +9 -0
  198. package/dist/src/scripts/validation/field-validators.d.ts.map +1 -0
  199. package/dist/src/scripts/validation/field-validators.js +135 -0
  200. package/dist/src/scripts/validation/field-validators.js.map +1 -0
  201. package/dist/src/scripts/validation/index.d.ts +29 -0
  202. package/dist/src/scripts/validation/index.d.ts.map +1 -0
  203. package/dist/src/scripts/validation/index.js +84 -0
  204. package/dist/src/scripts/validation/index.js.map +1 -0
  205. package/dist/src/scripts/validation/normalizers.d.ts +29 -0
  206. package/dist/src/scripts/validation/normalizers.d.ts.map +1 -0
  207. package/dist/src/scripts/validation/normalizers.js +79 -0
  208. package/dist/src/scripts/validation/normalizers.js.map +1 -0
  209. package/dist/src/scripts/validation/pipeline.d.ts +13 -0
  210. package/dist/src/scripts/validation/pipeline.d.ts.map +1 -0
  211. package/dist/src/scripts/validation/pipeline.js +126 -0
  212. package/dist/src/scripts/validation/pipeline.js.map +1 -0
  213. package/dist/src/scripts/validation/types.d.ts +128 -0
  214. package/dist/src/scripts/validation/types.d.ts.map +1 -0
  215. package/dist/src/scripts/validation/types.js +43 -0
  216. package/dist/src/scripts/validation/types.js.map +1 -0
  217. package/dist/src/security/index.d.ts +5 -4
  218. package/dist/src/security/index.d.ts.map +1 -1
  219. package/dist/src/security/index.js +8 -2
  220. package/dist/src/security/index.js.map +1 -1
  221. package/dist/src/security/rate-limiter/RateLimiter.d.ts +86 -0
  222. package/dist/src/security/rate-limiter/RateLimiter.d.ts.map +1 -0
  223. package/dist/src/security/rate-limiter/RateLimiter.js +260 -0
  224. package/dist/src/security/rate-limiter/RateLimiter.js.map +1 -0
  225. package/dist/src/security/rate-limiter/constants.d.ts +15 -0
  226. package/dist/src/security/rate-limiter/constants.d.ts.map +1 -0
  227. package/dist/src/security/rate-limiter/constants.js +15 -0
  228. package/dist/src/security/rate-limiter/constants.js.map +1 -0
  229. package/dist/src/security/rate-limiter/errors.d.ts +22 -0
  230. package/dist/src/security/rate-limiter/errors.d.ts.map +1 -0
  231. package/dist/src/security/rate-limiter/errors.js +32 -0
  232. package/dist/src/security/rate-limiter/errors.js.map +1 -0
  233. package/dist/src/security/rate-limiter/index.d.ts +12 -0
  234. package/dist/src/security/rate-limiter/index.d.ts.map +1 -0
  235. package/dist/src/security/rate-limiter/index.js +16 -0
  236. package/dist/src/security/rate-limiter/index.js.map +1 -0
  237. package/dist/src/security/rate-limiter/metrics-manager.d.ts +55 -0
  238. package/dist/src/security/rate-limiter/metrics-manager.d.ts.map +1 -0
  239. package/dist/src/security/rate-limiter/metrics-manager.js +144 -0
  240. package/dist/src/security/rate-limiter/metrics-manager.js.map +1 -0
  241. package/dist/src/security/rate-limiter/presets.d.ts +52 -0
  242. package/dist/src/security/rate-limiter/presets.d.ts.map +1 -0
  243. package/dist/src/security/rate-limiter/presets.js +53 -0
  244. package/dist/src/security/rate-limiter/presets.js.map +1 -0
  245. package/dist/src/security/rate-limiter/queue-manager.d.ts +59 -0
  246. package/dist/src/security/rate-limiter/queue-manager.d.ts.map +1 -0
  247. package/dist/src/security/rate-limiter/queue-manager.js +189 -0
  248. package/dist/src/security/rate-limiter/queue-manager.js.map +1 -0
  249. package/dist/src/security/rate-limiter/storage.d.ts +34 -0
  250. package/dist/src/security/rate-limiter/storage.d.ts.map +1 -0
  251. package/dist/src/security/rate-limiter/storage.js +80 -0
  252. package/dist/src/security/rate-limiter/storage.js.map +1 -0
  253. package/dist/src/security/rate-limiter/token-bucket.d.ts +44 -0
  254. package/dist/src/security/rate-limiter/token-bucket.d.ts.map +1 -0
  255. package/dist/src/security/rate-limiter/token-bucket.js +99 -0
  256. package/dist/src/security/rate-limiter/token-bucket.js.map +1 -0
  257. package/dist/src/security/rate-limiter/types.d.ts +104 -0
  258. package/dist/src/security/rate-limiter/types.d.ts.map +1 -0
  259. package/dist/src/security/rate-limiter/types.js +7 -0
  260. package/dist/src/security/rate-limiter/types.js.map +1 -0
  261. package/dist/src/security/scanner/SecurityScanner.d.ts +94 -0
  262. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -0
  263. package/dist/src/security/scanner/SecurityScanner.js +403 -0
  264. package/dist/src/security/scanner/SecurityScanner.js.map +1 -0
  265. package/dist/src/security/scanner/index.d.ts +11 -0
  266. package/dist/src/security/scanner/index.d.ts.map +1 -0
  267. package/dist/src/security/scanner/index.js +14 -0
  268. package/dist/src/security/scanner/index.js.map +1 -0
  269. package/dist/src/security/scanner/patterns.d.ts +14 -0
  270. package/dist/src/security/scanner/patterns.d.ts.map +1 -0
  271. package/dist/src/security/scanner/patterns.js +147 -0
  272. package/dist/src/security/scanner/patterns.js.map +1 -0
  273. package/dist/src/security/scanner/regex-utils.d.ts +33 -0
  274. package/dist/src/security/scanner/regex-utils.d.ts.map +1 -0
  275. package/dist/src/security/scanner/regex-utils.js +41 -0
  276. package/dist/src/security/scanner/regex-utils.js.map +1 -0
  277. package/dist/src/security/scanner/types.d.ts +63 -0
  278. package/dist/src/security/scanner/types.d.ts.map +1 -0
  279. package/dist/src/security/scanner/types.js +7 -0
  280. package/dist/src/security/scanner/types.js.map +1 -0
  281. package/dist/src/security/scanner/weights.d.ts +15 -0
  282. package/dist/src/security/scanner/weights.d.ts.map +1 -0
  283. package/dist/src/security/scanner/weights.js +28 -0
  284. package/dist/src/security/scanner/weights.js.map +1 -0
  285. package/dist/src/session/SessionHealthMonitor.d.ts +5 -168
  286. package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
  287. package/dist/src/session/SessionHealthMonitor.js +22 -91
  288. package/dist/src/session/SessionHealthMonitor.js.map +1 -1
  289. package/dist/src/session/health-checks.d.ts +37 -0
  290. package/dist/src/session/health-checks.d.ts.map +1 -0
  291. package/dist/src/session/health-checks.js +64 -0
  292. package/dist/src/session/health-checks.js.map +1 -0
  293. package/dist/src/session/health-types.d.ts +78 -0
  294. package/dist/src/session/health-types.d.ts.map +1 -0
  295. package/dist/src/session/health-types.js +16 -0
  296. package/dist/src/session/health-types.js.map +1 -0
  297. package/dist/src/session/index.d.ts +5 -1
  298. package/dist/src/session/index.d.ts.map +1 -1
  299. package/dist/src/session/index.js +9 -0
  300. package/dist/src/session/index.js.map +1 -1
  301. package/dist/src/session/metrics-collector.d.ts +23 -0
  302. package/dist/src/session/metrics-collector.d.ts.map +1 -0
  303. package/dist/src/session/metrics-collector.js +44 -0
  304. package/dist/src/session/metrics-collector.js.map +1 -0
  305. package/dist/src/session/typed-event-emitter.d.ts +70 -0
  306. package/dist/src/session/typed-event-emitter.d.ts.map +1 -0
  307. package/dist/src/session/typed-event-emitter.js +79 -0
  308. package/dist/src/session/typed-event-emitter.js.map +1 -0
  309. package/dist/src/sources/BaseSourceAdapter.d.ts +1 -1
  310. package/dist/src/sources/BaseSourceAdapter.d.ts.map +1 -1
  311. package/dist/src/sources/BaseSourceAdapter.js +2 -2
  312. package/dist/src/sources/BaseSourceAdapter.js.map +1 -1
  313. package/dist/src/telemetry/index.d.ts +1 -0
  314. package/dist/src/telemetry/index.d.ts.map +1 -1
  315. package/dist/src/telemetry/index.js +2 -0
  316. package/dist/src/telemetry/index.js.map +1 -1
  317. package/dist/src/telemetry/posthog.d.ts +125 -0
  318. package/dist/src/telemetry/posthog.d.ts.map +1 -0
  319. package/dist/src/telemetry/posthog.js +198 -0
  320. package/dist/src/telemetry/posthog.js.map +1 -0
  321. package/dist/tests/RateLimiter.test.js +4 -4
  322. package/dist/tests/RateLimiter.test.js.map +1 -1
  323. package/dist/tests/e2e/security/security.e2e.test.js +3 -3
  324. package/dist/tests/e2e/security/security.e2e.test.js.map +1 -1
  325. package/package.json +2 -1
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Rate Limiter - SMI-730, SMI-1013, SMI-1189
3
+ *
4
+ * Token bucket algorithm for rate limiting API endpoints and adapters.
5
+ * Prevents abuse and DoS attacks with configurable limits and windows.
6
+ *
7
+ * Features:
8
+ * - Token bucket algorithm for smooth rate limiting
9
+ * - Per-IP and per-user limits
10
+ * - Configurable limits and windows
11
+ * - In-memory storage (Redis-compatible interface)
12
+ * - Graceful degradation on errors
13
+ * - Request queue for waiting when rate limited (SMI-1013)
14
+ * - Configurable timeout for queued requests (SMI-1013)
15
+ */
16
+ import { createLogger } from '../../utils/logger.js';
17
+ import { InMemoryRateLimitStorage } from './storage.js';
18
+ import { tryConsumeToken as tryConsumeTokenCore, getTokenBucketState, resetTokenBucket, } from './token-bucket.js';
19
+ import { MetricsManager } from './metrics-manager.js';
20
+ import { QueueManager } from './queue-manager.js';
21
+ const log = createLogger('RateLimiter');
22
+ /**
23
+ * Rate Limiter using Token Bucket Algorithm
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const limiter = new RateLimiter({
28
+ * maxTokens: 100,
29
+ * refillRate: 100 / 60,
30
+ * windowMs: 60000,
31
+ * })
32
+ *
33
+ * const result = await limiter.checkLimit('user:123')
34
+ * if (result.allowed) {
35
+ * // Process request
36
+ * } else {
37
+ * // Return 429 Too Many Requests
38
+ * }
39
+ * ```
40
+ */
41
+ export class RateLimiter {
42
+ config;
43
+ storage;
44
+ metricsManager;
45
+ queueManager;
46
+ constructor(config, storage = new InMemoryRateLimitStorage()) {
47
+ this.config = {
48
+ keyPrefix: 'ratelimit',
49
+ debug: false,
50
+ failMode: 'open',
51
+ enableQueue: false,
52
+ queueTimeoutMs: 30000,
53
+ maxQueueSize: 100,
54
+ ...config,
55
+ };
56
+ this.storage = storage;
57
+ this.metricsManager = new MetricsManager(this.config.debug, log);
58
+ this.queueManager = new QueueManager({
59
+ maxQueueSize: this.config.maxQueueSize,
60
+ queueTimeoutMs: this.config.queueTimeoutMs,
61
+ debug: this.config.debug,
62
+ }, log);
63
+ // Start queue processor if queuing is enabled (SMI-1013)
64
+ if (this.config.enableQueue) {
65
+ this.queueManager.startProcessor((key, cost) => this.tryConsumeToken(key, cost), (key, allowed) => this.metricsManager.update(key, allowed));
66
+ }
67
+ // Start metrics cleanup interval
68
+ this.metricsManager.startCleanup();
69
+ if (this.config.debug) {
70
+ log.info('Rate limiter initialized', {
71
+ maxTokens: this.config.maxTokens,
72
+ refillRate: this.config.refillRate,
73
+ windowMs: this.config.windowMs,
74
+ failMode: this.config.failMode,
75
+ enableQueue: this.config.enableQueue,
76
+ queueTimeoutMs: this.config.queueTimeoutMs,
77
+ maxQueueSize: this.config.maxQueueSize,
78
+ });
79
+ }
80
+ }
81
+ /**
82
+ * Try to consume a token without queuing (internal method)
83
+ */
84
+ async tryConsumeToken(key, cost) {
85
+ return tryConsumeTokenCore(this.storage, this.config, key, cost);
86
+ }
87
+ /**
88
+ * Check if a request is allowed under rate limit
89
+ */
90
+ async checkLimit(key, cost = 1) {
91
+ const storageKey = `${this.config.keyPrefix}:${key}`;
92
+ const now = Date.now();
93
+ try {
94
+ let bucket = await this.storage.get(storageKey);
95
+ if (!bucket) {
96
+ bucket = {
97
+ tokens: this.config.maxTokens,
98
+ lastRefill: now,
99
+ firstRequest: now,
100
+ };
101
+ }
102
+ // Refill tokens
103
+ const elapsedMs = now - bucket.lastRefill;
104
+ const elapsedSeconds = elapsedMs / 1000;
105
+ const tokensToAdd = elapsedSeconds * this.config.refillRate;
106
+ if (tokensToAdd > 0) {
107
+ bucket.tokens = Math.min(this.config.maxTokens, bucket.tokens + tokensToAdd);
108
+ bucket.lastRefill = now;
109
+ }
110
+ const allowed = bucket.tokens >= cost;
111
+ if (allowed) {
112
+ bucket.tokens -= cost;
113
+ await this.storage.set(storageKey, bucket, this.config.windowMs);
114
+ if (this.config.debug) {
115
+ log.debug(`Rate limit check: ${key}`, { allowed: true, remaining: bucket.tokens, cost });
116
+ }
117
+ this.metricsManager.update(key, true);
118
+ return {
119
+ allowed: true,
120
+ remaining: Math.floor(bucket.tokens),
121
+ limit: this.config.maxTokens,
122
+ metrics: this.metricsManager.get(key),
123
+ };
124
+ }
125
+ else {
126
+ const tokensNeeded = cost - bucket.tokens;
127
+ const retryAfterMs = Math.ceil((tokensNeeded / this.config.refillRate) * 1000);
128
+ const resetAt = new Date(now + retryAfterMs).toISOString();
129
+ if (this.config.debug) {
130
+ log.debug(`Rate limit exceeded: ${key}`, {
131
+ allowed: false,
132
+ remaining: bucket.tokens,
133
+ cost,
134
+ retryAfterMs,
135
+ });
136
+ }
137
+ this.metricsManager.update(key, false);
138
+ const currentMetrics = this.metricsManager.get(key);
139
+ if (this.config.onLimitExceeded && currentMetrics) {
140
+ this.config.onLimitExceeded(key, currentMetrics);
141
+ }
142
+ return {
143
+ allowed: false,
144
+ remaining: Math.floor(bucket.tokens),
145
+ limit: this.config.maxTokens,
146
+ retryAfterMs,
147
+ resetAt,
148
+ metrics: currentMetrics,
149
+ };
150
+ }
151
+ }
152
+ catch (error) {
153
+ this.metricsManager.update(key, this.config.failMode === 'open', true);
154
+ if (this.config.failMode === 'closed') {
155
+ log.error(`Rate limiter error (fail-closed) for ${key}: ${error instanceof Error ? error.message : String(error)}`);
156
+ return {
157
+ allowed: false,
158
+ remaining: 0,
159
+ limit: this.config.maxTokens,
160
+ retryAfterMs: this.config.windowMs,
161
+ resetAt: new Date(Date.now() + this.config.windowMs).toISOString(),
162
+ metrics: this.metricsManager.get(key),
163
+ };
164
+ }
165
+ log.error(`Rate limiter error (fail-open) for ${key}: ${error instanceof Error ? error.message : String(error)}`);
166
+ return {
167
+ allowed: true,
168
+ remaining: this.config.maxTokens,
169
+ limit: this.config.maxTokens,
170
+ metrics: this.metricsManager.get(key),
171
+ };
172
+ }
173
+ }
174
+ /**
175
+ * Wait for a token to become available (SMI-1013)
176
+ */
177
+ async waitForToken(key, cost = 1) {
178
+ if (!this.config.enableQueue) {
179
+ return this.checkLimit(key, cost);
180
+ }
181
+ const immediateResult = await this.tryConsumeToken(key, cost);
182
+ if (immediateResult.allowed) {
183
+ this.metricsManager.update(key, true);
184
+ return {
185
+ ...immediateResult,
186
+ queued: false,
187
+ metrics: this.metricsManager.get(key),
188
+ };
189
+ }
190
+ const result = await this.queueManager.queueRequest(key, cost, (allowed) => this.metricsManager.update(key, allowed));
191
+ return {
192
+ ...result,
193
+ metrics: this.metricsManager.get(key),
194
+ };
195
+ }
196
+ /**
197
+ * Get queue status for a key (SMI-1013)
198
+ */
199
+ getQueueStatus(key) {
200
+ return this.queueManager.getStatus(key);
201
+ }
202
+ /**
203
+ * Clear queue for a key (SMI-1013)
204
+ */
205
+ clearQueue(key) {
206
+ this.queueManager.clear(key);
207
+ if (this.config.debug) {
208
+ log.debug(`Queue cleared${key ? ` for key: ${key}` : ' (all)'}`);
209
+ }
210
+ }
211
+ /**
212
+ * Reset rate limit for a key
213
+ */
214
+ async reset(key) {
215
+ await resetTokenBucket(this.storage, this.config.keyPrefix, key);
216
+ if (this.config.debug) {
217
+ log.debug(`Rate limit reset: ${key}`);
218
+ }
219
+ }
220
+ /**
221
+ * Get current state for a key
222
+ */
223
+ async getState(key) {
224
+ return getTokenBucketState(this.storage, this.config.keyPrefix, key);
225
+ }
226
+ /**
227
+ * Get metrics for a specific key or all keys
228
+ */
229
+ getMetrics(key) {
230
+ if (key) {
231
+ return this.metricsManager.get(key);
232
+ }
233
+ return this.metricsManager.getAll();
234
+ }
235
+ /**
236
+ * Reset metrics for a specific key or all keys
237
+ */
238
+ resetMetrics(key) {
239
+ if (key) {
240
+ this.metricsManager.delete(key);
241
+ }
242
+ else {
243
+ this.metricsManager.clear();
244
+ }
245
+ if (this.config.debug) {
246
+ log.debug(`Metrics reset${key ? ` for key: ${key}` : ' (all)'}`);
247
+ }
248
+ }
249
+ /**
250
+ * Dispose of resources
251
+ */
252
+ dispose() {
253
+ this.queueManager.dispose();
254
+ this.metricsManager.dispose();
255
+ if (this.storage instanceof InMemoryRateLimitStorage) {
256
+ this.storage.dispose();
257
+ }
258
+ }
259
+ }
260
+ //# sourceMappingURL=RateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../../../src/security/rate-limiter/RateLimiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Rate Limiter Constants - SMI-730, SMI-1189
3
+ *
4
+ * Constants for rate limiting functionality.
5
+ */
6
+ /**
7
+ * Maximum number of unique keys to track in queues and metrics
8
+ * Prevents unbounded memory growth from malicious or misconfigured clients
9
+ */
10
+ export declare const MAX_UNIQUE_KEYS = 10000;
11
+ /**
12
+ * Metrics TTL in milliseconds (1 hour) - metrics older than this are cleaned up
13
+ */
14
+ export declare const METRICS_TTL_MS: number;
15
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/security/rate-limiter/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAQ,CAAA;AAEpC;;GAEG;AACH,eAAO,MAAM,cAAc,QAAiB,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Rate Limiter Constants - SMI-730, SMI-1189
3
+ *
4
+ * Constants for rate limiting functionality.
5
+ */
6
+ /**
7
+ * Maximum number of unique keys to track in queues and metrics
8
+ * Prevents unbounded memory growth from malicious or misconfigured clients
9
+ */
10
+ export const MAX_UNIQUE_KEYS = 10000;
11
+ /**
12
+ * Metrics TTL in milliseconds (1 hour) - metrics older than this are cleaned up
13
+ */
14
+ export const METRICS_TTL_MS = 60 * 60 * 1000;
15
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/security/rate-limiter/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAA;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Rate Limiter Errors - SMI-1013, SMI-1189
3
+ *
4
+ * Error classes for rate limiting queue functionality.
5
+ */
6
+ /**
7
+ * Error thrown when queue timeout is exceeded (SMI-1013)
8
+ */
9
+ export declare class RateLimitQueueTimeoutError extends Error {
10
+ readonly key: string;
11
+ readonly timeoutMs: number;
12
+ constructor(key: string, timeoutMs: number);
13
+ }
14
+ /**
15
+ * Error thrown when queue is full (SMI-1013)
16
+ */
17
+ export declare class RateLimitQueueFullError extends Error {
18
+ readonly key: string;
19
+ readonly maxQueueSize: number;
20
+ constructor(key: string, maxQueueSize: number);
21
+ }
22
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/security/rate-limiter/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;aAEjC,GAAG,EAAE,MAAM;aACX,SAAS,EAAE,MAAM;gBADjB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM;CAKpC;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;aAE9B,GAAG,EAAE,MAAM;aACX,YAAY,EAAE,MAAM;gBADpB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM;CAKvC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Rate Limiter Errors - SMI-1013, SMI-1189
3
+ *
4
+ * Error classes for rate limiting queue functionality.
5
+ */
6
+ /**
7
+ * Error thrown when queue timeout is exceeded (SMI-1013)
8
+ */
9
+ export class RateLimitQueueTimeoutError extends Error {
10
+ key;
11
+ timeoutMs;
12
+ constructor(key, timeoutMs) {
13
+ super(`Rate limit queue timeout exceeded for key '${key}' after ${timeoutMs}ms`);
14
+ this.key = key;
15
+ this.timeoutMs = timeoutMs;
16
+ this.name = 'RateLimitQueueTimeoutError';
17
+ }
18
+ }
19
+ /**
20
+ * Error thrown when queue is full (SMI-1013)
21
+ */
22
+ export class RateLimitQueueFullError extends Error {
23
+ key;
24
+ maxQueueSize;
25
+ constructor(key, maxQueueSize) {
26
+ super(`Rate limit queue full for key '${key}' (max: ${maxQueueSize})`);
27
+ this.key = key;
28
+ this.maxQueueSize = maxQueueSize;
29
+ this.name = 'RateLimitQueueFullError';
30
+ }
31
+ }
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/security/rate-limiter/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAEjC;IACA;IAFlB,YACkB,GAAW,EACX,SAAiB;QAEjC,KAAK,CAAC,8CAA8C,GAAG,WAAW,SAAS,IAAI,CAAC,CAAA;QAHhE,QAAG,GAAH,GAAG,CAAQ;QACX,cAAS,GAAT,SAAS,CAAQ;QAGjC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;IAC1C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAE9B;IACA;IAFlB,YACkB,GAAW,EACX,YAAoB;QAEpC,KAAK,CAAC,kCAAkC,GAAG,WAAW,YAAY,GAAG,CAAC,CAAA;QAHtD,QAAG,GAAH,GAAG,CAAQ;QACX,iBAAY,GAAZ,YAAY,CAAQ;QAGpC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;IACvC,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Rate Limiter Module - SMI-730, SMI-1013, SMI-1189
3
+ *
4
+ * Re-exports for rate limiting functionality.
5
+ */
6
+ export type { RateLimitConfig, RateLimitMetrics, RateLimitResult, RateLimitStorage, TokenBucket, QueuedRequest, } from './types.js';
7
+ export { MAX_UNIQUE_KEYS, METRICS_TTL_MS } from './constants.js';
8
+ export { RateLimitQueueTimeoutError, RateLimitQueueFullError } from './errors.js';
9
+ export { InMemoryRateLimitStorage } from './storage.js';
10
+ export { RateLimiter } from './RateLimiter.js';
11
+ export { RATE_LIMIT_PRESETS, createRateLimiterFromPreset } from './presets.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/security/rate-limiter/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGhE,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAGjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Rate Limiter Module - SMI-730, SMI-1013, SMI-1189
3
+ *
4
+ * Re-exports for rate limiting functionality.
5
+ */
6
+ // Constants
7
+ export { MAX_UNIQUE_KEYS, METRICS_TTL_MS } from './constants.js';
8
+ // Errors
9
+ export { RateLimitQueueTimeoutError, RateLimitQueueFullError } from './errors.js';
10
+ // Storage
11
+ export { InMemoryRateLimitStorage } from './storage.js';
12
+ // Main class
13
+ export { RateLimiter } from './RateLimiter.js';
14
+ // Presets
15
+ export { RATE_LIMIT_PRESETS, createRateLimiterFromPreset } from './presets.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/security/rate-limiter/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEhE,SAAS;AACT,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAEjF,UAAU;AACV,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAEvD,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,UAAU;AACV,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Rate Limit Metrics Manager - SMI-730, SMI-1189
3
+ *
4
+ * Metrics tracking and management for rate limiting.
5
+ */
6
+ import type { RateLimitMetrics } from './types.js';
7
+ /**
8
+ * Manages rate limit metrics with bounds checking and cleanup
9
+ */
10
+ export declare class MetricsManager {
11
+ private readonly metrics;
12
+ private cleanupInterval;
13
+ private readonly debug;
14
+ private readonly log;
15
+ constructor(debug?: boolean, log?: {
16
+ debug: (msg: string) => void;
17
+ });
18
+ /**
19
+ * Start periodic cleanup of stale metrics
20
+ */
21
+ startCleanup(): void;
22
+ /**
23
+ * Stop metrics cleanup
24
+ */
25
+ stopCleanup(): void;
26
+ /**
27
+ * Clean up metrics older than METRICS_TTL_MS
28
+ */
29
+ private cleanupStaleMetrics;
30
+ /**
31
+ * Update metrics for a key with bounds checking
32
+ */
33
+ update(key: string, allowed: boolean, error?: boolean): void;
34
+ /**
35
+ * Get metrics for a specific key
36
+ */
37
+ get(key: string): RateLimitMetrics | undefined;
38
+ /**
39
+ * Get all metrics
40
+ */
41
+ getAll(): Map<string, RateLimitMetrics>;
42
+ /**
43
+ * Delete metrics for a key
44
+ */
45
+ delete(key: string): void;
46
+ /**
47
+ * Clear all metrics
48
+ */
49
+ clear(): void;
50
+ /**
51
+ * Dispose of resources
52
+ */
53
+ dispose(): void;
54
+ }
55
+ //# sourceMappingURL=metrics-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-manager.d.ts","sourceRoot":"","sources":["../../../../src/security/rate-limiter/metrics-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGlD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IACnE,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkC;gBAE1C,KAAK,UAAQ,EAAE,GAAG,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE;IAKjE;;OAEG;IACH,YAAY,IAAI,IAAI;IAUpB;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA6B3B;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,UAAQ,GAAG,IAAI;IAiD1D;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI9C;;OAEG;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAIvC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Rate Limit Metrics Manager - SMI-730, SMI-1189
3
+ *
4
+ * Metrics tracking and management for rate limiting.
5
+ */
6
+ import { MAX_UNIQUE_KEYS, METRICS_TTL_MS } from './constants.js';
7
+ /**
8
+ * Manages rate limit metrics with bounds checking and cleanup
9
+ */
10
+ export class MetricsManager {
11
+ metrics = new Map();
12
+ cleanupInterval = null;
13
+ debug;
14
+ log;
15
+ constructor(debug = false, log) {
16
+ this.debug = debug;
17
+ this.log = log || { debug: () => { } };
18
+ }
19
+ /**
20
+ * Start periodic cleanup of stale metrics
21
+ */
22
+ startCleanup() {
23
+ // Clean up stale metrics every 5 minutes
24
+ this.cleanupInterval = setInterval(() => {
25
+ this.cleanupStaleMetrics();
26
+ }, 5 * 60 * 1000);
27
+ }
28
+ /**
29
+ * Stop metrics cleanup
30
+ */
31
+ stopCleanup() {
32
+ if (this.cleanupInterval) {
33
+ clearInterval(this.cleanupInterval);
34
+ this.cleanupInterval = null;
35
+ }
36
+ }
37
+ /**
38
+ * Clean up metrics older than METRICS_TTL_MS
39
+ */
40
+ cleanupStaleMetrics() {
41
+ const now = new Date();
42
+ let cleaned = 0;
43
+ for (const [key, metrics] of this.metrics.entries()) {
44
+ if (now.getTime() - metrics.lastUpdated.getTime() > METRICS_TTL_MS) {
45
+ this.metrics.delete(key);
46
+ cleaned++;
47
+ }
48
+ }
49
+ // Also enforce MAX_UNIQUE_KEYS limit if somehow exceeded
50
+ if (this.metrics.size > MAX_UNIQUE_KEYS) {
51
+ // Sort by lastUpdated and remove oldest entries
52
+ const entries = Array.from(this.metrics.entries()).sort((a, b) => a[1].lastUpdated.getTime() - b[1].lastUpdated.getTime());
53
+ const toRemove = entries.slice(0, this.metrics.size - MAX_UNIQUE_KEYS);
54
+ for (const [key] of toRemove) {
55
+ this.metrics.delete(key);
56
+ cleaned++;
57
+ }
58
+ }
59
+ if (cleaned > 0 && this.debug) {
60
+ this.log.debug(`Cleaned up ${cleaned} stale metric entries`);
61
+ }
62
+ }
63
+ /**
64
+ * Update metrics for a key with bounds checking
65
+ */
66
+ update(key, allowed, error = false) {
67
+ // Check if we've hit the max unique keys limit
68
+ if (!this.metrics.has(key) && this.metrics.size >= MAX_UNIQUE_KEYS) {
69
+ // Evict oldest entry before adding new one
70
+ let oldestKey = null;
71
+ let oldestTime = Infinity;
72
+ for (const [k, m] of this.metrics.entries()) {
73
+ if (m.lastUpdated.getTime() < oldestTime) {
74
+ oldestTime = m.lastUpdated.getTime();
75
+ oldestKey = k;
76
+ }
77
+ }
78
+ if (oldestKey) {
79
+ this.metrics.delete(oldestKey);
80
+ if (this.debug) {
81
+ this.log.debug(`Evicted oldest metrics entry: ${oldestKey}`);
82
+ }
83
+ }
84
+ }
85
+ const now = new Date();
86
+ const existing = this.metrics.get(key) || {
87
+ allowed: 0,
88
+ blocked: 0,
89
+ errors: 0,
90
+ lastReset: now,
91
+ lastUpdated: now,
92
+ };
93
+ if (error) {
94
+ existing.errors++;
95
+ // Also track allowed/blocked for error cases (fail-open vs fail-closed)
96
+ if (allowed) {
97
+ existing.allowed++;
98
+ }
99
+ else {
100
+ existing.blocked++;
101
+ }
102
+ }
103
+ else if (allowed) {
104
+ existing.allowed++;
105
+ }
106
+ else {
107
+ existing.blocked++;
108
+ }
109
+ existing.lastUpdated = now;
110
+ this.metrics.set(key, existing);
111
+ }
112
+ /**
113
+ * Get metrics for a specific key
114
+ */
115
+ get(key) {
116
+ return this.metrics.get(key);
117
+ }
118
+ /**
119
+ * Get all metrics
120
+ */
121
+ getAll() {
122
+ return new Map(this.metrics);
123
+ }
124
+ /**
125
+ * Delete metrics for a key
126
+ */
127
+ delete(key) {
128
+ this.metrics.delete(key);
129
+ }
130
+ /**
131
+ * Clear all metrics
132
+ */
133
+ clear() {
134
+ this.metrics.clear();
135
+ }
136
+ /**
137
+ * Dispose of resources
138
+ */
139
+ dispose() {
140
+ this.stopCleanup();
141
+ this.clear();
142
+ }
143
+ }
144
+ //# sourceMappingURL=metrics-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-manager.js","sourceRoot":"","sources":["../../../../src/security/rate-limiter/metrics-manager.ts"],"names":[],"mappings":"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"}