telegram-ssh-bot 2.0.0 → 2.2.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/LICENSE +21 -0
- package/README.md +103 -22
- package/deploy/.env.example +86 -0
- package/dist/config/index.d.ts +68 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +315 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +6 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +50 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/Bot.d.ts +91 -0
- package/dist/core/Bot.d.ts.map +1 -0
- package/dist/core/Bot.js +263 -0
- package/dist/core/Bot.js.map +1 -0
- package/dist/core/ConnectionPool.d.ts +125 -0
- package/dist/core/ConnectionPool.d.ts.map +1 -0
- package/dist/core/ConnectionPool.js +397 -0
- package/dist/core/ConnectionPool.js.map +1 -0
- package/dist/core/SSHClient.d.ts +112 -0
- package/dist/core/SSHClient.d.ts.map +1 -0
- package/dist/core/SSHClient.js +367 -0
- package/dist/core/SSHClient.js.map +1 -0
- package/dist/core/ServerManager.d.ts +80 -0
- package/dist/core/ServerManager.d.ts.map +1 -0
- package/dist/core/ServerManager.js +207 -0
- package/dist/core/ServerManager.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/errors/AuthError.d.ts +30 -0
- package/dist/errors/AuthError.d.ts.map +1 -0
- package/dist/errors/AuthError.js +35 -0
- package/dist/errors/AuthError.js.map +1 -0
- package/dist/errors/BaseError.d.ts +17 -0
- package/dist/errors/BaseError.d.ts.map +1 -0
- package/dist/errors/BaseError.js +34 -0
- package/dist/errors/BaseError.js.map +1 -0
- package/dist/errors/ConfigurationError.d.ts +24 -0
- package/dist/errors/ConfigurationError.d.ts.map +1 -0
- package/dist/errors/ConfigurationError.js +24 -0
- package/dist/errors/ConfigurationError.js.map +1 -0
- package/dist/errors/PoolError.d.ts +21 -0
- package/dist/errors/PoolError.d.ts.map +1 -0
- package/dist/errors/PoolError.js +30 -0
- package/dist/errors/PoolError.js.map +1 -0
- package/dist/errors/SSHError.d.ts +24 -0
- package/dist/errors/SSHError.d.ts.map +1 -0
- package/dist/errors/SSHError.js +38 -0
- package/dist/errors/SSHError.js.map +1 -0
- package/dist/errors/StorageError.d.ts +24 -0
- package/dist/errors/StorageError.d.ts.map +1 -0
- package/dist/errors/StorageError.js +35 -0
- package/dist/errors/StorageError.js.map +1 -0
- package/dist/errors/ValidationError.d.ts +29 -0
- package/dist/errors/ValidationError.d.ts.map +1 -0
- package/dist/errors/ValidationError.js +35 -0
- package/dist/errors/ValidationError.js.map +1 -0
- package/dist/errors/index.d.ts +11 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/handlers/BaseHandler.d.ts +50 -0
- package/dist/handlers/BaseHandler.d.ts.map +1 -0
- package/dist/handlers/BaseHandler.js +87 -0
- package/dist/handlers/BaseHandler.js.map +1 -0
- package/dist/handlers/CommandHandler.d.ts +23 -0
- package/dist/handlers/CommandHandler.d.ts.map +1 -0
- package/dist/handlers/CommandHandler.js +99 -0
- package/dist/handlers/CommandHandler.js.map +1 -0
- package/dist/handlers/HealthHandler.d.ts +25 -0
- package/dist/handlers/HealthHandler.d.ts.map +1 -0
- package/dist/handlers/HealthHandler.js +51 -0
- package/dist/handlers/HealthHandler.js.map +1 -0
- package/dist/handlers/HelpHandler.d.ts +32 -0
- package/dist/handlers/HelpHandler.d.ts.map +1 -0
- package/dist/handlers/HelpHandler.js +76 -0
- package/dist/handlers/HelpHandler.js.map +1 -0
- package/dist/handlers/ServerHandler.d.ts +72 -0
- package/dist/handlers/ServerHandler.d.ts.map +1 -0
- package/dist/handlers/ServerHandler.js +272 -0
- package/dist/handlers/ServerHandler.js.map +1 -0
- package/dist/handlers/index.d.ts +9 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +9 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +348 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/AuthMiddleware.d.ts +28 -0
- package/dist/middleware/AuthMiddleware.d.ts.map +1 -0
- package/dist/middleware/AuthMiddleware.js +49 -0
- package/dist/middleware/AuthMiddleware.js.map +1 -0
- package/dist/middleware/RateLimitMiddleware.d.ts +23 -0
- package/dist/middleware/RateLimitMiddleware.d.ts.map +1 -0
- package/dist/middleware/RateLimitMiddleware.js +34 -0
- package/dist/middleware/RateLimitMiddleware.js.map +1 -0
- package/dist/middleware/index.d.ts +6 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +6 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/services/BackupService.d.ts +119 -0
- package/dist/services/BackupService.d.ts.map +1 -0
- package/dist/services/BackupService.js +313 -0
- package/dist/services/BackupService.js.map +1 -0
- package/dist/services/CryptoService.d.ts +37 -0
- package/dist/services/CryptoService.d.ts.map +1 -0
- package/dist/services/CryptoService.js +108 -0
- package/dist/services/CryptoService.js.map +1 -0
- package/dist/services/HealthService.d.ts +126 -0
- package/dist/services/HealthService.d.ts.map +1 -0
- package/dist/services/HealthService.js +213 -0
- package/dist/services/HealthService.js.map +1 -0
- package/dist/services/LoggingService.d.ts +115 -0
- package/dist/services/LoggingService.d.ts.map +1 -0
- package/dist/services/LoggingService.js +334 -0
- package/dist/services/LoggingService.js.map +1 -0
- package/dist/services/MonitoringService.d.ts +119 -0
- package/dist/services/MonitoringService.d.ts.map +1 -0
- package/dist/services/MonitoringService.js +267 -0
- package/dist/services/MonitoringService.js.map +1 -0
- package/dist/services/NotificationService.d.ts +132 -0
- package/dist/services/NotificationService.d.ts.map +1 -0
- package/dist/services/NotificationService.js +297 -0
- package/dist/services/NotificationService.js.map +1 -0
- package/dist/services/RateLimiter.d.ts +51 -0
- package/dist/services/RateLimiter.d.ts.map +1 -0
- package/dist/services/RateLimiter.js +141 -0
- package/dist/services/RateLimiter.js.map +1 -0
- package/dist/services/ValidationService.d.ts +49 -0
- package/dist/services/ValidationService.d.ts.map +1 -0
- package/dist/services/ValidationService.js +158 -0
- package/dist/services/ValidationService.js.map +1 -0
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +12 -0
- package/dist/services/index.js.map +1 -0
- package/dist/types/Bot.d.ts +63 -0
- package/dist/types/Bot.d.ts.map +1 -0
- package/dist/types/Bot.js +5 -0
- package/dist/types/Bot.js.map +1 -0
- package/dist/types/Config.d.ts +57 -0
- package/dist/types/Config.d.ts.map +1 -0
- package/dist/types/Config.js +5 -0
- package/dist/types/Config.js.map +1 -0
- package/dist/types/Errors.d.ts +37 -0
- package/dist/types/Errors.d.ts.map +1 -0
- package/dist/types/Errors.js +34 -0
- package/dist/types/Errors.js.map +1 -0
- package/dist/types/SSH.d.ts +56 -0
- package/dist/types/SSH.d.ts.map +1 -0
- package/dist/types/SSH.js +6 -0
- package/dist/types/SSH.js.map +1 -0
- package/dist/types/Server.d.ts +39 -0
- package/dist/types/Server.d.ts.map +1 -0
- package/dist/types/Server.js +5 -0
- package/dist/types/Server.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/commandUtils.d.ts +25 -0
- package/dist/utils/commandUtils.d.ts.map +1 -0
- package/dist/utils/commandUtils.js +94 -0
- package/dist/utils/commandUtils.js.map +1 -0
- package/dist/utils/fileUtils.d.ts +40 -0
- package/dist/utils/fileUtils.d.ts.map +1 -0
- package/dist/utils/fileUtils.js +114 -0
- package/dist/utils/fileUtils.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/pathUtils.d.ts +40 -0
- package/dist/utils/pathUtils.d.ts.map +1 -0
- package/dist/utils/pathUtils.js +140 -0
- package/dist/utils/pathUtils.js.map +1 -0
- package/package.json +31 -5
- package/scripts/build.sh +20 -0
- package/scripts/postinstall.js +87 -0
- package/scripts/release.sh +22 -0
- package/scripts/setup-env.js +237 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monitoring Service
|
|
3
|
+
* Provides server health monitoring and alerting
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from "events";
|
|
6
|
+
/**
|
|
7
|
+
* Service for monitoring server health
|
|
8
|
+
*/
|
|
9
|
+
export class MonitoringService extends EventEmitter {
|
|
10
|
+
logger;
|
|
11
|
+
config;
|
|
12
|
+
serverStatuses = new Map();
|
|
13
|
+
checkTimer = null;
|
|
14
|
+
lastAlertTime = new Map();
|
|
15
|
+
isRunning = false;
|
|
16
|
+
checkFunction = null;
|
|
17
|
+
constructor(config, logger) {
|
|
18
|
+
super();
|
|
19
|
+
this.config = {
|
|
20
|
+
enabled: config.enabled ?? true,
|
|
21
|
+
checkInterval: config.checkInterval ?? 60000, // 1 minute
|
|
22
|
+
timeout: config.timeout ?? 10000, // 10 seconds
|
|
23
|
+
alertThreshold: config.alertThreshold ?? 3, // 3 consecutive failures
|
|
24
|
+
cooldownPeriod: config.cooldownPeriod ?? 300000, // 5 minutes
|
|
25
|
+
};
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Set the check function for server reachability
|
|
30
|
+
*/
|
|
31
|
+
setCheckFunction(fn) {
|
|
32
|
+
this.checkFunction = fn;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Start monitoring
|
|
36
|
+
*/
|
|
37
|
+
start() {
|
|
38
|
+
if (!this.config.enabled || this.isRunning) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.isRunning = true;
|
|
42
|
+
this.scheduleNextCheck();
|
|
43
|
+
this.logger.info("Monitoring service started", {
|
|
44
|
+
checkInterval: this.config.checkInterval,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Stop monitoring
|
|
49
|
+
*/
|
|
50
|
+
stop() {
|
|
51
|
+
if (this.checkTimer) {
|
|
52
|
+
clearTimeout(this.checkTimer);
|
|
53
|
+
this.checkTimer = null;
|
|
54
|
+
}
|
|
55
|
+
this.isRunning = false;
|
|
56
|
+
this.logger.info("Monitoring service stopped");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Register a server for monitoring
|
|
60
|
+
*/
|
|
61
|
+
registerServer(server) {
|
|
62
|
+
const status = {
|
|
63
|
+
serverId: server.id,
|
|
64
|
+
serverName: server.note ?? server.host,
|
|
65
|
+
host: server.host,
|
|
66
|
+
isReachable: true,
|
|
67
|
+
lastCheck: null,
|
|
68
|
+
lastSuccessfulCheck: null,
|
|
69
|
+
consecutiveFailures: 0,
|
|
70
|
+
latency: null,
|
|
71
|
+
};
|
|
72
|
+
this.serverStatuses.set(server.id, status);
|
|
73
|
+
this.logger.debug("Server registered for monitoring", {
|
|
74
|
+
serverId: server.id,
|
|
75
|
+
serverName: status.serverName,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Unregister a server from monitoring
|
|
80
|
+
*/
|
|
81
|
+
unregisterServer(serverId) {
|
|
82
|
+
this.serverStatuses.delete(serverId);
|
|
83
|
+
this.lastAlertTime.delete(serverId);
|
|
84
|
+
this.logger.debug("Server unregistered from monitoring", { serverId });
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get server status
|
|
88
|
+
*/
|
|
89
|
+
getServerStatus(serverId) {
|
|
90
|
+
return this.serverStatuses.get(serverId);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get all server statuses
|
|
94
|
+
*/
|
|
95
|
+
getAllStatuses() {
|
|
96
|
+
return Array.from(this.serverStatuses.values());
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check a specific server
|
|
100
|
+
*/
|
|
101
|
+
async checkServer(server) {
|
|
102
|
+
const status = this.serverStatuses.get(server.id);
|
|
103
|
+
if (!status) {
|
|
104
|
+
throw new Error(`Server ${server.id} not registered for monitoring`);
|
|
105
|
+
}
|
|
106
|
+
const previousStatus = { ...status };
|
|
107
|
+
const startTime = Date.now();
|
|
108
|
+
try {
|
|
109
|
+
if (!this.checkFunction) {
|
|
110
|
+
throw new Error("Check function not configured");
|
|
111
|
+
}
|
|
112
|
+
const isReachable = await this.checkFunction(server);
|
|
113
|
+
const latency = Date.now() - startTime;
|
|
114
|
+
status.lastCheck = new Date();
|
|
115
|
+
status.latency = latency;
|
|
116
|
+
status.error = undefined;
|
|
117
|
+
if (isReachable) {
|
|
118
|
+
status.isReachable = true;
|
|
119
|
+
status.lastSuccessfulCheck = new Date();
|
|
120
|
+
// Check for recovery
|
|
121
|
+
if (previousStatus.consecutiveFailures > 0) {
|
|
122
|
+
this.emit("server:recovered", {
|
|
123
|
+
server,
|
|
124
|
+
status,
|
|
125
|
+
previousStatus,
|
|
126
|
+
timestamp: new Date(),
|
|
127
|
+
});
|
|
128
|
+
this.logger.info("Server recovered", {
|
|
129
|
+
serverId: server.id,
|
|
130
|
+
serverName: status.serverName,
|
|
131
|
+
previousFailures: previousStatus.consecutiveFailures,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
status.consecutiveFailures = 0;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.handleFailure(server, status, previousStatus, "Health check returned false");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const latency = Date.now() - startTime;
|
|
142
|
+
status.lastCheck = new Date();
|
|
143
|
+
status.latency = latency;
|
|
144
|
+
status.error = error instanceof Error ? error.message : String(error);
|
|
145
|
+
this.handleFailure(server, status, previousStatus, status.error);
|
|
146
|
+
}
|
|
147
|
+
return status;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Handle server failure
|
|
151
|
+
*/
|
|
152
|
+
handleFailure(server, status, previousStatus, error) {
|
|
153
|
+
status.isReachable = false;
|
|
154
|
+
status.consecutiveFailures++;
|
|
155
|
+
status.error = error;
|
|
156
|
+
this.logger.warn("Server health check failed", {
|
|
157
|
+
serverId: server.id,
|
|
158
|
+
serverName: status.serverName,
|
|
159
|
+
consecutiveFailures: status.consecutiveFailures,
|
|
160
|
+
error,
|
|
161
|
+
});
|
|
162
|
+
// Emit unreachable event
|
|
163
|
+
this.emit("server:unreachable", {
|
|
164
|
+
server,
|
|
165
|
+
status,
|
|
166
|
+
previousStatus,
|
|
167
|
+
timestamp: new Date(),
|
|
168
|
+
});
|
|
169
|
+
// Check if alert should be triggered
|
|
170
|
+
if (status.consecutiveFailures >= this.config.alertThreshold) {
|
|
171
|
+
this.maybeTriggerAlert(server, status, previousStatus);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Maybe trigger an alert (respects cooldown)
|
|
176
|
+
*/
|
|
177
|
+
maybeTriggerAlert(server, status, previousStatus) {
|
|
178
|
+
const lastAlert = this.lastAlertTime.get(server.id);
|
|
179
|
+
const now = new Date();
|
|
180
|
+
// Check cooldown
|
|
181
|
+
if (lastAlert) {
|
|
182
|
+
const timeSinceLastAlert = now.getTime() - lastAlert.getTime();
|
|
183
|
+
if (timeSinceLastAlert < this.config.cooldownPeriod) {
|
|
184
|
+
this.logger.debug("Alert skipped due to cooldown", {
|
|
185
|
+
serverId: server.id,
|
|
186
|
+
timeSinceLastAlert,
|
|
187
|
+
cooldownPeriod: this.config.cooldownPeriod,
|
|
188
|
+
});
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
this.lastAlertTime.set(server.id, now);
|
|
193
|
+
this.emit("alert:triggered", {
|
|
194
|
+
server,
|
|
195
|
+
status,
|
|
196
|
+
previousStatus,
|
|
197
|
+
timestamp: now,
|
|
198
|
+
});
|
|
199
|
+
this.logger.error("Server alert triggered", undefined, {
|
|
200
|
+
serverId: server.id,
|
|
201
|
+
serverName: status.serverName,
|
|
202
|
+
consecutiveFailures: status.consecutiveFailures,
|
|
203
|
+
error: status.error,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Schedule next monitoring check
|
|
208
|
+
*/
|
|
209
|
+
scheduleNextCheck() {
|
|
210
|
+
this.checkTimer = setTimeout(() => {
|
|
211
|
+
this.performCheck();
|
|
212
|
+
}, this.config.checkInterval);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Perform monitoring check on all servers
|
|
216
|
+
*/
|
|
217
|
+
async performCheck() {
|
|
218
|
+
const servers = Array.from(this.serverStatuses.keys());
|
|
219
|
+
if (servers.length === 0) {
|
|
220
|
+
this.scheduleNextCheck();
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
this.logger.debug("Performing monitoring check", {
|
|
224
|
+
serverCount: servers.length,
|
|
225
|
+
});
|
|
226
|
+
// Check all servers in parallel
|
|
227
|
+
// Note: We need the actual Server objects, but we only have IDs here
|
|
228
|
+
// In practice, this would be called with server objects from the caller
|
|
229
|
+
// For now, we emit an event that the caller can handle
|
|
230
|
+
this.emit("check:needed", servers);
|
|
231
|
+
this.scheduleNextCheck();
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get monitoring statistics
|
|
235
|
+
*/
|
|
236
|
+
getStats() {
|
|
237
|
+
let reachable = 0;
|
|
238
|
+
let unreachable = 0;
|
|
239
|
+
for (const status of this.serverStatuses.values()) {
|
|
240
|
+
if (status.isReachable) {
|
|
241
|
+
reachable++;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
unreachable++;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
totalServers: this.serverStatuses.size,
|
|
249
|
+
reachableServers: reachable,
|
|
250
|
+
unreachableServers: unreachable,
|
|
251
|
+
isRunning: this.isRunning,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get log context for monitoring-related logs
|
|
256
|
+
*/
|
|
257
|
+
getLogContext() {
|
|
258
|
+
const stats = this.getStats();
|
|
259
|
+
return {
|
|
260
|
+
monitoring: stats.isRunning,
|
|
261
|
+
totalServers: stats.totalServers,
|
|
262
|
+
reachableServers: stats.reachableServers,
|
|
263
|
+
unreachableServers: stats.unreachableServers,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=MonitoringService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MonitoringService.js","sourceRoot":"","sources":["../../src/services/MonitoringService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Service
|
|
3
|
+
* Provides admin notifications for important events
|
|
4
|
+
*/
|
|
5
|
+
import { LoggingService } from "./LoggingService.js";
|
|
6
|
+
import type { IBot, LogContext, Server } from "../types/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Notification types
|
|
9
|
+
*/
|
|
10
|
+
export type NotificationType = "startup" | "shutdown" | "error" | "security" | "server_added" | "server_removed" | "connection_lost" | "connection_restored" | "backup_created" | "backup_restored" | "config_reloaded" | "rate_limited" | "unauthorized_access";
|
|
11
|
+
/**
|
|
12
|
+
* Notification priority
|
|
13
|
+
*/
|
|
14
|
+
export type NotificationPriority = "low" | "normal" | "high" | "critical";
|
|
15
|
+
/**
|
|
16
|
+
* Notification payload
|
|
17
|
+
*/
|
|
18
|
+
export interface NotificationPayload {
|
|
19
|
+
type: NotificationType;
|
|
20
|
+
priority: NotificationPriority;
|
|
21
|
+
title: string;
|
|
22
|
+
message: string;
|
|
23
|
+
details?: Record<string, unknown>;
|
|
24
|
+
timestamp: Date;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Notification configuration
|
|
28
|
+
*/
|
|
29
|
+
export interface NotificationConfig {
|
|
30
|
+
enabled: boolean;
|
|
31
|
+
notifyOnStartup: boolean;
|
|
32
|
+
notifyOnShutdown: boolean;
|
|
33
|
+
notifyOnErrors: boolean;
|
|
34
|
+
notifyOnSecurity: boolean;
|
|
35
|
+
adminChatId: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Service for sending admin notifications
|
|
39
|
+
*/
|
|
40
|
+
export declare class NotificationService {
|
|
41
|
+
private readonly logger;
|
|
42
|
+
private readonly config;
|
|
43
|
+
private bot;
|
|
44
|
+
private notificationCount;
|
|
45
|
+
private readonly startTime;
|
|
46
|
+
constructor(config: Partial<NotificationConfig>, logger: LoggingService);
|
|
47
|
+
/**
|
|
48
|
+
* Set the bot instance for sending messages
|
|
49
|
+
*/
|
|
50
|
+
setBot(bot: IBot): void;
|
|
51
|
+
/**
|
|
52
|
+
* Send a notification
|
|
53
|
+
*/
|
|
54
|
+
notify(payload: Omit<NotificationPayload, "timestamp">): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Send startup notification
|
|
57
|
+
*/
|
|
58
|
+
notifyStartup(version: string): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* Send shutdown notification
|
|
61
|
+
*/
|
|
62
|
+
notifyShutdown(reason: string): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Send error notification
|
|
65
|
+
*/
|
|
66
|
+
notifyError(error: Error, context?: Record<string, unknown>): Promise<boolean>;
|
|
67
|
+
/**
|
|
68
|
+
* Send security notification
|
|
69
|
+
*/
|
|
70
|
+
notifySecurity(event: string, details?: Record<string, unknown>): Promise<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* Send server added notification
|
|
73
|
+
*/
|
|
74
|
+
notifyServerAdded(server: Server): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Send server removed notification
|
|
77
|
+
*/
|
|
78
|
+
notifyServerRemoved(server: Server): Promise<boolean>;
|
|
79
|
+
/**
|
|
80
|
+
* Send connection lost notification
|
|
81
|
+
*/
|
|
82
|
+
notifyConnectionLost(server: Server, error?: string): Promise<boolean>;
|
|
83
|
+
/**
|
|
84
|
+
* Send connection restored notification
|
|
85
|
+
*/
|
|
86
|
+
notifyConnectionRestored(server: Server): Promise<boolean>;
|
|
87
|
+
/**
|
|
88
|
+
* Send backup created notification
|
|
89
|
+
*/
|
|
90
|
+
notifyBackupCreated(backupId: string, size: number): Promise<boolean>;
|
|
91
|
+
/**
|
|
92
|
+
* Send backup restored notification
|
|
93
|
+
*/
|
|
94
|
+
notifyBackupRestored(backupId: string): Promise<boolean>;
|
|
95
|
+
/**
|
|
96
|
+
* Send config reloaded notification
|
|
97
|
+
*/
|
|
98
|
+
notifyConfigReloaded(success: boolean): Promise<boolean>;
|
|
99
|
+
/**
|
|
100
|
+
* Send rate limited notification
|
|
101
|
+
*/
|
|
102
|
+
notifyRateLimited(chatId: number, command: string): Promise<boolean>;
|
|
103
|
+
/**
|
|
104
|
+
* Send unauthorized access notification
|
|
105
|
+
*/
|
|
106
|
+
notifyUnauthorizedAccess(chatId: number, username: string | undefined, command: string): Promise<boolean>;
|
|
107
|
+
/**
|
|
108
|
+
* Get notification statistics
|
|
109
|
+
*/
|
|
110
|
+
getStats(): {
|
|
111
|
+
enabled: boolean;
|
|
112
|
+
totalNotifications: number;
|
|
113
|
+
uptime: number;
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Get log context for notification-related logs
|
|
117
|
+
*/
|
|
118
|
+
getLogContext(): LogContext;
|
|
119
|
+
/**
|
|
120
|
+
* Format notification message
|
|
121
|
+
*/
|
|
122
|
+
private formatNotification;
|
|
123
|
+
/**
|
|
124
|
+
* Format uptime as human-readable string
|
|
125
|
+
*/
|
|
126
|
+
private formatUptime;
|
|
127
|
+
/**
|
|
128
|
+
* Format bytes to human-readable string
|
|
129
|
+
*/
|
|
130
|
+
private formatBytes;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=NotificationService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationService.d.ts","sourceRoot":"","sources":["../../src/services/NotificationService.ts"],"names":[],"mappings":"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"}
|