evogram-gramjs 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.
Files changed (64) hide show
  1. package/.evogram/7878190870/database.db +0 -0
  2. package/lib/EvogramGramJS.d.ts +51 -0
  3. package/lib/EvogramGramJS.js +99 -0
  4. package/lib/commands/Accounts.command.d.ts +6 -0
  5. package/lib/commands/Accounts.command.js +90 -0
  6. package/lib/commands/AddAccount.command.d.ts +6 -0
  7. package/lib/commands/AddAccount.command.js +170 -0
  8. package/lib/commands/index.d.ts +0 -0
  9. package/lib/commands/index.js +1 -0
  10. package/lib/commands/managment/DeleteAccount.command.d.ts +0 -0
  11. package/lib/commands/managment/DeleteAccount.command.js +12 -0
  12. package/lib/config/database.config.d.ts +26 -0
  13. package/lib/config/database.config.js +31 -0
  14. package/lib/entities/Session.entity.d.ts +28 -0
  15. package/lib/entities/Session.entity.js +71 -0
  16. package/lib/entities/SessionEventLog.entity.d.ts +22 -0
  17. package/lib/entities/SessionEventLog.entity.js +50 -0
  18. package/lib/examples/auth.example.d.ts +10 -0
  19. package/lib/examples/auth.example.js +126 -0
  20. package/lib/examples/database.example.d.ts +13 -0
  21. package/lib/examples/database.example.js +109 -0
  22. package/lib/examples/usage.example.d.ts +13 -0
  23. package/lib/examples/usage.example.js +127 -0
  24. package/lib/index.d.ts +7 -0
  25. package/lib/index.js +10 -0
  26. package/lib/services/DatabaseService.d.ts +30 -0
  27. package/lib/services/DatabaseService.js +93 -0
  28. package/lib/services/ImageUploadService.d.ts +15 -0
  29. package/lib/services/ImageUploadService.js +56 -0
  30. package/lib/sessions/Session.d.ts +13 -0
  31. package/lib/sessions/Session.js +25 -0
  32. package/lib/sessions/SessionAuth.d.ts +62 -0
  33. package/lib/sessions/SessionAuth.js +165 -0
  34. package/lib/sessions/SessionLogger.d.ts +84 -0
  35. package/lib/sessions/SessionLogger.js +196 -0
  36. package/lib/sessions/SessionManager.d.ts +79 -0
  37. package/lib/sessions/SessionManager.js +184 -0
  38. package/lib/types/auth.types.d.ts +90 -0
  39. package/lib/types/auth.types.js +19 -0
  40. package/lib/types/session.types.d.ts +87 -0
  41. package/lib/types/session.types.js +21 -0
  42. package/lib/utils/Deferrer.d.ts +6 -0
  43. package/lib/utils/Deferrer.js +14 -0
  44. package/package-lock.json +6 -0
  45. package/package.json +27 -0
  46. package/src/EvogramGramJS.ts +98 -0
  47. package/src/commands/Accounts.command.ts +84 -0
  48. package/src/commands/AddAccount.command.ts +171 -0
  49. package/src/commands/index.ts +0 -0
  50. package/src/commands/managment/DeleteAccount.command.ts +13 -0
  51. package/src/config/database.config.ts +75 -0
  52. package/src/entities/Session.entity.ts +58 -0
  53. package/src/entities/SessionEventLog.entity.ts +41 -0
  54. package/src/index.ts +7 -0
  55. package/src/services/DatabaseService.ts +82 -0
  56. package/src/services/ImageUploadService.ts +49 -0
  57. package/src/sessions/Session.ts +21 -0
  58. package/src/sessions/SessionAuth.ts +173 -0
  59. package/src/sessions/SessionLogger.ts +208 -0
  60. package/src/sessions/SessionManager.ts +190 -0
  61. package/src/types/auth.types.ts +94 -0
  62. package/src/types/session.types.ts +96 -0
  63. package/src/utils/Deferrer.ts +12 -0
  64. package/tsconfig.json +17 -0
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImageUploadService = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const axios_1 = tslib_1.__importDefault(require("axios"));
6
+ const form_data_1 = tslib_1.__importDefault(require("form-data"));
7
+ /**
8
+ * Сервис для загрузки изображений на внешние хостинги
9
+ */
10
+ class ImageUploadService {
11
+ /**
12
+ * Загружает изображение на imgbox.vu/uploads
13
+ *
14
+ * @param imageBuffer Буфер изображения
15
+ * @param filename Имя файла (опционально)
16
+ * @returns Promise с URL загруженного изображения
17
+ * @throws Error если загрузка не удалась
18
+ */
19
+ static uploadToImgbox(imageBuffer, filename) {
20
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
21
+ var _a;
22
+ try {
23
+ const formData = new form_data_1.default();
24
+ formData.append('file', imageBuffer, {
25
+ filename: filename || 'avatar.jpg',
26
+ contentType: 'image/jpeg',
27
+ });
28
+ const response = yield axios_1.default.post(this.UPLOAD_URL, formData, {
29
+ headers: formData.getHeaders(),
30
+ });
31
+ const result = response.data;
32
+ // Проверяем формат ответа imgbox.vu
33
+ // API может возвращать URL в разных форматах, нужно проверить структуру ответа
34
+ if (result.url) {
35
+ return result.url;
36
+ }
37
+ else if ((_a = result.data) === null || _a === void 0 ? void 0 : _a.url) {
38
+ return result.data.url;
39
+ }
40
+ else if (typeof result === 'string' && result.startsWith('http')) {
41
+ return result;
42
+ }
43
+ else {
44
+ // Если формат ответа неизвестен, возвращаем весь ответ как строку для отладки
45
+ throw new Error(`Неожиданный формат ответа от imgbox.vu: ${JSON.stringify(result)}`);
46
+ }
47
+ }
48
+ catch (error) {
49
+ const errorMessage = error instanceof Error ? error.message : String(error);
50
+ throw new Error(`Ошибка загрузки изображения на imgbox.vu: ${errorMessage}`);
51
+ }
52
+ });
53
+ }
54
+ }
55
+ exports.ImageUploadService = ImageUploadService;
56
+ ImageUploadService.UPLOAD_URL = 'https://imgbox.vu/uploads';
@@ -0,0 +1,13 @@
1
+ import { TelegramClient } from 'telegram';
2
+ import { SessionAuth } from './SessionAuth';
3
+ import { SessionLogger } from './SessionLogger';
4
+ export declare class Session {
5
+ readonly sessionId: string;
6
+ readonly client: TelegramClient;
7
+ readonly logger: SessionLogger | undefined;
8
+ /** Объект авторизации для сессии */
9
+ auth: SessionAuth;
10
+ constructor(sessionId: string, client: TelegramClient, logger: SessionLogger | undefined, auth: SessionAuth);
11
+ db(): Promise<import("..").Session | null>;
12
+ user(): Promise<import("telegram").Api.User>;
13
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Session = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const EvogramGramJS_1 = require("../EvogramGramJS");
6
+ class Session {
7
+ constructor(sessionId, client, logger, auth) {
8
+ this.sessionId = sessionId;
9
+ this.client = client;
10
+ this.logger = logger;
11
+ this.auth = auth;
12
+ }
13
+ db() {
14
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
15
+ var _a;
16
+ return (_a = (yield EvogramGramJS_1.EvogramGramJS.databaseService.getSession(this.sessionId))) !== null && _a !== void 0 ? _a : null;
17
+ });
18
+ }
19
+ user() {
20
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
21
+ return yield this.client.getMe();
22
+ });
23
+ }
24
+ }
25
+ exports.Session = Session;
@@ -0,0 +1,62 @@
1
+ import { EventEmitter } from 'events';
2
+ import { TelegramClient } from 'telegram';
3
+ import { AuthState } from '../types/auth.types';
4
+ import { Deferred } from '../utils/Deferrer';
5
+ import { SessionLogger } from './SessionLogger';
6
+ /**
7
+ * События авторизации для сессии
8
+ */
9
+ export declare enum SessionAuthEvent {
10
+ /** Начало авторизации */
11
+ AUTH_STARTED = "auth:started",
12
+ /** Код отправлен */
13
+ CODE_SENT = "auth:code_sent",
14
+ /** Код получен */
15
+ CODE_RECEIVED = "auth:code_received",
16
+ /** Требуется пароль */
17
+ PASSWORD_REQUIRED = "auth:password_required",
18
+ /** Авторизация успешна */
19
+ AUTH_SUCCESS = "auth:success",
20
+ /** Ошибка авторизации */
21
+ AUTH_ERROR = "auth:error",
22
+ /** Авторизация отменена */
23
+ AUTH_CANCELLED = "auth:cancelled"
24
+ }
25
+ /**
26
+ * Класс авторизации для конкретной сессии
27
+ * Предоставляет методы авторизации, привязанные к сессии
28
+ */
29
+ export declare class SessionAuth extends EventEmitter {
30
+ private readonly sessionId;
31
+ private readonly client;
32
+ private readonly logger?;
33
+ state: {
34
+ code: Deferred<string>;
35
+ password: Deferred<string>;
36
+ isRequiredPassword: boolean;
37
+ stage: AuthState;
38
+ connect: Deferred<boolean>;
39
+ };
40
+ constructor(sessionId: string, client: TelegramClient, logger?: SessionLogger | undefined);
41
+ start(phoneNumber: string): Promise<{
42
+ success: boolean;
43
+ error?: undefined;
44
+ } | {
45
+ success: boolean;
46
+ error: unknown;
47
+ }>;
48
+ setCode(code: string): Promise<{
49
+ success: boolean;
50
+ error: Error;
51
+ }>;
52
+ setPassword(password: string): Promise<{
53
+ success: boolean;
54
+ error: Error;
55
+ }>;
56
+ /**
57
+ * Проверяет, требуется ли пароль для авторизации
58
+ *
59
+ * @returns true, если требуется пароль
60
+ */
61
+ isRequiredPassword(): Promise<boolean>;
62
+ }
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionAuth = exports.SessionAuthEvent = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const events_1 = require("events");
6
+ const EvogramGramJS_1 = require("../EvogramGramJS");
7
+ const ImageUploadService_1 = require("../services/ImageUploadService");
8
+ const auth_types_1 = require("../types/auth.types");
9
+ const Deferrer_1 = require("../utils/Deferrer");
10
+ /**
11
+ * События авторизации для сессии
12
+ */
13
+ var SessionAuthEvent;
14
+ (function (SessionAuthEvent) {
15
+ /** Начало авторизации */
16
+ SessionAuthEvent["AUTH_STARTED"] = "auth:started";
17
+ /** Код отправлен */
18
+ SessionAuthEvent["CODE_SENT"] = "auth:code_sent";
19
+ /** Код получен */
20
+ SessionAuthEvent["CODE_RECEIVED"] = "auth:code_received";
21
+ /** Требуется пароль */
22
+ SessionAuthEvent["PASSWORD_REQUIRED"] = "auth:password_required";
23
+ /** Авторизация успешна */
24
+ SessionAuthEvent["AUTH_SUCCESS"] = "auth:success";
25
+ /** Ошибка авторизации */
26
+ SessionAuthEvent["AUTH_ERROR"] = "auth:error";
27
+ /** Авторизация отменена */
28
+ SessionAuthEvent["AUTH_CANCELLED"] = "auth:cancelled";
29
+ })(SessionAuthEvent || (exports.SessionAuthEvent = SessionAuthEvent = {}));
30
+ /**
31
+ * Класс авторизации для конкретной сессии
32
+ * Предоставляет методы авторизации, привязанные к сессии
33
+ */
34
+ class SessionAuth extends events_1.EventEmitter {
35
+ constructor(sessionId, client, logger) {
36
+ super();
37
+ this.sessionId = sessionId;
38
+ this.client = client;
39
+ this.logger = logger;
40
+ this.state = null;
41
+ }
42
+ start(phoneNumber) {
43
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
44
+ if (this.state)
45
+ throw new Error(`Авторизация для сессии "${this.sessionId}" уже начата`);
46
+ this.state = {
47
+ code: new Deferrer_1.Deferred(),
48
+ password: new Deferrer_1.Deferred(),
49
+ isRequiredPassword: false,
50
+ stage: auth_types_1.AuthState.INITIAL,
51
+ connect: new Deferrer_1.Deferred(),
52
+ };
53
+ try {
54
+ yield new Promise((res, rej) => tslib_1.__awaiter(this, void 0, void 0, function* () {
55
+ yield this.client
56
+ .start({
57
+ phoneNumber,
58
+ phoneCode: () => tslib_1.__awaiter(this, void 0, void 0, function* () {
59
+ res(true);
60
+ this.state.stage = auth_types_1.AuthState.WAITING_CODE;
61
+ const code = yield this.state.code.promise;
62
+ this.state.code = new Deferrer_1.Deferred();
63
+ return code;
64
+ }),
65
+ password: () => tslib_1.__awaiter(this, void 0, void 0, function* () {
66
+ this.state.isRequiredPassword = true;
67
+ this.state.stage = auth_types_1.AuthState.WAITING_PASSWORD;
68
+ const password = yield this.state.password.promise;
69
+ this.state.password = new Deferrer_1.Deferred();
70
+ return password;
71
+ }),
72
+ onError: (error) => {
73
+ this.state.stage = auth_types_1.AuthState.ERROR;
74
+ this.emit(SessionAuthEvent.AUTH_ERROR, {
75
+ sessionId: this.sessionId,
76
+ error: error instanceof Error ? error.message : String(error),
77
+ });
78
+ },
79
+ })
80
+ .catch(rej);
81
+ try {
82
+ const me = yield this.client.getMe();
83
+ this.state.connect.resolve(true);
84
+ let avatarBuffer = yield this.client.downloadProfilePhoto('me'), avatarUrl;
85
+ if (avatarBuffer)
86
+ avatarUrl = yield ImageUploadService_1.ImageUploadService.uploadToImgbox(Buffer.isBuffer(avatarBuffer) ? avatarBuffer : Buffer.from(avatarBuffer));
87
+ yield EvogramGramJS_1.EvogramGramJS.databaseService.saveSession({
88
+ sessionId: this.sessionId,
89
+ apiId: this.client.apiId,
90
+ apiHash: this.client.apiHash,
91
+ userId: Number(me.id),
92
+ username: me.username,
93
+ firstName: me.firstName,
94
+ lastName: me.lastName,
95
+ phoneNumber: me.phone,
96
+ sessionString: this.client.session.save(),
97
+ avatarUrl,
98
+ });
99
+ }
100
+ catch (_a) { }
101
+ }));
102
+ return {
103
+ success: true,
104
+ };
105
+ }
106
+ catch (error) {
107
+ this.emit(SessionAuthEvent.AUTH_ERROR, {
108
+ sessionId: this.sessionId,
109
+ error: error instanceof Error ? error.message : String(error),
110
+ });
111
+ return {
112
+ success: false,
113
+ error,
114
+ };
115
+ }
116
+ });
117
+ }
118
+ setCode(code) {
119
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
120
+ if (!this.state)
121
+ throw new Error(`Авторизация для сессии "${this.sessionId}" не начата`);
122
+ const errorPromise = new Promise((resolve, reject) => {
123
+ this.once(SessionAuthEvent.AUTH_ERROR, (data) => data.sessionId === this.sessionId && resolve(data.error));
124
+ setTimeout(resolve, 1000);
125
+ });
126
+ this.state.code.resolve(code);
127
+ const error = yield errorPromise;
128
+ return {
129
+ success: error ? false : true,
130
+ error: error || undefined,
131
+ };
132
+ });
133
+ }
134
+ setPassword(password) {
135
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
136
+ if (!this.state)
137
+ throw new Error(`Авторизация для сессии "${this.sessionId}" не начата`);
138
+ const errorPromise = new Promise((resolve, reject) => {
139
+ this.once(SessionAuthEvent.AUTH_ERROR, (data) => data.sessionId === this.sessionId && resolve(data.error));
140
+ setTimeout(resolve, 1000);
141
+ });
142
+ this.state.password.resolve(password);
143
+ const error = yield errorPromise;
144
+ return {
145
+ success: error ? false : true,
146
+ error: error || undefined,
147
+ };
148
+ });
149
+ }
150
+ /**
151
+ * Проверяет, требуется ли пароль для авторизации
152
+ *
153
+ * @returns true, если требуется пароль
154
+ */
155
+ isRequiredPassword() {
156
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
157
+ var _a, _b, _c;
158
+ if ((_a = this.state) === null || _a === void 0 ? void 0 : _a.isRequiredPassword)
159
+ return true;
160
+ yield new Promise((resolve) => setTimeout(resolve, 1000));
161
+ return (_c = (_b = this.state) === null || _b === void 0 ? void 0 : _b.isRequiredPassword) !== null && _c !== void 0 ? _c : false;
162
+ });
163
+ }
164
+ }
165
+ exports.SessionAuth = SessionAuth;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Логгер для отдельной сессии
3
+ * Записывает все действия и активность сессии в отдельный файл
4
+ */
5
+ export declare class SessionLogger {
6
+ private readonly sessionId;
7
+ private readonly logsDirectory;
8
+ private logStream;
9
+ private logFilePath;
10
+ private isInitialized;
11
+ /**
12
+ * @param sessionId Идентификатор сессии
13
+ * @param logsDirectory Директория для хранения логов (по умолчанию './logs')
14
+ */
15
+ constructor(sessionId: string, logsDirectory?: string);
16
+ /**
17
+ * Инициализирует логгер (создает директорию и файл)
18
+ */
19
+ initialize(): Promise<void>;
20
+ /**
21
+ * Записывает лог-запись в файл
22
+ *
23
+ * @param level Уровень логирования (INFO, WARN, ERROR, DEBUG)
24
+ * @param message Сообщение для логирования
25
+ * @param data Дополнительные данные (опционально)
26
+ */
27
+ log(level: 'INFO' | 'WARN' | 'ERROR' | 'DEBUG', message: string, data?: any): void;
28
+ /**
29
+ * Логирует информацию
30
+ */
31
+ info(message: string, data?: any): void;
32
+ /**
33
+ * Логирует предупреждение
34
+ */
35
+ warn(message: string, data?: any): void;
36
+ /**
37
+ * Логирует ошибку
38
+ */
39
+ error(message: string, error?: Error | any): void;
40
+ /**
41
+ * Логирует отладочную информацию
42
+ */
43
+ debug(message: string, data?: any): void;
44
+ /**
45
+ * Логирует действие сессии
46
+ *
47
+ * @param action Название действия
48
+ * @param details Детали действия
49
+ */
50
+ logAction(action: string, details?: any): void;
51
+ /**
52
+ * Логирует событие от Telegram клиента
53
+ *
54
+ * @param eventName Название события
55
+ * @param eventData Данные события
56
+ */
57
+ logTelegramEvent(eventName: string, eventData?: any): void;
58
+ /**
59
+ * Закрывает поток записи
60
+ */
61
+ close(): Promise<void>;
62
+ /**
63
+ * Получает путь к файлу лога
64
+ */
65
+ getLogFilePath(): string;
66
+ /**
67
+ * Внутренний метод для записи в файл
68
+ *
69
+ * @private
70
+ */
71
+ private writeLog;
72
+ /**
73
+ * Форматирует запись лога для записи в файл
74
+ *
75
+ * @private
76
+ */
77
+ private formatLogEntry;
78
+ /**
79
+ * Очищает имя файла от недопустимых символов
80
+ *
81
+ * @private
82
+ */
83
+ private sanitizeFileName;
84
+ }
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionLogger = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = require("fs");
6
+ const promises_1 = require("fs/promises");
7
+ const path_1 = require("path");
8
+ /**
9
+ * Логгер для отдельной сессии
10
+ * Записывает все действия и активность сессии в отдельный файл
11
+ */
12
+ class SessionLogger {
13
+ /**
14
+ * @param sessionId Идентификатор сессии
15
+ * @param logsDirectory Директория для хранения логов (по умолчанию './logs')
16
+ */
17
+ constructor(sessionId, logsDirectory = './logs') {
18
+ this.sessionId = sessionId;
19
+ this.logsDirectory = logsDirectory;
20
+ this.logStream = null;
21
+ this.isInitialized = false;
22
+ // Формируем путь к файлу лога
23
+ const sanitizedSessionId = this.sanitizeFileName(sessionId);
24
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
25
+ this.logFilePath = (0, path_1.join)(this.logsDirectory, `session-${sanitizedSessionId}-${timestamp}.log`);
26
+ }
27
+ /**
28
+ * Инициализирует логгер (создает директорию и файл)
29
+ */
30
+ initialize() {
31
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
32
+ if (this.isInitialized)
33
+ return;
34
+ try {
35
+ // Создаем директорию для логов, если её нет
36
+ yield (0, promises_1.mkdir)(this.logsDirectory, { recursive: true });
37
+ // Создаем поток записи в файл (режим append)
38
+ this.logStream = (0, fs_1.createWriteStream)(this.logFilePath, { flags: 'a' });
39
+ // Записываем заголовок
40
+ this.writeLog('INFO', `Логгер инициализирован для сессии: ${this.sessionId}`);
41
+ this.writeLog('INFO', `Файл лога: ${this.logFilePath}`);
42
+ this.writeLog('INFO', `Время создания: ${new Date().toISOString()}`);
43
+ this.writeLog('INFO', '─'.repeat(80));
44
+ this.isInitialized = true;
45
+ }
46
+ catch (error) {
47
+ console.error(`Ошибка инициализации логгера для сессии ${this.sessionId}:`, error);
48
+ throw error;
49
+ }
50
+ });
51
+ }
52
+ /**
53
+ * Записывает лог-запись в файл
54
+ *
55
+ * @param level Уровень логирования (INFO, WARN, ERROR, DEBUG)
56
+ * @param message Сообщение для логирования
57
+ * @param data Дополнительные данные (опционально)
58
+ */
59
+ log(level, message, data) {
60
+ if (!this.isInitialized) {
61
+ // Если логгер еще не инициализирован, инициализируем синхронно
62
+ this.initialize().catch((error) => {
63
+ console.error(`Ошибка инициализации логгера:`, error);
64
+ });
65
+ return;
66
+ }
67
+ this.writeLog(level, message, data);
68
+ }
69
+ /**
70
+ * Логирует информацию
71
+ */
72
+ info(message, data) {
73
+ this.log('INFO', message, data);
74
+ }
75
+ /**
76
+ * Логирует предупреждение
77
+ */
78
+ warn(message, data) {
79
+ this.log('WARN', message, data);
80
+ }
81
+ /**
82
+ * Логирует ошибку
83
+ */
84
+ error(message, error) {
85
+ const errorMessage = error instanceof Error ? error.message : String(error);
86
+ const errorStack = error instanceof Error ? error.stack : undefined;
87
+ this.log('ERROR', message, { error: errorMessage, stack: errorStack });
88
+ }
89
+ /**
90
+ * Логирует отладочную информацию
91
+ */
92
+ debug(message, data) {
93
+ this.log('DEBUG', message, data);
94
+ }
95
+ /**
96
+ * Логирует действие сессии
97
+ *
98
+ * @param action Название действия
99
+ * @param details Детали действия
100
+ */
101
+ logAction(action, details) {
102
+ this.info(`Действие: ${action}`, details);
103
+ }
104
+ /**
105
+ * Логирует событие от Telegram клиента
106
+ *
107
+ * @param eventName Название события
108
+ * @param eventData Данные события
109
+ */
110
+ logTelegramEvent(eventName, eventData) {
111
+ this.debug(`Telegram событие: ${eventName}`, eventData);
112
+ }
113
+ /**
114
+ * Закрывает поток записи
115
+ */
116
+ close() {
117
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
118
+ if (this.logStream) {
119
+ this.writeLog('INFO', '─'.repeat(80));
120
+ this.writeLog('INFO', `Логгер закрыт для сессии: ${this.sessionId}`);
121
+ this.writeLog('INFO', `Время закрытия: ${new Date().toISOString()}`);
122
+ return new Promise((resolve, reject) => {
123
+ this.logStream.end((error) => {
124
+ if (error) {
125
+ reject(error);
126
+ }
127
+ else {
128
+ this.logStream = null;
129
+ this.isInitialized = false;
130
+ resolve();
131
+ }
132
+ });
133
+ });
134
+ }
135
+ });
136
+ }
137
+ /**
138
+ * Получает путь к файлу лога
139
+ */
140
+ getLogFilePath() {
141
+ return this.logFilePath;
142
+ }
143
+ /**
144
+ * Внутренний метод для записи в файл
145
+ *
146
+ * @private
147
+ */
148
+ writeLog(level, message, data) {
149
+ if (!this.logStream) {
150
+ // Если поток еще не создан, выводим в консоль
151
+ console.log(`[${this.sessionId}] [${level}] ${message}`, data || '');
152
+ return;
153
+ }
154
+ const timestamp = new Date().toISOString();
155
+ const logEntry = {
156
+ timestamp,
157
+ level,
158
+ sessionId: this.sessionId,
159
+ message,
160
+ };
161
+ if (data !== undefined) {
162
+ logEntry.data = data;
163
+ }
164
+ // Форматируем запись для удобного чтения
165
+ const logLine = this.formatLogEntry(logEntry);
166
+ this.logStream.write(logLine + '\n');
167
+ }
168
+ /**
169
+ * Форматирует запись лога для записи в файл
170
+ *
171
+ * @private
172
+ */
173
+ formatLogEntry(entry) {
174
+ const { timestamp, level, message, data } = entry;
175
+ let logLine = `[${timestamp}] [${level}] ${message}`;
176
+ if (data !== undefined) {
177
+ try {
178
+ const dataStr = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
179
+ logLine += `\n${dataStr}`;
180
+ }
181
+ catch (error) {
182
+ logLine += `\n[Не удалось сериализовать данные]`;
183
+ }
184
+ }
185
+ return logLine;
186
+ }
187
+ /**
188
+ * Очищает имя файла от недопустимых символов
189
+ *
190
+ * @private
191
+ */
192
+ sanitizeFileName(fileName) {
193
+ return fileName.replace(/[^a-zA-Z0-9_-]/g, '_');
194
+ }
195
+ }
196
+ exports.SessionLogger = SessionLogger;
@@ -0,0 +1,79 @@
1
+ import { EventEmitter } from 'events';
2
+ import { TelegramClient } from 'telegram';
3
+ import { DatabaseService } from '../services/DatabaseService';
4
+ import { SessionConfig, SessionInfo } from '../types/session.types';
5
+ import { SessionLogger } from './SessionLogger';
6
+ /**
7
+ * Сервис для управления множеством сессий Telegram клиентов
8
+ *
9
+ * Предоставляет удобный API для:
10
+ * - Добавления и удаления сессий
11
+ * - Получения информации о сессиях
12
+ * - Отслеживания событий (подключение, отключение, ошибки)
13
+ * - Сохранения данных в базе данных
14
+ */
15
+ export declare class SessionManager extends EventEmitter {
16
+ private readonly TELEGRAM_APP_ID;
17
+ private readonly TELEGRAM_APP_HASH;
18
+ private readonly databaseService?;
19
+ constructor(TELEGRAM_APP_ID: number, TELEGRAM_APP_HASH: string, databaseService?: DatabaseService | undefined);
20
+ /** Хранилище всех активных сессий */
21
+ private sessions;
22
+ initialize(): Promise<void>;
23
+ /**
24
+ * Добавляет новую сессию
25
+ *
26
+ * @param config Конфигурация сессии
27
+ * @returns Promise с информацией о созданной сессии
28
+ * @throws Error если сессия с таким ID уже существует
29
+ */
30
+ addSession(config: SessionConfig): Promise<SessionInfo>;
31
+ disconnectSession(sessionId: string): Promise<void>;
32
+ getActiveSessions(): Promise<SessionInfo[]>;
33
+ /**
34
+ * Получает информацию о сессии по ID
35
+ *
36
+ * @param sessionId Идентификатор сессии
37
+ * @returns Информация о сессии или undefined, если не найдена
38
+ */
39
+ getSession(sessionId: string): SessionInfo | undefined;
40
+ /**
41
+ * Получает Telegram клиент по ID сессии
42
+ *
43
+ * @param sessionId Идентификатор сессии
44
+ * @returns Telegram клиент или undefined, если сессия не найдена
45
+ */
46
+ getClient(sessionId: string): TelegramClient | undefined;
47
+ /**
48
+ * Получает логгер сессии по ID
49
+ *
50
+ * @param sessionId Идентификатор сессии
51
+ * @returns Логгер сессии или undefined, если сессия не найдена или логирование отключено
52
+ */
53
+ getLogger(sessionId: string): SessionLogger | undefined;
54
+ /**
55
+ * Получает все активные сессии
56
+ *
57
+ * @returns Массив информации о всех сессиях
58
+ */
59
+ getAllSessions(): SessionInfo[];
60
+ /**
61
+ * Получает список всех ID сессий
62
+ *
63
+ * @returns Массив идентификаторов сессий
64
+ */
65
+ getAllSessionIds(): string[];
66
+ /**
67
+ * Проверяет, существует ли сессия с указанным ID
68
+ *
69
+ * @param sessionId Идентификатор сессии
70
+ * @returns true, если сессия существует, иначе false
71
+ */
72
+ hasSession(sessionId: string): boolean;
73
+ /**
74
+ * Получает количество активных сессий
75
+ *
76
+ * @returns Количество сессий
77
+ */
78
+ getSessionCount(): number;
79
+ }