@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,69 @@
|
|
|
1
|
+
import { BotStartedContext } from "./BotStartedContext.js";
|
|
2
|
+
import { CallbackContext } from "./CallbackContext.js";
|
|
3
|
+
import { ChatContext } from "./ChatContext.js";
|
|
4
|
+
import { MessageContext } from "./MessageContext.js";
|
|
5
|
+
import type { Context } from "../Bot.js";
|
|
6
|
+
/**
|
|
7
|
+
* Type guard: проверяет, что контекст является `MessageContext`.
|
|
8
|
+
*
|
|
9
|
+
* Применяется в middleware для сужения типа:
|
|
10
|
+
* @example
|
|
11
|
+
* bot.use(async (ctx, next) => {
|
|
12
|
+
* if (isMessageContext(ctx)) {
|
|
13
|
+
* console.log(ctx.text); // string | undefined — TS знает тип
|
|
14
|
+
* }
|
|
15
|
+
* await next();
|
|
16
|
+
* });
|
|
17
|
+
*/
|
|
18
|
+
export declare function isMessageContext(ctx: Context): ctx is MessageContext;
|
|
19
|
+
/**
|
|
20
|
+
* Type guard: проверяет, что контекст является `CallbackContext`.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* bot.use(async (ctx, next) => {
|
|
24
|
+
* if (isCallbackContext(ctx)) {
|
|
25
|
+
* console.log(ctx.data); // payload кнопки
|
|
26
|
+
* }
|
|
27
|
+
* await next();
|
|
28
|
+
* });
|
|
29
|
+
*/
|
|
30
|
+
export declare function isCallbackContext(ctx: Context): ctx is CallbackContext;
|
|
31
|
+
/**
|
|
32
|
+
* Type guard: проверяет, что контекст является `ChatContext`.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* bot.use(async (ctx, next) => {
|
|
36
|
+
* if (isChatContext(ctx)) {
|
|
37
|
+
* console.log(ctx.chatId); // number — всегда есть в ChatContext
|
|
38
|
+
* }
|
|
39
|
+
* await next();
|
|
40
|
+
* });
|
|
41
|
+
*/
|
|
42
|
+
export declare function isChatContext(ctx: Context): ctx is ChatContext;
|
|
43
|
+
/**
|
|
44
|
+
* Type guard: проверяет, что контекст является `BotStartedContext`.
|
|
45
|
+
*
|
|
46
|
+
* Используй для обработки нажатия Start или перехода по deep link:
|
|
47
|
+
* @example
|
|
48
|
+
* bot.use(async (ctx, next) => {
|
|
49
|
+
* if (isBotStartedContext(ctx)) {
|
|
50
|
+
* console.log(ctx.startPayload); // payload из deep link или null
|
|
51
|
+
* }
|
|
52
|
+
* await next();
|
|
53
|
+
* });
|
|
54
|
+
*/
|
|
55
|
+
export declare function isBotStartedContext(ctx: Context): ctx is BotStartedContext;
|
|
56
|
+
/**
|
|
57
|
+
* Type guard: проверяет конкретный `update_type`.
|
|
58
|
+
*
|
|
59
|
+
* Используй когда нужно сузить тип внутри MessageContext или ChatContext:
|
|
60
|
+
* @example
|
|
61
|
+
* bot.use(async (ctx, next) => {
|
|
62
|
+
* if (isUpdateType(ctx, 'message_created')) {
|
|
63
|
+
* // ctx — MessageContext с update_type === 'message_created'
|
|
64
|
+
* }
|
|
65
|
+
* await next();
|
|
66
|
+
* });
|
|
67
|
+
*/
|
|
68
|
+
export declare function isUpdateType<T extends Context>(ctx: Context, updateType: T["raw"]["update_type"]): ctx is T;
|
|
69
|
+
//# sourceMappingURL=guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../../src/bot/context/guards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAEpE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,eAAe,CAEtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAE9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,iBAAiB,CAE1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,OAAO,EAC5C,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,GAClC,GAAG,IAAI,CAAC,CAEV"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMessageContext = isMessageContext;
|
|
4
|
+
exports.isCallbackContext = isCallbackContext;
|
|
5
|
+
exports.isChatContext = isChatContext;
|
|
6
|
+
exports.isBotStartedContext = isBotStartedContext;
|
|
7
|
+
exports.isUpdateType = isUpdateType;
|
|
8
|
+
const BotStartedContext_js_1 = require("./BotStartedContext.js");
|
|
9
|
+
const CallbackContext_js_1 = require("./CallbackContext.js");
|
|
10
|
+
const ChatContext_js_1 = require("./ChatContext.js");
|
|
11
|
+
const MessageContext_js_1 = require("./MessageContext.js");
|
|
12
|
+
/**
|
|
13
|
+
* Type guard: проверяет, что контекст является `MessageContext`.
|
|
14
|
+
*
|
|
15
|
+
* Применяется в middleware для сужения типа:
|
|
16
|
+
* @example
|
|
17
|
+
* bot.use(async (ctx, next) => {
|
|
18
|
+
* if (isMessageContext(ctx)) {
|
|
19
|
+
* console.log(ctx.text); // string | undefined — TS знает тип
|
|
20
|
+
* }
|
|
21
|
+
* await next();
|
|
22
|
+
* });
|
|
23
|
+
*/
|
|
24
|
+
function isMessageContext(ctx) {
|
|
25
|
+
return ctx instanceof MessageContext_js_1.MessageContext;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Type guard: проверяет, что контекст является `CallbackContext`.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* bot.use(async (ctx, next) => {
|
|
32
|
+
* if (isCallbackContext(ctx)) {
|
|
33
|
+
* console.log(ctx.data); // payload кнопки
|
|
34
|
+
* }
|
|
35
|
+
* await next();
|
|
36
|
+
* });
|
|
37
|
+
*/
|
|
38
|
+
function isCallbackContext(ctx) {
|
|
39
|
+
return ctx instanceof CallbackContext_js_1.CallbackContext;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Type guard: проверяет, что контекст является `ChatContext`.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* bot.use(async (ctx, next) => {
|
|
46
|
+
* if (isChatContext(ctx)) {
|
|
47
|
+
* console.log(ctx.chatId); // number — всегда есть в ChatContext
|
|
48
|
+
* }
|
|
49
|
+
* await next();
|
|
50
|
+
* });
|
|
51
|
+
*/
|
|
52
|
+
function isChatContext(ctx) {
|
|
53
|
+
return ctx instanceof ChatContext_js_1.ChatContext;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Type guard: проверяет, что контекст является `BotStartedContext`.
|
|
57
|
+
*
|
|
58
|
+
* Используй для обработки нажатия Start или перехода по deep link:
|
|
59
|
+
* @example
|
|
60
|
+
* bot.use(async (ctx, next) => {
|
|
61
|
+
* if (isBotStartedContext(ctx)) {
|
|
62
|
+
* console.log(ctx.startPayload); // payload из deep link или null
|
|
63
|
+
* }
|
|
64
|
+
* await next();
|
|
65
|
+
* });
|
|
66
|
+
*/
|
|
67
|
+
function isBotStartedContext(ctx) {
|
|
68
|
+
return ctx instanceof BotStartedContext_js_1.BotStartedContext;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Type guard: проверяет конкретный `update_type`.
|
|
72
|
+
*
|
|
73
|
+
* Используй когда нужно сузить тип внутри MessageContext или ChatContext:
|
|
74
|
+
* @example
|
|
75
|
+
* bot.use(async (ctx, next) => {
|
|
76
|
+
* if (isUpdateType(ctx, 'message_created')) {
|
|
77
|
+
* // ctx — MessageContext с update_type === 'message_created'
|
|
78
|
+
* }
|
|
79
|
+
* await next();
|
|
80
|
+
* });
|
|
81
|
+
*/
|
|
82
|
+
function isUpdateType(ctx, updateType) {
|
|
83
|
+
return ctx.raw.update_type === updateType;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=guards.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { MessageContext, type SendOptions, type ContextApi, } from "./MessageContext.js";
|
|
2
|
+
export { CallbackContext, type AnswerOptions } from "./CallbackContext.js";
|
|
3
|
+
export { ChatContext } from "./ChatContext.js";
|
|
4
|
+
export { BotStartedContext } from "./BotStartedContext.js";
|
|
5
|
+
export { isMessageContext, isCallbackContext, isChatContext, isBotStartedContext, isUpdateType, } from "./guards.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bot/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,YAAY,GACb,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isUpdateType = exports.isBotStartedContext = exports.isChatContext = exports.isCallbackContext = exports.isMessageContext = exports.BotStartedContext = exports.ChatContext = exports.CallbackContext = exports.MessageContext = void 0;
|
|
4
|
+
var MessageContext_js_1 = require("./MessageContext.js");
|
|
5
|
+
Object.defineProperty(exports, "MessageContext", { enumerable: true, get: function () { return MessageContext_js_1.MessageContext; } });
|
|
6
|
+
var CallbackContext_js_1 = require("./CallbackContext.js");
|
|
7
|
+
Object.defineProperty(exports, "CallbackContext", { enumerable: true, get: function () { return CallbackContext_js_1.CallbackContext; } });
|
|
8
|
+
var ChatContext_js_1 = require("./ChatContext.js");
|
|
9
|
+
Object.defineProperty(exports, "ChatContext", { enumerable: true, get: function () { return ChatContext_js_1.ChatContext; } });
|
|
10
|
+
var BotStartedContext_js_1 = require("./BotStartedContext.js");
|
|
11
|
+
Object.defineProperty(exports, "BotStartedContext", { enumerable: true, get: function () { return BotStartedContext_js_1.BotStartedContext; } });
|
|
12
|
+
var guards_js_1 = require("./guards.js");
|
|
13
|
+
Object.defineProperty(exports, "isMessageContext", { enumerable: true, get: function () { return guards_js_1.isMessageContext; } });
|
|
14
|
+
Object.defineProperty(exports, "isCallbackContext", { enumerable: true, get: function () { return guards_js_1.isCallbackContext; } });
|
|
15
|
+
Object.defineProperty(exports, "isChatContext", { enumerable: true, get: function () { return guards_js_1.isChatContext; } });
|
|
16
|
+
Object.defineProperty(exports, "isBotStartedContext", { enumerable: true, get: function () { return guards_js_1.isBotStartedContext; } });
|
|
17
|
+
Object.defineProperty(exports, "isUpdateType", { enumerable: true, get: function () { return guards_js_1.isUpdateType; } });
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ContextApi } from "./context/MessageContext.js";
|
|
2
|
+
import type { Middleware } from "../middleware/types.js";
|
|
3
|
+
import type { Update } from "../types/update.js";
|
|
4
|
+
import type { BotMetrics } from "./metrics.js";
|
|
5
|
+
import type { Context, EventHandler } from "./Bot.js";
|
|
6
|
+
/**
|
|
7
|
+
* Слой диспетчеризации и семафора.
|
|
8
|
+
*
|
|
9
|
+
* Отвечает за:
|
|
10
|
+
* - Создание контекста из сырого обновления (`createContext`)
|
|
11
|
+
* - Запуск пайплайна middleware + handlers (`handleUpdate`, `runHandlersWithSemaphore`)
|
|
12
|
+
* - Backpressure (семафор: `acquireSemaphore` / `releaseSemaphore`)
|
|
13
|
+
* - Маршрутизацию ошибок (`handleError`)
|
|
14
|
+
*
|
|
15
|
+
* Не содержит бизнес-логики маршрутизации — она вынесена в {@link BotRouting}.
|
|
16
|
+
*/
|
|
17
|
+
export declare abstract class BotDispatch<Ctx extends Context> {
|
|
18
|
+
protected readonly handlers: Map<string, EventHandler<Ctx>[]>;
|
|
19
|
+
protected readonly middlewares: Middleware<Ctx>[];
|
|
20
|
+
protected contextApi: ContextApi;
|
|
21
|
+
protected _contextFactory: (base: Context) => Ctx;
|
|
22
|
+
protected concurrency: number;
|
|
23
|
+
protected errorHandler: ((error: Error) => void) | null;
|
|
24
|
+
protected slowHandler: ((ms: number, updateType: string) => void) | null;
|
|
25
|
+
protected slowThresholdMs: number;
|
|
26
|
+
protected unknownUpdateHandler: ((raw: Record<string, unknown>) => void) | null;
|
|
27
|
+
protected metricsHandler: ((metrics: BotMetrics) => void) | null;
|
|
28
|
+
private activeCount;
|
|
29
|
+
private readonly waitQueue;
|
|
30
|
+
protected handleUpdate(update: Update): void;
|
|
31
|
+
private runHandlersWithSemaphore;
|
|
32
|
+
/**
|
|
33
|
+
* Захватить слот семафора.
|
|
34
|
+
* Если свободных слотов нет — ждём в очереди.
|
|
35
|
+
*/
|
|
36
|
+
private acquireSemaphore;
|
|
37
|
+
/**
|
|
38
|
+
* Освободить слот семафора и разбудить следующего в очереди.
|
|
39
|
+
*/
|
|
40
|
+
private releaseSemaphore;
|
|
41
|
+
protected handleError(error: Error): void;
|
|
42
|
+
/**
|
|
43
|
+
* Создаёт типизированный контекст из сырого обновления.
|
|
44
|
+
*
|
|
45
|
+
* Возвращает `null` если `update_type` неизвестен SDK **и** задан хук
|
|
46
|
+
* `onUnknownUpdate` — хук уже вызван, update нужно пропустить.
|
|
47
|
+
* Если хук не задан — бросает ошибку через `assertNever` → `errorHandler`.
|
|
48
|
+
*/
|
|
49
|
+
private createContext;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../src/bot/dispatch.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,8BAAsB,WAAW,CAAC,GAAG,SAAS,OAAO;IAEnD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAa;IAC1E,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAM;IAKvD,SAAS,CAAC,UAAU,EAAG,UAAU,CAAC;IAClC,SAAS,CAAC,eAAe,EAAG,CAAC,IAAI,EAAE,OAAO,KAAK,GAAG,CAAC;IACnD,SAAS,CAAC,WAAW,EAAG,MAAM,CAAC;IAG/B,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC/D,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CACjE;IACP,SAAS,CAAC,eAAe,SAAK;IAC9B,SAAS,CAAC,oBAAoB,EAC1B,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,GACxC,IAAI,CAAQ;IAChB,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAGxE,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAInD,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;YA6B9B,wBAAwB;IAoEtC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAczC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAkCtB"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BotDispatch = void 0;
|
|
4
|
+
const CallbackContext_js_1 = require("./context/CallbackContext.js");
|
|
5
|
+
const ChatContext_js_1 = require("./context/ChatContext.js");
|
|
6
|
+
const BotStartedContext_js_1 = require("./context/BotStartedContext.js");
|
|
7
|
+
const MessageContext_js_1 = require("./context/MessageContext.js");
|
|
8
|
+
const assertNever_js_1 = require("../utils/assertNever.js");
|
|
9
|
+
const compose_js_1 = require("../middleware/compose.js");
|
|
10
|
+
/**
|
|
11
|
+
* Слой диспетчеризации и семафора.
|
|
12
|
+
*
|
|
13
|
+
* Отвечает за:
|
|
14
|
+
* - Создание контекста из сырого обновления (`createContext`)
|
|
15
|
+
* - Запуск пайплайна middleware + handlers (`handleUpdate`, `runHandlersWithSemaphore`)
|
|
16
|
+
* - Backpressure (семафор: `acquireSemaphore` / `releaseSemaphore`)
|
|
17
|
+
* - Маршрутизацию ошибок (`handleError`)
|
|
18
|
+
*
|
|
19
|
+
* Не содержит бизнес-логики маршрутизации — она вынесена в {@link BotRouting}.
|
|
20
|
+
*/
|
|
21
|
+
class BotDispatch {
|
|
22
|
+
// ── Хранилища маршрутов и middleware ──────────────────────────────────────
|
|
23
|
+
handlers = new Map();
|
|
24
|
+
middlewares = [];
|
|
25
|
+
// ── Поля, инициализируемые в конструкторе Bot ─────────────────────────────
|
|
26
|
+
// Используем ! (definite assignment assertion): TypeScript знает что поля
|
|
27
|
+
// будут присвоены до первого use (в конструкторе Bot, который вызывает super()).
|
|
28
|
+
contextApi;
|
|
29
|
+
_contextFactory;
|
|
30
|
+
concurrency;
|
|
31
|
+
// ── Наблюдатели (configurable через lifecycle-методы или config) ───────────
|
|
32
|
+
errorHandler = null;
|
|
33
|
+
slowHandler = null;
|
|
34
|
+
slowThresholdMs = 0;
|
|
35
|
+
unknownUpdateHandler = null;
|
|
36
|
+
metricsHandler = null;
|
|
37
|
+
// ── Семафор ───────────────────────────────────────────────────────────────
|
|
38
|
+
activeCount = 0;
|
|
39
|
+
waitQueue = [];
|
|
40
|
+
// ── Точка входа для транспорта ────────────────────────────────────────────
|
|
41
|
+
handleUpdate(update) {
|
|
42
|
+
let ctx;
|
|
43
|
+
try {
|
|
44
|
+
const base = this.createContext(update);
|
|
45
|
+
// null — знак что update_type неизвестен и хук onUnknownUpdate уже вызван;
|
|
46
|
+
// пропускаем update без ошибки
|
|
47
|
+
if (base === null)
|
|
48
|
+
return;
|
|
49
|
+
ctx = this._contextFactory(base);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
this.handleError(error instanceof Error ? error : new Error(String(error)));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const handlers = this.handlers.get(update.update_type) ?? [];
|
|
56
|
+
// Пропускаем только если нет ни middleware, ни handlers — тогда обрабатывать
|
|
57
|
+
// буквально нечего и мы не занимаем слот семафора впустую.
|
|
58
|
+
// Если есть хотя бы middleware — запускаем пайплайн: глобальные middleware
|
|
59
|
+
// (логирование, трейсинг) должны видеть ВСЕ update типы.
|
|
60
|
+
if (this.middlewares.length === 0 && handlers.length === 0)
|
|
61
|
+
return;
|
|
62
|
+
// Запускаем обработку через семафор — гарантируем не более concurrency
|
|
63
|
+
// параллельных задач. Каждое обновление обрабатывается как единица:
|
|
64
|
+
// все его хендлеры выполняются параллельно внутри одного слота семафора.
|
|
65
|
+
void this.runHandlersWithSemaphore(ctx, handlers, update.update_type);
|
|
66
|
+
}
|
|
67
|
+
async runHandlersWithSemaphore(ctx, handlers, updateType) {
|
|
68
|
+
const needMetrics = this.metricsHandler !== null;
|
|
69
|
+
const needSlow = this.slowHandler !== null;
|
|
70
|
+
// Размер очереди ДО захвата слота — показывает реальное давление
|
|
71
|
+
const queueSizeAtStart = this.waitQueue.length;
|
|
72
|
+
await this.acquireSemaphore();
|
|
73
|
+
const start = needMetrics || needSlow ? Date.now() : 0;
|
|
74
|
+
let handlerErrors = 0;
|
|
75
|
+
const middlewareTimes = [];
|
|
76
|
+
try {
|
|
77
|
+
// Финальный обработчик — запускает все зарегистрированные handlers параллельно
|
|
78
|
+
const finalHandler = async (c) => {
|
|
79
|
+
await Promise.all(handlers.map(async (handler) => {
|
|
80
|
+
try {
|
|
81
|
+
await handler(c);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
handlerErrors++;
|
|
85
|
+
this.handleError(error instanceof Error ? error : new Error(String(error)));
|
|
86
|
+
}
|
|
87
|
+
}));
|
|
88
|
+
};
|
|
89
|
+
// Весь пайплайн [middlewares... → handlers] выполняется внутри одного
|
|
90
|
+
// семафорного слота — backpressure применяется ко всему цепочке целиком.
|
|
91
|
+
const pipeline = needMetrics
|
|
92
|
+
? (0, compose_js_1.composeWithTiming)(this.middlewares, finalHandler, middlewareTimes)
|
|
93
|
+
: (0, compose_js_1.compose)(this.middlewares, finalHandler);
|
|
94
|
+
await pipeline(ctx);
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
const elapsed = needMetrics || needSlow ? Date.now() - start : 0;
|
|
98
|
+
if (needSlow && elapsed >= this.slowThresholdMs) {
|
|
99
|
+
try {
|
|
100
|
+
this.slowHandler?.(elapsed, updateType);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Ошибки наблюдателей не должны влиять на основной поток
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (needMetrics) {
|
|
107
|
+
try {
|
|
108
|
+
this.metricsHandler?.({
|
|
109
|
+
updateType,
|
|
110
|
+
totalMs: elapsed,
|
|
111
|
+
queueSizeAtStart,
|
|
112
|
+
handlerErrors,
|
|
113
|
+
middlewareTimes,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Ошибки наблюдателей не должны влиять на основной поток
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
this.releaseSemaphore();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Захватить слот семафора.
|
|
125
|
+
* Если свободных слотов нет — ждём в очереди.
|
|
126
|
+
*/
|
|
127
|
+
acquireSemaphore() {
|
|
128
|
+
if (this.activeCount < this.concurrency) {
|
|
129
|
+
this.activeCount++;
|
|
130
|
+
return Promise.resolve();
|
|
131
|
+
}
|
|
132
|
+
return new Promise((resolve) => {
|
|
133
|
+
this.waitQueue.push(resolve);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Освободить слот семафора и разбудить следующего в очереди.
|
|
138
|
+
*/
|
|
139
|
+
releaseSemaphore() {
|
|
140
|
+
const next = this.waitQueue.shift();
|
|
141
|
+
if (next) {
|
|
142
|
+
// Передаём слот напрямую — activeCount не меняется
|
|
143
|
+
next();
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
this.activeCount--;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
handleError(error) {
|
|
150
|
+
if (this.errorHandler) {
|
|
151
|
+
try {
|
|
152
|
+
this.errorHandler(error);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Игнорируем ошибки в обработчике ошибок
|
|
156
|
+
console.error("Ошибка в обработчике ошибок:", error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// По умолчанию логируем в консоль
|
|
161
|
+
console.error("Ошибка бота:", error);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Создаёт типизированный контекст из сырого обновления.
|
|
166
|
+
*
|
|
167
|
+
* Возвращает `null` если `update_type` неизвестен SDK **и** задан хук
|
|
168
|
+
* `onUnknownUpdate` — хук уже вызван, update нужно пропустить.
|
|
169
|
+
* Если хук не задан — бросает ошибку через `assertNever` → `errorHandler`.
|
|
170
|
+
*/
|
|
171
|
+
createContext(update) {
|
|
172
|
+
switch (update.update_type) {
|
|
173
|
+
case "message_callback":
|
|
174
|
+
return new CallbackContext_js_1.CallbackContext(update, this.contextApi);
|
|
175
|
+
case "message_created":
|
|
176
|
+
case "message_edited":
|
|
177
|
+
case "message_removed":
|
|
178
|
+
return new MessageContext_js_1.MessageContext(update, this.contextApi);
|
|
179
|
+
case "bot_added":
|
|
180
|
+
case "bot_removed":
|
|
181
|
+
case "user_added":
|
|
182
|
+
case "user_removed":
|
|
183
|
+
case "chat_title_changed":
|
|
184
|
+
return new ChatContext_js_1.ChatContext(update);
|
|
185
|
+
case "bot_started":
|
|
186
|
+
return new BotStartedContext_js_1.BotStartedContext(update, this.contextApi);
|
|
187
|
+
default:
|
|
188
|
+
// TypeScript проверит здесь что все варианты UpdateType обработаны выше.
|
|
189
|
+
// Если появится новый update_type — будет ошибка компиляции, а не рантайм-краш.
|
|
190
|
+
if (this.unknownUpdateHandler) {
|
|
191
|
+
// Хук вызван, возвращаем null — handleUpdate пропустит update без ошибки
|
|
192
|
+
this.unknownUpdateHandler(update);
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
// Хук не задан — бросаем ошибку, она уйдёт в errorHandler
|
|
196
|
+
return (0, assertNever_js_1.assertNever)(update);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
exports.BotDispatch = BotDispatch;
|
|
201
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { Bot, type BotConfig, type Context, type EventHandler } from "./Bot.js";
|
|
2
|
+
export { Composer, type Filter } from "./Composer.js";
|
|
3
|
+
export { type HearsTrigger, type CommandTrigger, matchCommand, } from "./triggers.js";
|
|
4
|
+
export type { BotMetrics } from "./metrics.js";
|
|
5
|
+
export { MessageContext, type ContextApi, type SendOptions, } from "./context/MessageContext.js";
|
|
6
|
+
export { CallbackContext, type AnswerOptions, } from "./context/CallbackContext.js";
|
|
7
|
+
export { ChatContext } from "./context/ChatContext.js";
|
|
8
|
+
export { BotStartedContext } from "./context/BotStartedContext.js";
|
|
9
|
+
export { isMessageContext, isCallbackContext, isChatContext, isBotStartedContext, isUpdateType, } from "./context/guards.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bot/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,YAAY,GACb,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isUpdateType = exports.isBotStartedContext = exports.isChatContext = exports.isCallbackContext = exports.isMessageContext = exports.BotStartedContext = exports.ChatContext = exports.CallbackContext = exports.MessageContext = exports.matchCommand = exports.Composer = exports.Bot = void 0;
|
|
4
|
+
var Bot_js_1 = require("./Bot.js");
|
|
5
|
+
Object.defineProperty(exports, "Bot", { enumerable: true, get: function () { return Bot_js_1.Bot; } });
|
|
6
|
+
var Composer_js_1 = require("./Composer.js");
|
|
7
|
+
Object.defineProperty(exports, "Composer", { enumerable: true, get: function () { return Composer_js_1.Composer; } });
|
|
8
|
+
var triggers_js_1 = require("./triggers.js");
|
|
9
|
+
Object.defineProperty(exports, "matchCommand", { enumerable: true, get: function () { return triggers_js_1.matchCommand; } });
|
|
10
|
+
var MessageContext_js_1 = require("./context/MessageContext.js");
|
|
11
|
+
Object.defineProperty(exports, "MessageContext", { enumerable: true, get: function () { return MessageContext_js_1.MessageContext; } });
|
|
12
|
+
var CallbackContext_js_1 = require("./context/CallbackContext.js");
|
|
13
|
+
Object.defineProperty(exports, "CallbackContext", { enumerable: true, get: function () { return CallbackContext_js_1.CallbackContext; } });
|
|
14
|
+
var ChatContext_js_1 = require("./context/ChatContext.js");
|
|
15
|
+
Object.defineProperty(exports, "ChatContext", { enumerable: true, get: function () { return ChatContext_js_1.ChatContext; } });
|
|
16
|
+
var BotStartedContext_js_1 = require("./context/BotStartedContext.js");
|
|
17
|
+
Object.defineProperty(exports, "BotStartedContext", { enumerable: true, get: function () { return BotStartedContext_js_1.BotStartedContext; } });
|
|
18
|
+
var guards_js_1 = require("./context/guards.js");
|
|
19
|
+
Object.defineProperty(exports, "isMessageContext", { enumerable: true, get: function () { return guards_js_1.isMessageContext; } });
|
|
20
|
+
Object.defineProperty(exports, "isCallbackContext", { enumerable: true, get: function () { return guards_js_1.isCallbackContext; } });
|
|
21
|
+
Object.defineProperty(exports, "isChatContext", { enumerable: true, get: function () { return guards_js_1.isChatContext; } });
|
|
22
|
+
Object.defineProperty(exports, "isBotStartedContext", { enumerable: true, get: function () { return guards_js_1.isBotStartedContext; } });
|
|
23
|
+
Object.defineProperty(exports, "isUpdateType", { enumerable: true, get: function () { return guards_js_1.isUpdateType; } });
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { IBotsApi, IChatsApi, IMessagesApi, ISubscriptionsApi, IUploadsApi } from "../api/interfaces.js";
|
|
2
|
+
import type { IUpdateTransport } from "../transport/interfaces.js";
|
|
3
|
+
import type { BotInfo } from "../types/bot.js";
|
|
4
|
+
import type { Message } from "../types/message.js";
|
|
5
|
+
import type { SubscriptionInfo } from "../types/subscription.js";
|
|
6
|
+
import type { SendOptions } from "./context/MessageContext.js";
|
|
7
|
+
import { BotRouting } from "./routing.js";
|
|
8
|
+
import type { Context } from "./Bot.js";
|
|
9
|
+
/**
|
|
10
|
+
* Слой жизненного цикла и удобных методов.
|
|
11
|
+
*
|
|
12
|
+
* Отвечает за:
|
|
13
|
+
* - Запуск / остановку бота (`start` / `stop`) с Promise-мьютексом
|
|
14
|
+
* - Управление webhook (`setWebhookUrl`, `deleteWebhook`, `getWebhookInfo`)
|
|
15
|
+
* - Высокоуровневые методы отправки (`sendMessage`, `sendPrivateMessage`, `getMe`)
|
|
16
|
+
* - Конфигурацию наблюдателей (`onError`, `onSlowHandler`)
|
|
17
|
+
*
|
|
18
|
+
* Расширяет {@link BotRouting} — использует маршруты и middleware из него.
|
|
19
|
+
*
|
|
20
|
+
* Поля `api` и `transport` объявлены как `abstract` — конкретные значения
|
|
21
|
+
* предоставляет конструктор `Bot`.
|
|
22
|
+
*/
|
|
23
|
+
export declare abstract class BotLifecycle<Ctx extends Context> extends BotRouting<Ctx> {
|
|
24
|
+
/** Доступ к низкоуровневым API для продвинутых сценариев */
|
|
25
|
+
abstract readonly api: {
|
|
26
|
+
readonly bots: IBotsApi;
|
|
27
|
+
readonly chats: IChatsApi;
|
|
28
|
+
readonly messages: IMessagesApi;
|
|
29
|
+
readonly subscriptions: ISubscriptionsApi;
|
|
30
|
+
readonly uploads: IUploadsApi;
|
|
31
|
+
};
|
|
32
|
+
/** Транспорт: LongPolling или Webhook */
|
|
33
|
+
protected abstract readonly transport: IUpdateTransport;
|
|
34
|
+
private startPromise;
|
|
35
|
+
/**
|
|
36
|
+
* Установить URL для webhook.
|
|
37
|
+
*/
|
|
38
|
+
setWebhookUrl(url: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Удалить webhook.
|
|
41
|
+
*/
|
|
42
|
+
deleteWebhook(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Получить информацию о текущем webhook.
|
|
45
|
+
*/
|
|
46
|
+
getWebhookInfo(): Promise<SubscriptionInfo>;
|
|
47
|
+
/**
|
|
48
|
+
* Зарегистрировать обработчик ошибок.
|
|
49
|
+
*/
|
|
50
|
+
onError(handler: (error: Error) => void): this;
|
|
51
|
+
/**
|
|
52
|
+
* Назначить коллбэк для медленных обработчиков.
|
|
53
|
+
*
|
|
54
|
+
* Если обработка обновления заняла больше `thresholdMs` мс,
|
|
55
|
+
* вызывается `cb` с фактическим временем выполнения и типом обновления.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* bot.onSlowHandler(500, (ms, type) => {
|
|
59
|
+
* log.warn({ ms, type }, 'slow handler detected');
|
|
60
|
+
* });
|
|
61
|
+
*/
|
|
62
|
+
onSlowHandler(thresholdMs: number, cb: (ms: number, updateType: string) => void): this;
|
|
63
|
+
/**
|
|
64
|
+
* Получить информацию о боте.
|
|
65
|
+
*/
|
|
66
|
+
getMe(): Promise<BotInfo>;
|
|
67
|
+
/**
|
|
68
|
+
* Отправить сообщение в чат.
|
|
69
|
+
*/
|
|
70
|
+
sendMessage(chatId: number, text: string, options?: SendOptions): Promise<Message>;
|
|
71
|
+
/**
|
|
72
|
+
* Отправить личное сообщение пользователю.
|
|
73
|
+
*/
|
|
74
|
+
sendPrivateMessage(userId: number, text: string, options?: SendOptions): Promise<Message>;
|
|
75
|
+
/**
|
|
76
|
+
* Запустить бота.
|
|
77
|
+
*/
|
|
78
|
+
start(): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Остановить бота.
|
|
81
|
+
*/
|
|
82
|
+
stop(): Promise<void>;
|
|
83
|
+
private _doStart;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/bot/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC;;;;;;;;;;;;;GAaG;AACH,8BAAsB,YAAY,CAChC,GAAG,SAAS,OAAO,CACnB,SAAQ,UAAU,CAAC,GAAG,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE;QACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;QAChC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;QAC1C,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;KAC/B,CAAC;IAEF,yCAAyC;IACzC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IAMxD,OAAO,CAAC,YAAY,CAA8B;IAIlD;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAMjD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAK9C;;;;;;;;;;OAUG;IACH,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAC3C,IAAI;IAQP;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,OAAO,CAAC;IAgBnB;;OAEG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,OAAO,CAAC;IAkBnB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YA8Bb,QAAQ;CAMvB"}
|