@abyss-project/monitor 1.0.71 → 1.0.73

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 (316) hide show
  1. package/.eslintrc.js +33 -33
  2. package/README.md +33 -2
  3. package/dist/__tests__/header-pattern.test.d.ts +1 -0
  4. package/dist/__tests__/header-pattern.test.js +63 -0
  5. package/dist/__tests__/header-pattern.test.js.map +1 -0
  6. package/dist/__tests__/identifier-resolver.test.d.ts +1 -0
  7. package/dist/__tests__/identifier-resolver.test.js +50 -0
  8. package/dist/__tests__/identifier-resolver.test.js.map +1 -0
  9. package/dist/__tests__/logger-endpoint-headers.test.d.ts +1 -0
  10. package/dist/__tests__/logger-endpoint-headers.test.js +23 -0
  11. package/dist/__tests__/logger-endpoint-headers.test.js.map +1 -0
  12. package/dist/__tests__/parse-window.test.d.ts +1 -0
  13. package/dist/__tests__/parse-window.test.js +19 -0
  14. package/dist/__tests__/parse-window.test.js.map +1 -0
  15. package/dist/__tests__/rate-limit.decorator.test.d.ts +1 -0
  16. package/dist/__tests__/rate-limit.decorator.test.js +106 -0
  17. package/dist/__tests__/rate-limit.decorator.test.js.map +1 -0
  18. package/dist/__tests__/rate-limit.middleware.test.d.ts +1 -0
  19. package/dist/__tests__/rate-limit.middleware.test.js +174 -0
  20. package/dist/__tests__/rate-limit.middleware.test.js.map +1 -0
  21. package/dist/__tests__/token-bucket.store.test.d.ts +1 -0
  22. package/dist/__tests__/token-bucket.store.test.js +99 -0
  23. package/dist/__tests__/token-bucket.store.test.js.map +1 -0
  24. package/dist/api/application-cron-task.admin.api.js +1 -0
  25. package/dist/api/application-cron-task.admin.api.js.map +1 -0
  26. package/dist/api/application-cron-task.api.js +1 -0
  27. package/dist/api/application-cron-task.api.js.map +1 -0
  28. package/dist/api/application-event.admin.api.js +1 -0
  29. package/dist/api/application-event.admin.api.js.map +1 -0
  30. package/dist/api/application-event.api.js +1 -0
  31. package/dist/api/application-event.api.js.map +1 -0
  32. package/dist/api/application-log.admin.api.js +1 -0
  33. package/dist/api/application-log.admin.api.js.map +1 -0
  34. package/dist/api/application-log.api.js +1 -0
  35. package/dist/api/application-log.api.js.map +1 -0
  36. package/dist/api/application-sentinel.admin.api.js +1 -0
  37. package/dist/api/application-sentinel.admin.api.js.map +1 -0
  38. package/dist/api/application-sentinel.api.js +1 -0
  39. package/dist/api/application-sentinel.api.js.map +1 -0
  40. package/dist/api/application-stats.admin.api.js +1 -0
  41. package/dist/api/application-stats.admin.api.js.map +1 -0
  42. package/dist/api/application-stats.api.js +1 -0
  43. package/dist/api/application-stats.api.js.map +1 -0
  44. package/dist/api/application-webhook-history.admin.api.js +1 -0
  45. package/dist/api/application-webhook-history.admin.api.js.map +1 -0
  46. package/dist/api/application-webhook-history.api.js +1 -0
  47. package/dist/api/application-webhook-history.api.js.map +1 -0
  48. package/dist/api/application-webhook.admin.api.js +1 -0
  49. package/dist/api/application-webhook.admin.api.js.map +1 -0
  50. package/dist/api/application-webhook.api.js +1 -0
  51. package/dist/api/application-webhook.api.js.map +1 -0
  52. package/dist/api/application.admin.api.js +1 -0
  53. package/dist/api/application.admin.api.js.map +1 -0
  54. package/dist/api/application.api.js +1 -0
  55. package/dist/api/application.api.js.map +1 -0
  56. package/dist/api/hourly-metrics.api.js +1 -0
  57. package/dist/api/hourly-metrics.api.js.map +1 -0
  58. package/dist/api/index.js +1 -0
  59. package/dist/api/index.js.map +1 -0
  60. package/dist/api/infrastructure.admin.api.js +1 -0
  61. package/dist/api/infrastructure.admin.api.js.map +1 -0
  62. package/dist/api/metrics.api.js +1 -0
  63. package/dist/api/metrics.api.js.map +1 -0
  64. package/dist/api/monitor.api.js +1 -0
  65. package/dist/api/monitor.api.js.map +1 -0
  66. package/dist/api/report.admin.api.js +1 -0
  67. package/dist/api/report.admin.api.js.map +1 -0
  68. package/dist/frameworks/express/decorators.js +6 -6
  69. package/dist/frameworks/express/decorators.js.map +1 -0
  70. package/dist/frameworks/express/index.js +5 -5
  71. package/dist/frameworks/express/index.js.map +1 -0
  72. package/dist/frameworks/express/metadata.js +1 -0
  73. package/dist/frameworks/express/metadata.js.map +1 -0
  74. package/dist/frameworks/index.js +1 -0
  75. package/dist/frameworks/index.js.map +1 -0
  76. package/dist/index.d.ts +3 -2
  77. package/dist/index.js +8 -8
  78. package/dist/index.js.map +1 -0
  79. package/dist/middlewares/context.middleware.js +5 -4
  80. package/dist/middlewares/context.middleware.js.map +1 -0
  81. package/dist/middlewares/index.d.ts +1 -0
  82. package/dist/middlewares/index.js +2 -0
  83. package/dist/middlewares/index.js.map +1 -0
  84. package/dist/middlewares/logger-endpoint.middleware.d.ts +2 -2
  85. package/dist/middlewares/logger-endpoint.middleware.js +17 -8
  86. package/dist/middlewares/logger-endpoint.middleware.js.map +1 -0
  87. package/dist/middlewares/logger-setup.middleware.js +1 -0
  88. package/dist/middlewares/logger-setup.middleware.js.map +1 -0
  89. package/dist/middlewares/rate-limit/identifier-resolver.d.ts +18 -0
  90. package/dist/middlewares/rate-limit/identifier-resolver.js +25 -0
  91. package/dist/middlewares/rate-limit/identifier-resolver.js.map +1 -0
  92. package/dist/middlewares/rate-limit/index.d.ts +10 -0
  93. package/dist/middlewares/rate-limit/index.js +17 -0
  94. package/dist/middlewares/rate-limit/index.js.map +1 -0
  95. package/dist/middlewares/rate-limit/parse-window.d.ts +2 -0
  96. package/dist/middlewares/rate-limit/parse-window.js +14 -0
  97. package/dist/middlewares/rate-limit/parse-window.js.map +1 -0
  98. package/dist/middlewares/rate-limit/rate-limit.decorator.d.ts +11 -0
  99. package/dist/middlewares/rate-limit/rate-limit.decorator.js +59 -0
  100. package/dist/middlewares/rate-limit/rate-limit.decorator.js.map +1 -0
  101. package/dist/middlewares/rate-limit/rate-limit.lua.d.ts +1 -0
  102. package/dist/middlewares/rate-limit/rate-limit.lua.js +77 -0
  103. package/dist/middlewares/rate-limit/rate-limit.lua.js.map +1 -0
  104. package/dist/middlewares/rate-limit/rate-limit.middleware.d.ts +4 -0
  105. package/dist/middlewares/rate-limit/rate-limit.middleware.js +186 -0
  106. package/dist/middlewares/rate-limit/rate-limit.middleware.js.map +1 -0
  107. package/dist/middlewares/rate-limit/token-bucket.store.d.ts +39 -0
  108. package/dist/middlewares/rate-limit/token-bucket.store.js +67 -0
  109. package/dist/middlewares/rate-limit/token-bucket.store.js.map +1 -0
  110. package/dist/middlewares/request-tracker.middleware.js +1 -0
  111. package/dist/middlewares/request-tracker.middleware.js.map +1 -0
  112. package/dist/models/index.js +1 -0
  113. package/dist/models/index.js.map +1 -0
  114. package/dist/models/logger.model.d.ts +2 -0
  115. package/dist/models/logger.model.js +10 -10
  116. package/dist/models/logger.model.js.map +1 -0
  117. package/dist/models/stats-publisher.model.js +17 -20
  118. package/dist/models/stats-publisher.model.js.map +1 -0
  119. package/dist/types/enum/api-error.enum.js +1 -0
  120. package/dist/types/enum/api-error.enum.js.map +1 -0
  121. package/dist/types/enum/api-method.enum.js +1 -0
  122. package/dist/types/enum/api-method.enum.js.map +1 -0
  123. package/dist/types/enum/application-alert-type.enum.js +1 -0
  124. package/dist/types/enum/application-alert-type.enum.js.map +1 -0
  125. package/dist/types/enum/application-sentinel-type.enum.js +1 -0
  126. package/dist/types/enum/application-sentinel-type.enum.js.map +1 -0
  127. package/dist/types/enum/application-stats-type.enum.js +1 -0
  128. package/dist/types/enum/application-stats-type.enum.js.map +1 -0
  129. package/dist/types/enum/application-webhook-scope.enum.js +1 -0
  130. package/dist/types/enum/application-webhook-scope.enum.js.map +1 -0
  131. package/dist/types/enum/index.js +1 -0
  132. package/dist/types/enum/index.js.map +1 -0
  133. package/dist/types/enum/log-level.enum.js +1 -0
  134. package/dist/types/enum/log-level.enum.js.map +1 -0
  135. package/dist/types/enum/log-scenario.enum.js +1 -0
  136. package/dist/types/enum/log-scenario.enum.js.map +1 -0
  137. package/dist/types/graceful-shutdown.types.js +1 -0
  138. package/dist/types/graceful-shutdown.types.js.map +1 -0
  139. package/dist/types/index.js +1 -0
  140. package/dist/types/index.js.map +1 -0
  141. package/dist/types/interface/api/index.js +1 -0
  142. package/dist/types/interface/api/index.js.map +1 -0
  143. package/dist/types/interface/api/requests/application-cron-task.admin.request.js +1 -0
  144. package/dist/types/interface/api/requests/application-cron-task.admin.request.js.map +1 -0
  145. package/dist/types/interface/api/requests/application-cron-task.request.js +1 -0
  146. package/dist/types/interface/api/requests/application-cron-task.request.js.map +1 -0
  147. package/dist/types/interface/api/requests/application-event.admin.request.js +1 -0
  148. package/dist/types/interface/api/requests/application-event.admin.request.js.map +1 -0
  149. package/dist/types/interface/api/requests/application-event.request.js +1 -0
  150. package/dist/types/interface/api/requests/application-event.request.js.map +1 -0
  151. package/dist/types/interface/api/requests/application-log.admin.request.js +1 -0
  152. package/dist/types/interface/api/requests/application-log.admin.request.js.map +1 -0
  153. package/dist/types/interface/api/requests/application-log.request.d.ts +2 -0
  154. package/dist/types/interface/api/requests/application-log.request.js +1 -0
  155. package/dist/types/interface/api/requests/application-log.request.js.map +1 -0
  156. package/dist/types/interface/api/requests/application-sentinel.admin.request.js +1 -0
  157. package/dist/types/interface/api/requests/application-sentinel.admin.request.js.map +1 -0
  158. package/dist/types/interface/api/requests/application-sentinel.request.js +1 -0
  159. package/dist/types/interface/api/requests/application-sentinel.request.js.map +1 -0
  160. package/dist/types/interface/api/requests/application-stats.admin.request.js +1 -0
  161. package/dist/types/interface/api/requests/application-stats.admin.request.js.map +1 -0
  162. package/dist/types/interface/api/requests/application-stats.request.js +1 -0
  163. package/dist/types/interface/api/requests/application-stats.request.js.map +1 -0
  164. package/dist/types/interface/api/requests/application-webhook-history.admin.request.js +1 -0
  165. package/dist/types/interface/api/requests/application-webhook-history.admin.request.js.map +1 -0
  166. package/dist/types/interface/api/requests/application-webhook-history.request.js +1 -0
  167. package/dist/types/interface/api/requests/application-webhook-history.request.js.map +1 -0
  168. package/dist/types/interface/api/requests/application-webhook.admin.request.js +1 -0
  169. package/dist/types/interface/api/requests/application-webhook.admin.request.js.map +1 -0
  170. package/dist/types/interface/api/requests/application-webhook.request.js +1 -0
  171. package/dist/types/interface/api/requests/application-webhook.request.js.map +1 -0
  172. package/dist/types/interface/api/requests/application.admin.request.js +1 -0
  173. package/dist/types/interface/api/requests/application.admin.request.js.map +1 -0
  174. package/dist/types/interface/api/requests/application.request.js +1 -0
  175. package/dist/types/interface/api/requests/application.request.js.map +1 -0
  176. package/dist/types/interface/api/requests/hourly-metrics.request.js +1 -0
  177. package/dist/types/interface/api/requests/hourly-metrics.request.js.map +1 -0
  178. package/dist/types/interface/api/requests/infrastructure.admin.request.js +1 -0
  179. package/dist/types/interface/api/requests/infrastructure.admin.request.js.map +1 -0
  180. package/dist/types/interface/api/requests/metrics.admin.request.js +1 -0
  181. package/dist/types/interface/api/requests/metrics.admin.request.js.map +1 -0
  182. package/dist/types/interface/api/requests/metrics.request.js +1 -0
  183. package/dist/types/interface/api/requests/metrics.request.js.map +1 -0
  184. package/dist/types/interface/api/requests/report.admin.request.js +1 -0
  185. package/dist/types/interface/api/requests/report.admin.request.js.map +1 -0
  186. package/dist/types/interface/api/responses/application-cron-task.admin.response.js +1 -0
  187. package/dist/types/interface/api/responses/application-cron-task.admin.response.js.map +1 -0
  188. package/dist/types/interface/api/responses/application-cron-task.response.js +1 -0
  189. package/dist/types/interface/api/responses/application-cron-task.response.js.map +1 -0
  190. package/dist/types/interface/api/responses/application-event.admin.response.js +1 -0
  191. package/dist/types/interface/api/responses/application-event.admin.response.js.map +1 -0
  192. package/dist/types/interface/api/responses/application-event.response.js +1 -0
  193. package/dist/types/interface/api/responses/application-event.response.js.map +1 -0
  194. package/dist/types/interface/api/responses/application-log.admin.response.js +1 -0
  195. package/dist/types/interface/api/responses/application-log.admin.response.js.map +1 -0
  196. package/dist/types/interface/api/responses/application-log.response.js +1 -0
  197. package/dist/types/interface/api/responses/application-log.response.js.map +1 -0
  198. package/dist/types/interface/api/responses/application-sentinel.admin.response.js +1 -0
  199. package/dist/types/interface/api/responses/application-sentinel.admin.response.js.map +1 -0
  200. package/dist/types/interface/api/responses/application-sentinel.response.js +1 -0
  201. package/dist/types/interface/api/responses/application-sentinel.response.js.map +1 -0
  202. package/dist/types/interface/api/responses/application-stats.admin.response.js +1 -0
  203. package/dist/types/interface/api/responses/application-stats.admin.response.js.map +1 -0
  204. package/dist/types/interface/api/responses/application-stats.response.js +1 -0
  205. package/dist/types/interface/api/responses/application-stats.response.js.map +1 -0
  206. package/dist/types/interface/api/responses/application-webhook-history.admin.response.js +1 -0
  207. package/dist/types/interface/api/responses/application-webhook-history.admin.response.js.map +1 -0
  208. package/dist/types/interface/api/responses/application-webhook-history.response.js +1 -0
  209. package/dist/types/interface/api/responses/application-webhook-history.response.js.map +1 -0
  210. package/dist/types/interface/api/responses/application-webhook.admin.response.js +1 -0
  211. package/dist/types/interface/api/responses/application-webhook.admin.response.js.map +1 -0
  212. package/dist/types/interface/api/responses/application-webhook.response.js +1 -0
  213. package/dist/types/interface/api/responses/application-webhook.response.js.map +1 -0
  214. package/dist/types/interface/api/responses/application.admin.response.js +1 -0
  215. package/dist/types/interface/api/responses/application.admin.response.js.map +1 -0
  216. package/dist/types/interface/api/responses/application.response.js +1 -0
  217. package/dist/types/interface/api/responses/application.response.js.map +1 -0
  218. package/dist/types/interface/api/responses/hourly-metrics.response.js +1 -0
  219. package/dist/types/interface/api/responses/hourly-metrics.response.js.map +1 -0
  220. package/dist/types/interface/api/responses/infrastructure.admin.response.js +1 -0
  221. package/dist/types/interface/api/responses/infrastructure.admin.response.js.map +1 -0
  222. package/dist/types/interface/api/responses/metrics.admin.response.js +1 -0
  223. package/dist/types/interface/api/responses/metrics.admin.response.js.map +1 -0
  224. package/dist/types/interface/api/responses/metrics.response.js +1 -0
  225. package/dist/types/interface/api/responses/metrics.response.js.map +1 -0
  226. package/dist/types/interface/api/responses/monitor.response.js +1 -0
  227. package/dist/types/interface/api/responses/monitor.response.js.map +1 -0
  228. package/dist/types/interface/api/responses/report.admin.response.js +1 -0
  229. package/dist/types/interface/api/responses/report.admin.response.js.map +1 -0
  230. package/dist/types/interface/api/type-message/api-error.js +1 -0
  231. package/dist/types/interface/api/type-message/api-error.js.map +1 -0
  232. package/dist/types/interface/api/type-message/base-order.js +1 -0
  233. package/dist/types/interface/api/type-message/base-order.js.map +1 -0
  234. package/dist/types/interface/api/type-message/base-paginate.js +1 -0
  235. package/dist/types/interface/api/type-message/base-paginate.js.map +1 -0
  236. package/dist/types/interface/api/type-message/response.js +1 -0
  237. package/dist/types/interface/api/type-message/response.js.map +1 -0
  238. package/dist/types/interface/dto/application-sentinel-configuration.dto.js +1 -0
  239. package/dist/types/interface/dto/application-sentinel-configuration.dto.js.map +1 -0
  240. package/dist/types/interface/dto/index.js +1 -0
  241. package/dist/types/interface/dto/index.js.map +1 -0
  242. package/dist/types/interface/dto/webhook.dto.js +1 -0
  243. package/dist/types/interface/dto/webhook.dto.js.map +1 -0
  244. package/dist/types/interface/header-capture.d.ts +4 -0
  245. package/dist/types/interface/header-capture.js +3 -0
  246. package/dist/types/interface/header-capture.js.map +1 -0
  247. package/dist/types/interface/index.d.ts +2 -0
  248. package/dist/types/interface/index.js +3 -0
  249. package/dist/types/interface/index.js.map +1 -0
  250. package/dist/types/interface/models/application-cron-task-history.model.js +1 -0
  251. package/dist/types/interface/models/application-cron-task-history.model.js.map +1 -0
  252. package/dist/types/interface/models/application-cron-task.model.js +1 -0
  253. package/dist/types/interface/models/application-cron-task.model.js.map +1 -0
  254. package/dist/types/interface/models/application-event.model.js +1 -0
  255. package/dist/types/interface/models/application-event.model.js.map +1 -0
  256. package/dist/types/interface/models/application-hourly-metrics.model.js +1 -0
  257. package/dist/types/interface/models/application-hourly-metrics.model.js.map +1 -0
  258. package/dist/types/interface/models/application-lifetime-metrics.model.js +1 -0
  259. package/dist/types/interface/models/application-lifetime-metrics.model.js.map +1 -0
  260. package/dist/types/interface/models/application-log-endpoint.model.d.ts +2 -0
  261. package/dist/types/interface/models/application-log-endpoint.model.js +1 -0
  262. package/dist/types/interface/models/application-log-endpoint.model.js.map +1 -0
  263. package/dist/types/interface/models/application-log.model.js +1 -0
  264. package/dist/types/interface/models/application-log.model.js.map +1 -0
  265. package/dist/types/interface/models/application-sentinel-history.model.js +1 -0
  266. package/dist/types/interface/models/application-sentinel-history.model.js.map +1 -0
  267. package/dist/types/interface/models/application-sentinel.model.js +1 -0
  268. package/dist/types/interface/models/application-sentinel.model.js.map +1 -0
  269. package/dist/types/interface/models/application-stats.model.js +1 -0
  270. package/dist/types/interface/models/application-stats.model.js.map +1 -0
  271. package/dist/types/interface/models/application-webhook-history.model.js +1 -0
  272. package/dist/types/interface/models/application-webhook-history.model.js.map +1 -0
  273. package/dist/types/interface/models/application-webhook.model.js +1 -0
  274. package/dist/types/interface/models/application-webhook.model.js.map +1 -0
  275. package/dist/types/interface/models/application.model.js +1 -0
  276. package/dist/types/interface/models/application.model.js.map +1 -0
  277. package/dist/types/interface/models/partition-optimization-history.model.js +1 -0
  278. package/dist/types/interface/models/partition-optimization-history.model.js.map +1 -0
  279. package/dist/types/interface/rate-limit.d.ts +47 -0
  280. package/dist/types/interface/rate-limit.js +10 -0
  281. package/dist/types/interface/rate-limit.js.map +1 -0
  282. package/dist/utils/alert.utils.js +4 -7
  283. package/dist/utils/alert.utils.js.map +1 -0
  284. package/dist/utils/discord-webhook-log-formatter.utils.d.ts +1 -1
  285. package/dist/utils/discord-webhook-log-formatter.utils.js +2 -1
  286. package/dist/utils/discord-webhook-log-formatter.utils.js.map +1 -0
  287. package/dist/utils/error.utils.js +1 -0
  288. package/dist/utils/error.utils.js.map +1 -0
  289. package/dist/utils/graceful-shutdown.utils.js +2 -1
  290. package/dist/utils/graceful-shutdown.utils.js.map +1 -0
  291. package/dist/utils/header-pattern.d.ts +5 -0
  292. package/dist/utils/header-pattern.js +56 -0
  293. package/dist/utils/header-pattern.js.map +1 -0
  294. package/dist/utils/import.utils.js +1 -0
  295. package/dist/utils/import.utils.js.map +1 -0
  296. package/dist/utils/index.d.ts +2 -0
  297. package/dist/utils/index.js +3 -0
  298. package/dist/utils/index.js.map +1 -0
  299. package/dist/utils/json.utils.js +1 -0
  300. package/dist/utils/json.utils.js.map +1 -0
  301. package/dist/utils/killable-route.utils.js +1 -0
  302. package/dist/utils/killable-route.utils.js.map +1 -0
  303. package/dist/utils/node-require.d.ts +1 -0
  304. package/dist/utils/node-require.js +9 -0
  305. package/dist/utils/node-require.js.map +1 -0
  306. package/dist/utils/non-blocking-promise.utils.js +2 -1
  307. package/dist/utils/non-blocking-promise.utils.js.map +1 -0
  308. package/dist/utils/request-tracker.utils.js +5 -4
  309. package/dist/utils/request-tracker.utils.js.map +1 -0
  310. package/dist/utils/string.utils.js +1 -0
  311. package/dist/utils/string.utils.js.map +1 -0
  312. package/jest.config.ts +14 -0
  313. package/package.json +78 -64
  314. package/tsconfig.json +35 -105
  315. package/dist/types/enum/time-period.enum.d.ts +0 -0
  316. package/dist/types/enum/time-period.enum.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ if (typeof window === 'undefined') {
7
7
  asyncHooks = require('async_hooks');
8
8
  }
9
9
  const store = new Map();
10
- const asyncHook = asyncHooks === null || asyncHooks === void 0 ? void 0 : asyncHooks.createHook({
10
+ const asyncHook = asyncHooks?.createHook({
11
11
  init: (asyncId, _, triggerAsyncId) => {
12
12
  const existingEntry = store.get(triggerAsyncId);
13
13
  if (existingEntry) {
@@ -20,7 +20,7 @@ const asyncHook = asyncHooks === null || asyncHooks === void 0 ? void 0 : asyncH
20
20
  }
21
21
  },
22
22
  });
23
- asyncHook === null || asyncHook === void 0 ? void 0 : asyncHook.enable();
23
+ asyncHook?.enable();
24
24
  const contextMiddleware = (req, res, next) => {
25
25
  const data = { headers: req.headers };
26
26
  (0, exports.createRequestContext)(data);
@@ -29,11 +29,12 @@ const contextMiddleware = (req, res, next) => {
29
29
  exports.contextMiddleware = contextMiddleware;
30
30
  const createRequestContext = (data, requestId = (0, uuid_1.v4)()) => {
31
31
  const requestInfo = { requestId, data };
32
- store.set(asyncHooks === null || asyncHooks === void 0 ? void 0 : asyncHooks.executionAsyncId(), requestInfo);
32
+ store.set(asyncHooks?.executionAsyncId(), requestInfo);
33
33
  return requestInfo;
34
34
  };
35
35
  exports.createRequestContext = createRequestContext;
36
36
  const getRequestContext = () => {
37
- return store.get(asyncHooks === null || asyncHooks === void 0 ? void 0 : asyncHooks.executionAsyncId());
37
+ return store.get(asyncHooks?.executionAsyncId());
38
38
  };
39
39
  exports.getRequestContext = getRequestContext;
40
+ //# sourceMappingURL=context.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.middleware.js","sourceRoot":"","sources":["../../src/middlewares/context.middleware.ts"],"names":[],"mappings":";;;AACA,+BAAoC;AAGpC,IAAI,UAAe,CAAC;AACpB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IAClC,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC;AAOD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE5C,MAAM,SAAS,GAAG,UAAU,EAAE,UAAU,CAAC;IACvC,IAAI,EAAE,CAAC,OAAe,EAAE,CAAM,EAAE,cAAsB,EAAE,EAAE;QACxD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAChD,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,EAAE,MAAM,EAAE,CAAC;AAEb,MAAM,iBAAiB,GAAG,CAAC,GAAY,EAAE,GAAuB,EAAE,IAAkB,EAAE,EAAE;IAC7F,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACtC,IAAA,4BAAoB,EAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAJW,QAAA,iBAAiB,qBAI5B;AAEK,MAAM,oBAAoB,GAAG,CAAC,IAA6B,EAAE,SAAS,GAAG,IAAA,SAAM,GAAE,EAAE,EAAE;IAC1F,MAAM,WAAW,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACxC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,WAAW,CAAC,CAAC;IACvD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAJW,QAAA,oBAAoB,wBAI/B;AAEK,MAAM,iBAAiB,GAAG,GAAe,EAAE;IAChD,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,EAAE,CAAe,CAAC;AACjE,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B"}
@@ -2,3 +2,4 @@ export * from './context.middleware';
2
2
  export * from './logger-endpoint.middleware';
3
3
  export * from './logger-setup.middleware';
4
4
  export * from './request-tracker.middleware';
5
+ export * from './rate-limit';
@@ -18,3 +18,5 @@ __exportStar(require("./context.middleware"), exports);
18
18
  __exportStar(require("./logger-endpoint.middleware"), exports);
19
19
  __exportStar(require("./logger-setup.middleware"), exports);
20
20
  __exportStar(require("./request-tracker.middleware"), exports);
21
+ __exportStar(require("./rate-limit"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,+DAA6C;AAC7C,4DAA0C;AAC1C,+DAA6C;AAC7C,+CAA6B"}
@@ -1,5 +1,5 @@
1
1
  import { Request, Response, NextFunction } from 'express-serve-static-core';
2
2
  import { Logger } from '../models';
3
- import { IMonitorLocals } from '../types';
3
+ import { IMonitorLocals, MonitorLoggerHeaderConfig } from '../types';
4
4
  export declare const CONTROLLER_FILE_ENDS_WITH: string;
5
- export declare const loggerEndpointMiddleware: (logger: Logger, req: Request, res: Response<unknown, IMonitorLocals>, next: NextFunction, callback?: ((req: Request, res: Response<unknown, IMonitorLocals>, next: NextFunction) => Promise<void>) | undefined) => Promise<void>;
5
+ export declare const loggerEndpointMiddleware: (logger: Logger, req: Request, res: Response<unknown, IMonitorLocals>, next: NextFunction, callback?: ((req: Request, res: Response<unknown, IMonitorLocals>, next: NextFunction) => Promise<void>) | undefined, options?: MonitorLoggerHeaderConfig) => Promise<void>;
@@ -1,23 +1,27 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.loggerEndpointMiddleware = exports.CONTROLLER_FILE_ENDS_WITH = void 0;
7
4
  const lodash_1 = require("lodash");
8
5
  const context_middleware_1 = require("./context.middleware");
9
6
  const types_1 = require("../types");
10
- const net_1 = __importDefault(require("net"));
11
7
  const import_utils_1 = require("../utils/import.utils");
8
+ const header_pattern_1 = require("../utils/header-pattern");
9
+ const node_require_1 = require("../utils/node-require");
10
+ let netModule;
11
+ const getNet = () => {
12
+ if (!netModule) {
13
+ netModule = (0, node_require_1.nodeRequire)('net');
14
+ }
15
+ return netModule;
16
+ };
12
17
  exports.CONTROLLER_FILE_ENDS_WITH = `.controller${(0, import_utils_1.extensionFileToImport)()}`;
13
- const loggerEndpointMiddleware = async (logger, req, res, next, callback) => {
18
+ const loggerEndpointMiddleware = async (logger, req, res, next, callback, options) => {
14
19
  res.locals.timer = {
15
20
  start: new Date(),
16
21
  startTime: process.hrtime(),
17
22
  };
18
23
  const requestId = (0, context_middleware_1.getRequestContext)().requestId;
19
24
  res.on('close', async () => {
20
- var _a;
21
25
  try {
22
26
  res.locals.timer.durationToClose = getDurationInMilliseconds(res.locals.timer.startTime);
23
27
  if (!res.locals.shouldNotPublishLog) {
@@ -37,14 +41,16 @@ const loggerEndpointMiddleware = async (logger, req, res, next, callback) => {
37
41
  if (req.ip) {
38
42
  ips.push(req.ip);
39
43
  }
44
+ const requestHeaders = (0, header_pattern_1.filterCapturedHeaders)(req.headers, options?.captureRequestHeaders);
45
+ const responseHeaders = (0, header_pattern_1.filterCapturedHeaders)(res.getHeaders(), options?.captureResponseHeaders);
40
46
  await logger.log('', {
41
47
  requestId,
42
48
  context: 'API',
43
49
  applicationLogEndpoint: {
44
50
  responseHttpCode: res.statusCode,
45
51
  responseTime: Math.round(res.locals.timer.durationToClose),
46
- ip: (0, lodash_1.uniq)(ips).filter(net_1.default.isIP),
47
- endpoint: res.locals.path || ((_a = req.route) === null || _a === void 0 ? void 0 : _a.path) || req.path,
52
+ ip: (0, lodash_1.uniq)(ips).filter(getNet().isIP),
53
+ endpoint: res.locals.path || req.route?.path || req.path,
48
54
  controller: res.locals.controller || 'Unknown Controller',
49
55
  method: types_1.APIMethod[req.method.toUpperCase()],
50
56
  requestParams: req.params,
@@ -59,6 +65,8 @@ const loggerEndpointMiddleware = async (logger, req, res, next, callback) => {
59
65
  : res.locals.responseBody
60
66
  ? JSON.parse(JSON.stringify(res.locals.responseBody))
61
67
  : null,
68
+ requestHeaders,
69
+ responseHeaders,
62
70
  },
63
71
  });
64
72
  }
@@ -84,3 +92,4 @@ const getDurationInMilliseconds = (start) => {
84
92
  const diff = process.hrtime(start);
85
93
  return (diff[0] * NS_PER_SEC + diff[1]) / NS_TO_MS;
86
94
  };
95
+ //# sourceMappingURL=logger-endpoint.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-endpoint.middleware.js","sourceRoot":"","sources":["../../src/middlewares/logger-endpoint.middleware.ts"],"names":[],"mappings":"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"}
@@ -14,3 +14,4 @@ const loggerSetupMiddleware = async (req, res, next) => {
14
14
  next();
15
15
  };
16
16
  exports.loggerSetupMiddleware = loggerSetupMiddleware;
17
+ //# sourceMappingURL=logger-setup.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-setup.middleware.js","sourceRoot":"","sources":["../../src/middlewares/logger-setup.middleware.ts"],"names":[],"mappings":";;;AAEO,MAAM,qBAAqB,GAAG,KAAK,EACxC,GAAY,EACZ,GAAkE,EAClE,IAAkB,EACH,EAAE;IACjB,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;IAC9B,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;IAE9B,GAAG,CAAC,IAAI,GAAG,UAAU,GAAG,IAAS;QAC/B,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,GAAG,CAAC,IAAI,GAAG,UACT,GAAG,IAAS;QAEZ,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IACF,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAnBW,QAAA,qBAAqB,yBAmBhC"}
@@ -0,0 +1,18 @@
1
+ import type { Request, Response } from 'express-serve-static-core';
2
+ export type ResolvedIdentifier = {
3
+ kind: 'admin';
4
+ } | {
5
+ kind: 'apikey';
6
+ apiKeyId: string;
7
+ } | {
8
+ kind: 'userOrg';
9
+ userId: string;
10
+ orgId: string;
11
+ } | {
12
+ kind: 'user';
13
+ userId: string;
14
+ } | {
15
+ kind: 'ip';
16
+ ip: string;
17
+ };
18
+ export declare function resolveIdentifiers(req: Request, res: Response): ResolvedIdentifier;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveIdentifiers = void 0;
4
+ const node_require_1 = require("../../utils/node-require");
5
+ function hashApiKey(value) {
6
+ const { createHash } = (0, node_require_1.nodeRequire)('crypto');
7
+ return createHash('sha256').update(value).digest('hex').slice(0, 16);
8
+ }
9
+ function resolveIdentifiers(req, res) {
10
+ const locals = (res.locals ?? {});
11
+ if (locals.isAdmin)
12
+ return { kind: 'admin' };
13
+ const apiKey = req.header?.('x-api-key');
14
+ if (apiKey)
15
+ return { kind: 'apikey', apiKeyId: hashApiKey(apiKey) };
16
+ if (locals.currentUser?.id) {
17
+ if (locals.organization?.id) {
18
+ return { kind: 'userOrg', userId: locals.currentUser.id, orgId: locals.organization.id };
19
+ }
20
+ return { kind: 'user', userId: locals.currentUser.id };
21
+ }
22
+ return { kind: 'ip', ip: req.ip ?? '0.0.0.0' };
23
+ }
24
+ exports.resolveIdentifiers = resolveIdentifiers;
25
+ //# sourceMappingURL=identifier-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier-resolver.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/identifier-resolver.ts"],"names":[],"mappings":";;;AACA,2DAAuD;AAavD,SAAS,UAAU,CAAC,KAAa;IAI/B,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,0BAAW,EAA0B,QAAQ,CAAC,CAAC;IACtE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,kBAAkB,CAAC,GAAY,EAAE,GAAa;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAI/B,CAAC;IAEF,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAEpE,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QAC3F,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,SAAS,EAAE,CAAC;AACjD,CAAC;AApBD,gDAoBC"}
@@ -0,0 +1,10 @@
1
+ export { createRateLimitMiddleware } from './rate-limit.middleware';
2
+ export { RateLimit, readRateLimitOptions } from './rate-limit.decorator';
3
+ export { buildRateLimitRouteRegistry } from './rate-limit.decorator';
4
+ export type { RateLimitRouteRegistryEntry } from './rate-limit.decorator';
5
+ export { TokenBucketStore } from './token-bucket.store';
6
+ export type { ConsumeArgs, ConsumeDualArgs, SingleResult, DualResult } from './token-bucket.store';
7
+ export { resolveIdentifiers } from './identifier-resolver';
8
+ export type { ResolvedIdentifier } from './identifier-resolver';
9
+ export { parseWindow } from './parse-window';
10
+ export type { RateLimitWindow } from './parse-window';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseWindow = exports.resolveIdentifiers = exports.TokenBucketStore = exports.buildRateLimitRouteRegistry = exports.readRateLimitOptions = exports.RateLimit = exports.createRateLimitMiddleware = void 0;
4
+ var rate_limit_middleware_1 = require("./rate-limit.middleware");
5
+ Object.defineProperty(exports, "createRateLimitMiddleware", { enumerable: true, get: function () { return rate_limit_middleware_1.createRateLimitMiddleware; } });
6
+ var rate_limit_decorator_1 = require("./rate-limit.decorator");
7
+ Object.defineProperty(exports, "RateLimit", { enumerable: true, get: function () { return rate_limit_decorator_1.RateLimit; } });
8
+ Object.defineProperty(exports, "readRateLimitOptions", { enumerable: true, get: function () { return rate_limit_decorator_1.readRateLimitOptions; } });
9
+ var rate_limit_decorator_2 = require("./rate-limit.decorator");
10
+ Object.defineProperty(exports, "buildRateLimitRouteRegistry", { enumerable: true, get: function () { return rate_limit_decorator_2.buildRateLimitRouteRegistry; } });
11
+ var token_bucket_store_1 = require("./token-bucket.store");
12
+ Object.defineProperty(exports, "TokenBucketStore", { enumerable: true, get: function () { return token_bucket_store_1.TokenBucketStore; } });
13
+ var identifier_resolver_1 = require("./identifier-resolver");
14
+ Object.defineProperty(exports, "resolveIdentifiers", { enumerable: true, get: function () { return identifier_resolver_1.resolveIdentifiers; } });
15
+ var parse_window_1 = require("./parse-window");
16
+ Object.defineProperty(exports, "parseWindow", { enumerable: true, get: function () { return parse_window_1.parseWindow; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/index.ts"],"names":[],"mappings":";;;AAAA,iEAAoE;AAA3D,kIAAA,yBAAyB,OAAA;AAClC,+DAAyE;AAAhE,iHAAA,SAAS,OAAA;AAAE,4HAAA,oBAAoB,OAAA;AACxC,+DAAqE;AAA5D,mIAAA,2BAA2B,OAAA;AAEpC,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AAEzB,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA;AAE3B,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
@@ -0,0 +1,2 @@
1
+ export type RateLimitWindow = `${number}s` | `${number}m` | `${number}h`;
2
+ export declare function parseWindow(input: string): number;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseWindow = void 0;
4
+ const PATTERN = /^([1-9]\d*)(s|m|h)$/;
5
+ const MULTIPLIERS = { s: 1, m: 60, h: 3600 };
6
+ function parseWindow(input) {
7
+ const match = PATTERN.exec(input);
8
+ if (!match)
9
+ throw new Error(`invalid window: ${input}`);
10
+ const [, value, unit] = match;
11
+ return Number(value) * MULTIPLIERS[unit];
12
+ }
13
+ exports.parseWindow = parseWindow;
14
+ //# sourceMappingURL=parse-window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-window.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/parse-window.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG,qBAAqB,CAAC;AACtC,MAAM,WAAW,GAAoC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAI9E,SAAgB,WAAW,CAAC,KAAa;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,IAAuB,CAAC,CAAC;AAC9D,CAAC;AALD,kCAKC"}
@@ -0,0 +1,11 @@
1
+ import 'reflect-metadata';
2
+ import type { RateLimitDecoratorOptions } from '../../types/interface/rate-limit';
3
+ export declare const RATE_LIMIT_WATERMARK: unique symbol;
4
+ export declare function RateLimit(options: RateLimitDecoratorOptions): MethodDecorator;
5
+ export declare function readRateLimitOptions(target: object, propertyKey: string | symbol): RateLimitDecoratorOptions | undefined;
6
+ export interface RateLimitRouteRegistryEntry {
7
+ method: string;
8
+ path: string;
9
+ options: RateLimitDecoratorOptions;
10
+ }
11
+ export declare function buildRateLimitRouteRegistry(controllers: ReadonlyArray<new (...args: any[]) => unknown>, controllerPrefix: string): RateLimitRouteRegistryEntry[];
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildRateLimitRouteRegistry = exports.readRateLimitOptions = exports.RateLimit = exports.RATE_LIMIT_WATERMARK = void 0;
4
+ require("reflect-metadata");
5
+ const metadata_1 = require("../../frameworks/express/metadata");
6
+ const types_1 = require("../../types");
7
+ exports.RATE_LIMIT_WATERMARK = Symbol('abyss:rate-limit');
8
+ function RateLimit(options) {
9
+ return function (target, propertyKey) {
10
+ Reflect.defineMetadata(exports.RATE_LIMIT_WATERMARK, options, target, propertyKey);
11
+ };
12
+ }
13
+ exports.RateLimit = RateLimit;
14
+ function readRateLimitOptions(target, propertyKey) {
15
+ return Reflect.getMetadata(exports.RATE_LIMIT_WATERMARK, target, propertyKey);
16
+ }
17
+ exports.readRateLimitOptions = readRateLimitOptions;
18
+ const HTTP_VERB_BY_API_METHOD = {
19
+ [types_1.APIMethod.GET]: 'GET',
20
+ [types_1.APIMethod.POST]: 'POST',
21
+ [types_1.APIMethod.PUT]: 'PUT',
22
+ [types_1.APIMethod.DELETE]: 'DELETE',
23
+ [types_1.APIMethod.PATCH]: 'PATCH',
24
+ };
25
+ function buildRateLimitRouteRegistry(controllers, controllerPrefix) {
26
+ const out = [];
27
+ for (const ControllerClass of controllers) {
28
+ const isController = Reflect.getMetadata(metadata_1.CONTROLLER_WATERMARK, ControllerClass) === true;
29
+ if (!isController)
30
+ continue;
31
+ const controllerBasePath = Reflect.getMetadata(metadata_1.PATH_WATERMARK, ControllerClass) ?? '';
32
+ const proto = ControllerClass.prototype;
33
+ for (const key of Object.getOwnPropertyNames(proto)) {
34
+ if (key === 'constructor')
35
+ continue;
36
+ const isRoute = Reflect.getMetadata(metadata_1.ROUTE_WATERMARK, proto, key) === true;
37
+ if (!isRoute)
38
+ continue;
39
+ const opts = readRateLimitOptions(proto, key);
40
+ if (!opts)
41
+ continue;
42
+ const apiMethod = Reflect.getMetadata(metadata_1.METHOD_WATERMARK, proto, key);
43
+ if (apiMethod === undefined)
44
+ continue;
45
+ const subPath = Reflect.getMetadata(metadata_1.PATH_WATERMARK, proto, key) ?? '';
46
+ const segments = [controllerPrefix, controllerBasePath, subPath]
47
+ .map((part) => part.replace(/^\/+|\/+$/g, ''))
48
+ .filter((part) => part.length > 0);
49
+ out.push({
50
+ method: HTTP_VERB_BY_API_METHOD[apiMethod],
51
+ path: '/' + segments.join('/'),
52
+ options: opts,
53
+ });
54
+ }
55
+ }
56
+ return out;
57
+ }
58
+ exports.buildRateLimitRouteRegistry = buildRateLimitRouteRegistry;
59
+ //# sourceMappingURL=rate-limit.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.decorator.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/rate-limit.decorator.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAE1B,gEAK2C;AAC3C,uCAAwC;AAE3B,QAAA,oBAAoB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE/D,SAAgB,SAAS,CAAC,OAAkC;IAC1D,OAAO,UAAU,MAAM,EAAE,WAAW;QAClC,OAAO,CAAC,cAAc,CAAC,4BAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC;AAJD,8BAIC;AAED,SAAgB,oBAAoB,CAClC,MAAc,EACd,WAA4B;IAE5B,OAAO,OAAO,CAAC,WAAW,CAAC,4BAAoB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC;AALD,oDAKC;AAED,MAAM,uBAAuB,GAA8B;IACzD,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE,KAAK;IACtB,CAAC,iBAAS,CAAC,IAAI,CAAC,EAAE,MAAM;IACxB,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE,KAAK;IACtB,CAAC,iBAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,iBAAS,CAAC,KAAK,CAAC,EAAE,OAAO;CAC3B,CAAC;AAQF,SAAgB,2BAA2B,CAEzC,WAA2D,EAC3D,gBAAwB;IAExB,MAAM,GAAG,GAAkC,EAAE,CAAC;IAE9C,KAAK,MAAM,eAAe,IAAI,WAAW,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,+BAAoB,EAAE,eAAe,CAAC,KAAK,IAAI,CAAC;QACzF,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,MAAM,kBAAkB,GACrB,OAAO,CAAC,WAAW,CAAC,yBAAc,EAAE,eAAe,CAAwB,IAAI,EAAE,CAAC;QACrF,MAAM,KAAK,GAAI,eAAyC,CAAC,SAAS,CAAC;QAEnE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,IAAI,GAAG,KAAK,aAAa;gBAAE,SAAS;YACpC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,0BAAe,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;YAC1E,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,2BAAgB,EAAE,KAAK,EAAE,GAAG,CAA0B,CAAC;YAC7F,IAAI,SAAS,KAAK,SAAS;gBAAE,SAAS;YAEtC,MAAM,OAAO,GAAI,OAAO,CAAC,WAAW,CAAC,yBAAc,EAAE,KAAK,EAAE,GAAG,CAAwB,IAAI,EAAE,CAAC;YAC9F,MAAM,QAAQ,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,OAAO,CAAC;iBAC7D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;iBAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAErC,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,uBAAuB,CAAC,SAAS,CAAC;gBAC1C,IAAI,EAAE,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC9B,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAxCD,kEAwCC"}
@@ -0,0 +1 @@
1
+ export declare const RATE_LIMIT_LUA = "\nlocal function load_bucket(key, capacity, refill, now)\n local data = redis.call('HMGET', key, 'tokens', 'ts')\n local tokens = tonumber(data[1])\n local ts = tonumber(data[2])\n if tokens == nil then tokens = capacity end\n if ts == nil then ts = now end\n local elapsed = (now - ts) / 1000.0\n if elapsed < 0 then elapsed = 0 end\n tokens = math.min(capacity, tokens + elapsed * refill)\n return tokens\nend\n\nlocal function save_bucket(key, tokens, capacity, refill, now)\n redis.call('HSET', key, 'tokens', tokens, 'ts', now)\n local ttl = math.ceil(capacity / refill) * 2\n redis.call('EXPIRE', key, ttl)\nend\n\nlocal function reset_sec(tokens, capacity, refill, cost)\n if tokens >= cost then return 0 end\n return math.ceil((cost - tokens) / refill)\nend\n\nlocal primary_cap = tonumber(ARGV[1])\nlocal primary_rate = tonumber(ARGV[2])\nlocal secondary_cap = tonumber(ARGV[3])\nlocal secondary_rate = tonumber(ARGV[4])\nlocal now = tonumber(ARGV[5])\nlocal cost = tonumber(ARGV[6])\n\nlocal primary_tokens = load_bucket(KEYS[1], primary_cap, primary_rate, now)\nlocal secondary_tokens = 0\nlocal has_secondary = KEYS[2] ~= nil and KEYS[2] ~= ''\nif has_secondary then\n secondary_tokens = load_bucket(KEYS[2], secondary_cap, secondary_rate, now)\nend\n\nlocal allowed = 1\nif primary_tokens < cost then allowed = 0 end\nif has_secondary and secondary_tokens < cost then allowed = 0 end\n\nif allowed == 1 then\n primary_tokens = primary_tokens - cost\n save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)\n if has_secondary then\n secondary_tokens = secondary_tokens - cost\n save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)\n end\nelse\n -- Refresh ts so refill math stays correct on next call without consuming tokens.\n save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)\n if has_secondary then\n save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)\n end\nend\n\nlocal primary_reset = reset_sec(primary_tokens, primary_cap, primary_rate, cost)\nlocal secondary_reset = 0\nif has_secondary then\n secondary_reset = reset_sec(secondary_tokens, secondary_cap, secondary_rate, cost)\nend\n\nreturn {\n allowed,\n math.floor(primary_tokens),\n primary_cap,\n primary_reset,\n math.floor(secondary_tokens),\n secondary_cap,\n secondary_reset,\n}\n";
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RATE_LIMIT_LUA = void 0;
4
+ exports.RATE_LIMIT_LUA = `
5
+ local function load_bucket(key, capacity, refill, now)
6
+ local data = redis.call('HMGET', key, 'tokens', 'ts')
7
+ local tokens = tonumber(data[1])
8
+ local ts = tonumber(data[2])
9
+ if tokens == nil then tokens = capacity end
10
+ if ts == nil then ts = now end
11
+ local elapsed = (now - ts) / 1000.0
12
+ if elapsed < 0 then elapsed = 0 end
13
+ tokens = math.min(capacity, tokens + elapsed * refill)
14
+ return tokens
15
+ end
16
+
17
+ local function save_bucket(key, tokens, capacity, refill, now)
18
+ redis.call('HSET', key, 'tokens', tokens, 'ts', now)
19
+ local ttl = math.ceil(capacity / refill) * 2
20
+ redis.call('EXPIRE', key, ttl)
21
+ end
22
+
23
+ local function reset_sec(tokens, capacity, refill, cost)
24
+ if tokens >= cost then return 0 end
25
+ return math.ceil((cost - tokens) / refill)
26
+ end
27
+
28
+ local primary_cap = tonumber(ARGV[1])
29
+ local primary_rate = tonumber(ARGV[2])
30
+ local secondary_cap = tonumber(ARGV[3])
31
+ local secondary_rate = tonumber(ARGV[4])
32
+ local now = tonumber(ARGV[5])
33
+ local cost = tonumber(ARGV[6])
34
+
35
+ local primary_tokens = load_bucket(KEYS[1], primary_cap, primary_rate, now)
36
+ local secondary_tokens = 0
37
+ local has_secondary = KEYS[2] ~= nil and KEYS[2] ~= ''
38
+ if has_secondary then
39
+ secondary_tokens = load_bucket(KEYS[2], secondary_cap, secondary_rate, now)
40
+ end
41
+
42
+ local allowed = 1
43
+ if primary_tokens < cost then allowed = 0 end
44
+ if has_secondary and secondary_tokens < cost then allowed = 0 end
45
+
46
+ if allowed == 1 then
47
+ primary_tokens = primary_tokens - cost
48
+ save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)
49
+ if has_secondary then
50
+ secondary_tokens = secondary_tokens - cost
51
+ save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)
52
+ end
53
+ else
54
+ -- Refresh ts so refill math stays correct on next call without consuming tokens.
55
+ save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)
56
+ if has_secondary then
57
+ save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)
58
+ end
59
+ end
60
+
61
+ local primary_reset = reset_sec(primary_tokens, primary_cap, primary_rate, cost)
62
+ local secondary_reset = 0
63
+ if has_secondary then
64
+ secondary_reset = reset_sec(secondary_tokens, secondary_cap, secondary_rate, cost)
65
+ end
66
+
67
+ return {
68
+ allowed,
69
+ math.floor(primary_tokens),
70
+ primary_cap,
71
+ primary_reset,
72
+ math.floor(secondary_tokens),
73
+ secondary_cap,
74
+ secondary_reset,
75
+ }
76
+ `;
77
+ //# sourceMappingURL=rate-limit.lua.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.lua.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/rate-limit.lua.ts"],"names":[],"mappings":";;;AAca,QAAA,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwE7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Request, Response, NextFunction } from 'express-serve-static-core';
2
+ import type { TokenBucketStore } from './token-bucket.store';
3
+ import type { RateLimitMiddlewareOptions } from '../../types/interface/rate-limit';
4
+ export declare function createRateLimitMiddleware(options: RateLimitMiddlewareOptions, store: TokenBucketStore): (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRateLimitMiddleware = void 0;
4
+ const identifier_resolver_1 = require("./identifier-resolver");
5
+ const parse_window_1 = require("./parse-window");
6
+ function buildKey(prefix, scope, id) {
7
+ return `rl:${prefix}:${scope}:${id}`;
8
+ }
9
+ function applyOverride(base, override) {
10
+ return {
11
+ max: override?.max ?? base.max,
12
+ windowSec: (0, parse_window_1.parseWindow)(override?.window ?? base.window),
13
+ };
14
+ }
15
+ function buildBuckets(identifier, config, override) {
16
+ switch (identifier.kind) {
17
+ case 'admin':
18
+ return {};
19
+ case 'apikey': {
20
+ const eff = applyOverride(config.apikey, override);
21
+ return {
22
+ primary: {
23
+ scope: 'apikey',
24
+ key: buildKey(config.redisPrefix, 'apikey', identifier.apiKeyId),
25
+ max: eff.max,
26
+ windowSec: eff.windowSec,
27
+ },
28
+ };
29
+ }
30
+ case 'userOrg': {
31
+ const userEff = applyOverride(config.user, override?.scope === 'user' ? override : undefined);
32
+ const orgEff = applyOverride(config.org, override?.scope === 'org' ? override : undefined);
33
+ return {
34
+ primary: {
35
+ scope: 'user',
36
+ key: buildKey(config.redisPrefix, 'user', identifier.userId),
37
+ max: userEff.max,
38
+ windowSec: userEff.windowSec,
39
+ },
40
+ secondary: {
41
+ scope: 'org',
42
+ key: buildKey(config.redisPrefix, 'org', identifier.orgId),
43
+ max: orgEff.max,
44
+ windowSec: orgEff.windowSec,
45
+ },
46
+ };
47
+ }
48
+ case 'user': {
49
+ const eff = applyOverride(config.user, override);
50
+ return {
51
+ primary: {
52
+ scope: 'user',
53
+ key: buildKey(config.redisPrefix, 'user', identifier.userId),
54
+ max: eff.max,
55
+ windowSec: eff.windowSec,
56
+ },
57
+ };
58
+ }
59
+ case 'ip': {
60
+ const eff = applyOverride(config.ip, override);
61
+ return {
62
+ primary: {
63
+ scope: 'ip',
64
+ key: buildKey(config.redisPrefix, 'ip', identifier.ip),
65
+ max: eff.max,
66
+ windowSec: eff.windowSec,
67
+ },
68
+ };
69
+ }
70
+ }
71
+ }
72
+ function setSuccessHeaders(res, bucket, remaining, resetSec) {
73
+ res.setHeader('RateLimit-Limit', bucket.max);
74
+ res.setHeader('RateLimit-Remaining', remaining);
75
+ res.setHeader('RateLimit-Reset', resetSec);
76
+ res.setHeader('RateLimit-Policy', `${bucket.max};w=${bucket.windowSec}`);
77
+ }
78
+ function createRateLimitMiddleware(options, store) {
79
+ const { config, logger, onExceeded } = options;
80
+ const routeOverrideLookup = new Map();
81
+ for (const entry of options.routeRegistry ?? []) {
82
+ routeOverrideLookup.set(`${entry.method}:${entry.path}`, entry.options);
83
+ }
84
+ return async function rateLimitMiddleware(req, res, next) {
85
+ if (!config.enabled) {
86
+ next();
87
+ return;
88
+ }
89
+ const identifier = (0, identifier_resolver_1.resolveIdentifiers)(req, res);
90
+ if (identifier.kind === 'admin') {
91
+ next();
92
+ return;
93
+ }
94
+ const override = routeOverrideLookup.get(`${req.method}:${req.path}`);
95
+ const cost = override?.cost ?? 1;
96
+ let effectiveIdentifier = identifier;
97
+ if (override?.scope === 'ip') {
98
+ effectiveIdentifier = { kind: 'ip', ip: req.ip ?? '0.0.0.0' };
99
+ }
100
+ const buckets = buildBuckets(effectiveIdentifier, config, override);
101
+ if (!buckets.primary) {
102
+ next();
103
+ return;
104
+ }
105
+ const refill = (b) => b.max / b.windowSec;
106
+ if (buckets.secondary) {
107
+ const result = await store.consumeDual({
108
+ primary: {
109
+ key: buckets.primary.key,
110
+ capacity: buckets.primary.max,
111
+ refillPerSec: refill(buckets.primary),
112
+ cost,
113
+ },
114
+ secondary: {
115
+ key: buckets.secondary.key,
116
+ capacity: buckets.secondary.max,
117
+ refillPerSec: refill(buckets.secondary),
118
+ cost,
119
+ },
120
+ });
121
+ const tighter = result.primaryRemaining <= result.secondaryRemaining ? buckets.primary : buckets.secondary;
122
+ const tighterRemaining = tighter === buckets.primary ? result.primaryRemaining : result.secondaryRemaining;
123
+ const tighterReset = tighter === buckets.primary ? result.primaryResetSeconds : result.secondaryResetSeconds;
124
+ if (!result.allowed) {
125
+ await emitExceeded(req, tighter, tighterReset, logger, onExceeded);
126
+ respond429(res, tighter, tighterReset);
127
+ return;
128
+ }
129
+ setSuccessHeaders(res, tighter, tighterRemaining, tighterReset);
130
+ next();
131
+ return;
132
+ }
133
+ const single = await store.consume({
134
+ key: buckets.primary.key,
135
+ capacity: buckets.primary.max,
136
+ refillPerSec: refill(buckets.primary),
137
+ cost,
138
+ });
139
+ if (!single.allowed) {
140
+ await emitExceeded(req, buckets.primary, single.resetSeconds, logger, onExceeded);
141
+ respond429(res, buckets.primary, single.resetSeconds);
142
+ return;
143
+ }
144
+ setSuccessHeaders(res, buckets.primary, single.remaining, single.resetSeconds);
145
+ next();
146
+ };
147
+ }
148
+ exports.createRateLimitMiddleware = createRateLimitMiddleware;
149
+ function respond429(res, bucket, resetSec) {
150
+ res.setHeader('RateLimit-Limit', bucket.max);
151
+ res.setHeader('RateLimit-Remaining', 0);
152
+ res.setHeader('RateLimit-Reset', resetSec);
153
+ res.setHeader('RateLimit-Policy', `${bucket.max};w=${bucket.windowSec}`);
154
+ res.setHeader('Retry-After', resetSec);
155
+ res.status(429).json({
156
+ error: {
157
+ code: 'RATE_LIMIT_EXCEEDED',
158
+ message: `Rate limit exceeded for scope '${bucket.scope}'. Retry in ${resetSec}s.`,
159
+ scope: bucket.scope,
160
+ limit: bucket.max,
161
+ window: bucket.windowSec,
162
+ retryAfter: resetSec,
163
+ },
164
+ });
165
+ }
166
+ async function emitExceeded(req, bucket, resetSec, logger, onExceeded) {
167
+ const info = {
168
+ scope: bucket.scope,
169
+ identifier: bucket.key,
170
+ limit: bucket.max,
171
+ windowSeconds: bucket.windowSec,
172
+ retryAfterSeconds: resetSec,
173
+ endpoint: req.path,
174
+ method: req.method,
175
+ ip: req.ip ?? '',
176
+ };
177
+ if (logger && typeof logger.warn === 'function') {
178
+ await logger.warn('rate_limit_exceeded', {
179
+ context: 'rate-limit',
180
+ data: info,
181
+ });
182
+ }
183
+ if (onExceeded)
184
+ await onExceeded(info);
185
+ }
186
+ //# sourceMappingURL=rate-limit.middleware.js.map