@dementevdev/maxbot-ts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1176 -0
  4. package/dist/cjs/api/BotsApi.d.ts +17 -0
  5. package/dist/cjs/api/BotsApi.d.ts.map +1 -0
  6. package/dist/cjs/api/BotsApi.js +22 -0
  7. package/dist/cjs/api/ChatsApi.d.ts +87 -0
  8. package/dist/cjs/api/ChatsApi.d.ts.map +1 -0
  9. package/dist/cjs/api/ChatsApi.js +144 -0
  10. package/dist/cjs/api/MessagesApi.d.ts +41 -0
  11. package/dist/cjs/api/MessagesApi.d.ts.map +1 -0
  12. package/dist/cjs/api/MessagesApi.js +66 -0
  13. package/dist/cjs/api/SubscriptionsApi.d.ts +45 -0
  14. package/dist/cjs/api/SubscriptionsApi.d.ts.map +1 -0
  15. package/dist/cjs/api/SubscriptionsApi.js +69 -0
  16. package/dist/cjs/api/UploadsApi.d.ts +45 -0
  17. package/dist/cjs/api/UploadsApi.d.ts.map +1 -0
  18. package/dist/cjs/api/UploadsApi.js +113 -0
  19. package/dist/cjs/api/index.d.ts +7 -0
  20. package/dist/cjs/api/index.d.ts.map +1 -0
  21. package/dist/cjs/api/index.js +14 -0
  22. package/dist/cjs/api/interfaces.d.ts +108 -0
  23. package/dist/cjs/api/interfaces.d.ts.map +1 -0
  24. package/dist/cjs/api/interfaces.js +3 -0
  25. package/dist/cjs/bot/Bot.d.ts +380 -0
  26. package/dist/cjs/bot/Bot.d.ts.map +1 -0
  27. package/dist/cjs/bot/Bot.js +624 -0
  28. package/dist/cjs/bot/Composer.d.ts +131 -0
  29. package/dist/cjs/bot/Composer.d.ts.map +1 -0
  30. package/dist/cjs/bot/Composer.js +218 -0
  31. package/dist/cjs/bot/context/BotStartedContext.d.ts +83 -0
  32. package/dist/cjs/bot/context/BotStartedContext.d.ts.map +1 -0
  33. package/dist/cjs/bot/context/BotStartedContext.js +113 -0
  34. package/dist/cjs/bot/context/CallbackContext.d.ts +107 -0
  35. package/dist/cjs/bot/context/CallbackContext.d.ts.map +1 -0
  36. package/dist/cjs/bot/context/CallbackContext.js +158 -0
  37. package/dist/cjs/bot/context/ChatContext.d.ts +35 -0
  38. package/dist/cjs/bot/context/ChatContext.d.ts.map +1 -0
  39. package/dist/cjs/bot/context/ChatContext.js +52 -0
  40. package/dist/cjs/bot/context/MessageContext.d.ts +149 -0
  41. package/dist/cjs/bot/context/MessageContext.d.ts.map +1 -0
  42. package/dist/cjs/bot/context/MessageContext.js +228 -0
  43. package/dist/cjs/bot/context/guards.d.ts +69 -0
  44. package/dist/cjs/bot/context/guards.d.ts.map +1 -0
  45. package/dist/cjs/bot/context/guards.js +85 -0
  46. package/dist/cjs/bot/context/index.d.ts +6 -0
  47. package/dist/cjs/bot/context/index.d.ts.map +1 -0
  48. package/dist/cjs/bot/context/index.js +18 -0
  49. package/dist/cjs/bot/dispatch.d.ts +51 -0
  50. package/dist/cjs/bot/dispatch.d.ts.map +1 -0
  51. package/dist/cjs/bot/dispatch.js +201 -0
  52. package/dist/cjs/bot/index.d.ts +10 -0
  53. package/dist/cjs/bot/index.d.ts.map +1 -0
  54. package/dist/cjs/bot/index.js +24 -0
  55. package/dist/cjs/bot/lifecycle.d.ts +85 -0
  56. package/dist/cjs/bot/lifecycle.d.ts.map +1 -0
  57. package/dist/cjs/bot/lifecycle.js +167 -0
  58. package/dist/cjs/bot/metrics.d.ts +18 -0
  59. package/dist/cjs/bot/metrics.d.ts.map +1 -0
  60. package/dist/cjs/bot/metrics.js +3 -0
  61. package/dist/cjs/bot/routing.d.ts +131 -0
  62. package/dist/cjs/bot/routing.d.ts.map +1 -0
  63. package/dist/cjs/bot/routing.js +198 -0
  64. package/dist/cjs/bot/triggers.d.ts +61 -0
  65. package/dist/cjs/bot/triggers.d.ts.map +1 -0
  66. package/dist/cjs/bot/triggers.js +84 -0
  67. package/dist/cjs/core/errors/MaxError.d.ts +11 -0
  68. package/dist/cjs/core/errors/MaxError.d.ts.map +1 -0
  69. package/dist/cjs/core/errors/MaxError.js +19 -0
  70. package/dist/cjs/core/errors/errors.d.ts +59 -0
  71. package/dist/cjs/core/errors/errors.d.ts.map +1 -0
  72. package/dist/cjs/core/errors/errors.js +84 -0
  73. package/dist/cjs/core/errors/index.d.ts +3 -0
  74. package/dist/cjs/core/errors/index.d.ts.map +1 -0
  75. package/dist/cjs/core/errors/index.js +13 -0
  76. package/dist/cjs/core/http/HttpClient.d.ts +28 -0
  77. package/dist/cjs/core/http/HttpClient.d.ts.map +1 -0
  78. package/dist/cjs/core/http/HttpClient.js +148 -0
  79. package/dist/cjs/core/http/index.d.ts +3 -0
  80. package/dist/cjs/core/http/index.d.ts.map +1 -0
  81. package/dist/cjs/core/http/index.js +6 -0
  82. package/dist/cjs/core/http/interfaces.d.ts +42 -0
  83. package/dist/cjs/core/http/interfaces.d.ts.map +1 -0
  84. package/dist/cjs/core/http/interfaces.js +3 -0
  85. package/dist/cjs/core/rate-limiter/RateLimiter.d.ts +46 -0
  86. package/dist/cjs/core/rate-limiter/RateLimiter.d.ts.map +1 -0
  87. package/dist/cjs/core/rate-limiter/RateLimiter.js +110 -0
  88. package/dist/cjs/core/rate-limiter/index.d.ts +3 -0
  89. package/dist/cjs/core/rate-limiter/index.d.ts.map +1 -0
  90. package/dist/cjs/core/rate-limiter/index.js +6 -0
  91. package/dist/cjs/filters/index.d.ts +2 -0
  92. package/dist/cjs/filters/index.d.ts.map +1 -0
  93. package/dist/cjs/filters/index.js +10 -0
  94. package/dist/cjs/filters/predicates.d.ts +85 -0
  95. package/dist/cjs/filters/predicates.d.ts.map +1 -0
  96. package/dist/cjs/filters/predicates.js +111 -0
  97. package/dist/cjs/index.d.ts +11 -0
  98. package/dist/cjs/index.d.ts.map +1 -0
  99. package/dist/cjs/index.js +27 -0
  100. package/dist/cjs/middleware/compose.d.ts +28 -0
  101. package/dist/cjs/middleware/compose.d.ts.map +1 -0
  102. package/dist/cjs/middleware/compose.js +89 -0
  103. package/dist/cjs/middleware/index.d.ts +3 -0
  104. package/dist/cjs/middleware/index.d.ts.map +1 -0
  105. package/dist/cjs/middleware/index.js +7 -0
  106. package/dist/cjs/middleware/types.d.ts +17 -0
  107. package/dist/cjs/middleware/types.d.ts.map +1 -0
  108. package/dist/cjs/middleware/types.js +3 -0
  109. package/dist/cjs/package.json +3 -0
  110. package/dist/cjs/transport/LongPollingTransport.d.ts +33 -0
  111. package/dist/cjs/transport/LongPollingTransport.d.ts.map +1 -0
  112. package/dist/cjs/transport/LongPollingTransport.js +153 -0
  113. package/dist/cjs/transport/WebhookTransport.d.ts +40 -0
  114. package/dist/cjs/transport/WebhookTransport.d.ts.map +1 -0
  115. package/dist/cjs/transport/WebhookTransport.js +229 -0
  116. package/dist/cjs/transport/index.d.ts +4 -0
  117. package/dist/cjs/transport/index.d.ts.map +1 -0
  118. package/dist/cjs/transport/index.js +8 -0
  119. package/dist/cjs/transport/interfaces.d.ts +74 -0
  120. package/dist/cjs/transport/interfaces.d.ts.map +1 -0
  121. package/dist/cjs/transport/interfaces.js +3 -0
  122. package/dist/cjs/types/bot.d.ts +19 -0
  123. package/dist/cjs/types/bot.d.ts.map +1 -0
  124. package/dist/cjs/types/bot.js +3 -0
  125. package/dist/cjs/types/chat.d.ts +94 -0
  126. package/dist/cjs/types/chat.d.ts.map +1 -0
  127. package/dist/cjs/types/chat.js +3 -0
  128. package/dist/cjs/types/common.d.ts +38 -0
  129. package/dist/cjs/types/common.d.ts.map +1 -0
  130. package/dist/cjs/types/common.js +6 -0
  131. package/dist/cjs/types/index.d.ts +9 -0
  132. package/dist/cjs/types/index.d.ts.map +1 -0
  133. package/dist/cjs/types/index.js +26 -0
  134. package/dist/cjs/types/keyboard.d.ts +97 -0
  135. package/dist/cjs/types/keyboard.d.ts.map +1 -0
  136. package/dist/cjs/types/keyboard.js +3 -0
  137. package/dist/cjs/types/message.d.ts +162 -0
  138. package/dist/cjs/types/message.d.ts.map +1 -0
  139. package/dist/cjs/types/message.js +3 -0
  140. package/dist/cjs/types/subscription.d.ts +23 -0
  141. package/dist/cjs/types/subscription.d.ts.map +1 -0
  142. package/dist/cjs/types/subscription.js +3 -0
  143. package/dist/cjs/types/update.d.ts +99 -0
  144. package/dist/cjs/types/update.d.ts.map +1 -0
  145. package/dist/cjs/types/update.js +3 -0
  146. package/dist/cjs/types/upload.d.ts +29 -0
  147. package/dist/cjs/types/upload.d.ts.map +1 -0
  148. package/dist/cjs/types/upload.js +3 -0
  149. package/dist/cjs/utils/Histogram.d.ts +93 -0
  150. package/dist/cjs/utils/Histogram.d.ts.map +1 -0
  151. package/dist/cjs/utils/Histogram.js +103 -0
  152. package/dist/cjs/utils/assertNever.d.ts +19 -0
  153. package/dist/cjs/utils/assertNever.d.ts.map +1 -0
  154. package/dist/cjs/utils/assertNever.js +24 -0
  155. package/dist/cjs/utils/format.d.ts +22 -0
  156. package/dist/cjs/utils/format.d.ts.map +1 -0
  157. package/dist/cjs/utils/format.js +25 -0
  158. package/dist/cjs/utils/index.d.ts +6 -0
  159. package/dist/cjs/utils/index.d.ts.map +1 -0
  160. package/dist/cjs/utils/index.js +14 -0
  161. package/dist/cjs/utils/keyboard.d.ts +70 -0
  162. package/dist/cjs/utils/keyboard.d.ts.map +1 -0
  163. package/dist/cjs/utils/keyboard.js +166 -0
  164. package/dist/esm/api/BotsApi.d.ts +17 -0
  165. package/dist/esm/api/BotsApi.d.ts.map +1 -0
  166. package/dist/esm/api/BotsApi.js +18 -0
  167. package/dist/esm/api/ChatsApi.d.ts +87 -0
  168. package/dist/esm/api/ChatsApi.d.ts.map +1 -0
  169. package/dist/esm/api/ChatsApi.js +140 -0
  170. package/dist/esm/api/MessagesApi.d.ts +41 -0
  171. package/dist/esm/api/MessagesApi.d.ts.map +1 -0
  172. package/dist/esm/api/MessagesApi.js +62 -0
  173. package/dist/esm/api/SubscriptionsApi.d.ts +45 -0
  174. package/dist/esm/api/SubscriptionsApi.d.ts.map +1 -0
  175. package/dist/esm/api/SubscriptionsApi.js +65 -0
  176. package/dist/esm/api/UploadsApi.d.ts +45 -0
  177. package/dist/esm/api/UploadsApi.d.ts.map +1 -0
  178. package/dist/esm/api/UploadsApi.js +109 -0
  179. package/dist/esm/api/index.d.ts +7 -0
  180. package/dist/esm/api/index.d.ts.map +1 -0
  181. package/dist/esm/api/index.js +6 -0
  182. package/dist/esm/api/interfaces.d.ts +108 -0
  183. package/dist/esm/api/interfaces.d.ts.map +1 -0
  184. package/dist/esm/api/interfaces.js +2 -0
  185. package/dist/esm/bot/Bot.d.ts +380 -0
  186. package/dist/esm/bot/Bot.d.ts.map +1 -0
  187. package/dist/esm/bot/Bot.js +620 -0
  188. package/dist/esm/bot/Composer.d.ts +131 -0
  189. package/dist/esm/bot/Composer.d.ts.map +1 -0
  190. package/dist/esm/bot/Composer.js +214 -0
  191. package/dist/esm/bot/context/BotStartedContext.d.ts +83 -0
  192. package/dist/esm/bot/context/BotStartedContext.d.ts.map +1 -0
  193. package/dist/esm/bot/context/BotStartedContext.js +109 -0
  194. package/dist/esm/bot/context/CallbackContext.d.ts +107 -0
  195. package/dist/esm/bot/context/CallbackContext.d.ts.map +1 -0
  196. package/dist/esm/bot/context/CallbackContext.js +154 -0
  197. package/dist/esm/bot/context/ChatContext.d.ts +35 -0
  198. package/dist/esm/bot/context/ChatContext.d.ts.map +1 -0
  199. package/dist/esm/bot/context/ChatContext.js +48 -0
  200. package/dist/esm/bot/context/MessageContext.d.ts +149 -0
  201. package/dist/esm/bot/context/MessageContext.d.ts.map +1 -0
  202. package/dist/esm/bot/context/MessageContext.js +224 -0
  203. package/dist/esm/bot/context/guards.d.ts +69 -0
  204. package/dist/esm/bot/context/guards.d.ts.map +1 -0
  205. package/dist/esm/bot/context/guards.js +78 -0
  206. package/dist/esm/bot/context/index.d.ts +6 -0
  207. package/dist/esm/bot/context/index.d.ts.map +1 -0
  208. package/dist/esm/bot/context/index.js +6 -0
  209. package/dist/esm/bot/dispatch.d.ts +51 -0
  210. package/dist/esm/bot/dispatch.d.ts.map +1 -0
  211. package/dist/esm/bot/dispatch.js +197 -0
  212. package/dist/esm/bot/index.d.ts +10 -0
  213. package/dist/esm/bot/index.d.ts.map +1 -0
  214. package/dist/esm/bot/index.js +9 -0
  215. package/dist/esm/bot/lifecycle.d.ts +85 -0
  216. package/dist/esm/bot/lifecycle.d.ts.map +1 -0
  217. package/dist/esm/bot/lifecycle.js +163 -0
  218. package/dist/esm/bot/metrics.d.ts +18 -0
  219. package/dist/esm/bot/metrics.d.ts.map +1 -0
  220. package/dist/esm/bot/metrics.js +2 -0
  221. package/dist/esm/bot/routing.d.ts +131 -0
  222. package/dist/esm/bot/routing.d.ts.map +1 -0
  223. package/dist/esm/bot/routing.js +194 -0
  224. package/dist/esm/bot/triggers.d.ts +61 -0
  225. package/dist/esm/bot/triggers.d.ts.map +1 -0
  226. package/dist/esm/bot/triggers.js +80 -0
  227. package/dist/esm/core/errors/MaxError.d.ts +11 -0
  228. package/dist/esm/core/errors/MaxError.d.ts.map +1 -0
  229. package/dist/esm/core/errors/MaxError.js +15 -0
  230. package/dist/esm/core/errors/errors.d.ts +59 -0
  231. package/dist/esm/core/errors/errors.d.ts.map +1 -0
  232. package/dist/esm/core/errors/errors.js +75 -0
  233. package/dist/esm/core/errors/index.d.ts +3 -0
  234. package/dist/esm/core/errors/index.d.ts.map +1 -0
  235. package/dist/esm/core/errors/index.js +3 -0
  236. package/dist/esm/core/http/HttpClient.d.ts +28 -0
  237. package/dist/esm/core/http/HttpClient.d.ts.map +1 -0
  238. package/dist/esm/core/http/HttpClient.js +144 -0
  239. package/dist/esm/core/http/index.d.ts +3 -0
  240. package/dist/esm/core/http/index.d.ts.map +1 -0
  241. package/dist/esm/core/http/index.js +2 -0
  242. package/dist/esm/core/http/interfaces.d.ts +42 -0
  243. package/dist/esm/core/http/interfaces.d.ts.map +1 -0
  244. package/dist/esm/core/http/interfaces.js +2 -0
  245. package/dist/esm/core/rate-limiter/RateLimiter.d.ts +46 -0
  246. package/dist/esm/core/rate-limiter/RateLimiter.d.ts.map +1 -0
  247. package/dist/esm/core/rate-limiter/RateLimiter.js +106 -0
  248. package/dist/esm/core/rate-limiter/index.d.ts +3 -0
  249. package/dist/esm/core/rate-limiter/index.d.ts.map +1 -0
  250. package/dist/esm/core/rate-limiter/index.js +2 -0
  251. package/dist/esm/filters/index.d.ts +2 -0
  252. package/dist/esm/filters/index.d.ts.map +1 -0
  253. package/dist/esm/filters/index.js +2 -0
  254. package/dist/esm/filters/predicates.d.ts +85 -0
  255. package/dist/esm/filters/predicates.d.ts.map +1 -0
  256. package/dist/esm/filters/predicates.js +104 -0
  257. package/dist/esm/index.d.ts +11 -0
  258. package/dist/esm/index.d.ts.map +1 -0
  259. package/dist/esm/index.js +11 -0
  260. package/dist/esm/middleware/compose.d.ts +28 -0
  261. package/dist/esm/middleware/compose.d.ts.map +1 -0
  262. package/dist/esm/middleware/compose.js +85 -0
  263. package/dist/esm/middleware/index.d.ts +3 -0
  264. package/dist/esm/middleware/index.d.ts.map +1 -0
  265. package/dist/esm/middleware/index.js +2 -0
  266. package/dist/esm/middleware/types.d.ts +17 -0
  267. package/dist/esm/middleware/types.d.ts.map +1 -0
  268. package/dist/esm/middleware/types.js +2 -0
  269. package/dist/esm/transport/LongPollingTransport.d.ts +33 -0
  270. package/dist/esm/transport/LongPollingTransport.d.ts.map +1 -0
  271. package/dist/esm/transport/LongPollingTransport.js +149 -0
  272. package/dist/esm/transport/WebhookTransport.d.ts +40 -0
  273. package/dist/esm/transport/WebhookTransport.d.ts.map +1 -0
  274. package/dist/esm/transport/WebhookTransport.js +225 -0
  275. package/dist/esm/transport/index.d.ts +4 -0
  276. package/dist/esm/transport/index.d.ts.map +1 -0
  277. package/dist/esm/transport/index.js +3 -0
  278. package/dist/esm/transport/interfaces.d.ts +74 -0
  279. package/dist/esm/transport/interfaces.d.ts.map +1 -0
  280. package/dist/esm/transport/interfaces.js +2 -0
  281. package/dist/esm/types/bot.d.ts +19 -0
  282. package/dist/esm/types/bot.d.ts.map +1 -0
  283. package/dist/esm/types/bot.js +2 -0
  284. package/dist/esm/types/chat.d.ts +94 -0
  285. package/dist/esm/types/chat.d.ts.map +1 -0
  286. package/dist/esm/types/chat.js +2 -0
  287. package/dist/esm/types/common.d.ts +38 -0
  288. package/dist/esm/types/common.d.ts.map +1 -0
  289. package/dist/esm/types/common.js +5 -0
  290. package/dist/esm/types/index.d.ts +9 -0
  291. package/dist/esm/types/index.d.ts.map +1 -0
  292. package/dist/esm/types/index.js +10 -0
  293. package/dist/esm/types/keyboard.d.ts +97 -0
  294. package/dist/esm/types/keyboard.d.ts.map +1 -0
  295. package/dist/esm/types/keyboard.js +2 -0
  296. package/dist/esm/types/message.d.ts +162 -0
  297. package/dist/esm/types/message.d.ts.map +1 -0
  298. package/dist/esm/types/message.js +2 -0
  299. package/dist/esm/types/subscription.d.ts +23 -0
  300. package/dist/esm/types/subscription.d.ts.map +1 -0
  301. package/dist/esm/types/subscription.js +2 -0
  302. package/dist/esm/types/update.d.ts +99 -0
  303. package/dist/esm/types/update.d.ts.map +1 -0
  304. package/dist/esm/types/update.js +2 -0
  305. package/dist/esm/types/upload.d.ts +29 -0
  306. package/dist/esm/types/upload.d.ts.map +1 -0
  307. package/dist/esm/types/upload.js +2 -0
  308. package/dist/esm/utils/Histogram.d.ts +93 -0
  309. package/dist/esm/utils/Histogram.d.ts.map +1 -0
  310. package/dist/esm/utils/Histogram.js +99 -0
  311. package/dist/esm/utils/assertNever.d.ts +19 -0
  312. package/dist/esm/utils/assertNever.d.ts.map +1 -0
  313. package/dist/esm/utils/assertNever.js +21 -0
  314. package/dist/esm/utils/format.d.ts +22 -0
  315. package/dist/esm/utils/format.d.ts.map +1 -0
  316. package/dist/esm/utils/format.js +22 -0
  317. package/dist/esm/utils/index.d.ts +6 -0
  318. package/dist/esm/utils/index.d.ts.map +1 -0
  319. package/dist/esm/utils/index.js +5 -0
  320. package/dist/esm/utils/keyboard.d.ts +70 -0
  321. package/dist/esm/utils/keyboard.d.ts.map +1 -0
  322. package/dist/esm/utils/keyboard.js +162 -0
  323. package/dist/types/api/BotsApi.d.ts +17 -0
  324. package/dist/types/api/BotsApi.d.ts.map +1 -0
  325. package/dist/types/api/ChatsApi.d.ts +87 -0
  326. package/dist/types/api/ChatsApi.d.ts.map +1 -0
  327. package/dist/types/api/MessagesApi.d.ts +41 -0
  328. package/dist/types/api/MessagesApi.d.ts.map +1 -0
  329. package/dist/types/api/SubscriptionsApi.d.ts +45 -0
  330. package/dist/types/api/SubscriptionsApi.d.ts.map +1 -0
  331. package/dist/types/api/UploadsApi.d.ts +45 -0
  332. package/dist/types/api/UploadsApi.d.ts.map +1 -0
  333. package/dist/types/api/index.d.ts +7 -0
  334. package/dist/types/api/index.d.ts.map +1 -0
  335. package/dist/types/api/interfaces.d.ts +108 -0
  336. package/dist/types/api/interfaces.d.ts.map +1 -0
  337. package/dist/types/bot/Bot.d.ts +380 -0
  338. package/dist/types/bot/Bot.d.ts.map +1 -0
  339. package/dist/types/bot/Composer.d.ts +131 -0
  340. package/dist/types/bot/Composer.d.ts.map +1 -0
  341. package/dist/types/bot/context/BotStartedContext.d.ts +83 -0
  342. package/dist/types/bot/context/BotStartedContext.d.ts.map +1 -0
  343. package/dist/types/bot/context/CallbackContext.d.ts +107 -0
  344. package/dist/types/bot/context/CallbackContext.d.ts.map +1 -0
  345. package/dist/types/bot/context/ChatContext.d.ts +35 -0
  346. package/dist/types/bot/context/ChatContext.d.ts.map +1 -0
  347. package/dist/types/bot/context/MessageContext.d.ts +149 -0
  348. package/dist/types/bot/context/MessageContext.d.ts.map +1 -0
  349. package/dist/types/bot/context/guards.d.ts +69 -0
  350. package/dist/types/bot/context/guards.d.ts.map +1 -0
  351. package/dist/types/bot/context/index.d.ts +6 -0
  352. package/dist/types/bot/context/index.d.ts.map +1 -0
  353. package/dist/types/bot/dispatch.d.ts +51 -0
  354. package/dist/types/bot/dispatch.d.ts.map +1 -0
  355. package/dist/types/bot/index.d.ts +10 -0
  356. package/dist/types/bot/index.d.ts.map +1 -0
  357. package/dist/types/bot/lifecycle.d.ts +85 -0
  358. package/dist/types/bot/lifecycle.d.ts.map +1 -0
  359. package/dist/types/bot/metrics.d.ts +18 -0
  360. package/dist/types/bot/metrics.d.ts.map +1 -0
  361. package/dist/types/bot/routing.d.ts +131 -0
  362. package/dist/types/bot/routing.d.ts.map +1 -0
  363. package/dist/types/bot/triggers.d.ts +61 -0
  364. package/dist/types/bot/triggers.d.ts.map +1 -0
  365. package/dist/types/core/errors/MaxError.d.ts +11 -0
  366. package/dist/types/core/errors/MaxError.d.ts.map +1 -0
  367. package/dist/types/core/errors/errors.d.ts +59 -0
  368. package/dist/types/core/errors/errors.d.ts.map +1 -0
  369. package/dist/types/core/errors/index.d.ts +3 -0
  370. package/dist/types/core/errors/index.d.ts.map +1 -0
  371. package/dist/types/core/http/HttpClient.d.ts +28 -0
  372. package/dist/types/core/http/HttpClient.d.ts.map +1 -0
  373. package/dist/types/core/http/index.d.ts +3 -0
  374. package/dist/types/core/http/index.d.ts.map +1 -0
  375. package/dist/types/core/http/interfaces.d.ts +42 -0
  376. package/dist/types/core/http/interfaces.d.ts.map +1 -0
  377. package/dist/types/core/rate-limiter/RateLimiter.d.ts +46 -0
  378. package/dist/types/core/rate-limiter/RateLimiter.d.ts.map +1 -0
  379. package/dist/types/core/rate-limiter/index.d.ts +3 -0
  380. package/dist/types/core/rate-limiter/index.d.ts.map +1 -0
  381. package/dist/types/filters/index.d.ts +2 -0
  382. package/dist/types/filters/index.d.ts.map +1 -0
  383. package/dist/types/filters/predicates.d.ts +85 -0
  384. package/dist/types/filters/predicates.d.ts.map +1 -0
  385. package/dist/types/index.d.ts +11 -0
  386. package/dist/types/index.d.ts.map +1 -0
  387. package/dist/types/middleware/compose.d.ts +28 -0
  388. package/dist/types/middleware/compose.d.ts.map +1 -0
  389. package/dist/types/middleware/index.d.ts +3 -0
  390. package/dist/types/middleware/index.d.ts.map +1 -0
  391. package/dist/types/middleware/types.d.ts +17 -0
  392. package/dist/types/middleware/types.d.ts.map +1 -0
  393. package/dist/types/transport/LongPollingTransport.d.ts +33 -0
  394. package/dist/types/transport/LongPollingTransport.d.ts.map +1 -0
  395. package/dist/types/transport/WebhookTransport.d.ts +40 -0
  396. package/dist/types/transport/WebhookTransport.d.ts.map +1 -0
  397. package/dist/types/transport/index.d.ts +4 -0
  398. package/dist/types/transport/index.d.ts.map +1 -0
  399. package/dist/types/transport/interfaces.d.ts +74 -0
  400. package/dist/types/transport/interfaces.d.ts.map +1 -0
  401. package/dist/types/types/bot.d.ts +19 -0
  402. package/dist/types/types/bot.d.ts.map +1 -0
  403. package/dist/types/types/chat.d.ts +94 -0
  404. package/dist/types/types/chat.d.ts.map +1 -0
  405. package/dist/types/types/common.d.ts +38 -0
  406. package/dist/types/types/common.d.ts.map +1 -0
  407. package/dist/types/types/index.d.ts +9 -0
  408. package/dist/types/types/index.d.ts.map +1 -0
  409. package/dist/types/types/keyboard.d.ts +97 -0
  410. package/dist/types/types/keyboard.d.ts.map +1 -0
  411. package/dist/types/types/message.d.ts +162 -0
  412. package/dist/types/types/message.d.ts.map +1 -0
  413. package/dist/types/types/subscription.d.ts +23 -0
  414. package/dist/types/types/subscription.d.ts.map +1 -0
  415. package/dist/types/types/update.d.ts +99 -0
  416. package/dist/types/types/update.d.ts.map +1 -0
  417. package/dist/types/types/upload.d.ts +29 -0
  418. package/dist/types/types/upload.d.ts.map +1 -0
  419. package/dist/types/utils/Histogram.d.ts +93 -0
  420. package/dist/types/utils/Histogram.d.ts.map +1 -0
  421. package/dist/types/utils/assertNever.d.ts +19 -0
  422. package/dist/types/utils/assertNever.d.ts.map +1 -0
  423. package/dist/types/utils/format.d.ts +22 -0
  424. package/dist/types/utils/format.d.ts.map +1 -0
  425. package/dist/types/utils/index.d.ts +6 -0
  426. package/dist/types/utils/index.d.ts.map +1 -0
  427. package/dist/types/utils/keyboard.d.ts +70 -0
  428. package/dist/types/utils/keyboard.d.ts.map +1 -0
  429. package/package.json +84 -0
@@ -0,0 +1,163 @@
1
+ import { BotRouting } from "./routing.js";
2
+ /**
3
+ * Слой жизненного цикла и удобных методов.
4
+ *
5
+ * Отвечает за:
6
+ * - Запуск / остановку бота (`start` / `stop`) с Promise-мьютексом
7
+ * - Управление webhook (`setWebhookUrl`, `deleteWebhook`, `getWebhookInfo`)
8
+ * - Высокоуровневые методы отправки (`sendMessage`, `sendPrivateMessage`, `getMe`)
9
+ * - Конфигурацию наблюдателей (`onError`, `onSlowHandler`)
10
+ *
11
+ * Расширяет {@link BotRouting} — использует маршруты и middleware из него.
12
+ *
13
+ * Поля `api` и `transport` объявлены как `abstract` — конкретные значения
14
+ * предоставляет конструктор `Bot`.
15
+ */
16
+ export class BotLifecycle extends BotRouting {
17
+ // Promise-мьютекс: не null пока бот запущен или останавливается.
18
+ // Использование Promise вместо boolean-флага устраняет race condition:
19
+ // конкурентный вызов start() во время stop() получит актуальный статус
20
+ // без окна между проверкой флага и его установкой.
21
+ startPromise = null;
22
+ // ==================== Управление webhook ====================
23
+ /**
24
+ * Установить URL для webhook.
25
+ */
26
+ async setWebhookUrl(url) {
27
+ await this.api.subscriptions.subscribe({ url });
28
+ }
29
+ /**
30
+ * Удалить webhook.
31
+ */
32
+ async deleteWebhook() {
33
+ await this.api.subscriptions.unsubscribe();
34
+ }
35
+ /**
36
+ * Получить информацию о текущем webhook.
37
+ */
38
+ async getWebhookInfo() {
39
+ return this.api.subscriptions.getSubscriptions();
40
+ }
41
+ // ==================== Наблюдатели ====================
42
+ /**
43
+ * Зарегистрировать обработчик ошибок.
44
+ */
45
+ onError(handler) {
46
+ this.errorHandler = handler;
47
+ return this;
48
+ }
49
+ /**
50
+ * Назначить коллбэк для медленных обработчиков.
51
+ *
52
+ * Если обработка обновления заняла больше `thresholdMs` мс,
53
+ * вызывается `cb` с фактическим временем выполнения и типом обновления.
54
+ *
55
+ * @example
56
+ * bot.onSlowHandler(500, (ms, type) => {
57
+ * log.warn({ ms, type }, 'slow handler detected');
58
+ * });
59
+ */
60
+ onSlowHandler(thresholdMs, cb) {
61
+ this.slowThresholdMs = thresholdMs;
62
+ this.slowHandler = cb;
63
+ return this;
64
+ }
65
+ // ==================== Удобные методы ====================
66
+ /**
67
+ * Получить информацию о боте.
68
+ */
69
+ async getMe() {
70
+ return this.api.bots.getMe();
71
+ }
72
+ /**
73
+ * Отправить сообщение в чат.
74
+ */
75
+ async sendMessage(chatId, text, options) {
76
+ const body = {
77
+ text,
78
+ format: options?.format,
79
+ attachments: options?.attachments,
80
+ notify: options?.notify,
81
+ };
82
+ const response = await this.api.messages.sendMessage({ chat_id: chatId, disable_link_preview: options?.disable_link_preview }, body);
83
+ return response.message;
84
+ }
85
+ /**
86
+ * Отправить личное сообщение пользователю.
87
+ */
88
+ async sendPrivateMessage(userId, text, options) {
89
+ const body = {
90
+ text,
91
+ format: options?.format,
92
+ attachments: options?.attachments,
93
+ notify: options?.notify,
94
+ };
95
+ const response = await this.api.messages.sendMessage({ user_id: userId, disable_link_preview: options?.disable_link_preview }, body);
96
+ return response.message;
97
+ }
98
+ // ==================== Жизненный цикл ====================
99
+ /**
100
+ * Запустить бота.
101
+ */
102
+ async start() {
103
+ // Если уже есть активный Promise запуска/остановки — бот занят.
104
+ // Ждём завершения и только потом решаем, можно ли стартовать.
105
+ if (this.startPromise !== null) {
106
+ await this.startPromise;
107
+ throw new Error("Бот уже запущен. Вызовите stop() перед повторным запуском.");
108
+ }
109
+ // Сохраняем Promise до первого await — в JS между синхронными строками
110
+ // нет переключения контекста, поэтому конкурентный вызов увидит startPromise
111
+ // уже установленным ещё до любого await внутри _doStart().
112
+ const startTask = this._doStart();
113
+ this.startPromise = startTask;
114
+ try {
115
+ await startTask;
116
+ }
117
+ catch (error) {
118
+ // Сбрасываем только если это всё ещё актуальный lifecycle task.
119
+ if (this.startPromise === startTask) {
120
+ this.startPromise = null;
121
+ }
122
+ throw error;
123
+ }
124
+ }
125
+ /**
126
+ * Остановить бота.
127
+ */
128
+ async stop() {
129
+ if (this.startPromise === null) {
130
+ return; // уже остановлен — идемпотентно
131
+ }
132
+ const lifecycleTask = this.startPromise;
133
+ const stopTask = (async () => {
134
+ // Дожидаемся завершения запуска перед остановкой, чтобы transport.stop()
135
+ // всегда вызывался после transport.start().
136
+ try {
137
+ await lifecycleTask;
138
+ }
139
+ catch {
140
+ /* start упал — transport уже не запущен */
141
+ }
142
+ await this.transport.stop();
143
+ })();
144
+ // Держим mutex до полного завершения stop() — это закрывает окно гонки,
145
+ // в котором параллельный start() мог пройти до фактической остановки.
146
+ this.startPromise = stopTask;
147
+ try {
148
+ await stopTask;
149
+ }
150
+ finally {
151
+ if (this.startPromise === stopTask) {
152
+ this.startPromise = null;
153
+ }
154
+ }
155
+ }
156
+ async _doStart() {
157
+ // Проверка токена до запуска — fail fast.
158
+ // Лучше узнать о невалидном токене сразу, чем при первом обновлении.
159
+ await this.api.bots.getMe();
160
+ await this.transport.start();
161
+ }
162
+ }
163
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Метрики обработки одного обновления.
3
+ *
4
+ * Передаются в колбэк `BotConfig.onMetrics` после каждого обработанного update.
5
+ */
6
+ export interface BotMetrics {
7
+ /** Тип обновления (`message_created`, `message_callback`, и т.д.) */
8
+ updateType: string;
9
+ /** Общее время обработки update в миллисекундах (middleware + handlers) */
10
+ totalMs: number;
11
+ /** Размер очереди семафора **до** захвата слота (число ожидающих updates) */
12
+ queueSizeAtStart: number;
13
+ /** Число ошибок, выброшенных handlers во время обработки этого update */
14
+ handlerErrors: number;
15
+ /** Время выполнения каждого middleware в миллисекундах (в порядке регистрации) */
16
+ middlewareTimes: number[];
17
+ }
18
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/bot/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1,131 @@
1
+ import type { Middleware } from "../middleware/types.js";
2
+ import type { UpdateType } from "../types/update.js";
3
+ import { BotDispatch } from "./dispatch.js";
4
+ import type { Context } from "./Bot.js";
5
+ import { type HearsTrigger, type CommandTrigger } from "./triggers.js";
6
+ /**
7
+ * Слой маршрутизации.
8
+ *
9
+ * Отвечает за регистрацию обработчиков событий:
10
+ * - `on` / `onMessage` / `onCallback` / `onStart` — подписка на типы обновлений
11
+ * - `command` / `hears` / `action` — шорткаты с pattern matching
12
+ * - `use` / `filter` — middleware-цепочки и предикаты
13
+ *
14
+ * Расширяет {@link BotDispatch} — использует `handlers` и `middlewares` из него.
15
+ */
16
+ export declare abstract class BotRouting<Ctx extends Context> extends BotDispatch<Ctx> {
17
+ /**
18
+ * Зарегистрировать один или несколько обработчиков для события message_created.
19
+ *
20
+ * При нескольких аргументах промежуточные middleware должны вызывать `next()`;
21
+ * последний аргумент — финальный обработчик (next не нужен).
22
+ *
23
+ * @example С промежуточным middleware
24
+ * bot.onMessage(authMw, async (ctx) => { await ctx.reply('OK'); });
25
+ */
26
+ onMessage(...fns: Middleware<Ctx>[]): this;
27
+ /**
28
+ * Зарегистрировать один или несколько обработчиков для callback-запросов.
29
+ *
30
+ * @example
31
+ * bot.onCallback(logMw, async (ctx) => { ... });
32
+ */
33
+ onCallback(...fns: Middleware<Ctx>[]): this;
34
+ /**
35
+ * Зарегистрировать обработчик для события `bot_started`.
36
+ *
37
+ * Срабатывает когда пользователь нажимает Start в диалоге или переходит по deep link.
38
+ *
39
+ * @example Onboarding с deep link
40
+ * bot.onStart(async (ctx) => {
41
+ * if (isBotStartedContext(ctx) && ctx.startPayload) {
42
+ * await ctx.reply(`Реферал: ${ctx.startPayload}`);
43
+ * } else {
44
+ * await ctx.reply('Добро пожаловать!');
45
+ * }
46
+ * });
47
+ */
48
+ onStart(...fns: Middleware<Ctx>[]): this;
49
+ /**
50
+ * Зарегистрировать один или несколько обработчиков для любого типа обновления.
51
+ *
52
+ * @example Один обработчик
53
+ * bot.on('message_created', async (ctx) => { ... });
54
+ *
55
+ * @example Несколько middleware + обработчик
56
+ * bot.on('message_created', authMw, rateLimitMw, async (ctx) => { ... });
57
+ */
58
+ on(event: UpdateType, ...fns: Middleware<Ctx>[]): this;
59
+ /**
60
+ * Зарегистрировать обработчик команды.
61
+ *
62
+ * Срабатывает на `message_created`, если текст сообщения начинается с `/<name>`.
63
+ *
64
+ * @example Один обработчик
65
+ * bot.command('start', async (ctx) => { ... });
66
+ *
67
+ * @example Массив команд
68
+ * bot.command(['start', 'begin'], async (ctx) => { ... });
69
+ *
70
+ * @example С промежуточными middleware
71
+ * bot.command('pay', authMw, checkBalanceMw, async (ctx) => { ... });
72
+ */
73
+ command(name: CommandTrigger, ...fns: Middleware<Ctx>[]): this;
74
+ /**
75
+ * Зарегистрировать обработчик по regexp- или строковому фильтру текста сообщения.
76
+ *
77
+ * При совпадении RegExp устанавливает `ctx.match` с capture-группами.
78
+ *
79
+ * @example
80
+ * bot.hears(/(\d+)/, async (ctx) => { ... });
81
+ * bot.hears('привет', async (ctx) => { ... });
82
+ * bot.hears(['привет', /^hi/i], async (ctx) => { ... });
83
+ */
84
+ hears(pattern: HearsTrigger, ...fns: Middleware<Ctx>[]): this;
85
+ /**
86
+ * Зарегистрировать обработчик по `callback.payload`.
87
+ *
88
+ * `pattern` может быть строкой, RegExp или массивом — срабатывает на первое
89
+ * совпадение. При совпадении RegExp устанавливает `ctx.match` с capture-группами.
90
+ *
91
+ * @example
92
+ * bot.action('buy', handler);
93
+ * bot.action(/^buy:(\d+)$/, handler);
94
+ * bot.action(['confirm', 'ok'], handler); // оба payload
95
+ * bot.action([/^buy:/, /^sell:/], handler); // несколько RegExp
96
+ */
97
+ action(pattern: HearsTrigger, ...fns: Middleware<Ctx>[]): this;
98
+ /**
99
+ * Добавить глобальный middleware.
100
+ *
101
+ * Middleware выполняется **внутри** семафорного слота — backpressure применяется
102
+ * ко всему пайплайну целиком, а не только к финальным хендлерам.
103
+ *
104
+ * @example
105
+ * bot.use(async (ctx, next) => {
106
+ * console.log('before');
107
+ * await next();
108
+ * console.log('after');
109
+ * });
110
+ */
111
+ use(middleware: Middleware<Ctx>): this;
112
+ /**
113
+ * Подключить middleware только если предикат возвращает `true`.
114
+ *
115
+ * Если предикат не сработал — обновление прозрачно перетекает к следующим middleware.
116
+ *
117
+ * @example Только сообщения с текстом
118
+ * bot.filter(hasText, async (ctx) => {
119
+ * console.log(ctx.text.toUpperCase()); // ctx.text: string
120
+ * });
121
+ *
122
+ * @example Composer + filter
123
+ * const privateRouter = new Composer();
124
+ * privateRouter.command('start', handler);
125
+ * bot.filter(isPrivateChat, privateRouter.middleware());
126
+ */
127
+ filter<Narrowed extends Ctx>(predicate: (ctx: Ctx) => ctx is Narrowed, ...fns: Middleware<Narrowed>[]): this;
128
+ /** Цепочка из middleware: возвращает единый EventHandler, вызывающий каждый fn по очереди. */
129
+ private pipe;
130
+ }
131
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../src/bot/routing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,UAAU,CAAC;AACtD,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;GASG;AACH,8BAAsB,UAAU,CAAC,GAAG,SAAS,OAAO,CAAE,SAAQ,WAAW,CAAC,GAAG,CAAC;IAG5E;;;;;;;;OAQG;IACH,SAAS,CAAC,GAAG,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAI1C;;;;;OAKG;IACH,UAAU,CAAC,GAAG,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAI3C;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,GAAG,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAIxC;;;;;;;;OAQG;IACH,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAUtD;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAU9D;;;;;;;;;OASG;IACH,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAY7D;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAY9D;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI;IAKtC;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,QAAQ,SAAS,GAAG,EACzB,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,QAAQ,EACxC,GAAG,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,GAC7B,IAAI;IAWP,8FAA8F;IAC9F,OAAO,CAAC,IAAI;CAIb"}
@@ -0,0 +1,194 @@
1
+ import { compose } from "../middleware/compose.js";
2
+ import { isMessageContext, isCallbackContext } from "./context/guards.js";
3
+ import { BotDispatch } from "./dispatch.js";
4
+ import { matchTrigger, matchCommand, } from "./triggers.js";
5
+ /**
6
+ * Слой маршрутизации.
7
+ *
8
+ * Отвечает за регистрацию обработчиков событий:
9
+ * - `on` / `onMessage` / `onCallback` / `onStart` — подписка на типы обновлений
10
+ * - `command` / `hears` / `action` — шорткаты с pattern matching
11
+ * - `use` / `filter` — middleware-цепочки и предикаты
12
+ *
13
+ * Расширяет {@link BotDispatch} — использует `handlers` и `middlewares` из него.
14
+ */
15
+ export class BotRouting extends BotDispatch {
16
+ // ==================== Регистрация обработчиков ====================
17
+ /**
18
+ * Зарегистрировать один или несколько обработчиков для события message_created.
19
+ *
20
+ * При нескольких аргументах промежуточные middleware должны вызывать `next()`;
21
+ * последний аргумент — финальный обработчик (next не нужен).
22
+ *
23
+ * @example С промежуточным middleware
24
+ * bot.onMessage(authMw, async (ctx) => { await ctx.reply('OK'); });
25
+ */
26
+ onMessage(...fns) {
27
+ return this.on("message_created", ...fns);
28
+ }
29
+ /**
30
+ * Зарегистрировать один или несколько обработчиков для callback-запросов.
31
+ *
32
+ * @example
33
+ * bot.onCallback(logMw, async (ctx) => { ... });
34
+ */
35
+ onCallback(...fns) {
36
+ return this.on("message_callback", ...fns);
37
+ }
38
+ /**
39
+ * Зарегистрировать обработчик для события `bot_started`.
40
+ *
41
+ * Срабатывает когда пользователь нажимает Start в диалоге или переходит по deep link.
42
+ *
43
+ * @example Onboarding с deep link
44
+ * bot.onStart(async (ctx) => {
45
+ * if (isBotStartedContext(ctx) && ctx.startPayload) {
46
+ * await ctx.reply(`Реферал: ${ctx.startPayload}`);
47
+ * } else {
48
+ * await ctx.reply('Добро пожаловать!');
49
+ * }
50
+ * });
51
+ */
52
+ onStart(...fns) {
53
+ return this.on("bot_started", ...fns);
54
+ }
55
+ /**
56
+ * Зарегистрировать один или несколько обработчиков для любого типа обновления.
57
+ *
58
+ * @example Один обработчик
59
+ * bot.on('message_created', async (ctx) => { ... });
60
+ *
61
+ * @example Несколько middleware + обработчик
62
+ * bot.on('message_created', authMw, rateLimitMw, async (ctx) => { ... });
63
+ */
64
+ on(event, ...fns) {
65
+ const composed = this.pipe(...fns);
66
+ const handlers = this.handlers.get(event) ?? [];
67
+ handlers.push(composed);
68
+ this.handlers.set(event, handlers);
69
+ return this;
70
+ }
71
+ // ==================== Composer sugar ====================
72
+ /**
73
+ * Зарегистрировать обработчик команды.
74
+ *
75
+ * Срабатывает на `message_created`, если текст сообщения начинается с `/<name>`.
76
+ *
77
+ * @example Один обработчик
78
+ * bot.command('start', async (ctx) => { ... });
79
+ *
80
+ * @example Массив команд
81
+ * bot.command(['start', 'begin'], async (ctx) => { ... });
82
+ *
83
+ * @example С промежуточными middleware
84
+ * bot.command('pay', authMw, checkBalanceMw, async (ctx) => { ... });
85
+ */
86
+ command(name, ...fns) {
87
+ const composed = this.pipe(...fns);
88
+ return this.on("message_created", async (ctx) => {
89
+ if (!isMessageContext(ctx))
90
+ return;
91
+ if (matchCommand(name, ctx.text ?? "")) {
92
+ await composed(ctx);
93
+ }
94
+ });
95
+ }
96
+ /**
97
+ * Зарегистрировать обработчик по regexp- или строковому фильтру текста сообщения.
98
+ *
99
+ * При совпадении RegExp устанавливает `ctx.match` с capture-группами.
100
+ *
101
+ * @example
102
+ * bot.hears(/(\d+)/, async (ctx) => { ... });
103
+ * bot.hears('привет', async (ctx) => { ... });
104
+ * bot.hears(['привет', /^hi/i], async (ctx) => { ... });
105
+ */
106
+ hears(pattern, ...fns) {
107
+ const composed = this.pipe(...fns);
108
+ return this.on("message_created", async (ctx) => {
109
+ if (!isMessageContext(ctx))
110
+ return;
111
+ const result = matchTrigger(pattern, ctx.text ?? "");
112
+ if (result !== null) {
113
+ if (result !== true)
114
+ ctx.match = result;
115
+ await composed(ctx);
116
+ }
117
+ });
118
+ }
119
+ /**
120
+ * Зарегистрировать обработчик по `callback.payload`.
121
+ *
122
+ * `pattern` может быть строкой, RegExp или массивом — срабатывает на первое
123
+ * совпадение. При совпадении RegExp устанавливает `ctx.match` с capture-группами.
124
+ *
125
+ * @example
126
+ * bot.action('buy', handler);
127
+ * bot.action(/^buy:(\d+)$/, handler);
128
+ * bot.action(['confirm', 'ok'], handler); // оба payload
129
+ * bot.action([/^buy:/, /^sell:/], handler); // несколько RegExp
130
+ */
131
+ action(pattern, ...fns) {
132
+ const composed = this.pipe(...fns);
133
+ return this.on("message_callback", async (ctx) => {
134
+ if (!isCallbackContext(ctx))
135
+ return;
136
+ const result = matchTrigger(pattern, ctx.data);
137
+ if (result !== null) {
138
+ if (result !== true)
139
+ ctx.match = result;
140
+ await composed(ctx);
141
+ }
142
+ });
143
+ }
144
+ /**
145
+ * Добавить глобальный middleware.
146
+ *
147
+ * Middleware выполняется **внутри** семафорного слота — backpressure применяется
148
+ * ко всему пайплайну целиком, а не только к финальным хендлерам.
149
+ *
150
+ * @example
151
+ * bot.use(async (ctx, next) => {
152
+ * console.log('before');
153
+ * await next();
154
+ * console.log('after');
155
+ * });
156
+ */
157
+ use(middleware) {
158
+ this.middlewares.push(middleware);
159
+ return this;
160
+ }
161
+ /**
162
+ * Подключить middleware только если предикат возвращает `true`.
163
+ *
164
+ * Если предикат не сработал — обновление прозрачно перетекает к следующим middleware.
165
+ *
166
+ * @example Только сообщения с текстом
167
+ * bot.filter(hasText, async (ctx) => {
168
+ * console.log(ctx.text.toUpperCase()); // ctx.text: string
169
+ * });
170
+ *
171
+ * @example Composer + filter
172
+ * const privateRouter = new Composer();
173
+ * privateRouter.command('start', handler);
174
+ * bot.filter(isPrivateChat, privateRouter.middleware());
175
+ */
176
+ filter(predicate, ...fns) {
177
+ this.use(async (ctx, next) => {
178
+ if (predicate(ctx)) {
179
+ await compose(fns, async () => { })(ctx);
180
+ }
181
+ else {
182
+ await next();
183
+ }
184
+ });
185
+ return this;
186
+ }
187
+ /** Цепочка из middleware: возвращает единый EventHandler, вызывающий каждый fn по очереди. */
188
+ pipe(...fns) {
189
+ if (fns.length === 1)
190
+ return fns[0];
191
+ return compose(fns, async () => { });
192
+ }
193
+ }
194
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Тип паттерна для `hears()` и `action()`.
3
+ *
4
+ * Принимает:
5
+ * - строку — точное совпадение
6
+ * - RegExp — совпадение по регулярке, устанавливает `ctx.match`
7
+ * - массив строк/RegExp — срабатывает на **первое** совпадение из списка
8
+ *
9
+ * @example
10
+ * bot.hears('привет', handler); // строка
11
+ * bot.hears(/(\d+)\+(\d+)/, handler); // RegExp
12
+ * bot.hears([/^\d+$/, 'помощь'], handler); // массив: число ИЛИ "помощь"
13
+ *
14
+ * bot.action(['confirm', 'ok'], handler); // несколько строк
15
+ * bot.action([/^buy:/, /^sell:/], handler); // несколько RegExp
16
+ */
17
+ export type HearsTrigger = string | RegExp | ReadonlyArray<string | RegExp>;
18
+ /**
19
+ * Тип паттерна для `command()`.
20
+ *
21
+ * Принимает одну команду или массив команд (без учёта ведущего `/`).
22
+ *
23
+ * @example
24
+ * bot.command('start', handler); // /start
25
+ * bot.command(['start', 'begin'], handler); // /start или /begin
26
+ * bot.command(['/help', 'info'], handler); // ведущий / необязателен
27
+ */
28
+ export type CommandTrigger = string | ReadonlyArray<string>;
29
+ /**
30
+ * Проверяет `HearsTrigger` против строки, перебирая все паттерны.
31
+ *
32
+ * Возвращает результат **первого** совпавшего паттерна:
33
+ * - `RegExpExecArray` — если совпал RegExp (для установки `ctx.match`)
34
+ * - `true` — если совпала строка
35
+ * - `null` — ни один паттерн не совпал
36
+ *
37
+ * @example
38
+ * const result = matchTrigger([/^(\d+)$/, 'да'], '42');
39
+ * // result: RegExpExecArray — ['42', '42'], совпал первый паттерн
40
+ *
41
+ * const result2 = matchTrigger([/^\d+$/, 'да'], 'да');
42
+ * // result2: true — совпала строка
43
+ */
44
+ export declare function matchTrigger(trigger: HearsTrigger, text: string): RegExpExecArray | true | null;
45
+ /**
46
+ * Проверяет `CommandTrigger` против текста сообщения.
47
+ *
48
+ * Совпадение: текст равен `/<name>` или начинается с `/<name> ` (команда с аргументами).
49
+ * Сравнение регистронезависимо (`/Start` === `/start`).
50
+ *
51
+ * @returns `true` если хотя бы одна команда совпала, иначе `false`
52
+ *
53
+ * @example
54
+ * matchCommand('start', '/start') // true
55
+ * matchCommand('start', '/start arg1') // true
56
+ * matchCommand(['start', 'help'], '/help') // true
57
+ * matchCommand('start', '/stop') // false
58
+ * matchCommand('start', '/starter') // false — нет пробела после имени
59
+ */
60
+ export declare function matchCommand(trigger: CommandTrigger, text: string): boolean;
61
+ //# sourceMappingURL=triggers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../../src/bot/triggers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAE5E;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAyB5D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,MAAM,GACX,eAAe,GAAG,IAAI,GAAG,IAAI,CAU/B;AAWD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAW3E"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Проверяет один паттерн против строки.
3
+ *
4
+ * Для RegExp с флагами `g`/`y` создаёт новый объект при каждом вызове,
5
+ * чтобы избежать сдвига `lastIndex` между вызовами.
6
+ *
7
+ * @returns Массив совпадения (RegExp), `true` (строка) или `null` (нет совпадения)
8
+ */
9
+ function matchOne(pattern, text) {
10
+ if (pattern instanceof RegExp) {
11
+ // Создаём новый RegExp для stateful-флагов чтобы lastIndex не сохранялся
12
+ const re = pattern.flags.includes("g") || pattern.flags.includes("y")
13
+ ? new RegExp(pattern.source, pattern.flags)
14
+ : pattern;
15
+ return re.exec(text) ?? null;
16
+ }
17
+ return text === pattern ? true : null;
18
+ }
19
+ /**
20
+ * Проверяет `HearsTrigger` против строки, перебирая все паттерны.
21
+ *
22
+ * Возвращает результат **первого** совпавшего паттерна:
23
+ * - `RegExpExecArray` — если совпал RegExp (для установки `ctx.match`)
24
+ * - `true` — если совпала строка
25
+ * - `null` — ни один паттерн не совпал
26
+ *
27
+ * @example
28
+ * const result = matchTrigger([/^(\d+)$/, 'да'], '42');
29
+ * // result: RegExpExecArray — ['42', '42'], совпал первый паттерн
30
+ *
31
+ * const result2 = matchTrigger([/^\d+$/, 'да'], 'да');
32
+ * // result2: true — совпала строка
33
+ */
34
+ export function matchTrigger(trigger, text) {
35
+ const patterns = Array.isArray(trigger)
36
+ ? trigger
37
+ : [trigger];
38
+ for (const p of patterns) {
39
+ const result = matchOne(p, text);
40
+ if (result !== null)
41
+ return result;
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Нормализует имя команды: убирает ведущий `/`, приводит к нижнему регистру.
47
+ *
48
+ * @internal
49
+ */
50
+ function normalizeCommandName(name) {
51
+ return (name.startsWith("/") ? name.slice(1) : name).toLowerCase();
52
+ }
53
+ /**
54
+ * Проверяет `CommandTrigger` против текста сообщения.
55
+ *
56
+ * Совпадение: текст равен `/<name>` или начинается с `/<name> ` (команда с аргументами).
57
+ * Сравнение регистронезависимо (`/Start` === `/start`).
58
+ *
59
+ * @returns `true` если хотя бы одна команда совпала, иначе `false`
60
+ *
61
+ * @example
62
+ * matchCommand('start', '/start') // true
63
+ * matchCommand('start', '/start arg1') // true
64
+ * matchCommand(['start', 'help'], '/help') // true
65
+ * matchCommand('start', '/stop') // false
66
+ * matchCommand('start', '/starter') // false — нет пробела после имени
67
+ */
68
+ export function matchCommand(trigger, text) {
69
+ const names = Array.isArray(trigger)
70
+ ? trigger
71
+ : [trigger];
72
+ const lower = text.toLowerCase();
73
+ for (const raw of names) {
74
+ const cmd = `/${normalizeCommandName(raw)}`;
75
+ if (lower === cmd || lower.startsWith(`${cmd} `))
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+ //# sourceMappingURL=triggers.js.map