@vvlad1973/telegram-bot-client 1.3.0 → 2.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/.claude/settings.local.json +7 -0
- package/README.md +300 -273
- package/dist/agents/LongPollingManager.d.ts +5 -6
- package/dist/agents/LongPollingManager.js +48 -46
- package/dist/agents/LongPollingManager.js.map +1 -1
- package/dist/agents/types/polling-manager.types.d.ts +4 -4
- package/dist/agents/workers/WorkerClientFactory.js +3 -3
- package/dist/agents/workers/WorkerClientFactory.js.map +1 -1
- package/dist/agents/workers/long-polling-worker-test.js +2 -1
- package/dist/agents/workers/long-polling-worker-test.js.map +1 -1
- package/dist/api/BaseTelegramApi.generated.js +481 -0
- package/dist/api/BaseTelegramApi.generated.js.map +1 -1
- package/dist/client/TelegramBotClient.d.ts +15 -4
- package/dist/client/TelegramBotClient.js +17 -4
- package/dist/client/TelegramBotClient.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/managers/PollingIntegrationManager.d.ts +160 -0
- package/dist/client/managers/PollingIntegrationManager.js +274 -0
- package/dist/client/managers/PollingIntegrationManager.js.map +1 -0
- package/dist/client/managers/RouteConfigManager.d.ts +186 -0
- package/dist/client/managers/RouteConfigManager.js +395 -0
- package/dist/client/managers/RouteConfigManager.js.map +1 -0
- package/dist/client/managers/RouteLifecycleManager.d.ts +146 -0
- package/dist/client/managers/RouteLifecycleManager.js +402 -0
- package/dist/client/managers/RouteLifecycleManager.js.map +1 -0
- package/dist/client/managers/index.d.ts +11 -0
- package/dist/client/managers/index.js +10 -0
- package/dist/client/managers/index.js.map +1 -0
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.js +2 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/logger-helpers.d.ts +2 -5
- package/dist/helpers/logger-helpers.js +2 -10
- package/dist/helpers/logger-helpers.js.map +1 -1
- package/dist/helpers/logging-decorators.d.ts +43 -0
- package/dist/helpers/logging-decorators.js +156 -0
- package/dist/helpers/logging-decorators.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/queue/InMemoryQueueProvider.d.ts +2 -2
- package/dist/queue/InMemoryQueueProvider.js +2 -2
- package/dist/queue/InMemoryQueueProvider.js.map +1 -1
- package/dist/transport/TelegramHttpClient.d.ts +2 -2
- package/dist/transport/TelegramHttpClient.js +2 -2
- package/dist/transport/TelegramHttpClient.js.map +1 -1
- package/dist/transport/TelegramHttpTransport.d.ts +2 -2
- package/dist/transport/TelegramHttpTransport.js +3 -4
- package/dist/transport/TelegramHttpTransport.js.map +1 -1
- package/dist/transport/TelegramTransport.d.ts +2 -2
- package/dist/transport/TelegramTransport.js +23 -7
- package/dist/transport/TelegramTransport.js.map +1 -1
- package/dist/transport/TokensManager.d.ts +2 -2
- package/dist/transport/TokensManager.js +6 -6
- package/dist/transport/TokensManager.js.map +1 -1
- package/dist/transport/index.d.ts +0 -1
- package/dist/transport/index.js +1 -3
- package/dist/transport/index.js.map +1 -1
- package/dist/types/logger.types.d.ts +3 -9
- package/dist/types/route.types.d.ts +110 -0
- package/dist/types/route.types.js +19 -0
- package/dist/types/route.types.js.map +1 -0
- package/dist/types/transport.types.d.ts +3 -1
- package/package.json +1 -1
- package/test_output.txt +256 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Lifecycle Manager
|
|
3
|
+
* Manages route initialization, activation, deactivation, and hot reload
|
|
4
|
+
*
|
|
5
|
+
* @module client/managers/RouteLifecycleManager
|
|
6
|
+
*/
|
|
7
|
+
import type { RouteConfigManager } from './RouteConfigManager.js';
|
|
8
|
+
import type { BaseTelegramApi } from '../../api/BaseTelegramApi.generated.js';
|
|
9
|
+
import type { RouteStatus, RouteMode } from '../../types/route.types.js';
|
|
10
|
+
import type { ILogger, LoggerOptions, ILoggerAware } from '../../types/logger.types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Configuration options for RouteLifecycleManager
|
|
13
|
+
*/
|
|
14
|
+
export interface RouteLifecycleManagerOptions extends LoggerOptions {
|
|
15
|
+
/** Route configuration manager */
|
|
16
|
+
configManager: RouteConfigManager;
|
|
17
|
+
/** API client for webhook and bot info operations */
|
|
18
|
+
apiClient: BaseTelegramApi;
|
|
19
|
+
/**
|
|
20
|
+
* Base URL for webhooks (optional)
|
|
21
|
+
* Combined with route's webhook.path to form full webhook URL
|
|
22
|
+
* Example: 'https://example.com/webhooks'
|
|
23
|
+
*/
|
|
24
|
+
webhookBaseUrl?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Route Lifecycle Manager
|
|
28
|
+
* Manages route initialization, activation, deactivation, and mode switching
|
|
29
|
+
*
|
|
30
|
+
* Responsibilities:
|
|
31
|
+
* - Initialize routes (getMe, store bot info)
|
|
32
|
+
* - Activate routes (set webhooks, prepare for polling)
|
|
33
|
+
* - Deactivate routes (delete webhooks, stop polling)
|
|
34
|
+
* - Switch between modes (webhook ↔ longPolling ↔ inactive)
|
|
35
|
+
* - Hot reload routes (apply configuration changes)
|
|
36
|
+
* - Manage route status
|
|
37
|
+
*/
|
|
38
|
+
export declare class RouteLifecycleManager implements ILoggerAware {
|
|
39
|
+
private readonly configManager;
|
|
40
|
+
private readonly apiClient;
|
|
41
|
+
private readonly webhookBaseUrl?;
|
|
42
|
+
/** Logger instance - mutable to support LoggerBinder.bind() */
|
|
43
|
+
logger?: ILogger;
|
|
44
|
+
/**
|
|
45
|
+
* Create a new RouteLifecycleManager instance
|
|
46
|
+
* @param options - Configuration options
|
|
47
|
+
*/
|
|
48
|
+
constructor(options: RouteLifecycleManagerOptions);
|
|
49
|
+
/**
|
|
50
|
+
* Initialize a route
|
|
51
|
+
* Calls getMe to fetch bot info and stores it in route config
|
|
52
|
+
*
|
|
53
|
+
* @param routeId - Route identifier (uses default if not specified)
|
|
54
|
+
* @throws {Error} If route not found or initialization fails
|
|
55
|
+
*/
|
|
56
|
+
initRoute(routeId?: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Initialize all routes
|
|
59
|
+
* Calls initRoute for each configured route
|
|
60
|
+
*/
|
|
61
|
+
initAllRoutes(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Activate a route in specified mode
|
|
64
|
+
* For webhook mode: calls setWebhook
|
|
65
|
+
* For longPolling mode: prepares route status
|
|
66
|
+
* For inactive mode: does nothing
|
|
67
|
+
*
|
|
68
|
+
* @param routeId - Route identifier
|
|
69
|
+
* @param mode - Mode to activate (uses route's configured mode if not specified)
|
|
70
|
+
* @throws {Error} If route not found or activation fails
|
|
71
|
+
*/
|
|
72
|
+
activateRoute(routeId: string, mode?: RouteMode): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Resolve webhook URL from route configuration
|
|
75
|
+
* Priority: webhook.url > webhook.path + webhookBaseUrl
|
|
76
|
+
*
|
|
77
|
+
* @param routeId - Route identifier
|
|
78
|
+
* @param webhook - Webhook configuration
|
|
79
|
+
* @returns Resolved webhook URL
|
|
80
|
+
* @throws {Error} If URL cannot be resolved
|
|
81
|
+
*/
|
|
82
|
+
private resolveWebhookUrl;
|
|
83
|
+
/**
|
|
84
|
+
* Activate webhook mode for a route
|
|
85
|
+
* Calls setWebhook with route's webhook configuration
|
|
86
|
+
*
|
|
87
|
+
* @param routeId - Route identifier
|
|
88
|
+
* @param route - Route configuration
|
|
89
|
+
*/
|
|
90
|
+
private activateWebhook;
|
|
91
|
+
/**
|
|
92
|
+
* Activate long polling mode for a route
|
|
93
|
+
* Deletes webhook and prepares status for polling
|
|
94
|
+
*
|
|
95
|
+
* @param routeId - Route identifier
|
|
96
|
+
* @param route - Route configuration
|
|
97
|
+
*/
|
|
98
|
+
private activateLongPolling;
|
|
99
|
+
/**
|
|
100
|
+
* Deactivate a route
|
|
101
|
+
* For webhook mode: deletes webhook
|
|
102
|
+
* For longPolling mode: marks as inactive (actual polling stop handled by PollingIntegrationManager)
|
|
103
|
+
*
|
|
104
|
+
* @param routeId - Route identifier
|
|
105
|
+
* @throws {Error} If route not found or deactivation fails
|
|
106
|
+
*/
|
|
107
|
+
deactivateRoute(routeId: string): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Switch route to a different mode
|
|
110
|
+
* Deactivates current mode and activates new mode
|
|
111
|
+
*
|
|
112
|
+
* @param routeId - Route identifier
|
|
113
|
+
* @param newMode - New mode to activate
|
|
114
|
+
* @throws {Error} If route not found or mode switch fails
|
|
115
|
+
*/
|
|
116
|
+
switchMode(routeId: string, newMode: RouteMode): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Get route status
|
|
119
|
+
*
|
|
120
|
+
* @param routeId - Route identifier
|
|
121
|
+
* @returns Route status or undefined
|
|
122
|
+
*/
|
|
123
|
+
getStatus(routeId: string): RouteStatus | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* Set route status
|
|
126
|
+
* Use with caution - normally status is managed internally
|
|
127
|
+
*
|
|
128
|
+
* @param routeId - Route identifier
|
|
129
|
+
* @param status - Route status
|
|
130
|
+
*/
|
|
131
|
+
setStatus(routeId: string, status: RouteStatus): void;
|
|
132
|
+
/**
|
|
133
|
+
* Hot reload a route
|
|
134
|
+
* Applies configuration changes without full restart
|
|
135
|
+
* If route is active, deactivates and reactivates it
|
|
136
|
+
*
|
|
137
|
+
* @param routeId - Route identifier
|
|
138
|
+
* @throws {Error} If route not found or reload fails
|
|
139
|
+
*/
|
|
140
|
+
reloadRoute(routeId: string): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Hot reload all routes
|
|
143
|
+
* Applies configuration changes to all routes
|
|
144
|
+
*/
|
|
145
|
+
reloadAllRoutes(): Promise<void>;
|
|
146
|
+
}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Lifecycle Manager
|
|
3
|
+
* Manages route initialization, activation, deactivation, and hot reload
|
|
4
|
+
*
|
|
5
|
+
* @module client/managers/RouteLifecycleManager
|
|
6
|
+
*/
|
|
7
|
+
'use strict';
|
|
8
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
9
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
10
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
11
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
12
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
13
|
+
};
|
|
14
|
+
import { RouteMode as RouteModeEnum } from '../../types/route.types.js';
|
|
15
|
+
import { initializeLogger } from '../../helpers/logger-helpers.js';
|
|
16
|
+
import { LogMethod } from '../../helpers/logging-decorators.js';
|
|
17
|
+
/**
|
|
18
|
+
* Route Lifecycle Manager
|
|
19
|
+
* Manages route initialization, activation, deactivation, and mode switching
|
|
20
|
+
*
|
|
21
|
+
* Responsibilities:
|
|
22
|
+
* - Initialize routes (getMe, store bot info)
|
|
23
|
+
* - Activate routes (set webhooks, prepare for polling)
|
|
24
|
+
* - Deactivate routes (delete webhooks, stop polling)
|
|
25
|
+
* - Switch between modes (webhook ↔ longPolling ↔ inactive)
|
|
26
|
+
* - Hot reload routes (apply configuration changes)
|
|
27
|
+
* - Manage route status
|
|
28
|
+
*/
|
|
29
|
+
export class RouteLifecycleManager {
|
|
30
|
+
configManager;
|
|
31
|
+
apiClient;
|
|
32
|
+
webhookBaseUrl;
|
|
33
|
+
/** Logger instance - mutable to support LoggerBinder.bind() */
|
|
34
|
+
logger;
|
|
35
|
+
/**
|
|
36
|
+
* Create a new RouteLifecycleManager instance
|
|
37
|
+
* @param options - Configuration options
|
|
38
|
+
*/
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.configManager = options.configManager;
|
|
41
|
+
this.apiClient = options.apiClient;
|
|
42
|
+
this.webhookBaseUrl = options.webhookBaseUrl;
|
|
43
|
+
this.logger = initializeLogger(this, options.logger);
|
|
44
|
+
this.logger?.info?.('RouteLifecycleManager initialized');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Initialize a route
|
|
48
|
+
* Calls getMe to fetch bot info and stores it in route config
|
|
49
|
+
*
|
|
50
|
+
* @param routeId - Route identifier (uses default if not specified)
|
|
51
|
+
* @throws {Error} If route not found or initialization fails
|
|
52
|
+
*/
|
|
53
|
+
async initRoute(routeId) {
|
|
54
|
+
const id = routeId || this.configManager.getDefaultRouteId();
|
|
55
|
+
if (!id) {
|
|
56
|
+
throw new Error('No route specified and no default route set');
|
|
57
|
+
}
|
|
58
|
+
const route = this.configManager.getRoute(id);
|
|
59
|
+
if (!route) {
|
|
60
|
+
throw new Error(`Route not found: ${id}`);
|
|
61
|
+
}
|
|
62
|
+
this.logger?.info?.(`Initializing route: ${id}`);
|
|
63
|
+
try {
|
|
64
|
+
// Call getMe to get bot information
|
|
65
|
+
const response = await this.apiClient.getMe({}, { routeId: id });
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const errorMsg = 'description' in response ? response.description : 'Unknown error';
|
|
68
|
+
throw new Error(`getMe failed for route ${id}: ${errorMsg}`);
|
|
69
|
+
}
|
|
70
|
+
// Type narrowing: response is GetMeOkResponse here
|
|
71
|
+
// Note: GetMeResponseSuccess is incorrectly typed as Success<string> instead of Success<User>
|
|
72
|
+
// Using type assertion until API types are regenerated
|
|
73
|
+
const botInfo = ('result' in response ? response.result : undefined);
|
|
74
|
+
if (!botInfo) {
|
|
75
|
+
throw new Error(`Unexpected response structure from getMe for route ${id}`);
|
|
76
|
+
}
|
|
77
|
+
// Store bot info in route config
|
|
78
|
+
route.botInfo = botInfo;
|
|
79
|
+
// Initialize status if not present
|
|
80
|
+
if (!route.status) {
|
|
81
|
+
route.status = {
|
|
82
|
+
mode: route.mode || RouteModeEnum.Inactive,
|
|
83
|
+
active: false,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Store updated bot info in status
|
|
87
|
+
route.status.botInfo = botInfo;
|
|
88
|
+
this.logger?.info?.(`Route ${id} initialized (@${botInfo.username || 'unknown'})`);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
92
|
+
this.logger?.error?.({ routeId: id, err }, 'Failed to initialize route');
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Initialize all routes
|
|
98
|
+
* Calls initRoute for each configured route
|
|
99
|
+
*/
|
|
100
|
+
async initAllRoutes() {
|
|
101
|
+
const routeIds = this.configManager.getRouteIds();
|
|
102
|
+
this.logger?.info?.(`Initializing ${routeIds.length} route(s)`);
|
|
103
|
+
const results = await Promise.allSettled(routeIds.map((id) => this.initRoute(id)));
|
|
104
|
+
// Log failures
|
|
105
|
+
results.forEach((result, index) => {
|
|
106
|
+
if (result.status === 'rejected') {
|
|
107
|
+
this.logger?.error?.({ routeId: routeIds[index], err: result.reason }, 'Failed to initialize route');
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
const successCount = results.filter((r) => r.status === 'fulfilled').length;
|
|
111
|
+
this.logger?.info?.(`Routes initialized: ${successCount}/${routeIds.length} successful`);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Activate a route in specified mode
|
|
115
|
+
* For webhook mode: calls setWebhook
|
|
116
|
+
* For longPolling mode: prepares route status
|
|
117
|
+
* For inactive mode: does nothing
|
|
118
|
+
*
|
|
119
|
+
* @param routeId - Route identifier
|
|
120
|
+
* @param mode - Mode to activate (uses route's configured mode if not specified)
|
|
121
|
+
* @throws {Error} If route not found or activation fails
|
|
122
|
+
*/
|
|
123
|
+
async activateRoute(routeId, mode) {
|
|
124
|
+
const route = this.configManager.getRoute(routeId);
|
|
125
|
+
if (!route) {
|
|
126
|
+
throw new Error(`Route not found: ${routeId}`);
|
|
127
|
+
}
|
|
128
|
+
const targetMode = mode || route.mode || RouteModeEnum.Inactive;
|
|
129
|
+
this.logger?.info?.(`Activating route ${routeId} in ${targetMode} mode`);
|
|
130
|
+
// Initialize status if not present
|
|
131
|
+
if (!route.status) {
|
|
132
|
+
route.status = {
|
|
133
|
+
mode: targetMode,
|
|
134
|
+
active: false,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
switch (targetMode) {
|
|
139
|
+
case RouteModeEnum.Webhook:
|
|
140
|
+
await this.activateWebhook(routeId, route);
|
|
141
|
+
break;
|
|
142
|
+
case RouteModeEnum.LongPolling:
|
|
143
|
+
await this.activateLongPolling(routeId, route);
|
|
144
|
+
break;
|
|
145
|
+
case RouteModeEnum.Inactive:
|
|
146
|
+
// Deactivate instead
|
|
147
|
+
await this.deactivateRoute(routeId);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
route.status.mode = targetMode;
|
|
151
|
+
route.status.active = true;
|
|
152
|
+
this.logger?.info?.(`Route ${routeId} activated in ${targetMode} mode`);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
156
|
+
this.logger?.error?.({ routeId, err }, 'Failed to activate route');
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Resolve webhook URL from route configuration
|
|
162
|
+
* Priority: webhook.url > webhook.path + webhookBaseUrl
|
|
163
|
+
*
|
|
164
|
+
* @param routeId - Route identifier
|
|
165
|
+
* @param webhook - Webhook configuration
|
|
166
|
+
* @returns Resolved webhook URL
|
|
167
|
+
* @throws {Error} If URL cannot be resolved
|
|
168
|
+
*/
|
|
169
|
+
resolveWebhookUrl(routeId, webhook) {
|
|
170
|
+
// Full URL has priority
|
|
171
|
+
if (webhook.url) {
|
|
172
|
+
return webhook.url;
|
|
173
|
+
}
|
|
174
|
+
// Combine path with webhookBaseUrl
|
|
175
|
+
if (webhook.path) {
|
|
176
|
+
if (!this.webhookBaseUrl) {
|
|
177
|
+
throw new Error(`Cannot resolve webhook URL for route ${routeId}: webhook.path is set but webhookBaseUrl is not configured in TelegramBotClient`);
|
|
178
|
+
}
|
|
179
|
+
// Ensure proper URL formation
|
|
180
|
+
const baseUrl = this.webhookBaseUrl.endsWith('/')
|
|
181
|
+
? this.webhookBaseUrl.slice(0, -1)
|
|
182
|
+
: this.webhookBaseUrl;
|
|
183
|
+
const path = webhook.path.startsWith('/')
|
|
184
|
+
? webhook.path
|
|
185
|
+
: '/' + webhook.path;
|
|
186
|
+
return baseUrl + path;
|
|
187
|
+
}
|
|
188
|
+
throw new Error(`Cannot resolve webhook URL for route ${routeId}: neither webhook.url nor webhook.path is specified`);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Activate webhook mode for a route
|
|
192
|
+
* Calls setWebhook with route's webhook configuration
|
|
193
|
+
*
|
|
194
|
+
* @param routeId - Route identifier
|
|
195
|
+
* @param route - Route configuration
|
|
196
|
+
*/
|
|
197
|
+
async activateWebhook(routeId, route) {
|
|
198
|
+
if (!route.webhook) {
|
|
199
|
+
throw new Error(`Webhook configuration not found for route: ${routeId}`);
|
|
200
|
+
}
|
|
201
|
+
// Resolve webhook URL
|
|
202
|
+
const webhookUrl = this.resolveWebhookUrl(routeId, route.webhook);
|
|
203
|
+
this.logger?.debug?.({ routeId, webhookUrl }, 'Setting webhook for route');
|
|
204
|
+
// Build params, omitting undefined values
|
|
205
|
+
const params = {
|
|
206
|
+
url: webhookUrl,
|
|
207
|
+
};
|
|
208
|
+
if (route.webhook.secretToken !== undefined)
|
|
209
|
+
params.secret_token = route.webhook.secretToken;
|
|
210
|
+
if (route.webhook.maxConnections !== undefined)
|
|
211
|
+
params.max_connections = route.webhook.maxConnections;
|
|
212
|
+
if (route.webhook.allowedUpdates !== undefined)
|
|
213
|
+
params.allowed_updates = route.webhook.allowedUpdates;
|
|
214
|
+
if (route.webhook.dropPendingUpdates !== undefined)
|
|
215
|
+
params.drop_pending_updates = route.webhook.dropPendingUpdates;
|
|
216
|
+
if (route.webhook.ipAddress !== undefined)
|
|
217
|
+
params.ip_address = route.webhook.ipAddress;
|
|
218
|
+
if (route.webhook.certificate !== undefined)
|
|
219
|
+
params.certificate = route.webhook.certificate;
|
|
220
|
+
// Type assertion needed because params is Record<string, unknown>
|
|
221
|
+
const response = await this.apiClient.setWebhook(params, { routeId });
|
|
222
|
+
if (!response.ok) {
|
|
223
|
+
const errorMsg = 'description' in response ? response.description : 'Unknown error';
|
|
224
|
+
throw new Error(`setWebhook failed for route ${routeId}: ${errorMsg}`);
|
|
225
|
+
}
|
|
226
|
+
// Fetch webhook info to verify
|
|
227
|
+
const infoResponse = await this.apiClient.getWebhookInfo({}, { routeId });
|
|
228
|
+
if (infoResponse.ok && 'result' in infoResponse) {
|
|
229
|
+
if (route.status) {
|
|
230
|
+
route.status.webhookInfo = infoResponse.result;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Activate long polling mode for a route
|
|
236
|
+
* Deletes webhook and prepares status for polling
|
|
237
|
+
*
|
|
238
|
+
* @param routeId - Route identifier
|
|
239
|
+
* @param route - Route configuration
|
|
240
|
+
*/
|
|
241
|
+
async activateLongPolling(routeId, route) {
|
|
242
|
+
this.logger?.debug?.({ routeId }, 'Preparing long polling for route');
|
|
243
|
+
// Delete webhook to enable long polling
|
|
244
|
+
const response = await this.apiClient.deleteWebhook({ drop_pending_updates: false }, { routeId });
|
|
245
|
+
if (!response.ok) {
|
|
246
|
+
const errorMsg = 'description' in response ? response.description : 'Unknown error';
|
|
247
|
+
throw new Error(`deleteWebhook failed for route ${routeId}: ${errorMsg}`);
|
|
248
|
+
}
|
|
249
|
+
// Clear webhook info from status
|
|
250
|
+
if (route.status) {
|
|
251
|
+
route.status.webhookInfo = undefined;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Deactivate a route
|
|
256
|
+
* For webhook mode: deletes webhook
|
|
257
|
+
* For longPolling mode: marks as inactive (actual polling stop handled by PollingIntegrationManager)
|
|
258
|
+
*
|
|
259
|
+
* @param routeId - Route identifier
|
|
260
|
+
* @throws {Error} If route not found or deactivation fails
|
|
261
|
+
*/
|
|
262
|
+
async deactivateRoute(routeId) {
|
|
263
|
+
const route = this.configManager.getRoute(routeId);
|
|
264
|
+
if (!route) {
|
|
265
|
+
throw new Error(`Route not found: ${routeId}`);
|
|
266
|
+
}
|
|
267
|
+
if (!route.status || !route.status.active) {
|
|
268
|
+
this.logger?.debug?.({ routeId }, 'Route is already inactive');
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
this.logger?.info?.(`Deactivating route: ${routeId}`);
|
|
272
|
+
try {
|
|
273
|
+
// If in webhook mode, delete webhook
|
|
274
|
+
if (route.status.mode === RouteModeEnum.Webhook) {
|
|
275
|
+
const response = await this.apiClient.deleteWebhook({ drop_pending_updates: false }, { routeId });
|
|
276
|
+
if (!response.ok) {
|
|
277
|
+
const errorMsg = 'description' in response ? response.description : 'Unknown error';
|
|
278
|
+
this.logger?.warn?.({ routeId, description: errorMsg }, 'deleteWebhook failed');
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
route.status.active = false;
|
|
282
|
+
route.status.mode = RouteModeEnum.Inactive;
|
|
283
|
+
this.logger?.info?.(`Route ${routeId} deactivated`);
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
287
|
+
this.logger?.error?.({ routeId, err }, 'Failed to deactivate route');
|
|
288
|
+
throw err;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Switch route to a different mode
|
|
293
|
+
* Deactivates current mode and activates new mode
|
|
294
|
+
*
|
|
295
|
+
* @param routeId - Route identifier
|
|
296
|
+
* @param newMode - New mode to activate
|
|
297
|
+
* @throws {Error} If route not found or mode switch fails
|
|
298
|
+
*/
|
|
299
|
+
async switchMode(routeId, newMode) {
|
|
300
|
+
const route = this.configManager.getRoute(routeId);
|
|
301
|
+
if (!route) {
|
|
302
|
+
throw new Error(`Route not found: ${routeId}`);
|
|
303
|
+
}
|
|
304
|
+
const currentMode = route.status?.mode || RouteModeEnum.Inactive;
|
|
305
|
+
if (currentMode === newMode) {
|
|
306
|
+
this.logger?.debug?.({ routeId, mode: newMode }, 'Route is already in specified mode');
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
this.logger?.info?.(`Switching route ${routeId} from ${currentMode} to ${newMode}`);
|
|
310
|
+
// Deactivate current mode
|
|
311
|
+
if (route.status?.active) {
|
|
312
|
+
await this.deactivateRoute(routeId);
|
|
313
|
+
}
|
|
314
|
+
// Update route mode config
|
|
315
|
+
route.mode = newMode;
|
|
316
|
+
// Activate new mode
|
|
317
|
+
await this.activateRoute(routeId, newMode);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Get route status
|
|
321
|
+
*
|
|
322
|
+
* @param routeId - Route identifier
|
|
323
|
+
* @returns Route status or undefined
|
|
324
|
+
*/
|
|
325
|
+
getStatus(routeId) {
|
|
326
|
+
const route = this.configManager.getRoute(routeId);
|
|
327
|
+
return route?.status;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Set route status
|
|
331
|
+
* Use with caution - normally status is managed internally
|
|
332
|
+
*
|
|
333
|
+
* @param routeId - Route identifier
|
|
334
|
+
* @param status - Route status
|
|
335
|
+
*/
|
|
336
|
+
setStatus(routeId, status) {
|
|
337
|
+
const route = this.configManager.getRoute(routeId);
|
|
338
|
+
if (!route) {
|
|
339
|
+
throw new Error(`Route not found: ${routeId}`);
|
|
340
|
+
}
|
|
341
|
+
route.status = status;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Hot reload a route
|
|
345
|
+
* Applies configuration changes without full restart
|
|
346
|
+
* If route is active, deactivates and reactivates it
|
|
347
|
+
*
|
|
348
|
+
* @param routeId - Route identifier
|
|
349
|
+
* @throws {Error} If route not found or reload fails
|
|
350
|
+
*/
|
|
351
|
+
async reloadRoute(routeId) {
|
|
352
|
+
const route = this.configManager.getRoute(routeId);
|
|
353
|
+
if (!route) {
|
|
354
|
+
throw new Error(`Route not found: ${routeId}`);
|
|
355
|
+
}
|
|
356
|
+
this.logger?.info?.(`Reloading route: ${routeId}`);
|
|
357
|
+
const wasActive = route.status?.active || false;
|
|
358
|
+
const currentMode = route.status?.mode;
|
|
359
|
+
try {
|
|
360
|
+
// Deactivate if active
|
|
361
|
+
if (wasActive) {
|
|
362
|
+
await this.deactivateRoute(routeId);
|
|
363
|
+
}
|
|
364
|
+
// Re-initialize to refresh bot info
|
|
365
|
+
await this.initRoute(routeId);
|
|
366
|
+
// Reactivate if was active
|
|
367
|
+
if (wasActive && currentMode) {
|
|
368
|
+
await this.activateRoute(routeId, currentMode);
|
|
369
|
+
}
|
|
370
|
+
this.logger?.info?.(`Route ${routeId} reloaded successfully`);
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
374
|
+
this.logger?.error?.({ routeId, err }, 'Failed to reload route');
|
|
375
|
+
throw err;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Hot reload all routes
|
|
380
|
+
* Applies configuration changes to all routes
|
|
381
|
+
*/
|
|
382
|
+
async reloadAllRoutes() {
|
|
383
|
+
const routeIds = this.configManager.getRouteIds();
|
|
384
|
+
this.logger?.info?.(`Reloading ${routeIds.length} route(s)`);
|
|
385
|
+
const results = await Promise.allSettled(routeIds.map((id) => this.reloadRoute(id)));
|
|
386
|
+
// Log failures
|
|
387
|
+
results.forEach((result, index) => {
|
|
388
|
+
if (result.status === 'rejected') {
|
|
389
|
+
this.logger?.error?.({ routeId: routeIds[index], err: result.reason }, 'Failed to reload route');
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
const successCount = results.filter((r) => r.status === 'fulfilled').length;
|
|
393
|
+
this.logger?.info?.(`Routes reloaded: ${successCount}/${routeIds.length} successful`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
__decorate([
|
|
397
|
+
LogMethod({ level: 'debug', logParams: true, logReturn: false })
|
|
398
|
+
], RouteLifecycleManager.prototype, "activateRoute", null);
|
|
399
|
+
__decorate([
|
|
400
|
+
LogMethod({ level: 'debug', logParams: true, logReturn: false })
|
|
401
|
+
], RouteLifecycleManager.prototype, "deactivateRoute", null);
|
|
402
|
+
//# sourceMappingURL=RouteLifecycleManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteLifecycleManager.js","sourceRoot":"","sources":["../../../src/client/managers/RouteLifecycleManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route managers for composition-based architecture
|
|
3
|
+
*
|
|
4
|
+
* @module client/managers
|
|
5
|
+
*/
|
|
6
|
+
export { RouteConfigManager } from './RouteConfigManager.js';
|
|
7
|
+
export type { RouteConfigManagerOptions } from './RouteConfigManager.js';
|
|
8
|
+
export { RouteLifecycleManager } from './RouteLifecycleManager.js';
|
|
9
|
+
export type { RouteLifecycleManagerOptions } from './RouteLifecycleManager.js';
|
|
10
|
+
export { PollingIntegrationManager } from './PollingIntegrationManager.js';
|
|
11
|
+
export type { PollingIntegrationManagerOptions } from './PollingIntegrationManager.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route managers for composition-based architecture
|
|
3
|
+
*
|
|
4
|
+
* @module client/managers
|
|
5
|
+
*/
|
|
6
|
+
'use strict';
|
|
7
|
+
export { RouteConfigManager } from './RouteConfigManager.js';
|
|
8
|
+
export { RouteLifecycleManager } from './RouteLifecycleManager.js';
|
|
9
|
+
export { PollingIntegrationManager } from './PollingIntegrationManager.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/managers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;AAEb,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC"}
|
package/dist/helpers/index.d.ts
CHANGED
|
@@ -6,3 +6,4 @@ export { UpdateType, MessageType, SERVICE_MESSAGE_TYPES, parseCommand, getMessag
|
|
|
6
6
|
export { DiceEmoji, DiceTypes, MediaType, MediaTypes, ParseMode, ChatType, type DiceEmoji as DiceEmojiType, type MediaType as MediaTypeEnum, type ParseMode as ParseModeType, type ChatType as ChatTypeEnum } from './constants.js';
|
|
7
7
|
export { formatUserUrl, formatUserMention, type UserLike, type MentionParseMode } from './user-helpers.js';
|
|
8
8
|
export { getFileUrl, getTelegramFileBuffer, getTelegramFileStream, downloadFileBuffer, downloadFileStream, getFileBuffer, getFileStream } from './file-helpers.js';
|
|
9
|
+
export { LogMethod, LogEntry, type LogMethodOptions } from './logging-decorators.js';
|
package/dist/helpers/index.js
CHANGED
|
@@ -10,4 +10,6 @@ export { DiceEmoji, DiceTypes, MediaType, MediaTypes, ParseMode, ChatType } from
|
|
|
10
10
|
export { formatUserUrl, formatUserMention } from './user-helpers.js';
|
|
11
11
|
// File helpers
|
|
12
12
|
export { getFileUrl, getTelegramFileBuffer, getTelegramFileStream, downloadFileBuffer, downloadFileStream, getFileBuffer, getFileStream } from './file-helpers.js';
|
|
13
|
+
// Logging decorators
|
|
14
|
+
export { LogMethod, LogEntry } from './logging-decorators.js';
|
|
13
15
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iBAAiB;AACjB,OAAO,EACL,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,SAAS,EACT,gBAAgB,GAEjB,MAAM,qBAAqB,CAAC;AAE7B,YAAY;AACZ,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EAKT,MAAM,gBAAgB,CAAC;AAExB,eAAe;AACf,OAAO,EACL,aAAa,EACb,iBAAiB,EAGlB,MAAM,mBAAmB,CAAC;AAE3B,eAAe;AACf,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACd,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iBAAiB;AACjB,OAAO,EACL,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,SAAS,EACT,gBAAgB,GAEjB,MAAM,qBAAqB,CAAC;AAE7B,YAAY;AACZ,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EAKT,MAAM,gBAAgB,CAAC;AAExB,eAAe;AACf,OAAO,EACL,aAAa,EACb,iBAAiB,EAGlB,MAAM,mBAAmB,CAAC;AAE3B,eAAe;AACf,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACd,MAAM,mBAAmB,CAAC;AAE3B,qBAAqB;AACrB,OAAO,EACL,SAAS,EACT,QAAQ,EAET,MAAM,yBAAyB,CAAC"}
|
|
@@ -3,20 +3,17 @@
|
|
|
3
3
|
* @description Helper functions for logger integration
|
|
4
4
|
*/
|
|
5
5
|
import type { ILogger } from '../types/logger.types.js';
|
|
6
|
-
import type { LoggerBinder } from '@vvlad1973/logger-tree';
|
|
7
6
|
/**
|
|
8
7
|
* Initialize logger for a component
|
|
9
|
-
*
|
|
8
|
+
* Only supports direct logger instance (not LoggerBinder - use binder.bind() externally instead)
|
|
10
9
|
*
|
|
11
10
|
* @param target - Target component to bind logger to
|
|
12
|
-
* @param loggerPath - Path for the logger (e.g., 'TelegramHttpClient')
|
|
13
|
-
* @param loggerBinder - Optional LoggerBinder instance
|
|
14
11
|
* @param logger - Optional logger instance
|
|
15
12
|
* @returns Logger instance or undefined
|
|
16
13
|
*/
|
|
17
14
|
export declare function initializeLogger(target: {
|
|
18
15
|
logger?: ILogger;
|
|
19
|
-
},
|
|
16
|
+
}, logger?: ILogger): ILogger | undefined;
|
|
20
17
|
/**
|
|
21
18
|
* Safe context wrapper for logger calls
|
|
22
19
|
* Handles undefined/null/primitive values by wrapping them in an object
|
|
@@ -5,26 +5,18 @@
|
|
|
5
5
|
'use strict';
|
|
6
6
|
/**
|
|
7
7
|
* Initialize logger for a component
|
|
8
|
-
*
|
|
8
|
+
* Only supports direct logger instance (not LoggerBinder - use binder.bind() externally instead)
|
|
9
9
|
*
|
|
10
10
|
* @param target - Target component to bind logger to
|
|
11
|
-
* @param loggerPath - Path for the logger (e.g., 'TelegramHttpClient')
|
|
12
|
-
* @param loggerBinder - Optional LoggerBinder instance
|
|
13
11
|
* @param logger - Optional logger instance
|
|
14
12
|
* @returns Logger instance or undefined
|
|
15
13
|
*/
|
|
16
|
-
export function initializeLogger(target,
|
|
14
|
+
export function initializeLogger(target, logger) {
|
|
17
15
|
// If logger is provided directly, use it
|
|
18
16
|
if (logger) {
|
|
19
17
|
target.logger = logger;
|
|
20
18
|
return logger;
|
|
21
19
|
}
|
|
22
|
-
// If loggerBinder is provided, use it to bind logger
|
|
23
|
-
if (loggerBinder) {
|
|
24
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
-
loggerBinder.bind(loggerPath, target);
|
|
26
|
-
return target.logger;
|
|
27
|
-
}
|
|
28
20
|
// No logger available
|
|
29
21
|
return undefined;
|
|
30
22
|
}
|