@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.
- package/CHANGELOG.md +9 -0
- package/LICENSE +21 -0
- package/README.md +1176 -0
- package/dist/cjs/api/BotsApi.d.ts +17 -0
- package/dist/cjs/api/BotsApi.d.ts.map +1 -0
- package/dist/cjs/api/BotsApi.js +22 -0
- package/dist/cjs/api/ChatsApi.d.ts +87 -0
- package/dist/cjs/api/ChatsApi.d.ts.map +1 -0
- package/dist/cjs/api/ChatsApi.js +144 -0
- package/dist/cjs/api/MessagesApi.d.ts +41 -0
- package/dist/cjs/api/MessagesApi.d.ts.map +1 -0
- package/dist/cjs/api/MessagesApi.js +66 -0
- package/dist/cjs/api/SubscriptionsApi.d.ts +45 -0
- package/dist/cjs/api/SubscriptionsApi.d.ts.map +1 -0
- package/dist/cjs/api/SubscriptionsApi.js +69 -0
- package/dist/cjs/api/UploadsApi.d.ts +45 -0
- package/dist/cjs/api/UploadsApi.d.ts.map +1 -0
- package/dist/cjs/api/UploadsApi.js +113 -0
- package/dist/cjs/api/index.d.ts +7 -0
- package/dist/cjs/api/index.d.ts.map +1 -0
- package/dist/cjs/api/index.js +14 -0
- package/dist/cjs/api/interfaces.d.ts +108 -0
- package/dist/cjs/api/interfaces.d.ts.map +1 -0
- package/dist/cjs/api/interfaces.js +3 -0
- package/dist/cjs/bot/Bot.d.ts +380 -0
- package/dist/cjs/bot/Bot.d.ts.map +1 -0
- package/dist/cjs/bot/Bot.js +624 -0
- package/dist/cjs/bot/Composer.d.ts +131 -0
- package/dist/cjs/bot/Composer.d.ts.map +1 -0
- package/dist/cjs/bot/Composer.js +218 -0
- package/dist/cjs/bot/context/BotStartedContext.d.ts +83 -0
- package/dist/cjs/bot/context/BotStartedContext.d.ts.map +1 -0
- package/dist/cjs/bot/context/BotStartedContext.js +113 -0
- package/dist/cjs/bot/context/CallbackContext.d.ts +107 -0
- package/dist/cjs/bot/context/CallbackContext.d.ts.map +1 -0
- package/dist/cjs/bot/context/CallbackContext.js +158 -0
- package/dist/cjs/bot/context/ChatContext.d.ts +35 -0
- package/dist/cjs/bot/context/ChatContext.d.ts.map +1 -0
- package/dist/cjs/bot/context/ChatContext.js +52 -0
- package/dist/cjs/bot/context/MessageContext.d.ts +149 -0
- package/dist/cjs/bot/context/MessageContext.d.ts.map +1 -0
- package/dist/cjs/bot/context/MessageContext.js +228 -0
- package/dist/cjs/bot/context/guards.d.ts +69 -0
- package/dist/cjs/bot/context/guards.d.ts.map +1 -0
- package/dist/cjs/bot/context/guards.js +85 -0
- package/dist/cjs/bot/context/index.d.ts +6 -0
- package/dist/cjs/bot/context/index.d.ts.map +1 -0
- package/dist/cjs/bot/context/index.js +18 -0
- package/dist/cjs/bot/dispatch.d.ts +51 -0
- package/dist/cjs/bot/dispatch.d.ts.map +1 -0
- package/dist/cjs/bot/dispatch.js +201 -0
- package/dist/cjs/bot/index.d.ts +10 -0
- package/dist/cjs/bot/index.d.ts.map +1 -0
- package/dist/cjs/bot/index.js +24 -0
- package/dist/cjs/bot/lifecycle.d.ts +85 -0
- package/dist/cjs/bot/lifecycle.d.ts.map +1 -0
- package/dist/cjs/bot/lifecycle.js +167 -0
- package/dist/cjs/bot/metrics.d.ts +18 -0
- package/dist/cjs/bot/metrics.d.ts.map +1 -0
- package/dist/cjs/bot/metrics.js +3 -0
- package/dist/cjs/bot/routing.d.ts +131 -0
- package/dist/cjs/bot/routing.d.ts.map +1 -0
- package/dist/cjs/bot/routing.js +198 -0
- package/dist/cjs/bot/triggers.d.ts +61 -0
- package/dist/cjs/bot/triggers.d.ts.map +1 -0
- package/dist/cjs/bot/triggers.js +84 -0
- package/dist/cjs/core/errors/MaxError.d.ts +11 -0
- package/dist/cjs/core/errors/MaxError.d.ts.map +1 -0
- package/dist/cjs/core/errors/MaxError.js +19 -0
- package/dist/cjs/core/errors/errors.d.ts +59 -0
- package/dist/cjs/core/errors/errors.d.ts.map +1 -0
- package/dist/cjs/core/errors/errors.js +84 -0
- package/dist/cjs/core/errors/index.d.ts +3 -0
- package/dist/cjs/core/errors/index.d.ts.map +1 -0
- package/dist/cjs/core/errors/index.js +13 -0
- package/dist/cjs/core/http/HttpClient.d.ts +28 -0
- package/dist/cjs/core/http/HttpClient.d.ts.map +1 -0
- package/dist/cjs/core/http/HttpClient.js +148 -0
- package/dist/cjs/core/http/index.d.ts +3 -0
- package/dist/cjs/core/http/index.d.ts.map +1 -0
- package/dist/cjs/core/http/index.js +6 -0
- package/dist/cjs/core/http/interfaces.d.ts +42 -0
- package/dist/cjs/core/http/interfaces.d.ts.map +1 -0
- package/dist/cjs/core/http/interfaces.js +3 -0
- package/dist/cjs/core/rate-limiter/RateLimiter.d.ts +46 -0
- package/dist/cjs/core/rate-limiter/RateLimiter.d.ts.map +1 -0
- package/dist/cjs/core/rate-limiter/RateLimiter.js +110 -0
- package/dist/cjs/core/rate-limiter/index.d.ts +3 -0
- package/dist/cjs/core/rate-limiter/index.d.ts.map +1 -0
- package/dist/cjs/core/rate-limiter/index.js +6 -0
- package/dist/cjs/filters/index.d.ts +2 -0
- package/dist/cjs/filters/index.d.ts.map +1 -0
- package/dist/cjs/filters/index.js +10 -0
- package/dist/cjs/filters/predicates.d.ts +85 -0
- package/dist/cjs/filters/predicates.d.ts.map +1 -0
- package/dist/cjs/filters/predicates.js +111 -0
- package/dist/cjs/index.d.ts +11 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +27 -0
- package/dist/cjs/middleware/compose.d.ts +28 -0
- package/dist/cjs/middleware/compose.d.ts.map +1 -0
- package/dist/cjs/middleware/compose.js +89 -0
- package/dist/cjs/middleware/index.d.ts +3 -0
- package/dist/cjs/middleware/index.d.ts.map +1 -0
- package/dist/cjs/middleware/index.js +7 -0
- package/dist/cjs/middleware/types.d.ts +17 -0
- package/dist/cjs/middleware/types.d.ts.map +1 -0
- package/dist/cjs/middleware/types.js +3 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/transport/LongPollingTransport.d.ts +33 -0
- package/dist/cjs/transport/LongPollingTransport.d.ts.map +1 -0
- package/dist/cjs/transport/LongPollingTransport.js +153 -0
- package/dist/cjs/transport/WebhookTransport.d.ts +40 -0
- package/dist/cjs/transport/WebhookTransport.d.ts.map +1 -0
- package/dist/cjs/transport/WebhookTransport.js +229 -0
- package/dist/cjs/transport/index.d.ts +4 -0
- package/dist/cjs/transport/index.d.ts.map +1 -0
- package/dist/cjs/transport/index.js +8 -0
- package/dist/cjs/transport/interfaces.d.ts +74 -0
- package/dist/cjs/transport/interfaces.d.ts.map +1 -0
- package/dist/cjs/transport/interfaces.js +3 -0
- package/dist/cjs/types/bot.d.ts +19 -0
- package/dist/cjs/types/bot.d.ts.map +1 -0
- package/dist/cjs/types/bot.js +3 -0
- package/dist/cjs/types/chat.d.ts +94 -0
- package/dist/cjs/types/chat.d.ts.map +1 -0
- package/dist/cjs/types/chat.js +3 -0
- package/dist/cjs/types/common.d.ts +38 -0
- package/dist/cjs/types/common.d.ts.map +1 -0
- package/dist/cjs/types/common.js +6 -0
- package/dist/cjs/types/index.d.ts +9 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +26 -0
- package/dist/cjs/types/keyboard.d.ts +97 -0
- package/dist/cjs/types/keyboard.d.ts.map +1 -0
- package/dist/cjs/types/keyboard.js +3 -0
- package/dist/cjs/types/message.d.ts +162 -0
- package/dist/cjs/types/message.d.ts.map +1 -0
- package/dist/cjs/types/message.js +3 -0
- package/dist/cjs/types/subscription.d.ts +23 -0
- package/dist/cjs/types/subscription.d.ts.map +1 -0
- package/dist/cjs/types/subscription.js +3 -0
- package/dist/cjs/types/update.d.ts +99 -0
- package/dist/cjs/types/update.d.ts.map +1 -0
- package/dist/cjs/types/update.js +3 -0
- package/dist/cjs/types/upload.d.ts +29 -0
- package/dist/cjs/types/upload.d.ts.map +1 -0
- package/dist/cjs/types/upload.js +3 -0
- package/dist/cjs/utils/Histogram.d.ts +93 -0
- package/dist/cjs/utils/Histogram.d.ts.map +1 -0
- package/dist/cjs/utils/Histogram.js +103 -0
- package/dist/cjs/utils/assertNever.d.ts +19 -0
- package/dist/cjs/utils/assertNever.d.ts.map +1 -0
- package/dist/cjs/utils/assertNever.js +24 -0
- package/dist/cjs/utils/format.d.ts +22 -0
- package/dist/cjs/utils/format.d.ts.map +1 -0
- package/dist/cjs/utils/format.js +25 -0
- package/dist/cjs/utils/index.d.ts +6 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +14 -0
- package/dist/cjs/utils/keyboard.d.ts +70 -0
- package/dist/cjs/utils/keyboard.d.ts.map +1 -0
- package/dist/cjs/utils/keyboard.js +166 -0
- package/dist/esm/api/BotsApi.d.ts +17 -0
- package/dist/esm/api/BotsApi.d.ts.map +1 -0
- package/dist/esm/api/BotsApi.js +18 -0
- package/dist/esm/api/ChatsApi.d.ts +87 -0
- package/dist/esm/api/ChatsApi.d.ts.map +1 -0
- package/dist/esm/api/ChatsApi.js +140 -0
- package/dist/esm/api/MessagesApi.d.ts +41 -0
- package/dist/esm/api/MessagesApi.d.ts.map +1 -0
- package/dist/esm/api/MessagesApi.js +62 -0
- package/dist/esm/api/SubscriptionsApi.d.ts +45 -0
- package/dist/esm/api/SubscriptionsApi.d.ts.map +1 -0
- package/dist/esm/api/SubscriptionsApi.js +65 -0
- package/dist/esm/api/UploadsApi.d.ts +45 -0
- package/dist/esm/api/UploadsApi.d.ts.map +1 -0
- package/dist/esm/api/UploadsApi.js +109 -0
- package/dist/esm/api/index.d.ts +7 -0
- package/dist/esm/api/index.d.ts.map +1 -0
- package/dist/esm/api/index.js +6 -0
- package/dist/esm/api/interfaces.d.ts +108 -0
- package/dist/esm/api/interfaces.d.ts.map +1 -0
- package/dist/esm/api/interfaces.js +2 -0
- package/dist/esm/bot/Bot.d.ts +380 -0
- package/dist/esm/bot/Bot.d.ts.map +1 -0
- package/dist/esm/bot/Bot.js +620 -0
- package/dist/esm/bot/Composer.d.ts +131 -0
- package/dist/esm/bot/Composer.d.ts.map +1 -0
- package/dist/esm/bot/Composer.js +214 -0
- package/dist/esm/bot/context/BotStartedContext.d.ts +83 -0
- package/dist/esm/bot/context/BotStartedContext.d.ts.map +1 -0
- package/dist/esm/bot/context/BotStartedContext.js +109 -0
- package/dist/esm/bot/context/CallbackContext.d.ts +107 -0
- package/dist/esm/bot/context/CallbackContext.d.ts.map +1 -0
- package/dist/esm/bot/context/CallbackContext.js +154 -0
- package/dist/esm/bot/context/ChatContext.d.ts +35 -0
- package/dist/esm/bot/context/ChatContext.d.ts.map +1 -0
- package/dist/esm/bot/context/ChatContext.js +48 -0
- package/dist/esm/bot/context/MessageContext.d.ts +149 -0
- package/dist/esm/bot/context/MessageContext.d.ts.map +1 -0
- package/dist/esm/bot/context/MessageContext.js +224 -0
- package/dist/esm/bot/context/guards.d.ts +69 -0
- package/dist/esm/bot/context/guards.d.ts.map +1 -0
- package/dist/esm/bot/context/guards.js +78 -0
- package/dist/esm/bot/context/index.d.ts +6 -0
- package/dist/esm/bot/context/index.d.ts.map +1 -0
- package/dist/esm/bot/context/index.js +6 -0
- package/dist/esm/bot/dispatch.d.ts +51 -0
- package/dist/esm/bot/dispatch.d.ts.map +1 -0
- package/dist/esm/bot/dispatch.js +197 -0
- package/dist/esm/bot/index.d.ts +10 -0
- package/dist/esm/bot/index.d.ts.map +1 -0
- package/dist/esm/bot/index.js +9 -0
- package/dist/esm/bot/lifecycle.d.ts +85 -0
- package/dist/esm/bot/lifecycle.d.ts.map +1 -0
- package/dist/esm/bot/lifecycle.js +163 -0
- package/dist/esm/bot/metrics.d.ts +18 -0
- package/dist/esm/bot/metrics.d.ts.map +1 -0
- package/dist/esm/bot/metrics.js +2 -0
- package/dist/esm/bot/routing.d.ts +131 -0
- package/dist/esm/bot/routing.d.ts.map +1 -0
- package/dist/esm/bot/routing.js +194 -0
- package/dist/esm/bot/triggers.d.ts +61 -0
- package/dist/esm/bot/triggers.d.ts.map +1 -0
- package/dist/esm/bot/triggers.js +80 -0
- package/dist/esm/core/errors/MaxError.d.ts +11 -0
- package/dist/esm/core/errors/MaxError.d.ts.map +1 -0
- package/dist/esm/core/errors/MaxError.js +15 -0
- package/dist/esm/core/errors/errors.d.ts +59 -0
- package/dist/esm/core/errors/errors.d.ts.map +1 -0
- package/dist/esm/core/errors/errors.js +75 -0
- package/dist/esm/core/errors/index.d.ts +3 -0
- package/dist/esm/core/errors/index.d.ts.map +1 -0
- package/dist/esm/core/errors/index.js +3 -0
- package/dist/esm/core/http/HttpClient.d.ts +28 -0
- package/dist/esm/core/http/HttpClient.d.ts.map +1 -0
- package/dist/esm/core/http/HttpClient.js +144 -0
- package/dist/esm/core/http/index.d.ts +3 -0
- package/dist/esm/core/http/index.d.ts.map +1 -0
- package/dist/esm/core/http/index.js +2 -0
- package/dist/esm/core/http/interfaces.d.ts +42 -0
- package/dist/esm/core/http/interfaces.d.ts.map +1 -0
- package/dist/esm/core/http/interfaces.js +2 -0
- package/dist/esm/core/rate-limiter/RateLimiter.d.ts +46 -0
- package/dist/esm/core/rate-limiter/RateLimiter.d.ts.map +1 -0
- package/dist/esm/core/rate-limiter/RateLimiter.js +106 -0
- package/dist/esm/core/rate-limiter/index.d.ts +3 -0
- package/dist/esm/core/rate-limiter/index.d.ts.map +1 -0
- package/dist/esm/core/rate-limiter/index.js +2 -0
- package/dist/esm/filters/index.d.ts +2 -0
- package/dist/esm/filters/index.d.ts.map +1 -0
- package/dist/esm/filters/index.js +2 -0
- package/dist/esm/filters/predicates.d.ts +85 -0
- package/dist/esm/filters/predicates.d.ts.map +1 -0
- package/dist/esm/filters/predicates.js +104 -0
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/middleware/compose.d.ts +28 -0
- package/dist/esm/middleware/compose.d.ts.map +1 -0
- package/dist/esm/middleware/compose.js +85 -0
- package/dist/esm/middleware/index.d.ts +3 -0
- package/dist/esm/middleware/index.d.ts.map +1 -0
- package/dist/esm/middleware/index.js +2 -0
- package/dist/esm/middleware/types.d.ts +17 -0
- package/dist/esm/middleware/types.d.ts.map +1 -0
- package/dist/esm/middleware/types.js +2 -0
- package/dist/esm/transport/LongPollingTransport.d.ts +33 -0
- package/dist/esm/transport/LongPollingTransport.d.ts.map +1 -0
- package/dist/esm/transport/LongPollingTransport.js +149 -0
- package/dist/esm/transport/WebhookTransport.d.ts +40 -0
- package/dist/esm/transport/WebhookTransport.d.ts.map +1 -0
- package/dist/esm/transport/WebhookTransport.js +225 -0
- package/dist/esm/transport/index.d.ts +4 -0
- package/dist/esm/transport/index.d.ts.map +1 -0
- package/dist/esm/transport/index.js +3 -0
- package/dist/esm/transport/interfaces.d.ts +74 -0
- package/dist/esm/transport/interfaces.d.ts.map +1 -0
- package/dist/esm/transport/interfaces.js +2 -0
- package/dist/esm/types/bot.d.ts +19 -0
- package/dist/esm/types/bot.d.ts.map +1 -0
- package/dist/esm/types/bot.js +2 -0
- package/dist/esm/types/chat.d.ts +94 -0
- package/dist/esm/types/chat.d.ts.map +1 -0
- package/dist/esm/types/chat.js +2 -0
- package/dist/esm/types/common.d.ts +38 -0
- package/dist/esm/types/common.d.ts.map +1 -0
- package/dist/esm/types/common.js +5 -0
- package/dist/esm/types/index.d.ts +9 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +10 -0
- package/dist/esm/types/keyboard.d.ts +97 -0
- package/dist/esm/types/keyboard.d.ts.map +1 -0
- package/dist/esm/types/keyboard.js +2 -0
- package/dist/esm/types/message.d.ts +162 -0
- package/dist/esm/types/message.d.ts.map +1 -0
- package/dist/esm/types/message.js +2 -0
- package/dist/esm/types/subscription.d.ts +23 -0
- package/dist/esm/types/subscription.d.ts.map +1 -0
- package/dist/esm/types/subscription.js +2 -0
- package/dist/esm/types/update.d.ts +99 -0
- package/dist/esm/types/update.d.ts.map +1 -0
- package/dist/esm/types/update.js +2 -0
- package/dist/esm/types/upload.d.ts +29 -0
- package/dist/esm/types/upload.d.ts.map +1 -0
- package/dist/esm/types/upload.js +2 -0
- package/dist/esm/utils/Histogram.d.ts +93 -0
- package/dist/esm/utils/Histogram.d.ts.map +1 -0
- package/dist/esm/utils/Histogram.js +99 -0
- package/dist/esm/utils/assertNever.d.ts +19 -0
- package/dist/esm/utils/assertNever.d.ts.map +1 -0
- package/dist/esm/utils/assertNever.js +21 -0
- package/dist/esm/utils/format.d.ts +22 -0
- package/dist/esm/utils/format.d.ts.map +1 -0
- package/dist/esm/utils/format.js +22 -0
- package/dist/esm/utils/index.d.ts +6 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +5 -0
- package/dist/esm/utils/keyboard.d.ts +70 -0
- package/dist/esm/utils/keyboard.d.ts.map +1 -0
- package/dist/esm/utils/keyboard.js +162 -0
- package/dist/types/api/BotsApi.d.ts +17 -0
- package/dist/types/api/BotsApi.d.ts.map +1 -0
- package/dist/types/api/ChatsApi.d.ts +87 -0
- package/dist/types/api/ChatsApi.d.ts.map +1 -0
- package/dist/types/api/MessagesApi.d.ts +41 -0
- package/dist/types/api/MessagesApi.d.ts.map +1 -0
- package/dist/types/api/SubscriptionsApi.d.ts +45 -0
- package/dist/types/api/SubscriptionsApi.d.ts.map +1 -0
- package/dist/types/api/UploadsApi.d.ts +45 -0
- package/dist/types/api/UploadsApi.d.ts.map +1 -0
- package/dist/types/api/index.d.ts +7 -0
- package/dist/types/api/index.d.ts.map +1 -0
- package/dist/types/api/interfaces.d.ts +108 -0
- package/dist/types/api/interfaces.d.ts.map +1 -0
- package/dist/types/bot/Bot.d.ts +380 -0
- package/dist/types/bot/Bot.d.ts.map +1 -0
- package/dist/types/bot/Composer.d.ts +131 -0
- package/dist/types/bot/Composer.d.ts.map +1 -0
- package/dist/types/bot/context/BotStartedContext.d.ts +83 -0
- package/dist/types/bot/context/BotStartedContext.d.ts.map +1 -0
- package/dist/types/bot/context/CallbackContext.d.ts +107 -0
- package/dist/types/bot/context/CallbackContext.d.ts.map +1 -0
- package/dist/types/bot/context/ChatContext.d.ts +35 -0
- package/dist/types/bot/context/ChatContext.d.ts.map +1 -0
- package/dist/types/bot/context/MessageContext.d.ts +149 -0
- package/dist/types/bot/context/MessageContext.d.ts.map +1 -0
- package/dist/types/bot/context/guards.d.ts +69 -0
- package/dist/types/bot/context/guards.d.ts.map +1 -0
- package/dist/types/bot/context/index.d.ts +6 -0
- package/dist/types/bot/context/index.d.ts.map +1 -0
- package/dist/types/bot/dispatch.d.ts +51 -0
- package/dist/types/bot/dispatch.d.ts.map +1 -0
- package/dist/types/bot/index.d.ts +10 -0
- package/dist/types/bot/index.d.ts.map +1 -0
- package/dist/types/bot/lifecycle.d.ts +85 -0
- package/dist/types/bot/lifecycle.d.ts.map +1 -0
- package/dist/types/bot/metrics.d.ts +18 -0
- package/dist/types/bot/metrics.d.ts.map +1 -0
- package/dist/types/bot/routing.d.ts +131 -0
- package/dist/types/bot/routing.d.ts.map +1 -0
- package/dist/types/bot/triggers.d.ts +61 -0
- package/dist/types/bot/triggers.d.ts.map +1 -0
- package/dist/types/core/errors/MaxError.d.ts +11 -0
- package/dist/types/core/errors/MaxError.d.ts.map +1 -0
- package/dist/types/core/errors/errors.d.ts +59 -0
- package/dist/types/core/errors/errors.d.ts.map +1 -0
- package/dist/types/core/errors/index.d.ts +3 -0
- package/dist/types/core/errors/index.d.ts.map +1 -0
- package/dist/types/core/http/HttpClient.d.ts +28 -0
- package/dist/types/core/http/HttpClient.d.ts.map +1 -0
- package/dist/types/core/http/index.d.ts +3 -0
- package/dist/types/core/http/index.d.ts.map +1 -0
- package/dist/types/core/http/interfaces.d.ts +42 -0
- package/dist/types/core/http/interfaces.d.ts.map +1 -0
- package/dist/types/core/rate-limiter/RateLimiter.d.ts +46 -0
- package/dist/types/core/rate-limiter/RateLimiter.d.ts.map +1 -0
- package/dist/types/core/rate-limiter/index.d.ts +3 -0
- package/dist/types/core/rate-limiter/index.d.ts.map +1 -0
- package/dist/types/filters/index.d.ts +2 -0
- package/dist/types/filters/index.d.ts.map +1 -0
- package/dist/types/filters/predicates.d.ts +85 -0
- package/dist/types/filters/predicates.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/middleware/compose.d.ts +28 -0
- package/dist/types/middleware/compose.d.ts.map +1 -0
- package/dist/types/middleware/index.d.ts +3 -0
- package/dist/types/middleware/index.d.ts.map +1 -0
- package/dist/types/middleware/types.d.ts +17 -0
- package/dist/types/middleware/types.d.ts.map +1 -0
- package/dist/types/transport/LongPollingTransport.d.ts +33 -0
- package/dist/types/transport/LongPollingTransport.d.ts.map +1 -0
- package/dist/types/transport/WebhookTransport.d.ts +40 -0
- package/dist/types/transport/WebhookTransport.d.ts.map +1 -0
- package/dist/types/transport/index.d.ts +4 -0
- package/dist/types/transport/index.d.ts.map +1 -0
- package/dist/types/transport/interfaces.d.ts +74 -0
- package/dist/types/transport/interfaces.d.ts.map +1 -0
- package/dist/types/types/bot.d.ts +19 -0
- package/dist/types/types/bot.d.ts.map +1 -0
- package/dist/types/types/chat.d.ts +94 -0
- package/dist/types/types/chat.d.ts.map +1 -0
- package/dist/types/types/common.d.ts +38 -0
- package/dist/types/types/common.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +9 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/keyboard.d.ts +97 -0
- package/dist/types/types/keyboard.d.ts.map +1 -0
- package/dist/types/types/message.d.ts +162 -0
- package/dist/types/types/message.d.ts.map +1 -0
- package/dist/types/types/subscription.d.ts +23 -0
- package/dist/types/types/subscription.d.ts.map +1 -0
- package/dist/types/types/update.d.ts +99 -0
- package/dist/types/types/update.d.ts.map +1 -0
- package/dist/types/types/upload.d.ts +29 -0
- package/dist/types/types/upload.d.ts.map +1 -0
- package/dist/types/utils/Histogram.d.ts +93 -0
- package/dist/types/utils/Histogram.d.ts.map +1 -0
- package/dist/types/utils/assertNever.d.ts +19 -0
- package/dist/types/utils/assertNever.d.ts.map +1 -0
- package/dist/types/utils/format.d.ts +22 -0
- package/dist/types/utils/format.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +6 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/keyboard.d.ts +70 -0
- package/dist/types/utils/keyboard.d.ts.map +1 -0
- 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,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
|