commandkit 1.2.0-rc.13 → 1.2.0-rc.15

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 (350) hide show
  1. package/README.md +42 -23
  2. package/dist/{ActionRow-B-CGmjDp.d.ts → ActionRow-Bt9qi0Mb.d.ts} +2 -2
  3. package/dist/{Button-C-GPeFA3.d.ts → Button-DxJLcZIU.d.ts} +5 -5
  4. package/dist/{ButtonKit-DKu0VAe4.d.ts → ButtonKit-BfcyvWfj.d.ts} +35 -35
  5. package/dist/{ChannelSelectMenuKit-HQZ4hH5s.d.ts → ChannelSelectMenuKit-DYkudikb.d.ts} +33 -33
  6. package/dist/{CommandsRouter-C7dZEepB.d.ts → CommandsRouter-DiNoF0dq.d.ts} +48 -48
  7. package/dist/{EventInterceptor-CZmWpS08.d.ts → EventInterceptor-D9JKMcfi.d.ts} +39 -39
  8. package/dist/{EventsRouter-DZ37r54v.d.ts → EventsRouter-EuuSu6NH.d.ts} +34 -34
  9. package/dist/{MentionableSelectMenuKit-7URDUM3-.d.ts → MentionableSelectMenuKit-Mu4xqP6B.d.ts} +33 -33
  10. package/dist/MessageCommandParser-DPCbHXCS.d.ts +194 -0
  11. package/dist/{Modal-CZT9MZsy.d.ts → Modal-v9rrcMl-.d.ts} +7 -7
  12. package/dist/{ModalKit-BWXI3Z26.d.ts → ModalKit-XJSM65SV.d.ts} +32 -32
  13. package/dist/{RoleSelectMenuKit-BY-JJ18w.d.ts → RoleSelectMenuKit-CCjcp3HY.d.ts} +33 -33
  14. package/dist/{SelectMenu-q_b3Mjv9.d.ts → SelectMenu-CY0vvoSu.d.ts} +15 -11
  15. package/dist/{StringSelectMenuKit-lVhUMc3g.d.ts → StringSelectMenuKit-G5nBTicX.d.ts} +33 -33
  16. package/dist/{UserSelectMenuKit-CCj4Fpkr.d.ts → UserSelectMenuKit-D3SO_fXA.d.ts} +33 -33
  17. package/dist/analytics/analytics-engine.d.ts +1 -1
  18. package/dist/analytics/analytics-engine.js +2 -24
  19. package/dist/analytics/analytics-provider.d.ts +1 -1
  20. package/dist/analytics/analytics-provider.js +1 -0
  21. package/dist/analytics/constants.js +26 -3
  22. package/dist/analytics/constants.js.map +1 -0
  23. package/dist/analytics/utils.js +2 -24
  24. package/dist/{analytics-engine-WQhXmx3H.d.ts → analytics-engine-DnRsHBId.d.ts} +846 -841
  25. package/dist/app/commands/AppCommandRunner.d.ts +1 -1
  26. package/dist/app/commands/AppCommandRunner.js +2 -24
  27. package/dist/app/commands/Context.d.ts +1 -1
  28. package/dist/app/commands/Context.js +2 -24
  29. package/dist/app/commands/MessageCommandParser.d.ts +1 -1
  30. package/dist/app/commands/MessageCommandParser.js +261 -3
  31. package/dist/app/commands/MessageCommandParser.js.map +1 -0
  32. package/dist/app/commands/helpers.d.ts +1 -1
  33. package/dist/app/commands/helpers.js +25 -3
  34. package/dist/app/commands/helpers.js.map +1 -0
  35. package/dist/app/events/EventWorkerContext.d.ts +2 -2
  36. package/dist/app/events/EventWorkerContext.js +48 -5
  37. package/dist/app/events/EventWorkerContext.js.map +1 -0
  38. package/dist/app/handlers/AppCommandHandler.d.ts +1 -1
  39. package/dist/app/handlers/AppCommandHandler.js +2 -24
  40. package/dist/app/handlers/AppEventsHandler.d.ts +1 -1
  41. package/dist/app/handlers/AppEventsHandler.js +2 -24
  42. package/dist/app/index.d.ts +4 -4
  43. package/dist/app/index.js +13 -32
  44. package/dist/app/interrupt/signals.d.ts +1 -1
  45. package/dist/app/interrupt/signals.js +54 -6
  46. package/dist/app/interrupt/signals.js.map +1 -0
  47. package/dist/app/middlewares/permissions.d.ts +1 -1
  48. package/dist/app/middlewares/permissions.js +2 -24
  49. package/dist/app/register/CommandRegistrar.d.ts +1 -1
  50. package/dist/app/register/CommandRegistrar.js +2 -24
  51. package/dist/app/router/CommandsRouter.d.ts +1 -1
  52. package/dist/app/router/CommandsRouter.js +210 -2
  53. package/dist/app/router/CommandsRouter.js.map +1 -0
  54. package/dist/app/router/EventsRouter.d.ts +1 -1
  55. package/dist/app/router/EventsRouter.js +128 -2
  56. package/dist/app/router/EventsRouter.js.map +1 -0
  57. package/dist/app/router/index.d.ts +2 -2
  58. package/dist/app/router/index.js +5 -5
  59. package/dist/{chunk-kSYXY2_d.js → chunk-BE-pF4vm.js} +1 -1
  60. package/dist/cli/app-process.d.ts +2 -2
  61. package/dist/cli/app-process.js +6 -8
  62. package/dist/cli/app-process.js.map +1 -1
  63. package/dist/cli/build.d.ts +2 -2
  64. package/dist/cli/build.js +15 -35
  65. package/dist/cli/build.js.map +1 -1
  66. package/dist/cli/common.d.ts +5 -5
  67. package/dist/cli/common.js +182 -12
  68. package/dist/cli/common.js.map +1 -0
  69. package/dist/cli/development.d.ts +3 -3
  70. package/dist/cli/development.js +38 -59
  71. package/dist/cli/development.js.map +1 -1
  72. package/dist/cli/env.js +73 -9
  73. package/dist/cli/env.js.map +1 -0
  74. package/dist/cli/generators.js +10 -10
  75. package/dist/cli/generators.js.map +1 -1
  76. package/dist/cli/information.js +8 -7
  77. package/dist/cli/information.js.map +1 -1
  78. package/dist/cli/init.d.ts +2 -2
  79. package/dist/cli/init.js +14 -33
  80. package/dist/cli/init.js.map +1 -1
  81. package/dist/cli/production.d.ts +2 -2
  82. package/dist/cli/production.js +11 -33
  83. package/dist/cli/production.js.map +1 -1
  84. package/dist/cli/type-checker.js +83 -6
  85. package/dist/cli/type-checker.js.map +1 -0
  86. package/dist/cli/utils.js +1 -0
  87. package/dist/cli/utils.js.map +1 -1
  88. package/dist/{commandkit-SIjTLD2R.js → commandkit--k6yDJEr.js} +3157 -2699
  89. package/dist/commandkit--k6yDJEr.js.map +1 -0
  90. package/dist/commandkit.d.ts +1 -1
  91. package/dist/commandkit.js +2 -24
  92. package/dist/{common-DnwCYit8.d.ts → common-CCvvgnxi.d.ts} +2 -2
  93. package/dist/components/common/EventInterceptor.d.ts +1 -1
  94. package/dist/components/common/EventInterceptor.js +137 -2
  95. package/dist/components/common/EventInterceptor.js.map +1 -0
  96. package/dist/components/common/element.d.ts +2 -2
  97. package/dist/components/common/element.js +10 -8
  98. package/dist/components/common/types.d.ts +1 -1
  99. package/dist/components/common/types.js +1 -0
  100. package/dist/components/display/common.js +3 -2
  101. package/dist/components/display/container.d.ts +1 -1
  102. package/dist/components/display/container.js +3 -2
  103. package/dist/components/display/file.d.ts +1 -1
  104. package/dist/components/display/file.js +23 -2
  105. package/dist/components/display/file.js.map +1 -0
  106. package/dist/components/display/index.d.ts +8 -8
  107. package/dist/components/display/index.js +18 -21
  108. package/dist/components/display/label.d.ts +1 -1
  109. package/dist/components/display/label.js +3 -2
  110. package/dist/components/display/media-gallery.d.ts +1 -1
  111. package/dist/components/display/media-gallery.js +4 -3
  112. package/dist/components/display/poll.d.ts +1 -1
  113. package/dist/components/display/poll.js +85 -4
  114. package/dist/{poll-CFe8yvoJ.js.map → components/display/poll.js.map} +1 -1
  115. package/dist/components/display/section.d.ts +1 -1
  116. package/dist/components/display/section.js +4 -3
  117. package/dist/components/display/separator.d.ts +1 -1
  118. package/dist/components/display/separator.js +21 -2
  119. package/dist/components/display/separator.js.map +1 -0
  120. package/dist/components/display/text-display.d.ts +1 -1
  121. package/dist/components/display/text-display.js +26 -2
  122. package/dist/components/display/text-display.js.map +1 -0
  123. package/dist/components/index.d.ts +23 -23
  124. package/dist/components/index.js +28 -45
  125. package/dist/components/interactive/action-row/ActionRow.d.ts +1 -1
  126. package/dist/components/interactive/action-row/ActionRow.js +20 -2
  127. package/dist/{ActionRow-CSN_UKmM.js.map → components/interactive/action-row/ActionRow.js.map} +1 -1
  128. package/dist/components/interactive/button/Button.d.ts +1 -1
  129. package/dist/components/interactive/button/Button.js +2 -24
  130. package/dist/components/interactive/button/ButtonKit.d.ts +1 -1
  131. package/dist/components/interactive/button/ButtonKit.js +2 -24
  132. package/dist/components/interactive/modal/Modal.d.ts +1 -1
  133. package/dist/components/interactive/modal/Modal.js +2 -24
  134. package/dist/components/interactive/modal/ModalKit.d.ts +1 -1
  135. package/dist/components/interactive/modal/ModalKit.js +2 -24
  136. package/dist/components/interactive/select-menu/ChannelSelectMenuKit.d.ts +1 -1
  137. package/dist/components/interactive/select-menu/ChannelSelectMenuKit.js +2 -24
  138. package/dist/components/interactive/select-menu/MentionableSelectMenuKit.d.ts +1 -1
  139. package/dist/components/interactive/select-menu/MentionableSelectMenuKit.js +2 -24
  140. package/dist/components/interactive/select-menu/RoleSelectMenuKit.d.ts +1 -1
  141. package/dist/components/interactive/select-menu/RoleSelectMenuKit.js +2 -24
  142. package/dist/components/interactive/select-menu/SelectMenu.d.ts +1 -1
  143. package/dist/components/interactive/select-menu/SelectMenu.js +2 -24
  144. package/dist/components/interactive/select-menu/StringSelectMenuKit.d.ts +1 -1
  145. package/dist/components/interactive/select-menu/StringSelectMenuKit.js +2 -24
  146. package/dist/components/interactive/select-menu/UserSelectMenuKit.d.ts +1 -1
  147. package/dist/components/interactive/select-menu/UserSelectMenuKit.js +2 -24
  148. package/dist/components/interactive/select-menu/common.d.ts +1 -1
  149. package/dist/components/interactive/select-menu/common.js +1 -0
  150. package/dist/config/config.d.ts +1 -1
  151. package/dist/config/config.js +2 -24
  152. package/dist/config/default.d.ts +1 -1
  153. package/dist/config/default.js +2 -24
  154. package/dist/config/loader.d.ts +1 -1
  155. package/dist/config/loader.js +2 -24
  156. package/dist/config/types.d.ts +1 -1
  157. package/dist/config/types.js +1 -0
  158. package/dist/config/utils.d.ts +1 -1
  159. package/dist/config/utils.js +29 -2
  160. package/dist/config/utils.js.map +1 -0
  161. package/dist/{constants-EpKcj0dH.d.ts → constants-DqtJY0t-.d.ts} +2 -2
  162. package/dist/{constants-CuYW0K10.d.ts → constants-DwxpkIeH.d.ts} +7 -7
  163. package/dist/{container-DYcb7zGw.d.ts → container-CYojOA9d.d.ts} +1 -1
  164. package/dist/context/async-context.d.ts +1 -1
  165. package/dist/context/async-context.js +2 -24
  166. package/dist/context/environment.d.ts +1 -1
  167. package/dist/context/environment.js +2 -24
  168. package/dist/{element-wQo0heGj.d.ts → element-DeLvTMfZ.d.ts} +5 -4
  169. package/dist/events/CommandKitEventsChannel.d.ts +1 -1
  170. package/dist/events/CommandKitEventsChannel.js +83 -2
  171. package/dist/events/CommandKitEventsChannel.js.map +1 -0
  172. package/dist/{file-CrV4lSnl.d.ts → file-DLO1zEcH.d.ts} +1 -1
  173. package/dist/flags/FlagProvider.d.ts +1 -1
  174. package/dist/flags/FlagProvider.js +1 -0
  175. package/dist/flags/FlagProvider.js.map +1 -1
  176. package/dist/flags/feature-flags.d.ts +1 -1
  177. package/dist/flags/feature-flags.js +5 -165
  178. package/dist/flags/store.d.ts +1 -1
  179. package/dist/flags/store.js +13 -2
  180. package/dist/flags/store.js.map +1 -0
  181. package/dist/{helpers-AQPLVY35.d.ts → helpers-zmC44Mcu.d.ts} +1 -1
  182. package/dist/index.d.ts +31 -31
  183. package/dist/index.js +78 -97
  184. package/dist/kv/constants.d.ts +1 -1
  185. package/dist/kv/constants.js +22 -2
  186. package/dist/kv/constants.js.map +1 -0
  187. package/dist/kv/dotprops.js +1 -0
  188. package/dist/kv/dotprops.js.map +1 -1
  189. package/dist/kv/kv.d.ts +288 -288
  190. package/dist/kv/kv.js +2 -1
  191. package/dist/kv/kv.js.map +1 -1
  192. package/dist/kv/serde.d.ts +1 -1
  193. package/dist/kv/serde.js +29 -28
  194. package/dist/kv/serde.js.map +1 -1
  195. package/dist/{label-37kaNWMH.d.ts → label-DqGRqodo.d.ts} +3 -3
  196. package/dist/logger/DefaultLogger.d.ts +19 -19
  197. package/dist/logger/DefaultLogger.js +2 -24
  198. package/dist/logger/ILogger.d.ts +35 -35
  199. package/dist/logger/ILogger.js +1 -0
  200. package/dist/logger/Logger.d.ts +5 -5
  201. package/dist/logger/Logger.js +2 -24
  202. package/dist/logger/NoopLogger.d.ts +35 -35
  203. package/dist/logger/NoopLogger.js +1 -0
  204. package/dist/logger/NoopLogger.js.map +1 -1
  205. package/dist/{media-gallery-Ci3I4ElH.d.ts → media-gallery-Ca8es-eB.d.ts} +1 -1
  206. package/dist/plugins/CompilerPlugin.d.ts +1 -1
  207. package/dist/plugins/CompilerPlugin.js +33 -3
  208. package/dist/plugins/CompilerPlugin.js.map +1 -0
  209. package/dist/plugins/PluginCommon.d.ts +1 -1
  210. package/dist/plugins/PluginCommon.js +55 -4
  211. package/dist/plugins/PluginCommon.js.map +1 -0
  212. package/dist/plugins/RuntimePlugin.d.ts +1 -1
  213. package/dist/plugins/RuntimePlugin.js +124 -3
  214. package/dist/plugins/RuntimePlugin.js.map +1 -0
  215. package/dist/plugins/index.d.ts +1 -1
  216. package/dist/plugins/index.js +8 -30
  217. package/dist/plugins/plugin-runtime/CommandKitPluginRuntime.d.ts +1 -1
  218. package/dist/plugins/plugin-runtime/CommandKitPluginRuntime.js +2 -24
  219. package/dist/plugins/plugin-runtime/CompilerPluginRuntime.d.ts +1 -1
  220. package/dist/plugins/plugin-runtime/CompilerPluginRuntime.js +2 -24
  221. package/dist/plugins/plugin-runtime/builtin/CommonDirectiveTransformer.d.ts +1 -1
  222. package/dist/plugins/plugin-runtime/builtin/CommonDirectiveTransformer.js +2 -24
  223. package/dist/plugins/plugin-runtime/builtin/MacroPlugin.d.ts +1 -1
  224. package/dist/plugins/plugin-runtime/builtin/MacroPlugin.js +2 -24
  225. package/dist/plugins/plugin-runtime/runtime.d.ts +1 -1
  226. package/dist/plugins/plugin-runtime/runtime.js +1 -0
  227. package/dist/plugins/types.d.ts +1 -1
  228. package/dist/plugins/types.js +1 -0
  229. package/dist/{poll-Ddtapd6n.d.ts → poll-DQ6DX_Tt.d.ts} +8 -8
  230. package/dist/{section-DkUKULnB.d.ts → section-Q8nwx_-q.d.ts} +1 -1
  231. package/dist/{separator-CbXsIFCa.d.ts → separator-B8P-kdIK.d.ts} +1 -1
  232. package/dist/{signals-BbTgTc0i.d.ts → signals-CBXwugBW.d.ts} +1 -1
  233. package/dist/{text-display-D7j39VC-.d.ts → text-display-CL9C2yMc.d.ts} +1 -1
  234. package/dist/{types-BywA9d2Z.d.ts → types-DZy7U-Ld.d.ts} +1 -1
  235. package/dist/types.d.ts +1 -1
  236. package/dist/types.js +1 -0
  237. package/dist/utils/colors.js +9 -3
  238. package/dist/utils/colors.js.map +1 -0
  239. package/dist/utils/constants.d.ts +1 -1
  240. package/dist/utils/constants.js +50 -8
  241. package/dist/utils/constants.js.map +1 -0
  242. package/dist/utils/dev-hooks.d.ts +1 -1
  243. package/dist/utils/dev-hooks.js +2 -24
  244. package/dist/utils/error-codes.d.ts +10 -10
  245. package/dist/utils/error-codes.js +53 -5
  246. package/dist/utils/error-codes.js.map +1 -0
  247. package/dist/utils/resolve-file-url.js +18 -2
  248. package/dist/utils/resolve-file-url.js.map +1 -0
  249. package/dist/utils/types-package.js +61 -4
  250. package/dist/utils/types-package.js.map +1 -0
  251. package/dist/utils/useful-stuff/async-queue.d.ts +21 -21
  252. package/dist/utils/useful-stuff/async-queue.js +1 -0
  253. package/dist/utils/useful-stuff/async-queue.js.map +1 -1
  254. package/dist/utils/useful-stuff/mutex.d.ts +62 -62
  255. package/dist/utils/useful-stuff/mutex.js +1 -0
  256. package/dist/utils/useful-stuff/mutex.js.map +1 -1
  257. package/dist/utils/useful-stuff/ratelimiter.d.ts +56 -56
  258. package/dist/utils/useful-stuff/ratelimiter.js +1 -0
  259. package/dist/utils/useful-stuff/ratelimiter.js.map +1 -1
  260. package/dist/utils/useful-stuff/semaphore.d.ts +82 -82
  261. package/dist/utils/useful-stuff/semaphore.js +1 -0
  262. package/dist/utils/useful-stuff/semaphore.js.map +1 -1
  263. package/dist/utils/utilities.d.ts +5 -5
  264. package/dist/utils/utilities.js +2 -24
  265. package/dist/utils/warning.js +38 -4
  266. package/dist/utils/warning.js.map +1 -0
  267. package/dist/version.js +2 -1
  268. package/dist/version.js.map +1 -1
  269. package/package.json +12 -15
  270. package/dist/ActionRow-CSN_UKmM.js +0 -25
  271. package/dist/CommandKitEventsChannel-CnT5ymYe.js +0 -88
  272. package/dist/CommandKitEventsChannel-CnT5ymYe.js.map +0 -1
  273. package/dist/CommandsRouter-C_HLsrGX.js +0 -215
  274. package/dist/CommandsRouter-C_HLsrGX.js.map +0 -1
  275. package/dist/CompilerPlugin-CUsGAfgl.js +0 -43
  276. package/dist/CompilerPlugin-CUsGAfgl.js.map +0 -1
  277. package/dist/EventInterceptor-BWoEJMHZ.js +0 -142
  278. package/dist/EventInterceptor-BWoEJMHZ.js.map +0 -1
  279. package/dist/EventWorkerContext-Dfhgv329.js +0 -68
  280. package/dist/EventWorkerContext-Dfhgv329.js.map +0 -1
  281. package/dist/EventsRouter-DZYIha6m.js +0 -133
  282. package/dist/EventsRouter-DZYIha6m.js.map +0 -1
  283. package/dist/MessageCommandParser-Bs9fimmd.js +0 -271
  284. package/dist/MessageCommandParser-Bs9fimmd.js.map +0 -1
  285. package/dist/MessageCommandParser-q3dQcE5N.d.ts +0 -194
  286. package/dist/PluginCommon-BLxWww5u.js +0 -70
  287. package/dist/PluginCommon-BLxWww5u.js.map +0 -1
  288. package/dist/RuntimePlugin-CtobluSU.js +0 -134
  289. package/dist/RuntimePlugin-CtobluSU.js.map +0 -1
  290. package/dist/colors-Csc0X4QJ.js +0 -14
  291. package/dist/colors-Csc0X4QJ.js.map +0 -1
  292. package/dist/commandkit-SIjTLD2R.js.map +0 -1
  293. package/dist/common-C2jAjX4U.js +0 -0
  294. package/dist/common-CEordwf3.js +0 -17
  295. package/dist/common-CEordwf3.js.map +0 -1
  296. package/dist/common-DSRs_mfw.js +0 -222
  297. package/dist/common-DSRs_mfw.js.map +0 -1
  298. package/dist/constants-BFFK-hfP.js +0 -27
  299. package/dist/constants-BFFK-hfP.js.map +0 -1
  300. package/dist/constants-Cw8VjCVz.js +0 -36
  301. package/dist/constants-Cw8VjCVz.js.map +0 -1
  302. package/dist/constants-CxkFFZ7p.js +0 -85
  303. package/dist/constants-CxkFFZ7p.js.map +0 -1
  304. package/dist/container-DCPljKVH.js +0 -43
  305. package/dist/container-DCPljKVH.js.map +0 -1
  306. package/dist/display-WDb9wMCv.js +0 -0
  307. package/dist/element-DibzzA5L.js +0 -84
  308. package/dist/element-DibzzA5L.js.map +0 -1
  309. package/dist/env-CmspDhHy.js +0 -113
  310. package/dist/env-CmspDhHy.js.map +0 -1
  311. package/dist/error-codes-Ds0bnPvT.js +0 -73
  312. package/dist/error-codes-Ds0bnPvT.js.map +0 -1
  313. package/dist/file-Ca1kpEtE.js +0 -28
  314. package/dist/file-Ca1kpEtE.js.map +0 -1
  315. package/dist/flags/feature-flags.js.map +0 -1
  316. package/dist/helpers-Btx1FSZx.js +0 -35
  317. package/dist/helpers-Btx1FSZx.js.map +0 -1
  318. package/dist/index.js.map +0 -1
  319. package/dist/label-B6vXvwLM.js +0 -35
  320. package/dist/label-B6vXvwLM.js.map +0 -1
  321. package/dist/media-gallery-u3gjX7yD.js +0 -61
  322. package/dist/media-gallery-u3gjX7yD.js.map +0 -1
  323. package/dist/poll-CFe8yvoJ.js +0 -100
  324. package/dist/resolve-file-url-CdHqwWs3.js +0 -23
  325. package/dist/resolve-file-url-CdHqwWs3.js.map +0 -1
  326. package/dist/router-BvamdzoF.js +0 -0
  327. package/dist/runtime-Skt5NiOc.js +0 -0
  328. package/dist/section-BC8LF-B2.js +0 -59
  329. package/dist/section-BC8LF-B2.js.map +0 -1
  330. package/dist/separator-BUTiW7uz.js +0 -26
  331. package/dist/separator-BUTiW7uz.js.map +0 -1
  332. package/dist/signals-B8z1wJ6W.js +0 -74
  333. package/dist/signals-B8z1wJ6W.js.map +0 -1
  334. package/dist/store-D8r_hryO.js +0 -18
  335. package/dist/store-D8r_hryO.js.map +0 -1
  336. package/dist/text-display-DANahMN3.js +0 -31
  337. package/dist/text-display-DANahMN3.js.map +0 -1
  338. package/dist/type-checker-cVd3Hpnh.js +0 -88
  339. package/dist/type-checker-cVd3Hpnh.js.map +0 -1
  340. package/dist/types-Cdh4uaFR.js +0 -0
  341. package/dist/types-TC4g3w91.js +0 -0
  342. package/dist/types-package-CsTNfvv2.js +0 -71
  343. package/dist/types-package-CsTNfvv2.js.map +0 -1
  344. package/dist/utils-Br3eenD1.js +0 -34
  345. package/dist/utils-Br3eenD1.js.map +0 -1
  346. package/dist/warning-CszH8HeS.js +0 -53
  347. package/dist/warning-CszH8HeS.js.map +0 -1
  348. /package/dist/{index-BJfko-dP.d.ts → index-BIsCUWAs.d.ts} +0 -0
  349. /package/dist/{index-CCggO_hw.d.ts → index-CwHYpK-f.d.ts} +0 -0
  350. /package/dist/{index-CLjpoGi1.d.ts → index-DHrsNvX1.d.ts} +0 -0
@@ -9,24 +9,24 @@
9
9
  */
10
10
  interface MutexStorage {
11
11
  /**
12
- * Attempts to acquire a lock for a given key
13
- * @param key - The unique identifier for the mutex lock
14
- * @param timeout - Optional timeout in milliseconds for the lock
15
- * @param signal - Optional AbortSignal for cancelling the acquisition
16
- * @returns Promise resolving to true if lock was acquired, false if timeout or already locked
17
- */
12
+ * Attempts to acquire a lock for a given key
13
+ * @param key - The unique identifier for the mutex lock
14
+ * @param timeout - Optional timeout in milliseconds for the lock
15
+ * @param signal - Optional AbortSignal for cancelling the acquisition
16
+ * @returns Promise resolving to true if lock was acquired, false if timeout or already locked
17
+ */
18
18
  acquire(key: string, timeout?: number, signal?: AbortSignal): Promise<boolean>;
19
19
  /**
20
- * Releases the lock for a given key
21
- * @param key - The unique identifier for the mutex lock
22
- * @returns Promise that resolves when the lock is released
23
- */
20
+ * Releases the lock for a given key
21
+ * @param key - The unique identifier for the mutex lock
22
+ * @returns Promise that resolves when the lock is released
23
+ */
24
24
  release(key: string): Promise<void>;
25
25
  /**
26
- * Checks if a lock is currently held for a given key
27
- * @param key - The unique identifier for the mutex lock
28
- * @returns Promise resolving to true if the lock is held, false otherwise
29
- */
26
+ * Checks if a lock is currently held for a given key
27
+ * @param key - The unique identifier for the mutex lock
28
+ * @returns Promise resolving to true if the lock is held, false otherwise
29
+ */
30
30
  isLocked(key: string): Promise<boolean>;
31
31
  }
32
32
  /**
@@ -45,24 +45,24 @@ interface MutexOptions {
45
45
  declare class MemoryMutexStorage implements MutexStorage {
46
46
  private readonly locks;
47
47
  /**
48
- * Attempts to acquire a lock for a given key
49
- * @param key - The unique identifier for the mutex lock
50
- * @param timeout - Optional timeout in milliseconds for the lock
51
- * @param signal - Optional AbortSignal for cancelling the acquisition
52
- * @returns Promise resolving to true if lock was acquired, false if timeout or already locked
53
- */
48
+ * Attempts to acquire a lock for a given key
49
+ * @param key - The unique identifier for the mutex lock
50
+ * @param timeout - Optional timeout in milliseconds for the lock
51
+ * @param signal - Optional AbortSignal for cancelling the acquisition
52
+ * @returns Promise resolving to true if lock was acquired, false if timeout or already locked
53
+ */
54
54
  acquire(key: string, timeout?: number, signal?: AbortSignal): Promise<boolean>;
55
55
  /**
56
- * Releases the lock for a given key
57
- * @param key - The unique identifier for the mutex lock
58
- * @returns Promise that resolves when the lock is released
59
- */
56
+ * Releases the lock for a given key
57
+ * @param key - The unique identifier for the mutex lock
58
+ * @returns Promise that resolves when the lock is released
59
+ */
60
60
  release(key: string): Promise<void>;
61
61
  /**
62
- * Checks if a lock is currently held for a given key
63
- * @param key - The unique identifier for the mutex lock
64
- * @returns Promise resolving to true if the lock is held, false otherwise
65
- */
62
+ * Checks if a lock is currently held for a given key
63
+ * @param key - The unique identifier for the mutex lock
64
+ * @returns Promise resolving to true if the lock is held, false otherwise
65
+ */
66
66
  isLocked(key: string): Promise<boolean>;
67
67
  private generateHolderId;
68
68
  private delay;
@@ -75,54 +75,54 @@ declare class Mutex {
75
75
  private storage;
76
76
  private readonly defaultTimeout;
77
77
  /**
78
- * Creates a new mutex instance
79
- * @param options - Configuration options for the mutex
80
- */
78
+ * Creates a new mutex instance
79
+ * @param options - Configuration options for the mutex
80
+ */
81
81
  constructor(options?: MutexOptions);
82
82
  /**
83
- * Sets the storage implementation for the mutex
84
- * @param storage - The storage implementation to use
85
- */
83
+ * Sets the storage implementation for the mutex
84
+ * @param storage - The storage implementation to use
85
+ */
86
86
  setStorage(storage: MutexStorage): void;
87
87
  /**
88
- * Gets the storage implementation for the mutex
89
- * @returns The storage implementation
90
- */
88
+ * Gets the storage implementation for the mutex
89
+ * @returns The storage implementation
90
+ */
91
91
  getStorage(): MutexStorage;
92
92
  /**
93
- * Acquires a lock for the given key
94
- * @param key - The unique identifier for the mutex lock
95
- * @param timeout - Optional timeout in milliseconds for lock acquisition
96
- * @param signal - Optional AbortSignal for cancelling the acquisition
97
- * @returns Promise resolving to true if lock was acquired, false if timeout
98
- */
93
+ * Acquires a lock for the given key
94
+ * @param key - The unique identifier for the mutex lock
95
+ * @param timeout - Optional timeout in milliseconds for lock acquisition
96
+ * @param signal - Optional AbortSignal for cancelling the acquisition
97
+ * @returns Promise resolving to true if lock was acquired, false if timeout
98
+ */
99
99
  acquire(key: string, timeout?: number, signal?: AbortSignal): Promise<boolean>;
100
100
  /**
101
- * Releases the lock for the given key
102
- * @param key - The unique identifier for the mutex lock
103
- * @returns Promise that resolves when the lock is released
104
- */
101
+ * Releases the lock for the given key
102
+ * @param key - The unique identifier for the mutex lock
103
+ * @returns Promise that resolves when the lock is released
104
+ */
105
105
  release(key: string): Promise<void>;
106
106
  /**
107
- * Checks if a lock is currently held for the given key
108
- * @param key - The unique identifier for the mutex lock
109
- * @returns Promise resolving to true if the lock is held, false otherwise
110
- */
107
+ * Checks if a lock is currently held for the given key
108
+ * @param key - The unique identifier for the mutex lock
109
+ * @returns Promise resolving to true if the lock is held, false otherwise
110
+ */
111
111
  isLocked(key: string): Promise<boolean>;
112
112
  /**
113
- * Executes a function with exclusive access to the resource
114
- * @param key - The unique identifier for the mutex lock
115
- * @param fn - The function to execute with exclusive access
116
- * @param timeout - Optional timeout in milliseconds for lock acquisition
117
- * @param signal - Optional AbortSignal for cancelling the lock acquisition
118
- * @returns Promise resolving to the result of the function execution
119
- * @throws Error if lock acquisition fails or function execution fails
120
- */
113
+ * Executes a function with exclusive access to the resource
114
+ * @param key - The unique identifier for the mutex lock
115
+ * @param fn - The function to execute with exclusive access
116
+ * @param timeout - Optional timeout in milliseconds for lock acquisition
117
+ * @param signal - Optional AbortSignal for cancelling the lock acquisition
118
+ * @returns Promise resolving to the result of the function execution
119
+ * @throws Error if lock acquisition fails or function execution fails
120
+ */
121
121
  withLock<T>(key: string, fn: () => Promise<T> | T, timeout?: number, signal?: AbortSignal): Promise<T>;
122
122
  /**
123
- * Gets the current configuration of the mutex
124
- * @returns Object containing the current timeout value
125
- */
123
+ * Gets the current configuration of the mutex
124
+ * @returns Object containing the current timeout value
125
+ */
126
126
  getConfig(): Omit<MutexOptions, 'storage'>;
127
127
  }
128
128
  /**
@@ -1,3 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1
2
 
2
3
  //#region src/utils/useful-stuff/mutex.ts
3
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mutex.js","names":[],"sources":["../../../src/utils/useful-stuff/mutex.ts"],"sourcesContent":["/**\n * Async mutex implementation for coordinating access to shared resources.\n * Provides mutual exclusion to ensure only one task can access a resource at a time.\n */\n\n/**\n * Interface for mutex storage implementations.\n * Provides methods to store, retrieve, and delete mutex lock data.\n */\nexport interface MutexStorage {\n /**\n * Attempts to acquire a lock for a given key\n * @param key - The unique identifier for the mutex lock\n * @param timeout - Optional timeout in milliseconds for the lock\n * @param signal - Optional AbortSignal for cancelling the acquisition\n * @returns Promise resolving to true if lock was acquired, false if timeout or already locked\n */\n acquire(\n key: string,\n timeout?: number,\n signal?: AbortSignal,\n ): Promise<boolean>;\n\n /**\n * Releases the lock for a given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise that resolves when the lock is released\n */\n release(key: string): Promise<void>;\n\n /**\n * Checks if a lock is currently held for a given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise resolving to true if the lock is held, false otherwise\n */\n isLocked(key: string): Promise<boolean>;\n}\n\n/**\n * Configuration options for mutex\n */\nexport interface MutexOptions {\n /** Default timeout in milliseconds for lock acquisition. Default: 30000 */\n timeout?: number;\n /** Storage implementation for persisting mutex data. Default: {@link MemoryMutexStorage} */\n storage?: MutexStorage;\n}\n\n/**\n * In-memory storage implementation for mutex locks.\n * Suitable for single-instance applications.\n */\nexport class MemoryMutexStorage implements MutexStorage {\n private readonly locks = new Map<\n string,\n { holder: string; acquiredAt: number }\n >();\n\n /**\n * Attempts to acquire a lock for a given key\n * @param key - The unique identifier for the mutex lock\n * @param timeout - Optional timeout in milliseconds for the lock\n * @param signal - Optional AbortSignal for cancelling the acquisition\n * @returns Promise resolving to true if lock was acquired, false if timeout or already locked\n */\n async acquire(\n key: string,\n timeout: number = 30000,\n signal?: AbortSignal,\n ): Promise<boolean> {\n const holder = this.generateHolderId();\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n // Check if aborted\n if (signal?.aborted) {\n throw new Error('Lock acquisition was aborted');\n }\n\n if (!this.locks.has(key)) {\n this.locks.set(key, { holder, acquiredAt: Date.now() });\n return true;\n }\n await this.delay(10);\n }\n\n return false;\n }\n\n /**\n * Releases the lock for a given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise that resolves when the lock is released\n */\n async release(key: string): Promise<void> {\n this.locks.delete(key);\n }\n\n /**\n * Checks if a lock is currently held for a given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise resolving to true if the lock is held, false otherwise\n */\n async isLocked(key: string): Promise<boolean> {\n return this.locks.has(key);\n }\n\n private generateHolderId(): string {\n return `holder_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Async mutex implementation that provides mutual exclusion for shared resources.\n * Ensures only one task can access a protected resource at a time.\n */\nexport class Mutex {\n private storage: MutexStorage;\n private readonly defaultTimeout: number;\n\n /**\n * Creates a new mutex instance\n * @param options - Configuration options for the mutex\n */\n public constructor(options: MutexOptions = {}) {\n this.storage = options.storage || new MemoryMutexStorage();\n this.defaultTimeout = options.timeout || 30000;\n }\n\n /**\n * Sets the storage implementation for the mutex\n * @param storage - The storage implementation to use\n */\n public setStorage(storage: MutexStorage) {\n this.storage = storage;\n }\n\n /**\n * Gets the storage implementation for the mutex\n * @returns The storage implementation\n */\n public getStorage(): MutexStorage {\n return this.storage;\n }\n\n /**\n * Acquires a lock for the given key\n * @param key - The unique identifier for the mutex lock\n * @param timeout - Optional timeout in milliseconds for lock acquisition\n * @param signal - Optional AbortSignal for cancelling the acquisition\n * @returns Promise resolving to true if lock was acquired, false if timeout\n */\n public async acquire(\n key: string,\n timeout?: number,\n signal?: AbortSignal,\n ): Promise<boolean> {\n return this.storage.acquire(key, timeout || this.defaultTimeout, signal);\n }\n\n /**\n * Releases the lock for the given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise that resolves when the lock is released\n */\n public async release(key: string): Promise<void> {\n return this.storage.release(key);\n }\n\n /**\n * Checks if a lock is currently held for the given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise resolving to true if the lock is held, false otherwise\n */\n public async isLocked(key: string): Promise<boolean> {\n return this.storage.isLocked(key);\n }\n\n /**\n * Executes a function with exclusive access to the resource\n * @param key - The unique identifier for the mutex lock\n * @param fn - The function to execute with exclusive access\n * @param timeout - Optional timeout in milliseconds for lock acquisition\n * @param signal - Optional AbortSignal for cancelling the lock acquisition\n * @returns Promise resolving to the result of the function execution\n * @throws Error if lock acquisition fails or function execution fails\n */\n public async withLock<T>(\n key: string,\n fn: () => Promise<T> | T,\n timeout?: number,\n signal?: AbortSignal,\n ): Promise<T> {\n const acquired = await this.acquire(key, timeout, signal);\n if (!acquired) {\n throw new Error(`Failed to acquire lock for key: ${key}`);\n }\n\n try {\n return await fn();\n } finally {\n await this.release(key);\n }\n }\n\n /**\n * Gets the current configuration of the mutex\n * @returns Object containing the current timeout value\n */\n public getConfig(): Omit<MutexOptions, 'storage'> {\n return {\n timeout: this.defaultTimeout,\n };\n }\n}\n\n/**\n * Default mutex instance for global use\n */\nexport const defaultMutex = new Mutex();\n\n/**\n * Convenience function to execute a function with exclusive access using the default mutex.\n *\n * @param key - The unique identifier for the mutex lock\n * @param fn - The function to execute with exclusive access\n * @param timeout - Optional timeout in milliseconds for lock acquisition\n * @param signal - Optional AbortSignal for cancelling the lock acquisition\n * @returns Promise resolving to the result of the function execution\n *\n * @example\n * ```typescript\n * const controller = new AbortController();\n * const result = await withMutex('shared-resource', async () => {\n * // This code runs with exclusive access\n * return await updateSharedResource();\n * }, 30000, controller.signal);\n * controller.abort(); // Cancels the lock acquisition\n * ```\n */\nexport async function withMutex<T>(\n key: string,\n fn: () => Promise<T> | T,\n timeout?: number,\n signal?: AbortSignal,\n): Promise<T> {\n return defaultMutex.withLock(key, fn, timeout, signal);\n}\n\n/**\n * Creates a new mutex instance with the specified configuration\n * @param options - Configuration options for the mutex\n * @returns New Mutex instance\n *\n * @example\n * ```typescript\n * const mutex = createMutex({\n * timeout: 60000,\n * storage: new RedisMutexStorage()\n * });\n * ```\n */\nexport function createMutex(options: MutexOptions): Mutex {\n return new Mutex(options);\n}\n\n/**\n * Acquires a lock using the default mutex\n * @param key - The unique identifier for the mutex lock\n * @param timeout - Optional timeout in milliseconds for lock acquisition\n * @param signal - Optional AbortSignal for cancelling the acquisition\n * @returns Promise resolving to true if lock was acquired, false if timeout\n */\nexport async function acquireLock(\n key: string,\n timeout?: number,\n signal?: AbortSignal,\n): Promise<boolean> {\n return defaultMutex.acquire(key, timeout, signal);\n}\n\n/**\n * Releases a lock using the default mutex\n * @param key - The unique identifier for the mutex lock\n * @returns Promise that resolves when the lock is released\n */\nexport async function releaseLock(key: string): Promise<void> {\n return defaultMutex.release(key);\n}\n\n/**\n * Checks if a lock is held using the default mutex\n * @param key - The unique identifier for the mutex lock\n * @returns Promise resolving to true if the lock is held, false otherwise\n */\nexport async function isLocked(key: string): Promise<boolean> {\n return defaultMutex.isLocked(key);\n}\n"],"mappings":";;;;;;AAoDA,IAAa,qBAAb,MAAwD;CACtD,AAAiB,wBAAQ,IAAI,KAG5B;;;;;;;;CASD,MAAM,QACN,KACA,UAAkB,KAClB,QACmB;EACjB,MAAM,SAAS,KAAK,kBAAkB;EACtC,MAAM,YAAY,KAAK,KAAK;AAE5B,SAAO,KAAK,KAAK,GAAG,YAAY,SAAS;AAEvC,uDAAI,OAAQ,QACV,OAAM,IAAI,MAAM,+BAA+B;AAGjD,OAAI,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE;AACxB,SAAK,MAAM,IAAI,KAAK;KAAE;KAAQ,YAAY,KAAK,KAAK;KAAE,CAAC;AACvD,WAAO;;AAET,SAAM,KAAK,MAAM,GAAG;;AAGtB,SAAO;;;;;;;CAQT,MAAM,QAAQ,KAA4B;AACxC,OAAK,MAAM,OAAO,IAAI;;;;;;;CAQxB,MAAM,SAAS,KAA+B;AAC5C,SAAO,KAAK,MAAM,IAAI,IAAI;;CAG5B,AAAQ,mBAA2B;AACjC,SAAO,UAAU,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,OAAO,GAAG,EAAE;;CAGxE,AAAQ,MAAM,IAA2B;AACvC,SAAO,IAAI,SAAS,YAAY,WAAW,SAAS,GAAG,CAAC;;;;;;;AAQ5D,IAAa,QAAb,MAAmB;CACjB,AAAQ;CACR,AAAiB;;;;;CAMjB,AAAO,YAAY,UAAwB,EAAE,EAAE;AAC7C,OAAK,UAAU,QAAQ,WAAW,IAAI,oBAAoB;AAC1D,OAAK,iBAAiB,QAAQ,WAAW;;;;;;CAO3C,AAAO,WAAW,SAAuB;AACvC,OAAK,UAAU;;;;;;CAOjB,AAAO,aAA2B;AAChC,SAAO,KAAK;;;;;;;;;CAUd,MAAa,QACb,KACA,SACA,QACmB;AACjB,SAAO,KAAK,QAAQ,QAAQ,KAAK,WAAW,KAAK,gBAAgB,OAAO;;;;;;;CAQ1E,MAAa,QAAQ,KAA4B;AAC/C,SAAO,KAAK,QAAQ,QAAQ,IAAI;;;;;;;CAQlC,MAAa,SAAS,KAA+B;AACnD,SAAO,KAAK,QAAQ,SAAS,IAAI;;;;;;;;;;;CAYnC,MAAa,SACb,KACA,IACA,SACA,QACa;AAEX,MAAI,CADa,MAAM,KAAK,QAAQ,KAAK,SAAS,OAAO,CAEvD,OAAM,IAAI,MAAM,mCAAmC,MAAM;AAG3D,MAAI;AACF,UAAO,MAAM,IAAI;YACT;AACR,SAAM,KAAK,QAAQ,IAAI;;;;;;;CAQ3B,AAAO,YAA2C;AAChD,SAAO,EACL,SAAS,KAAK,gBACf;;;;;;AAOL,MAAa,eAAe,IAAI,OAAO;;;;;;;;;;;;;;;;;;;;AAqBvC,eAAsB,UACtB,KACA,IACA,SACA,QACa;AACX,QAAO,aAAa,SAAS,KAAK,IAAI,SAAS,OAAO;;;;;;;;;;;;;;;AAgBxD,SAAgB,YAAY,SAA8B;AACxD,QAAO,IAAI,MAAM,QAAQ;;;;;;;;;AAU3B,eAAsB,YACtB,KACA,SACA,QACmB;AACjB,QAAO,aAAa,QAAQ,KAAK,SAAS,OAAO;;;;;;;AAQnD,eAAsB,YAAY,KAA4B;AAC5D,QAAO,aAAa,QAAQ,IAAI;;;;;;;AAQlC,eAAsB,SAAS,KAA+B;AAC5D,QAAO,aAAa,SAAS,IAAI"}
1
+ {"version":3,"file":"mutex.js","names":[],"sources":["../../../src/utils/useful-stuff/mutex.ts"],"sourcesContent":["/**\n * Async mutex implementation for coordinating access to shared resources.\n * Provides mutual exclusion to ensure only one task can access a resource at a time.\n */\n\n/**\n * Interface for mutex storage implementations.\n * Provides methods to store, retrieve, and delete mutex lock data.\n */\nexport interface MutexStorage {\n /**\n * Attempts to acquire a lock for a given key\n * @param key - The unique identifier for the mutex lock\n * @param timeout - Optional timeout in milliseconds for the lock\n * @param signal - Optional AbortSignal for cancelling the acquisition\n * @returns Promise resolving to true if lock was acquired, false if timeout or already locked\n */\n acquire(\n key: string,\n timeout?: number,\n signal?: AbortSignal,\n ): Promise<boolean>;\n\n /**\n * Releases the lock for a given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise that resolves when the lock is released\n */\n release(key: string): Promise<void>;\n\n /**\n * Checks if a lock is currently held for a given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise resolving to true if the lock is held, false otherwise\n */\n isLocked(key: string): Promise<boolean>;\n}\n\n/**\n * Configuration options for mutex\n */\nexport interface MutexOptions {\n /** Default timeout in milliseconds for lock acquisition. Default: 30000 */\n timeout?: number;\n /** Storage implementation for persisting mutex data. Default: {@link MemoryMutexStorage} */\n storage?: MutexStorage;\n}\n\n/**\n * In-memory storage implementation for mutex locks.\n * Suitable for single-instance applications.\n */\nexport class MemoryMutexStorage implements MutexStorage {\n private readonly locks = new Map<\n string,\n { holder: string; acquiredAt: number }\n >();\n\n /**\n * Attempts to acquire a lock for a given key\n * @param key - The unique identifier for the mutex lock\n * @param timeout - Optional timeout in milliseconds for the lock\n * @param signal - Optional AbortSignal for cancelling the acquisition\n * @returns Promise resolving to true if lock was acquired, false if timeout or already locked\n */\n async acquire(\n key: string,\n timeout: number = 30000,\n signal?: AbortSignal,\n ): Promise<boolean> {\n const holder = this.generateHolderId();\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n // Check if aborted\n if (signal?.aborted) {\n throw new Error('Lock acquisition was aborted');\n }\n\n if (!this.locks.has(key)) {\n this.locks.set(key, { holder, acquiredAt: Date.now() });\n return true;\n }\n await this.delay(10);\n }\n\n return false;\n }\n\n /**\n * Releases the lock for a given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise that resolves when the lock is released\n */\n async release(key: string): Promise<void> {\n this.locks.delete(key);\n }\n\n /**\n * Checks if a lock is currently held for a given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise resolving to true if the lock is held, false otherwise\n */\n async isLocked(key: string): Promise<boolean> {\n return this.locks.has(key);\n }\n\n private generateHolderId(): string {\n return `holder_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Async mutex implementation that provides mutual exclusion for shared resources.\n * Ensures only one task can access a protected resource at a time.\n */\nexport class Mutex {\n private storage: MutexStorage;\n private readonly defaultTimeout: number;\n\n /**\n * Creates a new mutex instance\n * @param options - Configuration options for the mutex\n */\n public constructor(options: MutexOptions = {}) {\n this.storage = options.storage || new MemoryMutexStorage();\n this.defaultTimeout = options.timeout || 30000;\n }\n\n /**\n * Sets the storage implementation for the mutex\n * @param storage - The storage implementation to use\n */\n public setStorage(storage: MutexStorage) {\n this.storage = storage;\n }\n\n /**\n * Gets the storage implementation for the mutex\n * @returns The storage implementation\n */\n public getStorage(): MutexStorage {\n return this.storage;\n }\n\n /**\n * Acquires a lock for the given key\n * @param key - The unique identifier for the mutex lock\n * @param timeout - Optional timeout in milliseconds for lock acquisition\n * @param signal - Optional AbortSignal for cancelling the acquisition\n * @returns Promise resolving to true if lock was acquired, false if timeout\n */\n public async acquire(\n key: string,\n timeout?: number,\n signal?: AbortSignal,\n ): Promise<boolean> {\n return this.storage.acquire(key, timeout || this.defaultTimeout, signal);\n }\n\n /**\n * Releases the lock for the given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise that resolves when the lock is released\n */\n public async release(key: string): Promise<void> {\n return this.storage.release(key);\n }\n\n /**\n * Checks if a lock is currently held for the given key\n * @param key - The unique identifier for the mutex lock\n * @returns Promise resolving to true if the lock is held, false otherwise\n */\n public async isLocked(key: string): Promise<boolean> {\n return this.storage.isLocked(key);\n }\n\n /**\n * Executes a function with exclusive access to the resource\n * @param key - The unique identifier for the mutex lock\n * @param fn - The function to execute with exclusive access\n * @param timeout - Optional timeout in milliseconds for lock acquisition\n * @param signal - Optional AbortSignal for cancelling the lock acquisition\n * @returns Promise resolving to the result of the function execution\n * @throws Error if lock acquisition fails or function execution fails\n */\n public async withLock<T>(\n key: string,\n fn: () => Promise<T> | T,\n timeout?: number,\n signal?: AbortSignal,\n ): Promise<T> {\n const acquired = await this.acquire(key, timeout, signal);\n if (!acquired) {\n throw new Error(`Failed to acquire lock for key: ${key}`);\n }\n\n try {\n return await fn();\n } finally {\n await this.release(key);\n }\n }\n\n /**\n * Gets the current configuration of the mutex\n * @returns Object containing the current timeout value\n */\n public getConfig(): Omit<MutexOptions, 'storage'> {\n return {\n timeout: this.defaultTimeout,\n };\n }\n}\n\n/**\n * Default mutex instance for global use\n */\nexport const defaultMutex = new Mutex();\n\n/**\n * Convenience function to execute a function with exclusive access using the default mutex.\n *\n * @param key - The unique identifier for the mutex lock\n * @param fn - The function to execute with exclusive access\n * @param timeout - Optional timeout in milliseconds for lock acquisition\n * @param signal - Optional AbortSignal for cancelling the lock acquisition\n * @returns Promise resolving to the result of the function execution\n *\n * @example\n * ```typescript\n * const controller = new AbortController();\n * const result = await withMutex('shared-resource', async () => {\n * // This code runs with exclusive access\n * return await updateSharedResource();\n * }, 30000, controller.signal);\n * controller.abort(); // Cancels the lock acquisition\n * ```\n */\nexport async function withMutex<T>(\n key: string,\n fn: () => Promise<T> | T,\n timeout?: number,\n signal?: AbortSignal,\n): Promise<T> {\n return defaultMutex.withLock(key, fn, timeout, signal);\n}\n\n/**\n * Creates a new mutex instance with the specified configuration\n * @param options - Configuration options for the mutex\n * @returns New Mutex instance\n *\n * @example\n * ```typescript\n * const mutex = createMutex({\n * timeout: 60000,\n * storage: new RedisMutexStorage()\n * });\n * ```\n */\nexport function createMutex(options: MutexOptions): Mutex {\n return new Mutex(options);\n}\n\n/**\n * Acquires a lock using the default mutex\n * @param key - The unique identifier for the mutex lock\n * @param timeout - Optional timeout in milliseconds for lock acquisition\n * @param signal - Optional AbortSignal for cancelling the acquisition\n * @returns Promise resolving to true if lock was acquired, false if timeout\n */\nexport async function acquireLock(\n key: string,\n timeout?: number,\n signal?: AbortSignal,\n): Promise<boolean> {\n return defaultMutex.acquire(key, timeout, signal);\n}\n\n/**\n * Releases a lock using the default mutex\n * @param key - The unique identifier for the mutex lock\n * @returns Promise that resolves when the lock is released\n */\nexport async function releaseLock(key: string): Promise<void> {\n return defaultMutex.release(key);\n}\n\n/**\n * Checks if a lock is held using the default mutex\n * @param key - The unique identifier for the mutex lock\n * @returns Promise resolving to true if the lock is held, false otherwise\n */\nexport async function isLocked(key: string): Promise<boolean> {\n return defaultMutex.isLocked(key);\n}\n"],"mappings":";;;;;;;AAoDA,IAAa,qBAAb,MAAwD;CACtD,AAAiB,wBAAQ,IAAI,KAG5B;;;;;;;;CASD,MAAM,QACN,KACA,UAAkB,KAClB,QACmB;EACjB,MAAM,SAAS,KAAK,kBAAkB;EACtC,MAAM,YAAY,KAAK,KAAK;AAE5B,SAAO,KAAK,KAAK,GAAG,YAAY,SAAS;AAEvC,uDAAI,OAAQ,QACV,OAAM,IAAI,MAAM,+BAA+B;AAGjD,OAAI,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE;AACxB,SAAK,MAAM,IAAI,KAAK;KAAE;KAAQ,YAAY,KAAK,KAAK;KAAE,CAAC;AACvD,WAAO;;AAET,SAAM,KAAK,MAAM,GAAG;;AAGtB,SAAO;;;;;;;CAQT,MAAM,QAAQ,KAA4B;AACxC,OAAK,MAAM,OAAO,IAAI;;;;;;;CAQxB,MAAM,SAAS,KAA+B;AAC5C,SAAO,KAAK,MAAM,IAAI,IAAI;;CAG5B,AAAQ,mBAA2B;AACjC,SAAO,UAAU,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,OAAO,GAAG,EAAE;;CAGxE,AAAQ,MAAM,IAA2B;AACvC,SAAO,IAAI,SAAS,YAAY,WAAW,SAAS,GAAG,CAAC;;;;;;;AAQ5D,IAAa,QAAb,MAAmB;CACjB,AAAQ;CACR,AAAiB;;;;;CAMjB,AAAO,YAAY,UAAwB,EAAE,EAAE;AAC7C,OAAK,UAAU,QAAQ,WAAW,IAAI,oBAAoB;AAC1D,OAAK,iBAAiB,QAAQ,WAAW;;;;;;CAO3C,AAAO,WAAW,SAAuB;AACvC,OAAK,UAAU;;;;;;CAOjB,AAAO,aAA2B;AAChC,SAAO,KAAK;;;;;;;;;CAUd,MAAa,QACb,KACA,SACA,QACmB;AACjB,SAAO,KAAK,QAAQ,QAAQ,KAAK,WAAW,KAAK,gBAAgB,OAAO;;;;;;;CAQ1E,MAAa,QAAQ,KAA4B;AAC/C,SAAO,KAAK,QAAQ,QAAQ,IAAI;;;;;;;CAQlC,MAAa,SAAS,KAA+B;AACnD,SAAO,KAAK,QAAQ,SAAS,IAAI;;;;;;;;;;;CAYnC,MAAa,SACb,KACA,IACA,SACA,QACa;AAEX,MAAI,CADa,MAAM,KAAK,QAAQ,KAAK,SAAS,OAAO,CAEvD,OAAM,IAAI,MAAM,mCAAmC,MAAM;AAG3D,MAAI;AACF,UAAO,MAAM,IAAI;YACT;AACR,SAAM,KAAK,QAAQ,IAAI;;;;;;;CAQ3B,AAAO,YAA2C;AAChD,SAAO,EACL,SAAS,KAAK,gBACf;;;;;;AAOL,MAAa,eAAe,IAAI,OAAO;;;;;;;;;;;;;;;;;;;;AAqBvC,eAAsB,UACtB,KACA,IACA,SACA,QACa;AACX,QAAO,aAAa,SAAS,KAAK,IAAI,SAAS,OAAO;;;;;;;;;;;;;;;AAgBxD,SAAgB,YAAY,SAA8B;AACxD,QAAO,IAAI,MAAM,QAAQ;;;;;;;;;AAU3B,eAAsB,YACtB,KACA,SACA,QACmB;AACjB,QAAO,aAAa,QAAQ,KAAK,SAAS,OAAO;;;;;;;AAQnD,eAAsB,YAAY,KAA4B;AAC5D,QAAO,aAAa,QAAQ,IAAI;;;;;;;AAQlC,eAAsB,SAAS,KAA+B;AAC5D,QAAO,aAAa,SAAS,IAAI"}
@@ -13,23 +13,23 @@ declare const DEFAULT_MAX_REQUESTS = 10;
13
13
  */
14
14
  interface RateLimitStorage {
15
15
  /**
16
- * Retrieves the current request count for a given key
17
- * @param key - The unique identifier for the rate limit entry
18
- * @returns Promise resolving to the current request count
19
- */
16
+ * Retrieves the current request count for a given key
17
+ * @param key - The unique identifier for the rate limit entry
18
+ * @returns Promise resolving to the current request count
19
+ */
20
20
  get(key: string): Promise<number>;
21
21
  /**
22
- * Sets the request count for a given key
23
- * @param key - The unique identifier for the rate limit entry
24
- * @param value - The request count to store
25
- * @returns Promise that resolves when the value is stored
26
- */
22
+ * Sets the request count for a given key
23
+ * @param key - The unique identifier for the rate limit entry
24
+ * @param value - The request count to store
25
+ * @returns Promise that resolves when the value is stored
26
+ */
27
27
  set(key: string, value: number): Promise<void>;
28
28
  /**
29
- * Deletes the rate limit entry for a given key
30
- * @param key - The unique identifier for the rate limit entry
31
- * @returns Promise that resolves when the entry is deleted
32
- */
29
+ * Deletes the rate limit entry for a given key
30
+ * @param key - The unique identifier for the rate limit entry
31
+ * @returns Promise that resolves when the entry is deleted
32
+ */
33
33
  delete(key: string): Promise<void>;
34
34
  }
35
35
  /**
@@ -50,23 +50,23 @@ interface RateLimitOptions {
50
50
  declare class MemoryRateLimitStorage implements RateLimitStorage {
51
51
  private readonly store;
52
52
  /**
53
- * Retrieves the current request count for a given key
54
- * @param key - The unique identifier for the rate limit entry
55
- * @returns Promise resolving to the current request count or 0 if not found
56
- */
53
+ * Retrieves the current request count for a given key
54
+ * @param key - The unique identifier for the rate limit entry
55
+ * @returns Promise resolving to the current request count or 0 if not found
56
+ */
57
57
  get(key: string): Promise<number>;
58
58
  /**
59
- * Sets the request count for a given key
60
- * @param key - The unique identifier for the rate limit entry
61
- * @param value - The request count to store
62
- * @returns Promise that resolves immediately
63
- */
59
+ * Sets the request count for a given key
60
+ * @param key - The unique identifier for the rate limit entry
61
+ * @param value - The request count to store
62
+ * @returns Promise that resolves immediately
63
+ */
64
64
  set(key: string, value: number): Promise<void>;
65
65
  /**
66
- * Deletes the rate limit entry for a given key
67
- * @param key - The unique identifier for the rate limit entry
68
- * @returns Promise that resolves immediately
69
- */
66
+ * Deletes the rate limit entry for a given key
67
+ * @param key - The unique identifier for the rate limit entry
68
+ * @returns Promise that resolves immediately
69
+ */
70
70
  delete(key: string): Promise<void>;
71
71
  }
72
72
  /**
@@ -81,50 +81,50 @@ declare class RateLimiter {
81
81
  private readonly lastReset;
82
82
  private readonly resetInterval;
83
83
  /**
84
- * Creates a new rate limiter instance
85
- * @param maxRequests - Maximum number of requests allowed per interval (default: 10)
86
- * @param interval - Time interval in milliseconds for the rate limit window (default: 60000)
87
- * @param storage - Optional storage implementation (default: MemoryRateLimitStorage)
88
- */
84
+ * Creates a new rate limiter instance
85
+ * @param maxRequests - Maximum number of requests allowed per interval (default: 10)
86
+ * @param interval - Time interval in milliseconds for the rate limit window (default: 60000)
87
+ * @param storage - Optional storage implementation (default: MemoryRateLimitStorage)
88
+ */
89
89
  constructor(maxRequests?: number, interval?: number, storage?: RateLimitStorage);
90
90
  /**
91
- * Sets the storage implementation for the rate limiter
92
- * @param storage - The storage implementation to use
93
- */
91
+ * Sets the storage implementation for the rate limiter
92
+ * @param storage - The storage implementation to use
93
+ */
94
94
  setStorage(storage: RateLimitStorage): void;
95
95
  /**
96
- * Gets the storage implementation for the rate limiter
97
- * @returns The storage implementation
98
- */
96
+ * Gets the storage implementation for the rate limiter
97
+ * @returns The storage implementation
98
+ */
99
99
  getStorage(): RateLimitStorage;
100
100
  /**
101
- * Checks if a request is allowed for the given key and increments the counter if allowed
102
- * @param key - The unique identifier for the rate limit entry
103
- * @returns Promise resolving to true if the request is allowed, false if rate limited
104
- */
101
+ * Checks if a request is allowed for the given key and increments the counter if allowed
102
+ * @param key - The unique identifier for the rate limit entry
103
+ * @returns Promise resolving to true if the request is allowed, false if rate limited
104
+ */
105
105
  limit(key: string): Promise<boolean>;
106
106
  /**
107
- * Gets the remaining requests allowed for a given key
108
- * @param key - The unique identifier for the rate limit entry
109
- * @returns Promise resolving to the number of remaining requests
110
- */
107
+ * Gets the remaining requests allowed for a given key
108
+ * @param key - The unique identifier for the rate limit entry
109
+ * @returns Promise resolving to the number of remaining requests
110
+ */
111
111
  getRemaining(key: string): Promise<number>;
112
112
  /**
113
- * Gets the time until the rate limit resets for a given key
114
- * @param key - The unique identifier for the rate limit entry
115
- * @returns Promise resolving to the time in milliseconds until reset, or 0 if no limit is active
116
- */
113
+ * Gets the time until the rate limit resets for a given key
114
+ * @param key - The unique identifier for the rate limit entry
115
+ * @returns Promise resolving to the time in milliseconds until reset, or 0 if no limit is active
116
+ */
117
117
  getResetTime(key: string): Promise<number>;
118
118
  /**
119
- * Resets the rate limit for a given key
120
- * @param key - The unique identifier for the rate limit entry
121
- * @returns Promise that resolves when the reset is complete
122
- */
119
+ * Resets the rate limit for a given key
120
+ * @param key - The unique identifier for the rate limit entry
121
+ * @returns Promise that resolves when the reset is complete
122
+ */
123
123
  reset(key: string): Promise<void>;
124
124
  /**
125
- * Gets the current configuration of the rate limiter
126
- * @returns Object containing the current maxRequests and interval values
127
- */
125
+ * Gets the current configuration of the rate limiter
126
+ * @returns Object containing the current maxRequests and interval values
127
+ */
128
128
  getConfig(): Omit<RateLimitOptions, 'storage'>;
129
129
  }
130
130
  /**
@@ -1,3 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1
2
 
2
3
  //#region src/utils/useful-stuff/ratelimiter.ts
3
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ratelimiter.js","names":[],"sources":["../../../src/utils/useful-stuff/ratelimiter.ts"],"sourcesContent":["/**\n * Default timeout interval for rate limiting in milliseconds\n */\nexport const DEFAULT_TIMEOUT = 60000;\n\n/**\n * Default maximum number of requests allowed per interval\n */\nexport const DEFAULT_MAX_REQUESTS = 10;\n\n/**\n * Interface for rate limit storage implementations.\n * Provides methods to store, retrieve, and delete rate limit data.\n */\nexport interface RateLimitStorage {\n /**\n * Retrieves the current request count for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the current request count\n */\n get(key: string): Promise<number>;\n\n /**\n * Sets the request count for a given key\n * @param key - The unique identifier for the rate limit entry\n * @param value - The request count to store\n * @returns Promise that resolves when the value is stored\n */\n set(key: string, value: number): Promise<void>;\n\n /**\n * Deletes the rate limit entry for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise that resolves when the entry is deleted\n */\n delete(key: string): Promise<void>;\n}\n\n/**\n * Configuration options for rate limiting\n */\nexport interface RateLimitOptions {\n /** Maximum number of requests allowed per interval. Default: 10 */\n maxRequests?: number;\n /** Time interval in milliseconds for the rate limit window. Default: 60000 */\n interval?: number;\n /** Storage implementation for persisting rate limit data. Default: {@link MemoryRateLimitStorage} */\n storage?: RateLimitStorage;\n}\n\n/**\n * In-memory storage implementation for rate limiting.\n * Suitable for single-instance applications.\n */\nexport class MemoryRateLimitStorage implements RateLimitStorage {\n private readonly store = new Map<string, number>();\n\n /**\n * Retrieves the current request count for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the current request count or 0 if not found\n */\n async get(key: string): Promise<number> {\n return this.store.get(key) || 0;\n }\n\n /**\n * Sets the request count for a given key\n * @param key - The unique identifier for the rate limit entry\n * @param value - The request count to store\n * @returns Promise that resolves immediately\n */\n async set(key: string, value: number): Promise<void> {\n this.store.set(key, value);\n }\n\n /**\n * Deletes the rate limit entry for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise that resolves immediately\n */\n async delete(key: string): Promise<void> {\n this.store.delete(key);\n }\n}\n\n/**\n * Rate limiter implementation that enforces request limits per key.\n * Supports configurable request limits and time intervals.\n */\nexport class RateLimiter {\n private readonly limits: Map<string, number> = new Map();\n private readonly lastReset: Map<string, number> = new Map();\n private readonly resetInterval: number;\n\n /**\n * Creates a new rate limiter instance\n * @param maxRequests - Maximum number of requests allowed per interval (default: 10)\n * @param interval - Time interval in milliseconds for the rate limit window (default: 60000)\n * @param storage - Optional storage implementation (default: MemoryRateLimitStorage)\n */\n public constructor(\n private readonly maxRequests: number = DEFAULT_MAX_REQUESTS,\n private readonly interval: number = DEFAULT_TIMEOUT,\n private storage: RateLimitStorage = new MemoryRateLimitStorage(),\n ) {\n this.resetInterval = interval;\n }\n\n /**\n * Sets the storage implementation for the rate limiter\n * @param storage - The storage implementation to use\n */\n public setStorage(storage: RateLimitStorage) {\n this.storage = storage;\n }\n\n /**\n * Gets the storage implementation for the rate limiter\n * @returns The storage implementation\n */\n public getStorage(): RateLimitStorage {\n return this.storage;\n }\n\n /**\n * Checks if a request is allowed for the given key and increments the counter if allowed\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to true if the request is allowed, false if rate limited\n */\n public async limit(key: string): Promise<boolean> {\n const now = Date.now();\n const lastReset = this.lastReset.get(key) || 0;\n const timeSinceReset = now - lastReset;\n\n // Reset counter if interval has passed\n if (timeSinceReset > this.resetInterval) {\n await this.storage.delete(key);\n this.lastReset.set(key, now);\n this.limits.set(key, 0);\n }\n\n // Get current count from storage\n const currentCount = await this.storage.get(key);\n\n // Check if limit exceeded\n if (currentCount >= this.maxRequests) {\n return false;\n }\n\n // Increment counter\n const newCount = currentCount + 1;\n await this.storage.set(key, newCount);\n this.limits.set(key, newCount);\n\n return true;\n }\n\n /**\n * Gets the remaining requests allowed for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the number of remaining requests\n */\n public async getRemaining(key: string): Promise<number> {\n const currentCount = await this.storage.get(key);\n return Math.max(0, this.maxRequests - currentCount);\n }\n\n /**\n * Gets the time until the rate limit resets for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the time in milliseconds until reset, or 0 if no limit is active\n */\n public async getResetTime(key: string): Promise<number> {\n const lastReset = this.lastReset.get(key) || 0;\n const now = Date.now();\n const timeSinceReset = now - lastReset;\n\n if (timeSinceReset >= this.resetInterval) {\n return 0;\n }\n\n return this.resetInterval - timeSinceReset;\n }\n\n /**\n * Resets the rate limit for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise that resolves when the reset is complete\n */\n public async reset(key: string): Promise<void> {\n await this.storage.delete(key);\n this.limits.delete(key);\n this.lastReset.delete(key);\n }\n\n /**\n * Gets the current configuration of the rate limiter\n * @returns Object containing the current maxRequests and interval values\n */\n public getConfig(): Omit<RateLimitOptions, 'storage'> {\n return {\n maxRequests: this.maxRequests,\n interval: this.interval,\n };\n }\n}\n\n/**\n * Default rate limiter instance for global use\n */\nexport const defaultRateLimiter = new RateLimiter();\n\n/**\n * Convenience function to check if a request is allowed for a given key.\n * Uses the default rate limiter instance.\n *\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to true if the request is allowed, false if rate limited\n *\n * @example\n * ```typescript\n * const allowed = await ratelimit('user:123');\n * // update the default rate limiter config\n * import { defaultRateLimiter } from 'commandkit/ratelimit';\n *\n * // update max allowed requests\n * defaultRateLimiter.setMaxRequests(10);\n *\n * // update the timeout interval\n * defaultRateLimiter.setInterval(30000);\n *\n * // update the storage implementation\n * defaultRateLimiter.setStorage(new RedisStorage());\n * ```\n */\nexport async function ratelimit(key: string): Promise<boolean> {\n return defaultRateLimiter.limit(key);\n}\n\n/**\n * Creates a new rate limiter instance with the specified configuration\n * @param options - Configuration options for the rate limiter\n * @returns New RateLimiter instance\n *\n * @example\n * ```typescript\n * const limiter = createRateLimiter({\n * maxRequests: 5,\n * interval: 30000,\n * storage: new CustomStorage()\n * });\n * ```\n */\nexport function createRateLimiter(options: RateLimitOptions): RateLimiter {\n return new RateLimiter(\n options.maxRequests,\n options.interval,\n options.storage,\n );\n}\n\n/**\n * Gets the remaining requests for a key using the default rate limiter\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the number of remaining requests\n */\nexport async function getRemainingRequests(key: string): Promise<number> {\n return defaultRateLimiter.getRemaining(key);\n}\n\n/**\n * Gets the reset time for a key using the default rate limiter\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the time in milliseconds until reset\n */\nexport async function getResetTime(key: string): Promise<number> {\n return defaultRateLimiter.getResetTime(key);\n}\n\n/**\n * Resets the rate limit for a key using the default rate limiter\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise that resolves when the reset is complete\n */\nexport async function resetRateLimit(key: string): Promise<void> {\n return defaultRateLimiter.reset(key);\n}\n"],"mappings":";;;;;AAGA,MAAa,kBAAkB;;;;AAK/B,MAAa,uBAAuB;;;;;AA8CpC,IAAa,yBAAb,MAAgE;CAC9D,AAAiB,wBAAQ,IAAI,KAAqB;;;;;;CAOlD,MAAM,IAAI,KAA8B;AACtC,SAAO,KAAK,MAAM,IAAI,IAAI,IAAI;;;;;;;;CAShC,MAAM,IAAI,KAAa,OAA8B;AACnD,OAAK,MAAM,IAAI,KAAK,MAAM;;;;;;;CAQ5B,MAAM,OAAO,KAA4B;AACvC,OAAK,MAAM,OAAO,IAAI;;;;;;;AAQ1B,IAAa,cAAb,MAAyB;CACvB,AAAiB,yBAA8B,IAAI,KAAK;CACxD,AAAiB,4BAAiC,IAAI,KAAK;CAC3D,AAAiB;;;;;;;CAQjB,AAAO,YACP,AAAU,cAA6B,sBACvC,AAAU,WAA0B,iBACpC,AAAE,UAAkC,IAAE,wBAA0B,EAChE;EAHU;EACA;EACR;AAEA,OAAK,gBAAgB;;;;;;CAOvB,AAAO,WAAW,SAA2B;AAC3C,OAAK,UAAU;;;;;;CAOjB,AAAO,aAA+B;AACpC,SAAO,KAAK;;;;;;;CAQd,MAAa,MAAM,KAA+B;EAChD,MAAM,MAAM,KAAK,KAAK;AAKtB,MAHuB,OADL,KAAK,UAAU,IAAI,IAAI,IAAI,KAIxB,KAAK,eAAe;AACvC,SAAM,KAAK,QAAQ,OAAO,IAAI;AAC9B,QAAK,UAAU,IAAI,KAAK,IAAI;AAC5B,QAAK,OAAO,IAAI,KAAK,EAAE;;EAIzB,MAAM,eAAe,MAAM,KAAK,QAAQ,IAAI,IAAI;AAGhD,MAAI,gBAAgB,KAAK,YACvB,QAAO;EAIT,MAAM,WAAW,eAAe;AAChC,QAAM,KAAK,QAAQ,IAAI,KAAK,SAAS;AACrC,OAAK,OAAO,IAAI,KAAK,SAAS;AAE9B,SAAO;;;;;;;CAQT,MAAa,aAAa,KAA8B;EACtD,MAAM,eAAe,MAAM,KAAK,QAAQ,IAAI,IAAI;AAChD,SAAO,KAAK,IAAI,GAAG,KAAK,cAAc,aAAa;;;;;;;CAQrD,MAAa,aAAa,KAA8B;EACtD,MAAM,YAAY,KAAK,UAAU,IAAI,IAAI,IAAI;EAE7C,MAAM,iBADM,KAAK,KAAK,GACO;AAE7B,MAAI,kBAAkB,KAAK,cACzB,QAAO;AAGT,SAAO,KAAK,gBAAgB;;;;;;;CAQ9B,MAAa,MAAM,KAA4B;AAC7C,QAAM,KAAK,QAAQ,OAAO,IAAI;AAC9B,OAAK,OAAO,OAAO,IAAI;AACvB,OAAK,UAAU,OAAO,IAAI;;;;;;CAO5B,AAAO,YAA+C;AACpD,SAAO;GACL,aAAa,KAAK;GAClB,UAAU,KAAK;GAChB;;;;;;AAOL,MAAa,qBAAqB,IAAI,aAAa;;;;;;;;;;;;;;;;;;;;;;;;AAyBnD,eAAsB,UAAU,KAA+B;AAC7D,QAAO,mBAAmB,MAAM,IAAI;;;;;;;;;;;;;;;;AAiBtC,SAAgB,kBAAkB,SAAwC;AACxE,QAAO,IAAI,YACT,QAAQ,aACR,QAAQ,UACR,QAAQ,QACT;;;;;;;AAQH,eAAsB,qBAAqB,KAA8B;AACvE,QAAO,mBAAmB,aAAa,IAAI;;;;;;;AAQ7C,eAAsB,aAAa,KAA8B;AAC/D,QAAO,mBAAmB,aAAa,IAAI;;;;;;;AAQ7C,eAAsB,eAAe,KAA4B;AAC/D,QAAO,mBAAmB,MAAM,IAAI"}
1
+ {"version":3,"file":"ratelimiter.js","names":[],"sources":["../../../src/utils/useful-stuff/ratelimiter.ts"],"sourcesContent":["/**\n * Default timeout interval for rate limiting in milliseconds\n */\nexport const DEFAULT_TIMEOUT = 60000;\n\n/**\n * Default maximum number of requests allowed per interval\n */\nexport const DEFAULT_MAX_REQUESTS = 10;\n\n/**\n * Interface for rate limit storage implementations.\n * Provides methods to store, retrieve, and delete rate limit data.\n */\nexport interface RateLimitStorage {\n /**\n * Retrieves the current request count for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the current request count\n */\n get(key: string): Promise<number>;\n\n /**\n * Sets the request count for a given key\n * @param key - The unique identifier for the rate limit entry\n * @param value - The request count to store\n * @returns Promise that resolves when the value is stored\n */\n set(key: string, value: number): Promise<void>;\n\n /**\n * Deletes the rate limit entry for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise that resolves when the entry is deleted\n */\n delete(key: string): Promise<void>;\n}\n\n/**\n * Configuration options for rate limiting\n */\nexport interface RateLimitOptions {\n /** Maximum number of requests allowed per interval. Default: 10 */\n maxRequests?: number;\n /** Time interval in milliseconds for the rate limit window. Default: 60000 */\n interval?: number;\n /** Storage implementation for persisting rate limit data. Default: {@link MemoryRateLimitStorage} */\n storage?: RateLimitStorage;\n}\n\n/**\n * In-memory storage implementation for rate limiting.\n * Suitable for single-instance applications.\n */\nexport class MemoryRateLimitStorage implements RateLimitStorage {\n private readonly store = new Map<string, number>();\n\n /**\n * Retrieves the current request count for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the current request count or 0 if not found\n */\n async get(key: string): Promise<number> {\n return this.store.get(key) || 0;\n }\n\n /**\n * Sets the request count for a given key\n * @param key - The unique identifier for the rate limit entry\n * @param value - The request count to store\n * @returns Promise that resolves immediately\n */\n async set(key: string, value: number): Promise<void> {\n this.store.set(key, value);\n }\n\n /**\n * Deletes the rate limit entry for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise that resolves immediately\n */\n async delete(key: string): Promise<void> {\n this.store.delete(key);\n }\n}\n\n/**\n * Rate limiter implementation that enforces request limits per key.\n * Supports configurable request limits and time intervals.\n */\nexport class RateLimiter {\n private readonly limits: Map<string, number> = new Map();\n private readonly lastReset: Map<string, number> = new Map();\n private readonly resetInterval: number;\n\n /**\n * Creates a new rate limiter instance\n * @param maxRequests - Maximum number of requests allowed per interval (default: 10)\n * @param interval - Time interval in milliseconds for the rate limit window (default: 60000)\n * @param storage - Optional storage implementation (default: MemoryRateLimitStorage)\n */\n public constructor(\n private readonly maxRequests: number = DEFAULT_MAX_REQUESTS,\n private readonly interval: number = DEFAULT_TIMEOUT,\n private storage: RateLimitStorage = new MemoryRateLimitStorage(),\n ) {\n this.resetInterval = interval;\n }\n\n /**\n * Sets the storage implementation for the rate limiter\n * @param storage - The storage implementation to use\n */\n public setStorage(storage: RateLimitStorage) {\n this.storage = storage;\n }\n\n /**\n * Gets the storage implementation for the rate limiter\n * @returns The storage implementation\n */\n public getStorage(): RateLimitStorage {\n return this.storage;\n }\n\n /**\n * Checks if a request is allowed for the given key and increments the counter if allowed\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to true if the request is allowed, false if rate limited\n */\n public async limit(key: string): Promise<boolean> {\n const now = Date.now();\n const lastReset = this.lastReset.get(key) || 0;\n const timeSinceReset = now - lastReset;\n\n // Reset counter if interval has passed\n if (timeSinceReset > this.resetInterval) {\n await this.storage.delete(key);\n this.lastReset.set(key, now);\n this.limits.set(key, 0);\n }\n\n // Get current count from storage\n const currentCount = await this.storage.get(key);\n\n // Check if limit exceeded\n if (currentCount >= this.maxRequests) {\n return false;\n }\n\n // Increment counter\n const newCount = currentCount + 1;\n await this.storage.set(key, newCount);\n this.limits.set(key, newCount);\n\n return true;\n }\n\n /**\n * Gets the remaining requests allowed for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the number of remaining requests\n */\n public async getRemaining(key: string): Promise<number> {\n const currentCount = await this.storage.get(key);\n return Math.max(0, this.maxRequests - currentCount);\n }\n\n /**\n * Gets the time until the rate limit resets for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the time in milliseconds until reset, or 0 if no limit is active\n */\n public async getResetTime(key: string): Promise<number> {\n const lastReset = this.lastReset.get(key) || 0;\n const now = Date.now();\n const timeSinceReset = now - lastReset;\n\n if (timeSinceReset >= this.resetInterval) {\n return 0;\n }\n\n return this.resetInterval - timeSinceReset;\n }\n\n /**\n * Resets the rate limit for a given key\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise that resolves when the reset is complete\n */\n public async reset(key: string): Promise<void> {\n await this.storage.delete(key);\n this.limits.delete(key);\n this.lastReset.delete(key);\n }\n\n /**\n * Gets the current configuration of the rate limiter\n * @returns Object containing the current maxRequests and interval values\n */\n public getConfig(): Omit<RateLimitOptions, 'storage'> {\n return {\n maxRequests: this.maxRequests,\n interval: this.interval,\n };\n }\n}\n\n/**\n * Default rate limiter instance for global use\n */\nexport const defaultRateLimiter = new RateLimiter();\n\n/**\n * Convenience function to check if a request is allowed for a given key.\n * Uses the default rate limiter instance.\n *\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to true if the request is allowed, false if rate limited\n *\n * @example\n * ```typescript\n * const allowed = await ratelimit('user:123');\n * // update the default rate limiter config\n * import { defaultRateLimiter } from 'commandkit/ratelimit';\n *\n * // update max allowed requests\n * defaultRateLimiter.setMaxRequests(10);\n *\n * // update the timeout interval\n * defaultRateLimiter.setInterval(30000);\n *\n * // update the storage implementation\n * defaultRateLimiter.setStorage(new RedisStorage());\n * ```\n */\nexport async function ratelimit(key: string): Promise<boolean> {\n return defaultRateLimiter.limit(key);\n}\n\n/**\n * Creates a new rate limiter instance with the specified configuration\n * @param options - Configuration options for the rate limiter\n * @returns New RateLimiter instance\n *\n * @example\n * ```typescript\n * const limiter = createRateLimiter({\n * maxRequests: 5,\n * interval: 30000,\n * storage: new CustomStorage()\n * });\n * ```\n */\nexport function createRateLimiter(options: RateLimitOptions): RateLimiter {\n return new RateLimiter(\n options.maxRequests,\n options.interval,\n options.storage,\n );\n}\n\n/**\n * Gets the remaining requests for a key using the default rate limiter\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the number of remaining requests\n */\nexport async function getRemainingRequests(key: string): Promise<number> {\n return defaultRateLimiter.getRemaining(key);\n}\n\n/**\n * Gets the reset time for a key using the default rate limiter\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise resolving to the time in milliseconds until reset\n */\nexport async function getResetTime(key: string): Promise<number> {\n return defaultRateLimiter.getResetTime(key);\n}\n\n/**\n * Resets the rate limit for a key using the default rate limiter\n * @param key - The unique identifier for the rate limit entry\n * @returns Promise that resolves when the reset is complete\n */\nexport async function resetRateLimit(key: string): Promise<void> {\n return defaultRateLimiter.reset(key);\n}\n"],"mappings":";;;;;;AAGA,MAAa,kBAAkB;;;;AAK/B,MAAa,uBAAuB;;;;;AA8CpC,IAAa,yBAAb,MAAgE;CAC9D,AAAiB,wBAAQ,IAAI,KAAqB;;;;;;CAOlD,MAAM,IAAI,KAA8B;AACtC,SAAO,KAAK,MAAM,IAAI,IAAI,IAAI;;;;;;;;CAShC,MAAM,IAAI,KAAa,OAA8B;AACnD,OAAK,MAAM,IAAI,KAAK,MAAM;;;;;;;CAQ5B,MAAM,OAAO,KAA4B;AACvC,OAAK,MAAM,OAAO,IAAI;;;;;;;AAQ1B,IAAa,cAAb,MAAyB;CACvB,AAAiB,yBAA8B,IAAI,KAAK;CACxD,AAAiB,4BAAiC,IAAI,KAAK;CAC3D,AAAiB;;;;;;;CAQjB,AAAO,YACP,AAAU,cAA6B,sBACvC,AAAU,WAA0B,iBACpC,AAAE,UAAkC,IAAE,wBAA0B,EAChE;EAHU;EACA;EACR;AAEA,OAAK,gBAAgB;;;;;;CAOvB,AAAO,WAAW,SAA2B;AAC3C,OAAK,UAAU;;;;;;CAOjB,AAAO,aAA+B;AACpC,SAAO,KAAK;;;;;;;CAQd,MAAa,MAAM,KAA+B;EAChD,MAAM,MAAM,KAAK,KAAK;AAKtB,MAHuB,OADL,KAAK,UAAU,IAAI,IAAI,IAAI,KAIxB,KAAK,eAAe;AACvC,SAAM,KAAK,QAAQ,OAAO,IAAI;AAC9B,QAAK,UAAU,IAAI,KAAK,IAAI;AAC5B,QAAK,OAAO,IAAI,KAAK,EAAE;;EAIzB,MAAM,eAAe,MAAM,KAAK,QAAQ,IAAI,IAAI;AAGhD,MAAI,gBAAgB,KAAK,YACvB,QAAO;EAIT,MAAM,WAAW,eAAe;AAChC,QAAM,KAAK,QAAQ,IAAI,KAAK,SAAS;AACrC,OAAK,OAAO,IAAI,KAAK,SAAS;AAE9B,SAAO;;;;;;;CAQT,MAAa,aAAa,KAA8B;EACtD,MAAM,eAAe,MAAM,KAAK,QAAQ,IAAI,IAAI;AAChD,SAAO,KAAK,IAAI,GAAG,KAAK,cAAc,aAAa;;;;;;;CAQrD,MAAa,aAAa,KAA8B;EACtD,MAAM,YAAY,KAAK,UAAU,IAAI,IAAI,IAAI;EAE7C,MAAM,iBADM,KAAK,KAAK,GACO;AAE7B,MAAI,kBAAkB,KAAK,cACzB,QAAO;AAGT,SAAO,KAAK,gBAAgB;;;;;;;CAQ9B,MAAa,MAAM,KAA4B;AAC7C,QAAM,KAAK,QAAQ,OAAO,IAAI;AAC9B,OAAK,OAAO,OAAO,IAAI;AACvB,OAAK,UAAU,OAAO,IAAI;;;;;;CAO5B,AAAO,YAA+C;AACpD,SAAO;GACL,aAAa,KAAK;GAClB,UAAU,KAAK;GAChB;;;;;;AAOL,MAAa,qBAAqB,IAAI,aAAa;;;;;;;;;;;;;;;;;;;;;;;;AAyBnD,eAAsB,UAAU,KAA+B;AAC7D,QAAO,mBAAmB,MAAM,IAAI;;;;;;;;;;;;;;;;AAiBtC,SAAgB,kBAAkB,SAAwC;AACxE,QAAO,IAAI,YACT,QAAQ,aACR,QAAQ,UACR,QAAQ,QACT;;;;;;;AAQH,eAAsB,qBAAqB,KAA8B;AACvE,QAAO,mBAAmB,aAAa,IAAI;;;;;;;AAQ7C,eAAsB,aAAa,KAA8B;AAC/D,QAAO,mBAAmB,aAAa,IAAI;;;;;;;AAQ7C,eAAsB,eAAe,KAA4B;AAC/D,QAAO,mBAAmB,MAAM,IAAI"}