@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,620 @@
1
+ import { BotsApi, ChatsApi, MessagesApi, SubscriptionsApi, UploadsApi, } from "../api/index.js";
2
+ import { HttpClient } from "../core/http/HttpClient.js";
3
+ import { RateLimiter, } from "../core/rate-limiter/RateLimiter.js";
4
+ import { LongPollingTransport } from "../transport/LongPollingTransport.js";
5
+ import { WebhookTransport } from "../transport/WebhookTransport.js";
6
+ import { CallbackContext } from "./context/CallbackContext.js";
7
+ import { ChatContext } from "./context/ChatContext.js";
8
+ import { BotStartedContext } from "./context/BotStartedContext.js";
9
+ import { MessageContext, } from "./context/MessageContext.js";
10
+ import { assertNever } from "../utils/assertNever.js";
11
+ import { compose, composeWithTiming } from "../middleware/compose.js";
12
+ import { isMessageContext, isCallbackContext } from "./context/guards.js";
13
+ import { matchTrigger, matchCommand, } from "./triggers.js";
14
+ const BASE_URL = "https://platform-api.max.ru";
15
+ /**
16
+ * Главный класс бота.
17
+ *
18
+ * Параметр `Ctx` задаёт тип контекста, передаваемого в middleware и handlers.
19
+ * По умолчанию — базовый `Context = MessageContext | CallbackContext | ChatContext`.
20
+ * Используй `contextFactory` в конфиге чтобы расширить контекст своими полями.
21
+ *
22
+ * @example Базовое использование
23
+ * const bot = new Bot({ token: '...', transport: 'polling' });
24
+ *
25
+ * @example Расширенный контекст
26
+ * const bot = new Bot<MyCtx>({ token: '...', transport: 'polling', contextFactory: buildCtx });
27
+ */
28
+ export class Bot {
29
+ /** Доступ к низкоуровневым API для продвинутых сценариев */
30
+ api;
31
+ http;
32
+ transport;
33
+ contextApi;
34
+ _contextFactory;
35
+ handlers = new Map();
36
+ middlewares = [];
37
+ errorHandler = null;
38
+ slowHandler = null;
39
+ slowThresholdMs = 0;
40
+ unknownUpdateHandler = null;
41
+ metricsHandler = null;
42
+ // Семафор для backpressure: ограничивает число параллельных обработчиков.
43
+ concurrency;
44
+ activeCount = 0;
45
+ waitQueue = [];
46
+ // Promise-мьютекс: не null пока бот запущен или останавливается.
47
+ // Использование Promise вместо boolean-флага устраняет race condition:
48
+ // конкурентный вызов start() во время stop() получит актуальный статус
49
+ // без окна между проверкой флага и его установкой.
50
+ startPromise = null;
51
+ constructor(config) {
52
+ // Собираем граф зависимостей — каждый компонент получает только то, что ему нужно
53
+ const rateLimiter = config.rateLimiter ?? new RateLimiter();
54
+ // Если contextFactory не задана — идентичная функция (Ctx = Context по умолчанию)
55
+ this._contextFactory = config.contextFactory ?? ((base) => base);
56
+ this.unknownUpdateHandler = config.onUnknownUpdate ?? null;
57
+ this.metricsHandler = config.onMetrics ?? null;
58
+ this.http = new HttpClient({
59
+ baseUrl: config.baseUrl ?? BASE_URL,
60
+ token: config.token,
61
+ rateLimiter,
62
+ });
63
+ // Инициализируем API-сервисы
64
+ const bots = new BotsApi(this.http);
65
+ const chats = new ChatsApi(this.http);
66
+ const messages = new MessagesApi(this.http);
67
+ const subscriptions = new SubscriptionsApi(this.http);
68
+ // Токен передаётся явно — UploadsApi использует его для прямых fetch-запросов
69
+ const uploads = new UploadsApi(this.http, config.token);
70
+ this.api = { bots, chats, messages, subscriptions, uploads };
71
+ this.contextApi = { bots, chats, messages, subscriptions, uploads };
72
+ // Выбираем стратегию транспорта — паттерн Strategy
73
+ this.transport =
74
+ config.transport === "webhook"
75
+ ? new WebhookTransport(subscriptions, config.webhook)
76
+ : new LongPollingTransport(subscriptions, config.polling);
77
+ const concurrency = config.concurrency ?? 10;
78
+ if (!(concurrency === Infinity ||
79
+ (Number.isInteger(concurrency) && concurrency > 0))) {
80
+ throw new Error("Параметр concurrency должен быть положительным целым числом или Infinity");
81
+ }
82
+ this.concurrency = concurrency;
83
+ this.transport.onUpdate(this.handleUpdate.bind(this));
84
+ this.transport.onError(this.handleError.bind(this));
85
+ }
86
+ // ==================== Управление webhook ====================
87
+ /**
88
+ * Установить URL для webhook.
89
+ */
90
+ async setWebhookUrl(url) {
91
+ await this.api.subscriptions.subscribe({ url });
92
+ }
93
+ /**
94
+ * Удалить webhook.
95
+ */
96
+ async deleteWebhook() {
97
+ await this.api.subscriptions.unsubscribe();
98
+ }
99
+ /**
100
+ * Получить информацию о текущем webhook.
101
+ */
102
+ async getWebhookInfo() {
103
+ return this.api.subscriptions.getSubscriptions();
104
+ }
105
+ // ==================== Регистрация обработчиков ====================
106
+ /**
107
+ * Зарегистрировать один или несколько обработчиков для события message_created.
108
+ *
109
+ * При нескольких аргументах промежуточные middleware должны вызывать `next()`;
110
+ * последний аргумент — финальный обработчик (next не нужен).
111
+ *
112
+ * @example С промежуточным middleware
113
+ * bot.onMessage(authMw, async (ctx) => { await ctx.reply('OK'); });
114
+ */
115
+ onMessage(...fns) {
116
+ return this.on("message_created", ...fns);
117
+ }
118
+ /**
119
+ * Зарегистрировать один или несколько обработчиков для callback-запросов.
120
+ *
121
+ * При нескольких аргументах промежуточные middleware должны вызывать `next()`.
122
+ *
123
+ * @example
124
+ * bot.onCallback(logMw, async (ctx) => { ... });
125
+ */
126
+ onCallback(...fns) {
127
+ return this.on("message_callback", ...fns);
128
+ }
129
+ /**
130
+ * Зарегистрировать обработчик для события `bot_started`.
131
+ *
132
+ * Срабатывает когда пользователь нажимает Start в диалоге или переходит по deep link.
133
+ *
134
+ * @example Onboarding с deep link
135
+ * bot.onStart(async (ctx) => {
136
+ * if (isBotStartedContext(ctx) && ctx.startPayload) {
137
+ * await ctx.reply(`Вы пришли по реферальной ссылке: ${ctx.startPayload}`);
138
+ * } else {
139
+ * await ctx.reply('Добро пожаловать!');
140
+ * }
141
+ * });
142
+ */
143
+ onStart(...fns) {
144
+ return this.on("bot_started", ...fns);
145
+ }
146
+ /**
147
+ * Зарегистрировать один или несколько обработчиков для любого типа обновления.
148
+ *
149
+ * При нескольких аргументах промежуточные middleware должны вызывать `next()`;
150
+ * последний аргумент — финальный обработчик.
151
+ *
152
+ * @example Один обработчик (прежнее поведение)
153
+ * bot.on('message_created', async (ctx) => { ... });
154
+ *
155
+ * @example Несколько middleware + обработчик
156
+ * bot.on('message_created', authMw, rateLimitMw, async (ctx) => { ... });
157
+ */
158
+ on(event, ...fns) {
159
+ const composed = this.pipe(...fns);
160
+ const handlers = this.handlers.get(event) ?? [];
161
+ handlers.push(composed);
162
+ this.handlers.set(event, handlers);
163
+ return this;
164
+ }
165
+ /** Цепочка из middleware: возвращает единый EventHandler, вызывающий каждый fn по очереди. */
166
+ pipe(...fns) {
167
+ if (fns.length === 1)
168
+ return fns[0];
169
+ return compose(fns, async () => { });
170
+ }
171
+ // ==================== Composer sugar ====================
172
+ /**
173
+ * Зарегистрировать обработчик команды.
174
+ *
175
+ * Срабатывает на `message_created`, если текст сообщения начинается с `/<name>` (с аргументами или без).
176
+ * Обработчик получает полный `Ctx` — для сужения до `MessageContext` используй `isMessageContext(ctx)`.
177
+ *
178
+ * @param name - Имя команды без слеша (`start`, `help`, и т.\u0434.)
179
+ * @param fns - Один или несколько middleware/обработчиков. Промежуточные должны вызывать `next()`.
180
+ *
181
+ * @example Один обработчик
182
+ * bot.command('start', async (ctx) => {
183
+ * if (isMessageContext(ctx)) await ctx.reply('Добро пожаловать!');
184
+ * });
185
+ *
186
+ * @example Массив команд
187
+ * bot.command(['start', 'begin'], async (ctx) => {
188
+ * await ctx.reply('Добро пожаловать!');
189
+ * });
190
+ *
191
+ * @example С промежуточными middleware
192
+ * bot.command('pay', authMw, checkBalanceMw, async (ctx) => {
193
+ * await ctx.reply('Оплата выполнена');
194
+ * });
195
+ */
196
+ command(name, ...fns) {
197
+ const composed = this.pipe(...fns);
198
+ return this.on("message_created", async (ctx) => {
199
+ if (!isMessageContext(ctx))
200
+ return;
201
+ if (matchCommand(name, ctx.text ?? "")) {
202
+ await composed(ctx);
203
+ }
204
+ });
205
+ }
206
+ /**
207
+ * Зарегистрировать обработчик по regexp- или строковому фильтру текста сообщения.
208
+ *
209
+ * Срабатывает на `message_created`, если `ctx.text` совпадает с `pattern`.
210
+ *
211
+ * @param pattern - Строка (точное совпадение) или `RegExp`
212
+ * @param fns - Один или несколько middleware/обработчиков. Промежуточные должны вызывать `next()`.
213
+ *
214
+ * @example Один обработчик
215
+ * bot.hears('привет', async (ctx) => { ... });
216
+ * bot.hears(/^\u043fр/i, async (ctx) => { ... });
217
+ * bot.hears(/(\d+)/, async (ctx) => {
218
+ * if (isMessageContext(ctx)) console.log(ctx.match?.[1]); // группа захвата
219
+ * });
220
+ *
221
+ * @example С промежуточными middleware
222
+ * bot.hears(/^\u043fоплата/, authMw, async (ctx) => { ... });
223
+ */
224
+ hears(pattern, ...fns) {
225
+ const composed = this.pipe(...fns);
226
+ return this.on("message_created", async (ctx) => {
227
+ if (!isMessageContext(ctx))
228
+ return;
229
+ const result = matchTrigger(pattern, ctx.text ?? "");
230
+ if (result !== null) {
231
+ if (result !== true)
232
+ ctx.match = result;
233
+ await composed(ctx);
234
+ }
235
+ });
236
+ }
237
+ /**
238
+ * Зарегистрировать обработчик по `callback.payload`.
239
+ *
240
+ * Срабатывает на `message_callback`, если `ctx.data` совпадает с `pattern`.
241
+ *
242
+ * @param pattern - Строка (точное совпадение) или `RegExp`
243
+ * @param fns - Один или несколько middleware/обработчиков. Промежуточные должны вызывать `next()`.
244
+ *
245
+ * @example Один обработчик
246
+ * bot.action('buy', async (ctx) => { ... });
247
+ * bot.action(/^action:/, async (ctx) => { ... });
248
+ * bot.action(/^buy:(\d+)$/, async (ctx) => {
249
+ * if (isCallbackContext(ctx)) console.log(ctx.match?.[1]); // id из payload
250
+ * });
251
+ *
252
+ * @example С промежуточными middleware
253
+ * bot.action(/^buy:/, authMw, checkStockMw, async (ctx) => { ... });
254
+ */
255
+ action(pattern, ...fns) {
256
+ const composed = this.pipe(...fns);
257
+ return this.on("message_callback", async (ctx) => {
258
+ if (!isCallbackContext(ctx))
259
+ return;
260
+ const result = matchTrigger(pattern, ctx.data);
261
+ if (result !== null) {
262
+ if (result !== true)
263
+ ctx.match = result;
264
+ await composed(ctx);
265
+ }
266
+ });
267
+ }
268
+ /**
269
+ * Зарегистрировать middleware, выполняемый перед обработчиками события.
270
+ *
271
+ * Middleware выполняется **внутри** семафорного слота — backpressure применяется
272
+ * ко всему пайплайну целиком, а не только к финальным хендлерам.
273
+ *
274
+ * @example
275
+ * bot.use(async (ctx, next) => {
276
+ * console.log('before handlers');
277
+ * await next();
278
+ * console.log('after handlers');
279
+ * });
280
+ */
281
+ use(middleware) {
282
+ this.middlewares.push(middleware);
283
+ return this;
284
+ }
285
+ /**
286
+ * Подключить middleware только если предикат возвращает `true`.
287
+ *
288
+ * Сочетается с предикатами из модуля `filters` и с `ctx.has()` для type narrowing.
289
+ * Если предикат не сработал — обновление прозрачно перетекает к следующим middleware.
290
+ *
291
+ * @example Только сообщения с текстом
292
+ * ```ts
293
+ * bot.filter(hasText, async (ctx) => {
294
+ * console.log(ctx.text.toUpperCase()); // ctx.text: string
295
+ * });
296
+ * ```
297
+ *
298
+ * @example Комбинация с Composer
299
+ * ```ts
300
+ * const privateRouter = new Composer();
301
+ * privateRouter.command('start', handler);
302
+ * bot.filter(isPrivateChat, privateRouter.middleware());
303
+ * ```
304
+ */
305
+ filter(predicate, ...fns) {
306
+ this.use(async (ctx, next) => {
307
+ if (predicate(ctx)) {
308
+ await compose(fns, async () => { })(ctx);
309
+ }
310
+ else {
311
+ await next();
312
+ }
313
+ });
314
+ return this;
315
+ }
316
+ /**
317
+ * Зарегистрировать обработчик ошибок.
318
+ */
319
+ onError(handler) {
320
+ this.errorHandler = handler;
321
+ return this;
322
+ }
323
+ /**
324
+ * Назначить коллбэк для медленных обработчиков.
325
+ *
326
+ * Если обработка обновления (включая middleware и handlers) заняла больше `thresholdMs` мс,
327
+ * вызывается `cb` с фактическим временем выполнения и типом обновления.
328
+ *
329
+ * Используйте для SLO-мониторинга и диагностики производительности.
330
+ *
331
+ * @param thresholdMs - Пороговое значение в миллисекундах
332
+ * @param cb - Коллбэк, получающий фактическое время выполнения (ms) и тип обновления
333
+ *
334
+ * @example
335
+ * bot.onSlowHandler(500, (ms, type) => {
336
+ * log.warn({ ms, type }, 'slow handler detected');
337
+ * });
338
+ */
339
+ onSlowHandler(thresholdMs, cb) {
340
+ this.slowThresholdMs = thresholdMs;
341
+ this.slowHandler = cb;
342
+ return this;
343
+ }
344
+ // ==================== Удобные методы ====================
345
+ /**
346
+ * Получить информацию о боте.
347
+ */
348
+ async getMe() {
349
+ return this.api.bots.getMe();
350
+ }
351
+ /**
352
+ * Отправить сообщение в чат.
353
+ */
354
+ async sendMessage(chatId, text, options) {
355
+ const body = {
356
+ text,
357
+ format: options?.format,
358
+ attachments: options?.attachments,
359
+ notify: options?.notify,
360
+ };
361
+ const response = await this.api.messages.sendMessage({ chat_id: chatId, disable_link_preview: options?.disable_link_preview }, body);
362
+ return response.message;
363
+ }
364
+ /**
365
+ * Отправить личное сообщение пользователю.
366
+ */
367
+ async sendPrivateMessage(userId, text, options) {
368
+ const body = {
369
+ text,
370
+ format: options?.format,
371
+ attachments: options?.attachments,
372
+ notify: options?.notify,
373
+ };
374
+ const response = await this.api.messages.sendMessage({ user_id: userId, disable_link_preview: options?.disable_link_preview }, body);
375
+ return response.message;
376
+ }
377
+ // ==================== Жизненный цикл ====================
378
+ /**
379
+ * Запустить бота.
380
+ */
381
+ async start() {
382
+ // Если уже есть активный Promise запуска/остановки — бот занят.
383
+ // Ждём завершения и только потом решаем, можно ли стартовать.
384
+ if (this.startPromise !== null) {
385
+ await this.startPromise;
386
+ throw new Error("Бот уже запущен. Вызовите stop() перед повторным запуском.");
387
+ }
388
+ // Сохраняем Promise до первого await — в JS между синхронными строками
389
+ // нет переключения контекста, поэтому конкурентный вызов увидит startPromise
390
+ // уже установленным ещё до любого await внутри _doStart().
391
+ const startTask = this._doStart();
392
+ this.startPromise = startTask;
393
+ try {
394
+ await startTask;
395
+ }
396
+ catch (error) {
397
+ // Сбрасываем только если это всё ещё актуальный lifecycle task.
398
+ // Если параллельно начался stop(), startPromise уже указывает на stop-task.
399
+ if (this.startPromise === startTask) {
400
+ this.startPromise = null;
401
+ }
402
+ throw error;
403
+ }
404
+ }
405
+ async _doStart() {
406
+ // Проверка токена до запуска — fail fast.
407
+ // Лучше узнать о невалидном токене сразу, чем при первом обновлении.
408
+ await this.api.bots.getMe();
409
+ await this.transport.start();
410
+ }
411
+ /**
412
+ * Остановить бота.
413
+ */
414
+ async stop() {
415
+ if (this.startPromise === null) {
416
+ return; // уже остановлен — идемпотентно
417
+ }
418
+ const lifecycleTask = this.startPromise;
419
+ const stopTask = (async () => {
420
+ // Дожидаемся завершения запуска перед остановкой, чтобы transport.stop()
421
+ // всегда вызывался после transport.start().
422
+ try {
423
+ await lifecycleTask;
424
+ }
425
+ catch {
426
+ /* start упал — transport уже не запущен */
427
+ }
428
+ await this.transport.stop();
429
+ })();
430
+ // Держим mutex до полного завершения stop() — это закрывает окно гонки,
431
+ // в котором параллельный start() мог пройти до фактической остановки.
432
+ this.startPromise = stopTask;
433
+ try {
434
+ await stopTask;
435
+ }
436
+ finally {
437
+ if (this.startPromise === stopTask) {
438
+ this.startPromise = null;
439
+ }
440
+ }
441
+ }
442
+ // ==================== Внутренние методы ====================
443
+ handleUpdate(update) {
444
+ let ctx;
445
+ try {
446
+ const base = this.createContext(update);
447
+ // null — знак что update_type неизвестен и хук onUnknownUpdate уже вызван;
448
+ // пропускаем update без ошибки
449
+ if (base === null)
450
+ return;
451
+ ctx = this._contextFactory(base);
452
+ }
453
+ catch (error) {
454
+ this.handleError(error instanceof Error ? error : new Error(String(error)));
455
+ return;
456
+ }
457
+ const handlers = this.handlers.get(update.update_type) ?? [];
458
+ // Пропускаем только если нет ни middleware, ни handlers — тогда обрабатывать
459
+ // буквально нечего и мы не занимаем слот семафора впустую.
460
+ // Если есть хотя бы middleware — запускаем пайплайн: глобальные middleware
461
+ // (логирование, трейсинг) должны видеть ВСЕ update типы.
462
+ if (this.middlewares.length === 0 && handlers.length === 0)
463
+ return;
464
+ // Запускаем обработку через семафор — гарантируем не более concurrency
465
+ // параллельных задач. Каждое обновление обрабатывается как единица:
466
+ // все его хендлеры выполняются параллельно внутри одного слота семафора.
467
+ void this.runHandlersWithSemaphore(ctx, handlers, update.update_type);
468
+ }
469
+ async runHandlersWithSemaphore(ctx, handlers, updateType) {
470
+ const needMetrics = this.metricsHandler !== null;
471
+ const needSlow = this.slowHandler !== null;
472
+ // Размер очереди ДО захвата слота — показывает реальное давление
473
+ const queueSizeAtStart = this.waitQueue.length;
474
+ await this.acquireSemaphore();
475
+ const start = needMetrics || needSlow ? Date.now() : 0;
476
+ let handlerErrors = 0;
477
+ const middlewareTimes = [];
478
+ try {
479
+ // Финальный обработчик — запускает все зарегистрированные handlers параллельно
480
+ const finalHandler = async (c) => {
481
+ await Promise.all(handlers.map(async (handler) => {
482
+ try {
483
+ await handler(c);
484
+ }
485
+ catch (error) {
486
+ handlerErrors++;
487
+ this.handleError(error instanceof Error ? error : new Error(String(error)));
488
+ }
489
+ }));
490
+ };
491
+ // Весь пайплайн [middlewares... → handlers] выполняется внутри одного
492
+ // семафорного слота — backpressure применяется ко всему цепочке целиком.
493
+ const pipeline = needMetrics
494
+ ? composeWithTiming(this.middlewares, finalHandler, middlewareTimes)
495
+ : compose(this.middlewares, finalHandler);
496
+ await pipeline(ctx);
497
+ }
498
+ finally {
499
+ const elapsed = needMetrics || needSlow ? Date.now() - start : 0;
500
+ if (needSlow && elapsed >= this.slowThresholdMs) {
501
+ try {
502
+ this.slowHandler?.(elapsed, updateType);
503
+ }
504
+ catch {
505
+ // Ошибки наблюдателей не должны влиять на основной поток
506
+ }
507
+ }
508
+ if (needMetrics) {
509
+ try {
510
+ this.metricsHandler?.({
511
+ updateType,
512
+ totalMs: elapsed,
513
+ queueSizeAtStart,
514
+ handlerErrors,
515
+ middlewareTimes,
516
+ });
517
+ }
518
+ catch {
519
+ // Ошибки наблюдателей не должны влиять на основной поток
520
+ }
521
+ }
522
+ this.releaseSemaphore();
523
+ }
524
+ }
525
+ /**
526
+ * Захватить слот семафора.
527
+ * Если свободных слотов нет — ждём в очереди.
528
+ */
529
+ acquireSemaphore() {
530
+ if (this.activeCount < this.concurrency) {
531
+ this.activeCount++;
532
+ return Promise.resolve();
533
+ }
534
+ return new Promise((resolve) => {
535
+ this.waitQueue.push(resolve);
536
+ });
537
+ }
538
+ /**
539
+ * Освободить слот семафора и разбудить следующего в очереди.
540
+ */
541
+ releaseSemaphore() {
542
+ const next = this.waitQueue.shift();
543
+ if (next) {
544
+ // Передаём слот напрямую — activeCount не меняется
545
+ next();
546
+ }
547
+ else {
548
+ this.activeCount--;
549
+ }
550
+ }
551
+ handleError(error) {
552
+ if (this.errorHandler) {
553
+ try {
554
+ this.errorHandler(error);
555
+ }
556
+ catch {
557
+ // Игнорируем ошибки в обработчике ошибок
558
+ console.error("Ошибка в обработчике ошибок:", error);
559
+ }
560
+ }
561
+ else {
562
+ // По умолчанию логируем в консоль
563
+ console.error("Ошибка бота:", error);
564
+ }
565
+ }
566
+ /**
567
+ * Создаёт типизированный контекст из сырого обновления.
568
+ *
569
+ * Возвращает `null` если `update_type` неизвестен SDK **и** задан хук
570
+ * {@link BotConfig.onUnknownUpdate} — хук уже вызван, update нужно пропустить.
571
+ * Если хук не задан — бросает ошибку через {@link assertNever} → `errorHandler`.
572
+ *
573
+ * ### Обработка неизвестных update_type
574
+ *
575
+ * TypeScript гарантирует exhaustiveness: если появится новый `update_type`
576
+ * в типах `Update`, компилятор выдаст ошибку в `default`-ветке через
577
+ * {@link assertNever}. Это предотвращает рантайм-краши при изменении типов.
578
+ *
579
+ * **Рантайм-сценарий**: Если платформа присылает `update_type`, которого
580
+ * **нет в типах SDK** (например, новая версия API), используй
581
+ * {@link BotConfig.onUnknownUpdate} для явного контроля:
582
+ *
583
+ * ```typescript
584
+ * const bot = new Bot({
585
+ * token: '...',
586
+ * transport: 'polling',
587
+ * onUnknownUpdate: (raw) => console.warn('unknown update_type:', raw.update_type),
588
+ * });
589
+ * ```
590
+ */
591
+ createContext(update) {
592
+ switch (update.update_type) {
593
+ case "message_callback":
594
+ return new CallbackContext(update, this.contextApi);
595
+ case "message_created":
596
+ case "message_edited":
597
+ case "message_removed":
598
+ return new MessageContext(update, this.contextApi);
599
+ case "bot_added":
600
+ case "bot_removed":
601
+ case "user_added":
602
+ case "user_removed":
603
+ case "chat_title_changed":
604
+ return new ChatContext(update);
605
+ case "bot_started":
606
+ return new BotStartedContext(update, this.contextApi);
607
+ default:
608
+ // TypeScript проверит здесь что все варианты UpdateType обработаны выше.
609
+ // Если появится новый update_type — будет ошибка компиляции, а не рантайм-краш.
610
+ if (this.unknownUpdateHandler) {
611
+ // Хук вызван, возвращаем null — handleUpdate пропустит update без ошибки
612
+ this.unknownUpdateHandler(update);
613
+ return null;
614
+ }
615
+ // Хук не задан — бросаем ошибку, она уйдёт в errorHandler
616
+ return assertNever(update);
617
+ }
618
+ }
619
+ }
620
+ //# sourceMappingURL=Bot.js.map