@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,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LongPollingTransport = void 0;
|
|
4
|
+
const index_js_1 = require("../core/errors/index.js");
|
|
5
|
+
/**
|
|
6
|
+
* Транспорт на основе Long Polling.
|
|
7
|
+
*
|
|
8
|
+
* Long Polling проще в настройке — не нужен публичный IP и SSL.
|
|
9
|
+
* Подходит для разработки и небольших ботов.
|
|
10
|
+
*/
|
|
11
|
+
class LongPollingTransport {
|
|
12
|
+
subscriptionsApi;
|
|
13
|
+
timeout;
|
|
14
|
+
limit;
|
|
15
|
+
retryDelay;
|
|
16
|
+
resetMarkerOnRestart;
|
|
17
|
+
allowedUpdates;
|
|
18
|
+
isRunning = false;
|
|
19
|
+
marker = null;
|
|
20
|
+
updateHandler = null;
|
|
21
|
+
errorHandler = null;
|
|
22
|
+
// AbortController живёт на протяжении одного сеанса polling —
|
|
23
|
+
// позволяет мгновенно прервать текущий fetch-запрос при вызове stop()
|
|
24
|
+
abortController = null;
|
|
25
|
+
// Храним Promise от poll() чтобы stop() мог дождаться чистого завершения цикла
|
|
26
|
+
pollPromise = null;
|
|
27
|
+
constructor(subscriptionsApi, config) {
|
|
28
|
+
this.subscriptionsApi = subscriptionsApi;
|
|
29
|
+
this.timeout = config?.timeout ?? 25;
|
|
30
|
+
this.limit = config?.limit ?? 100;
|
|
31
|
+
this.retryDelay = config?.retryDelay ?? 5000;
|
|
32
|
+
this.resetMarkerOnRestart = config?.resetMarkerOnRestart ?? false;
|
|
33
|
+
this.allowedUpdates = config?.allowedUpdates;
|
|
34
|
+
}
|
|
35
|
+
async start() {
|
|
36
|
+
// Отписка от webhook перед стартом polling —
|
|
37
|
+
// MAX API не позволяет использовать оба метода одновременно
|
|
38
|
+
try {
|
|
39
|
+
await this.subscriptionsApi.unsubscribe();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Игнорируем ошибку — webhook мог быть не установлен
|
|
43
|
+
}
|
|
44
|
+
this.isRunning = true;
|
|
45
|
+
this.abortController = new AbortController();
|
|
46
|
+
// Запуск в отдельном "потоке" — не блокируем возврат из start()
|
|
47
|
+
this.pollPromise = this.poll();
|
|
48
|
+
}
|
|
49
|
+
async stop() {
|
|
50
|
+
this.isRunning = false;
|
|
51
|
+
// Прерываем текущий getUpdates или delay немедленно —
|
|
52
|
+
// без этого пришлось бы ждать до 25 секунд завершения long-poll запроса
|
|
53
|
+
this.abortController?.abort();
|
|
54
|
+
this.abortController = null;
|
|
55
|
+
// Дожидаемся завершения poll() — гарантируем чистую остановку
|
|
56
|
+
await this.pollPromise;
|
|
57
|
+
this.pollPromise = null;
|
|
58
|
+
// Сбрасываем маркер если настройка включена —
|
|
59
|
+
// следующий start() стартует с самых свежих обновлений
|
|
60
|
+
if (this.resetMarkerOnRestart) {
|
|
61
|
+
this.marker = null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
onUpdate(handler) {
|
|
65
|
+
this.updateHandler = handler;
|
|
66
|
+
}
|
|
67
|
+
onError(handler) {
|
|
68
|
+
this.errorHandler = handler;
|
|
69
|
+
}
|
|
70
|
+
async poll() {
|
|
71
|
+
while (this.isRunning) {
|
|
72
|
+
try {
|
|
73
|
+
const response = await this.subscriptionsApi.getUpdates({
|
|
74
|
+
timeout: this.timeout,
|
|
75
|
+
limit: this.limit,
|
|
76
|
+
marker: this.marker ?? undefined,
|
|
77
|
+
update_types: this.allowedUpdates,
|
|
78
|
+
}, this.abortController?.signal);
|
|
79
|
+
// Marker сохраняется между запросами —
|
|
80
|
+
// без него API вернёт те же обновления повторно
|
|
81
|
+
if (response.marker !== null) {
|
|
82
|
+
this.marker = response.marker;
|
|
83
|
+
}
|
|
84
|
+
for (const update of response.updates) {
|
|
85
|
+
// Fire-and-forget: один зависший обработчик не блокирует остальные.
|
|
86
|
+
// Ошибки в обработчике логируются, но не останавливают polling.
|
|
87
|
+
this.emitUpdate(update);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// AbortError означает намеренную остановку через stop() — не ошибка
|
|
92
|
+
if (this.isAbortError(error)) {
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
// API вернул 400/404 — маркер устарел или невалиден.
|
|
96
|
+
// Сбрасываем маркер и сразу повторяем запрос без паузы —
|
|
97
|
+
// бот продолжит работу автономно даже после долгой остановки.
|
|
98
|
+
if (error instanceof index_js_1.ApiError &&
|
|
99
|
+
(error.statusCode === 400 || error.statusCode === 404)) {
|
|
100
|
+
this.marker = null;
|
|
101
|
+
this.emitError(new Error(`Маркер устарел или невалиден (HTTP ${error.statusCode}), сброс позиции`));
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
this.emitError(error instanceof Error ? error : new Error(String(error)));
|
|
105
|
+
// Пауза перед retry — защита от спама сервера при ошибках сети.
|
|
106
|
+
// delay тоже прерывается по сигналу, чтобы stop() не ждал retryDelay.
|
|
107
|
+
await this.delay(this.retryDelay, this.abortController?.signal);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
isAbortError(error) {
|
|
112
|
+
return (error instanceof Error &&
|
|
113
|
+
(error.name === "AbortError" || error.name === "TimeoutError"));
|
|
114
|
+
}
|
|
115
|
+
emitUpdate(update) {
|
|
116
|
+
if (this.updateHandler) {
|
|
117
|
+
try {
|
|
118
|
+
this.updateHandler(update);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
// Ошибки в обработчике не должны ломать polling
|
|
122
|
+
this.emitError(error instanceof Error ? error : new Error(String(error)));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
emitError(error) {
|
|
127
|
+
if (this.errorHandler) {
|
|
128
|
+
try {
|
|
129
|
+
this.errorHandler(error);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Игнорируем ошибки в обработчике ошибок
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// delay с поддержкой AbortSignal — stop() прерывает ожидание мгновенно,
|
|
137
|
+
// а не ждёт истечения retryDelay (до 5 секунд)
|
|
138
|
+
delay(ms, signal) {
|
|
139
|
+
return new Promise((resolve) => {
|
|
140
|
+
if (signal?.aborted) {
|
|
141
|
+
resolve();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const tid = setTimeout(resolve, ms);
|
|
145
|
+
signal?.addEventListener("abort", () => {
|
|
146
|
+
clearTimeout(tid);
|
|
147
|
+
resolve();
|
|
148
|
+
}, { once: true });
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.LongPollingTransport = LongPollingTransport;
|
|
153
|
+
//# sourceMappingURL=LongPollingTransport.js.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type IncomingMessage, type ServerResponse } from "node:http";
|
|
2
|
+
import type { ISubscriptionsApi } from "../api/interfaces.js";
|
|
3
|
+
import type { ErrorHandler, IUpdateTransport, UpdateHandler, WebhookConfig } from "./interfaces.js";
|
|
4
|
+
/**
|
|
5
|
+
* Транспорт на основе Webhook.
|
|
6
|
+
*
|
|
7
|
+
* Webhook эффективнее для production — MAX сам присылает обновления.
|
|
8
|
+
* Требует публичный HTTPS endpoint.
|
|
9
|
+
*/
|
|
10
|
+
export declare class WebhookTransport implements IUpdateTransport {
|
|
11
|
+
private readonly subscriptionsApi;
|
|
12
|
+
private readonly path;
|
|
13
|
+
private readonly port;
|
|
14
|
+
private readonly host;
|
|
15
|
+
private readonly secretToken;
|
|
16
|
+
private readonly webhookUrl;
|
|
17
|
+
private readonly autoRegister;
|
|
18
|
+
private server;
|
|
19
|
+
private startPromise;
|
|
20
|
+
private updateHandler;
|
|
21
|
+
private errorHandler;
|
|
22
|
+
constructor(subscriptionsApi: ISubscriptionsApi, config?: WebhookConfig);
|
|
23
|
+
start(): Promise<void>;
|
|
24
|
+
private _doStart;
|
|
25
|
+
stop(): Promise<void>;
|
|
26
|
+
onUpdate(handler: UpdateHandler): void;
|
|
27
|
+
onError(handler: ErrorHandler): void;
|
|
28
|
+
/**
|
|
29
|
+
* Получить middleware для интеграции с Express/Fastify/Koa.
|
|
30
|
+
*
|
|
31
|
+
* Позволяет встроить webhook в существующий сервер разработчика.
|
|
32
|
+
*/
|
|
33
|
+
getMiddleware(): (req: IncomingMessage, res: ServerResponse, next?: () => void) => void;
|
|
34
|
+
private handleRequest;
|
|
35
|
+
private verifyToken;
|
|
36
|
+
private parseBody;
|
|
37
|
+
private emitUpdate;
|
|
38
|
+
private emitError;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=WebhookTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebhookTransport.d.ts","sourceRoot":"","sources":["../../../src/transport/WebhookTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EAEpB,KAAK,cAAc,EACpB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,EACd,MAAM,iBAAiB,CAAC;AAKzB;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,gBAAgB;IAgBrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAfnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IAEvC,OAAO,CAAC,MAAM,CAAuB;IAGrC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,YAAY,CAA6B;gBAG9B,gBAAgB,EAAE,iBAAiB,EACpD,MAAM,CAAC,EAAE,aAAa;IAUlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAWd,QAAQ;IAmBhB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD3B,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAItC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIpC;;;;OAIG;IACH,aAAa,IAAI,CACf,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,CAAC,EAAE,MAAM,IAAI,KACd,IAAI;IAeT,OAAO,CAAC,aAAa;IAiDrB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,SAAS;IAgCjB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,SAAS;CASlB"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebhookTransport = void 0;
|
|
4
|
+
const node_http_1 = require("node:http");
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
// Максимальный размер тела запроса — защита от переполнения памяти
|
|
7
|
+
const MAX_BODY_SIZE = 1024 * 1024; // 1 MB
|
|
8
|
+
/**
|
|
9
|
+
* Транспорт на основе Webhook.
|
|
10
|
+
*
|
|
11
|
+
* Webhook эффективнее для production — MAX сам присылает обновления.
|
|
12
|
+
* Требует публичный HTTPS endpoint.
|
|
13
|
+
*/
|
|
14
|
+
class WebhookTransport {
|
|
15
|
+
subscriptionsApi;
|
|
16
|
+
path;
|
|
17
|
+
port;
|
|
18
|
+
host;
|
|
19
|
+
secretToken;
|
|
20
|
+
webhookUrl;
|
|
21
|
+
autoRegister;
|
|
22
|
+
server = null;
|
|
23
|
+
// startPromise — мьютекс жизненного цикла (аналог Bot.startPromise):
|
|
24
|
+
// не null пока сервер поднимается или работает, предотвращает двойной listen.
|
|
25
|
+
startPromise = null;
|
|
26
|
+
updateHandler = null;
|
|
27
|
+
errorHandler = null;
|
|
28
|
+
constructor(subscriptionsApi, config) {
|
|
29
|
+
this.subscriptionsApi = subscriptionsApi;
|
|
30
|
+
this.path = config?.path ?? "/webhook";
|
|
31
|
+
this.port = config?.port ?? 3000;
|
|
32
|
+
this.host = config?.host ?? "0.0.0.0";
|
|
33
|
+
this.secretToken = config?.secretToken ?? null;
|
|
34
|
+
this.webhookUrl = config?.url ?? null;
|
|
35
|
+
this.autoRegister = config?.autoRegister ?? false;
|
|
36
|
+
}
|
|
37
|
+
async start() {
|
|
38
|
+
if (this.startPromise !== null) {
|
|
39
|
+
await this.startPromise;
|
|
40
|
+
throw new Error("WebhookTransport уже запущен. Вызовите stop() перед повторным запуском.");
|
|
41
|
+
}
|
|
42
|
+
this.startPromise = this._doStart();
|
|
43
|
+
return this.startPromise;
|
|
44
|
+
}
|
|
45
|
+
async _doStart() {
|
|
46
|
+
// Автоматическая регистрация webhook URL если указан
|
|
47
|
+
if (this.autoRegister && this.webhookUrl) {
|
|
48
|
+
await this.subscriptionsApi.subscribe({ url: this.webhookUrl });
|
|
49
|
+
}
|
|
50
|
+
const server = (0, node_http_1.createServer)(this.handleRequest.bind(this));
|
|
51
|
+
await new Promise((resolve, reject) => {
|
|
52
|
+
server.once("error", (err) => {
|
|
53
|
+
this.startPromise = null; // сбрасываем мьютекс при ошибке
|
|
54
|
+
reject(err);
|
|
55
|
+
});
|
|
56
|
+
server.listen(this.port, this.host, () => resolve());
|
|
57
|
+
});
|
|
58
|
+
this.server = server;
|
|
59
|
+
}
|
|
60
|
+
async stop() {
|
|
61
|
+
if (this.startPromise === null) {
|
|
62
|
+
return; // уже остановлен — идемпотентно
|
|
63
|
+
}
|
|
64
|
+
// Держим mutex (startPromise) установленным на весь период остановки.
|
|
65
|
+
// Это закрывает race condition: параллельный start() увидит не-null promise
|
|
66
|
+
// и заблокируется до полного завершения stop(), а не до сброса null.
|
|
67
|
+
const stopTask = (async () => {
|
|
68
|
+
// Дожидаемся завершения старта перед остановкой
|
|
69
|
+
try {
|
|
70
|
+
await this.startPromise;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
/* start упал — сервер не поднят */
|
|
74
|
+
}
|
|
75
|
+
// Отписка при остановке — только если autoRegister, только если сервер поднялся
|
|
76
|
+
if (this.autoRegister && this.server) {
|
|
77
|
+
try {
|
|
78
|
+
await this.subscriptionsApi.unsubscribe();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Игнорируем ошибки при остановке
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
await new Promise((resolve) => {
|
|
85
|
+
if (this.server) {
|
|
86
|
+
this.server.close(() => {
|
|
87
|
+
this.server = null;
|
|
88
|
+
resolve();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
resolve();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
})();
|
|
96
|
+
// Заменяем mutex на stopTask — он не-null до полного завершения
|
|
97
|
+
this.startPromise = stopTask;
|
|
98
|
+
try {
|
|
99
|
+
await stopTask;
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
// Сбрасываем только если никто не перезаписал mutex между await-ами
|
|
103
|
+
if (this.startPromise === stopTask) {
|
|
104
|
+
this.startPromise = null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
onUpdate(handler) {
|
|
109
|
+
this.updateHandler = handler;
|
|
110
|
+
}
|
|
111
|
+
onError(handler) {
|
|
112
|
+
this.errorHandler = handler;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Получить middleware для интеграции с Express/Fastify/Koa.
|
|
116
|
+
*
|
|
117
|
+
* Позволяет встроить webhook в существующий сервер разработчика.
|
|
118
|
+
*/
|
|
119
|
+
getMiddleware() {
|
|
120
|
+
return (req, res, next) => {
|
|
121
|
+
const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
|
|
122
|
+
if (url.pathname === this.path && req.method === "POST") {
|
|
123
|
+
this.handleRequest(req, res);
|
|
124
|
+
}
|
|
125
|
+
else if (next) {
|
|
126
|
+
next();
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
res.writeHead(404);
|
|
130
|
+
res.end();
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
handleRequest(req, res) {
|
|
135
|
+
const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
|
|
136
|
+
// Проверяем path и метод
|
|
137
|
+
if (url.pathname !== this.path || req.method !== "POST") {
|
|
138
|
+
res.writeHead(404);
|
|
139
|
+
res.end();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Валидация секретного токена — защита от поддельных запросов
|
|
143
|
+
if (this.secretToken) {
|
|
144
|
+
const receivedToken = req.headers["x-secret-token"];
|
|
145
|
+
if (typeof receivedToken !== "string" ||
|
|
146
|
+
!this.verifyToken(receivedToken)) {
|
|
147
|
+
// Timing-safe сравнение защищает от timing attack —
|
|
148
|
+
// злоумышленник не сможет подобрать токен по времени ответа
|
|
149
|
+
res.writeHead(403);
|
|
150
|
+
res.end();
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Проверка Content-Length — защита от переполнения памяти
|
|
155
|
+
const contentLength = parseInt(req.headers["content-length"] ?? "0", 10);
|
|
156
|
+
if (contentLength > MAX_BODY_SIZE) {
|
|
157
|
+
res.writeHead(413); // Payload Too Large
|
|
158
|
+
res.end();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// Отвечаем 200 до обработки —
|
|
162
|
+
// MAX ждёт подтверждения и сделает retry при долгом ответе
|
|
163
|
+
res.writeHead(200);
|
|
164
|
+
res.end();
|
|
165
|
+
// Обработка асинхронно — не задерживаем ответ сервера
|
|
166
|
+
this.parseBody(req)
|
|
167
|
+
.then((update) => this.emitUpdate(update))
|
|
168
|
+
.catch((error) => this.emitError(error instanceof Error ? error : new Error(String(error))));
|
|
169
|
+
}
|
|
170
|
+
verifyToken(received) {
|
|
171
|
+
if (!this.secretToken)
|
|
172
|
+
return true;
|
|
173
|
+
const a = Buffer.from(received);
|
|
174
|
+
const b = Buffer.from(this.secretToken);
|
|
175
|
+
// Длины должны совпадать для timingSafeEqual
|
|
176
|
+
if (a.length !== b.length)
|
|
177
|
+
return false;
|
|
178
|
+
return (0, node_crypto_1.timingSafeEqual)(a, b);
|
|
179
|
+
}
|
|
180
|
+
parseBody(req) {
|
|
181
|
+
return new Promise((resolve, reject) => {
|
|
182
|
+
const chunks = [];
|
|
183
|
+
let size = 0;
|
|
184
|
+
req.on("data", (chunk) => {
|
|
185
|
+
size += chunk.length;
|
|
186
|
+
// Дополнительная проверка размера при потоковом чтении
|
|
187
|
+
if (size > MAX_BODY_SIZE) {
|
|
188
|
+
req.destroy();
|
|
189
|
+
reject(new Error("Превышен максимальный размер тела запроса"));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
chunks.push(chunk);
|
|
193
|
+
});
|
|
194
|
+
req.on("end", () => {
|
|
195
|
+
try {
|
|
196
|
+
const body = Buffer.concat(chunks).toString("utf-8");
|
|
197
|
+
const update = JSON.parse(body);
|
|
198
|
+
resolve(update);
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
reject(new Error("Ошибка парсинга тела запроса"));
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
req.on("error", reject);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
emitUpdate(update) {
|
|
208
|
+
if (this.updateHandler) {
|
|
209
|
+
try {
|
|
210
|
+
this.updateHandler(update);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
this.emitError(error instanceof Error ? error : new Error(String(error)));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
emitError(error) {
|
|
218
|
+
if (this.errorHandler) {
|
|
219
|
+
try {
|
|
220
|
+
this.errorHandler(error);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Игнорируем ошибки в обработчике ошибок
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
exports.WebhookTransport = WebhookTransport;
|
|
229
|
+
//# sourceMappingURL=WebhookTransport.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { LongPollingTransport } from "./LongPollingTransport.js";
|
|
2
|
+
export { WebhookTransport } from "./WebhookTransport.js";
|
|
3
|
+
export type { IUpdateTransport, LongPollingConfig, WebhookConfig, UpdateHandler, ErrorHandler, } from "./interfaces.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,GACb,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebhookTransport = exports.LongPollingTransport = void 0;
|
|
4
|
+
var LongPollingTransport_js_1 = require("./LongPollingTransport.js");
|
|
5
|
+
Object.defineProperty(exports, "LongPollingTransport", { enumerable: true, get: function () { return LongPollingTransport_js_1.LongPollingTransport; } });
|
|
6
|
+
var WebhookTransport_js_1 = require("./WebhookTransport.js");
|
|
7
|
+
Object.defineProperty(exports, "WebhookTransport", { enumerable: true, get: function () { return WebhookTransport_js_1.WebhookTransport; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Update, UpdateType } from "../types/update.js";
|
|
2
|
+
/**
|
|
3
|
+
* Обработчик обновлений
|
|
4
|
+
*/
|
|
5
|
+
export type UpdateHandler = (update: Update) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Обработчик ошибок
|
|
8
|
+
*/
|
|
9
|
+
export type ErrorHandler = (error: Error) => void;
|
|
10
|
+
/**
|
|
11
|
+
* Конфигурация Long Polling
|
|
12
|
+
*/
|
|
13
|
+
export interface LongPollingConfig {
|
|
14
|
+
/** Таймаут ожидания обновлений в секундах (по умолчанию 25) */
|
|
15
|
+
timeout?: number;
|
|
16
|
+
/** Максимальное количество обновлений за запрос (по умолчанию 100) */
|
|
17
|
+
limit?: number;
|
|
18
|
+
/** Задержка перед повторной попыткой при ошибке в мс (по умолчанию 5000) */
|
|
19
|
+
retryDelay?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Фильтр типов обновлений — бот получит только перечисленные типы.
|
|
22
|
+
* Если не указан — приходят все типы.
|
|
23
|
+
*
|
|
24
|
+
* @example Получать только сообщения и нажатия кнопок
|
|
25
|
+
* allowedUpdates: ['message_created', 'message_callback']
|
|
26
|
+
*/
|
|
27
|
+
allowedUpdates?: UpdateType[];
|
|
28
|
+
/**
|
|
29
|
+
* Сбрасывать маркер при перезапуске (по умолчанию `false`).
|
|
30
|
+
*
|
|
31
|
+
* По умолчанию (значение `false`) бот продолжает с последнего запомненного
|
|
32
|
+
* маркера — обновления, пришедшие во время остановки, будут получены
|
|
33
|
+
* после старта. Установите `true` если хотите всегда начинать с самых
|
|
34
|
+
* актуальных обновлений без обработки пропущенных во время остановки.
|
|
35
|
+
*
|
|
36
|
+
* Внезависимо от этой настройки, маркер автоматически сбрасывается
|
|
37
|
+
* если API возвращает 400/404 (маркер устарел или невалиден).
|
|
38
|
+
*/
|
|
39
|
+
resetMarkerOnRestart?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Конфигурация Webhook
|
|
43
|
+
*/
|
|
44
|
+
export interface WebhookConfig {
|
|
45
|
+
/** URL path для вебхука (по умолчанию '/webhook') */
|
|
46
|
+
path?: string;
|
|
47
|
+
/** Порт сервера (по умолчанию 3000) */
|
|
48
|
+
port?: number;
|
|
49
|
+
/** Хост сервера (по умолчанию '0.0.0.0') */
|
|
50
|
+
host?: string;
|
|
51
|
+
/** Секретный токен для валидации запросов */
|
|
52
|
+
secretToken?: string;
|
|
53
|
+
/** Публичный URL для регистрации webhook */
|
|
54
|
+
url?: string;
|
|
55
|
+
/** Автоматически регистрировать webhook при старте */
|
|
56
|
+
autoRegister?: boolean;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Интерфейс транспорта для получения обновлений.
|
|
60
|
+
*
|
|
61
|
+
* Позволяет использовать разные стратегии (Long Polling / Webhook)
|
|
62
|
+
* с единым интерфейсом.
|
|
63
|
+
*/
|
|
64
|
+
export interface IUpdateTransport {
|
|
65
|
+
/** Запустить транспорт */
|
|
66
|
+
start(): Promise<void>;
|
|
67
|
+
/** Остановить транспорт */
|
|
68
|
+
stop(): Promise<void>;
|
|
69
|
+
/** Установить обработчик обновлений */
|
|
70
|
+
onUpdate(handler: UpdateHandler): void;
|
|
71
|
+
/** Установить обработчик ошибок */
|
|
72
|
+
onError(handler: ErrorHandler): void;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/transport/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE7D;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC;IAC9B;;;;;;;;;;OAUG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,2BAA2B;IAC3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,mCAAmC;IACnC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CACtC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { User } from "./common.js";
|
|
2
|
+
/**
|
|
3
|
+
* Команда бота
|
|
4
|
+
*/
|
|
5
|
+
export interface BotCommand {
|
|
6
|
+
command: string;
|
|
7
|
+
/** Описание команды — необязательное (в API не nullable, но может отсутствовать) */
|
|
8
|
+
description?: string | null;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Информация о боте
|
|
12
|
+
*/
|
|
13
|
+
export interface BotInfo extends User {
|
|
14
|
+
description: string | null;
|
|
15
|
+
avatar_url: string | null;
|
|
16
|
+
full_avatar_url: string | null;
|
|
17
|
+
commands: BotCommand[] | null;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=bot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/types/bot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;CAC/B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { Image, User, UserWithPhoto } from "./common.js";
|
|
2
|
+
import type { Message } from "./message.js";
|
|
3
|
+
/**
|
|
4
|
+
* Статус чата
|
|
5
|
+
*/
|
|
6
|
+
export type ChatStatus = "active" | "removed" | "left" | "closed";
|
|
7
|
+
/**
|
|
8
|
+
* Тип чата
|
|
9
|
+
*/
|
|
10
|
+
export type ChatType = "chat" | "dialog";
|
|
11
|
+
/**
|
|
12
|
+
* Групповой чат
|
|
13
|
+
*/
|
|
14
|
+
export interface Chat {
|
|
15
|
+
chat_id: number;
|
|
16
|
+
type: "chat";
|
|
17
|
+
status: ChatStatus;
|
|
18
|
+
title: string | null;
|
|
19
|
+
icon: Image | null;
|
|
20
|
+
/** Unix-время последнего события */
|
|
21
|
+
last_event_time: number;
|
|
22
|
+
participants_count: number;
|
|
23
|
+
owner_id: number | null;
|
|
24
|
+
/** Участники с временем последней активности */
|
|
25
|
+
participants: Record<string, number> | null;
|
|
26
|
+
is_public: boolean;
|
|
27
|
+
link: string | null;
|
|
28
|
+
description: string | null;
|
|
29
|
+
/** Собеседник в диалоге */
|
|
30
|
+
dialog_with_user?: UserWithPhoto;
|
|
31
|
+
/** ID сообщения с кнопкой, через которую был инициирован чат */
|
|
32
|
+
chat_message_id: string | null;
|
|
33
|
+
pinned_message?: Message | null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Участник чата
|
|
37
|
+
*/
|
|
38
|
+
export interface ChatMember extends User {
|
|
39
|
+
permissions: string[] | null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Получатель сообщения
|
|
43
|
+
*/
|
|
44
|
+
export interface Recipient {
|
|
45
|
+
chat_id: number | null;
|
|
46
|
+
chat_type: ChatType;
|
|
47
|
+
user_id: number | null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Параметры получения списка чатов
|
|
51
|
+
*/
|
|
52
|
+
export interface GetChatsParams {
|
|
53
|
+
count?: number;
|
|
54
|
+
marker?: number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Ответ со списком чатов
|
|
58
|
+
*/
|
|
59
|
+
export interface ChatsResponse {
|
|
60
|
+
chats: Chat[];
|
|
61
|
+
marker: number | null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Запрос на обновление чата
|
|
65
|
+
*/
|
|
66
|
+
export interface UpdateChatRequest {
|
|
67
|
+
title?: string | null;
|
|
68
|
+
description?: string | null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Запрос на добавление участников
|
|
72
|
+
*/
|
|
73
|
+
export interface AddMembersRequest {
|
|
74
|
+
user_ids: number[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Запрос на добавление администратора
|
|
78
|
+
*/
|
|
79
|
+
export interface AddAdminRequest {
|
|
80
|
+
user_id: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Запрос на отправку действия в чат
|
|
84
|
+
*/
|
|
85
|
+
export interface SendActionRequest {
|
|
86
|
+
action: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Запрос на закрепление сообщения
|
|
90
|
+
*/
|
|
91
|
+
export interface PinMessageRequest {
|
|
92
|
+
message_id: string;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/types/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAElE;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5C,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,2BAA2B;IAC3B,gBAAgB,CAAC,EAAE,aAAa,CAAC;IACjC,gEAAgE;IAChE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,IAAI;IACtC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB"}
|