evogram-gramjs 1.1.0 → 1.1.1
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/lib/EvogramGramJS.d.ts +51 -0
- package/lib/EvogramGramJS.js +99 -0
- package/lib/commands/Accounts.command.d.ts +6 -0
- package/lib/commands/Accounts.command.js +95 -0
- package/lib/commands/AddAccount.command.d.ts +19 -0
- package/lib/commands/AddAccount.command.js +461 -0
- package/lib/commands/index.d.ts +2 -0
- package/lib/commands/index.js +5 -0
- package/lib/commands/managment/DeleteAccount.command.d.ts +0 -0
- package/{src/commands/managment/DeleteAccount.command.ts → lib/commands/managment/DeleteAccount.command.js} +1 -2
- package/lib/config/database.config.d.ts +26 -0
- package/lib/config/database.config.js +31 -0
- package/lib/entities/Session.entity.d.ts +28 -0
- package/lib/entities/Session.entity.js +71 -0
- package/lib/entities/SessionEventLog.entity.d.ts +22 -0
- package/lib/entities/SessionEventLog.entity.js +50 -0
- package/lib/examples/auth.example.d.ts +10 -0
- package/lib/examples/auth.example.js +126 -0
- package/lib/examples/database.example.d.ts +13 -0
- package/lib/examples/database.example.js +109 -0
- package/lib/examples/usage.example.d.ts +13 -0
- package/lib/examples/usage.example.js +127 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +10 -0
- package/lib/services/DatabaseService.d.ts +30 -0
- package/lib/services/DatabaseService.js +93 -0
- package/lib/services/ImageUploadService.d.ts +15 -0
- package/lib/services/ImageUploadService.js +56 -0
- package/lib/sessions/Session.d.ts +13 -0
- package/lib/sessions/Session.js +25 -0
- package/lib/sessions/SessionAuth.d.ts +72 -0
- package/lib/sessions/SessionAuth.js +327 -0
- package/lib/sessions/SessionLogger.d.ts +84 -0
- package/lib/sessions/SessionLogger.js +196 -0
- package/lib/sessions/SessionManager.d.ts +84 -0
- package/lib/sessions/SessionManager.js +198 -0
- package/lib/test.d.ts +1 -0
- package/lib/test.js +144 -0
- package/lib/types/auth.types.d.ts +90 -0
- package/lib/types/auth.types.js +19 -0
- package/lib/types/session.types.d.ts +87 -0
- package/lib/types/session.types.js +21 -0
- package/lib/utils/Deferrer.d.ts +6 -0
- package/lib/utils/Deferrer.js +14 -0
- package/package.json +1 -2
- package/src/EvogramGramJS.ts +0 -98
- package/src/commands/Accounts.command.ts +0 -89
- package/src/commands/AddAccount.command.ts +0 -449
- package/src/commands/index.ts +0 -2
- package/src/config/database.config.ts +0 -75
- package/src/entities/Session.entity.ts +0 -58
- package/src/entities/SessionEventLog.entity.ts +0 -41
- package/src/index.ts +0 -7
- package/src/services/DatabaseService.ts +0 -82
- package/src/services/ImageUploadService.ts +0 -49
- package/src/sessions/Session.ts +0 -21
- package/src/sessions/SessionAuth.ts +0 -356
- package/src/sessions/SessionLogger.ts +0 -208
- package/src/sessions/SessionManager.ts +0 -211
- package/src/types/auth.types.ts +0 -94
- package/src/types/session.types.ts +0 -96
- package/src/utils/Deferrer.ts +0 -12
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import { createWriteStream, WriteStream } from 'fs'
|
|
2
|
-
import { mkdir } from 'fs/promises'
|
|
3
|
-
import { join } from 'path'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Логгер для отдельной сессии
|
|
7
|
-
* Записывает все действия и активность сессии в отдельный файл
|
|
8
|
-
*/
|
|
9
|
-
export class SessionLogger {
|
|
10
|
-
private logStream: WriteStream | null = null
|
|
11
|
-
private logFilePath: string
|
|
12
|
-
private isInitialized: boolean = false
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* @param sessionId Идентификатор сессии
|
|
16
|
-
* @param logsDirectory Директория для хранения логов (по умолчанию './logs')
|
|
17
|
-
*/
|
|
18
|
-
constructor(private readonly sessionId: string, private readonly logsDirectory: string = './logs') {
|
|
19
|
-
// Формируем путь к файлу лога
|
|
20
|
-
const sanitizedSessionId = this.sanitizeFileName(sessionId)
|
|
21
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-')
|
|
22
|
-
this.logFilePath = join(this.logsDirectory, `session-${sanitizedSessionId}-${timestamp}.log`)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Инициализирует логгер (создает директорию и файл)
|
|
27
|
-
*/
|
|
28
|
-
async initialize(): Promise<void> {
|
|
29
|
-
if (this.isInitialized) return
|
|
30
|
-
|
|
31
|
-
try {
|
|
32
|
-
// Создаем директорию для логов, если её нет
|
|
33
|
-
await mkdir(this.logsDirectory, { recursive: true })
|
|
34
|
-
|
|
35
|
-
// Создаем поток записи в файл (режим append)
|
|
36
|
-
this.logStream = createWriteStream(this.logFilePath, { flags: 'a' })
|
|
37
|
-
|
|
38
|
-
// Записываем заголовок
|
|
39
|
-
this.writeLog('INFO', `Логгер инициализирован для сессии: ${this.sessionId}`)
|
|
40
|
-
this.writeLog('INFO', `Файл лога: ${this.logFilePath}`)
|
|
41
|
-
this.writeLog('INFO', `Время создания: ${new Date().toISOString()}`)
|
|
42
|
-
this.writeLog('INFO', '─'.repeat(80))
|
|
43
|
-
|
|
44
|
-
this.isInitialized = true
|
|
45
|
-
} catch (error) {
|
|
46
|
-
console.error(`Ошибка инициализации логгера для сессии ${this.sessionId}:`, error)
|
|
47
|
-
throw error
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Записывает лог-запись в файл
|
|
53
|
-
*
|
|
54
|
-
* @param level Уровень логирования (INFO, WARN, ERROR, DEBUG)
|
|
55
|
-
* @param message Сообщение для логирования
|
|
56
|
-
* @param data Дополнительные данные (опционально)
|
|
57
|
-
*/
|
|
58
|
-
log(level: 'INFO' | 'WARN' | 'ERROR' | 'DEBUG', message: string, data?: any): void {
|
|
59
|
-
if (!this.isInitialized) {
|
|
60
|
-
// Если логгер еще не инициализирован, инициализируем синхронно
|
|
61
|
-
this.initialize().catch((error) => {
|
|
62
|
-
console.error(`Ошибка инициализации логгера:`, error)
|
|
63
|
-
})
|
|
64
|
-
return
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
this.writeLog(level, message, data)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Логирует информацию
|
|
72
|
-
*/
|
|
73
|
-
info(message: string, data?: any): void {
|
|
74
|
-
this.log('INFO', message, data)
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Логирует предупреждение
|
|
79
|
-
*/
|
|
80
|
-
warn(message: string, data?: any): void {
|
|
81
|
-
this.log('WARN', message, data)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Логирует ошибку
|
|
86
|
-
*/
|
|
87
|
-
error(message: string, error?: Error | any): void {
|
|
88
|
-
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
89
|
-
const errorStack = error instanceof Error ? error.stack : undefined
|
|
90
|
-
this.log('ERROR', message, { error: errorMessage, stack: errorStack })
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Логирует отладочную информацию
|
|
95
|
-
*/
|
|
96
|
-
debug(message: string, data?: any): void {
|
|
97
|
-
this.log('DEBUG', message, data)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Логирует действие сессии
|
|
102
|
-
*
|
|
103
|
-
* @param action Название действия
|
|
104
|
-
* @param details Детали действия
|
|
105
|
-
*/
|
|
106
|
-
logAction(action: string, details?: any): void {
|
|
107
|
-
this.info(`Действие: ${action}`, details)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Логирует событие от Telegram клиента
|
|
112
|
-
*
|
|
113
|
-
* @param eventName Название события
|
|
114
|
-
* @param eventData Данные события
|
|
115
|
-
*/
|
|
116
|
-
logTelegramEvent(eventName: string, eventData?: any): void {
|
|
117
|
-
this.debug(`Telegram событие: ${eventName}`, eventData)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Закрывает поток записи
|
|
122
|
-
*/
|
|
123
|
-
async close(): Promise<void> {
|
|
124
|
-
if (this.logStream) {
|
|
125
|
-
this.writeLog('INFO', '─'.repeat(80))
|
|
126
|
-
this.writeLog('INFO', `Логгер закрыт для сессии: ${this.sessionId}`)
|
|
127
|
-
this.writeLog('INFO', `Время закрытия: ${new Date().toISOString()}`)
|
|
128
|
-
|
|
129
|
-
return new Promise((resolve, reject) => {
|
|
130
|
-
this.logStream!.end((error: Error | null | undefined) => {
|
|
131
|
-
if (error) {
|
|
132
|
-
reject(error)
|
|
133
|
-
} else {
|
|
134
|
-
this.logStream = null
|
|
135
|
-
this.isInitialized = false
|
|
136
|
-
resolve()
|
|
137
|
-
}
|
|
138
|
-
})
|
|
139
|
-
})
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Получает путь к файлу лога
|
|
145
|
-
*/
|
|
146
|
-
getLogFilePath(): string {
|
|
147
|
-
return this.logFilePath
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Внутренний метод для записи в файл
|
|
152
|
-
*
|
|
153
|
-
* @private
|
|
154
|
-
*/
|
|
155
|
-
private writeLog(level: string, message: string, data?: any): void {
|
|
156
|
-
if (!this.logStream) {
|
|
157
|
-
// Если поток еще не создан, выводим в консоль
|
|
158
|
-
console.log(`[${this.sessionId}] [${level}] ${message}`, data || '')
|
|
159
|
-
return
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const timestamp = new Date().toISOString()
|
|
163
|
-
const logEntry: any = {
|
|
164
|
-
timestamp,
|
|
165
|
-
level,
|
|
166
|
-
sessionId: this.sessionId,
|
|
167
|
-
message,
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
if (data !== undefined) {
|
|
171
|
-
logEntry.data = data
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// Форматируем запись для удобного чтения
|
|
175
|
-
const logLine = this.formatLogEntry(logEntry)
|
|
176
|
-
this.logStream.write(logLine + '\n')
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Форматирует запись лога для записи в файл
|
|
181
|
-
*
|
|
182
|
-
* @private
|
|
183
|
-
*/
|
|
184
|
-
private formatLogEntry(entry: any): string {
|
|
185
|
-
const { timestamp, level, message, data } = entry
|
|
186
|
-
let logLine = `[${timestamp}] [${level}] ${message}`
|
|
187
|
-
|
|
188
|
-
if (data !== undefined) {
|
|
189
|
-
try {
|
|
190
|
-
const dataStr = typeof data === 'string' ? data : JSON.stringify(data, null, 2)
|
|
191
|
-
logLine += `\n${dataStr}`
|
|
192
|
-
} catch (error) {
|
|
193
|
-
logLine += `\n[Не удалось сериализовать данные]`
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return logLine
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Очищает имя файла от недопустимых символов
|
|
202
|
-
*
|
|
203
|
-
* @private
|
|
204
|
-
*/
|
|
205
|
-
private sanitizeFileName(fileName: string): string {
|
|
206
|
-
return fileName.replace(/[^a-zA-Z0-9_-]/g, '_')
|
|
207
|
-
}
|
|
208
|
-
}
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'events'
|
|
2
|
-
import { Api, TelegramClient } from 'telegram'
|
|
3
|
-
import { UpdateConnectionState } from 'telegram/network'
|
|
4
|
-
import { StringSession } from 'telegram/sessions'
|
|
5
|
-
import { EvogramGramJS } from '../EvogramGramJS'
|
|
6
|
-
import { Session as SessionEntity } from '../entities/Session.entity'
|
|
7
|
-
import { DatabaseService } from '../services/DatabaseService'
|
|
8
|
-
import { SessionConfig, SessionEvent, SessionEventData, SessionInfo, SessionInvalidEventData } from '../types/session.types'
|
|
9
|
-
import { Session } from './Session'
|
|
10
|
-
import { SessionAuth } from './SessionAuth'
|
|
11
|
-
import { SessionLogger } from './SessionLogger'
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Сервис для управления множеством сессий Telegram клиентов
|
|
15
|
-
*
|
|
16
|
-
* Предоставляет удобный API для:
|
|
17
|
-
* - Добавления и удаления сессий
|
|
18
|
-
* - Получения информации о сессиях
|
|
19
|
-
* - Отслеживания событий (подключение, отключение, ошибки)
|
|
20
|
-
* - Сохранения данных в базе данных
|
|
21
|
-
*/
|
|
22
|
-
export class SessionManager extends EventEmitter {
|
|
23
|
-
constructor(private readonly TELEGRAM_APP_ID: number, private readonly TELEGRAM_APP_HASH: string, private readonly databaseService?: DatabaseService) {
|
|
24
|
-
super()
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Хранилище всех активных сессий */
|
|
28
|
-
private sessions: Map<string, SessionInfo> = new Map()
|
|
29
|
-
|
|
30
|
-
public async initialize(): Promise<void> {
|
|
31
|
-
const sessions = await this.databaseService?.getSessions()
|
|
32
|
-
if (!sessions || sessions.length === 0) return
|
|
33
|
-
|
|
34
|
-
for (const session of sessions) {
|
|
35
|
-
await this.addSession({
|
|
36
|
-
sessionId: session.sessionId,
|
|
37
|
-
sessionString: session.sessionString,
|
|
38
|
-
apiId: session.apiId,
|
|
39
|
-
apiHash: session.apiHash,
|
|
40
|
-
clientOptions: session.clientOptions ? JSON.parse(session.clientOptions) : undefined,
|
|
41
|
-
})
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Добавляет новую сессию
|
|
47
|
-
*
|
|
48
|
-
* @param config Конфигурация сессии
|
|
49
|
-
* @returns Promise с информацией о созданной сессии
|
|
50
|
-
* @throws Error если сессия с таким ID уже существует
|
|
51
|
-
*/
|
|
52
|
-
async addSession(config: SessionConfig): Promise<SessionInfo> {
|
|
53
|
-
// Проверяем, не существует ли уже сессия с таким ID в памяти
|
|
54
|
-
if (this.sessions.has(config.sessionId)) return this.sessions.get(config.sessionId)!
|
|
55
|
-
|
|
56
|
-
// Создаем строковую сессию (если не предоставлена, создается пустая)
|
|
57
|
-
const session = new StringSession(config.sessionString || '')
|
|
58
|
-
|
|
59
|
-
// Создаем Telegram клиент
|
|
60
|
-
const client = new TelegramClient(session, config.apiId ?? this.TELEGRAM_APP_ID, config.apiHash ?? this.TELEGRAM_APP_HASH, {
|
|
61
|
-
useIPV6: config.clientOptions?.useIPV6 ?? false,
|
|
62
|
-
connectionRetries: config.clientOptions?.connectionRetries ?? 5,
|
|
63
|
-
})
|
|
64
|
-
await client.connect()
|
|
65
|
-
|
|
66
|
-
client.addEventHandler(async (event) => {
|
|
67
|
-
if ((await this.getSession(config.sessionId)?.db())?.error) return
|
|
68
|
-
else if (!(await this.getSession(config.sessionId)?.db())?.sessionString) return
|
|
69
|
-
|
|
70
|
-
if (event instanceof UpdateConnectionState) {
|
|
71
|
-
const error = await client
|
|
72
|
-
.getMe()
|
|
73
|
-
.then(() => undefined)
|
|
74
|
-
.catch((error) => error)
|
|
75
|
-
|
|
76
|
-
if (error) {
|
|
77
|
-
this.emit(SessionEvent.SESSION_INVALID, {
|
|
78
|
-
sessionId: config.sessionId,
|
|
79
|
-
error: error,
|
|
80
|
-
} as SessionInvalidEventData)
|
|
81
|
-
|
|
82
|
-
await EvogramGramJS.databaseService.updateSession(config.sessionId, { error: error.errorMessage })
|
|
83
|
-
await this.disconnectSession(config.sessionId)
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
const sessionAuth = new SessionAuth(config.sessionId, client)
|
|
89
|
-
|
|
90
|
-
const sessionInfo = new Session(config.sessionId, client, undefined, sessionAuth)
|
|
91
|
-
this.sessions.set(config.sessionId, sessionInfo)
|
|
92
|
-
|
|
93
|
-
// Генерируем событие добавления сессии
|
|
94
|
-
this.emit(SessionEvent.SESSION_ADDED, {
|
|
95
|
-
sessionId: config.sessionId,
|
|
96
|
-
sessionInfo,
|
|
97
|
-
} as SessionEventData)
|
|
98
|
-
|
|
99
|
-
return sessionInfo
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
async disconnectSession(sessionId: string): Promise<void> {
|
|
103
|
-
const session = this.sessions.get(sessionId)
|
|
104
|
-
if (!session) throw new Error(`Сессия с ID ${sessionId} не найдена`)
|
|
105
|
-
|
|
106
|
-
await session.client.disconnect()
|
|
107
|
-
this.emit(SessionEvent.SESSION_DISCONNECTED, {
|
|
108
|
-
sessionId: sessionId,
|
|
109
|
-
} as SessionEventData)
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
async getActiveSessions(): Promise<SessionInfo[]> {
|
|
113
|
-
const sessions = Array.from(this.sessions.values())
|
|
114
|
-
|
|
115
|
-
const results = await Promise.all(
|
|
116
|
-
sessions.map(async (session) => {
|
|
117
|
-
const dbData = await session.db()
|
|
118
|
-
return { session, hasError: !!dbData?.error }
|
|
119
|
-
})
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
return results.filter((result) => !result.hasError).map((result) => result.session)
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Получает информацию о сессии по ID
|
|
127
|
-
*
|
|
128
|
-
* @param sessionId Идентификатор сессии
|
|
129
|
-
* @returns Информация о сессии или undefined, если не найдена
|
|
130
|
-
*/
|
|
131
|
-
getSession(sessionId: string): SessionInfo | undefined {
|
|
132
|
-
const sessionInfo = this.sessions.get(sessionId)
|
|
133
|
-
return sessionInfo
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Получает Telegram клиент по ID сессии
|
|
138
|
-
*
|
|
139
|
-
* @param sessionId Идентификатор сессии
|
|
140
|
-
* @returns Telegram клиент или undefined, если сессия не найдена
|
|
141
|
-
*/
|
|
142
|
-
getClient(sessionId: string): TelegramClient | undefined {
|
|
143
|
-
return this.getSession(sessionId)?.client
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Получает логгер сессии по ID
|
|
148
|
-
*
|
|
149
|
-
* @param sessionId Идентификатор сессии
|
|
150
|
-
* @returns Логгер сессии или undefined, если сессия не найдена или логирование отключено
|
|
151
|
-
*/
|
|
152
|
-
getLogger(sessionId: string): SessionLogger | undefined {
|
|
153
|
-
return this.getSession(sessionId)?.logger
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Получает все активные сессии
|
|
158
|
-
*
|
|
159
|
-
* @returns Массив информации о всех сессиях
|
|
160
|
-
*/
|
|
161
|
-
getAllSessions(): SessionInfo[] {
|
|
162
|
-
return Array.from(this.sessions.values())
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async getAllLoadedSessions(): Promise<({ db: SessionEntity | null; user: Api.User | null } & Omit<SessionInfo, 'db' | 'user'>)[]> {
|
|
166
|
-
const sessions = Array.from(this.sessions.values())
|
|
167
|
-
|
|
168
|
-
const results = await Promise.all(
|
|
169
|
-
sessions
|
|
170
|
-
.filter((x) => x.sessionId)
|
|
171
|
-
.map(async (session) => {
|
|
172
|
-
return {
|
|
173
|
-
...session,
|
|
174
|
-
db: await session.db().catch(() => null),
|
|
175
|
-
user: await session.user().catch(() => null),
|
|
176
|
-
}
|
|
177
|
-
})
|
|
178
|
-
)
|
|
179
|
-
|
|
180
|
-
//@ts-ignore
|
|
181
|
-
return results
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Получает список всех ID сессий
|
|
186
|
-
*
|
|
187
|
-
* @returns Массив идентификаторов сессий
|
|
188
|
-
*/
|
|
189
|
-
getAllSessionIds(): string[] {
|
|
190
|
-
return Array.from(this.sessions.keys())
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Проверяет, существует ли сессия с указанным ID
|
|
195
|
-
*
|
|
196
|
-
* @param sessionId Идентификатор сессии
|
|
197
|
-
* @returns true, если сессия существует, иначе false
|
|
198
|
-
*/
|
|
199
|
-
hasSession(sessionId: string): boolean {
|
|
200
|
-
return this.sessions.has(sessionId)
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Получает количество активных сессий
|
|
205
|
-
*
|
|
206
|
-
* @returns Количество сессий
|
|
207
|
-
*/
|
|
208
|
-
getSessionCount(): number {
|
|
209
|
-
return this.sessions.size
|
|
210
|
-
}
|
|
211
|
-
}
|
package/src/types/auth.types.ts
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Состояния процесса авторизации
|
|
3
|
-
*/
|
|
4
|
-
export enum AuthState {
|
|
5
|
-
/** Начальное состояние - не авторизован */
|
|
6
|
-
INITIAL = 'initial',
|
|
7
|
-
/** Ожидание кода подтверждения */
|
|
8
|
-
WAITING_CODE = 'waiting_code',
|
|
9
|
-
/** Ожидание пароля (2FA) */
|
|
10
|
-
WAITING_PASSWORD = 'waiting_password',
|
|
11
|
-
/** Авторизация завершена */
|
|
12
|
-
AUTHORIZED = 'authorized',
|
|
13
|
-
/** Ошибка авторизации */
|
|
14
|
-
ERROR = 'error',
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Информация о процессе авторизации
|
|
19
|
-
*/
|
|
20
|
-
export interface AuthInfo {
|
|
21
|
-
/** Идентификатор сессии */
|
|
22
|
-
sessionId: string
|
|
23
|
-
/** Текущее состояние авторизации */
|
|
24
|
-
state: AuthState
|
|
25
|
-
/** Номер телефона (если указан) */
|
|
26
|
-
phoneNumber?: string
|
|
27
|
-
/** Требуется ли пароль (2FA) */
|
|
28
|
-
isRequiredPassword: boolean
|
|
29
|
-
/** Код подтверждения (если ожидается) */
|
|
30
|
-
code?: string
|
|
31
|
-
/** Пароль (2FA) (если ожидается) */
|
|
32
|
-
password?: string
|
|
33
|
-
/** Хеш кода подтверждения */
|
|
34
|
-
phoneCodeHash?: string
|
|
35
|
-
/** Сообщение об ошибке (если есть) */
|
|
36
|
-
error?: string
|
|
37
|
-
/** Время начала авторизации */
|
|
38
|
-
startedAt: Date
|
|
39
|
-
/** Время последнего обновления */
|
|
40
|
-
updatedAt: Date
|
|
41
|
-
/** Промисы для ожидания кода и пароля */
|
|
42
|
-
_codeResolver?: (code: string) => void
|
|
43
|
-
_codeRejecter?: (error: Error) => void
|
|
44
|
-
_passwordResolver?: (password: string) => void
|
|
45
|
-
_passwordRejecter?: (error: Error) => void
|
|
46
|
-
/** Промис для отслеживания начальной ошибки (до запроса кода) */
|
|
47
|
-
_initialErrorRejecter?: (error: Error) => void
|
|
48
|
-
/** Resolver для промиса, когда код был запрошен (успешное начало) */
|
|
49
|
-
_codeRequestedResolver?: () => void
|
|
50
|
-
/** Флаг, что код был запрошен (для различения начальной ошибки от ошибки после запроса кода) */
|
|
51
|
-
_codeRequested?: boolean
|
|
52
|
-
/** Флаг, что была ошибка неверного кода (для отслеживания повторной попытки) */
|
|
53
|
-
_hasCodeError?: boolean
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Результат отправки кода
|
|
58
|
-
*/
|
|
59
|
-
export interface SendCodeResult {
|
|
60
|
-
/** Успешно ли отправлен код */
|
|
61
|
-
success: boolean
|
|
62
|
-
/** Требуется ли пароль (2FA) */
|
|
63
|
-
isRequiredPassword: boolean
|
|
64
|
-
/** Сообщение об ошибке (если есть) */
|
|
65
|
-
error?: string
|
|
66
|
-
/** Тип отправки кода (sms, call, etc.) */
|
|
67
|
-
phoneCodeHash?: string
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Результат ввода кода
|
|
72
|
-
*/
|
|
73
|
-
export interface SignInResult {
|
|
74
|
-
/** Успешно ли авторизован */
|
|
75
|
-
success: boolean
|
|
76
|
-
/** Требуется ли пароль (2FA) */
|
|
77
|
-
isRequiredPassword: boolean
|
|
78
|
-
/** Сообщение об ошибке (если есть) */
|
|
79
|
-
error?: string
|
|
80
|
-
/** Строка сессии (если авторизация успешна) */
|
|
81
|
-
sessionString?: string
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Результат ввода пароля
|
|
86
|
-
*/
|
|
87
|
-
export interface SignInWithPasswordResult {
|
|
88
|
-
/** Успешно ли авторизован */
|
|
89
|
-
success: boolean
|
|
90
|
-
/** Сообщение об ошибке (если есть) */
|
|
91
|
-
error?: string
|
|
92
|
-
/** Строка сессии (если авторизация успешна) */
|
|
93
|
-
sessionString?: string
|
|
94
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { Session } from '../sessions/Session'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Конфигурация для создания новой сессии
|
|
5
|
-
*/
|
|
6
|
-
export interface SessionConfig {
|
|
7
|
-
/** Уникальный идентификатор сессии */
|
|
8
|
-
sessionId: string
|
|
9
|
-
/** API ID из Telegram */
|
|
10
|
-
apiId?: number
|
|
11
|
-
/** API Hash из Telegram */
|
|
12
|
-
apiHash?: string
|
|
13
|
-
/** Строка сессии (если уже существует) */
|
|
14
|
-
sessionString?: string
|
|
15
|
-
/** Дополнительные опции для клиента */
|
|
16
|
-
clientOptions?: {
|
|
17
|
-
/** Использовать IPv6 */
|
|
18
|
-
useIPV6?: boolean
|
|
19
|
-
/** Таймаут подключения */
|
|
20
|
-
connectionRetries?: number
|
|
21
|
-
/** Максимальное количество попыток переподключения */
|
|
22
|
-
maxRetries?: number
|
|
23
|
-
}
|
|
24
|
-
/** Настройки логирования */
|
|
25
|
-
logging?: {
|
|
26
|
-
/** Включить логирование (по умолчанию true) */
|
|
27
|
-
enabled?: boolean
|
|
28
|
-
/** Директория для хранения логов (по умолчанию './logs') */
|
|
29
|
-
logsDirectory?: string
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Информация о сессии
|
|
35
|
-
* Использует класс Session для представления сессии
|
|
36
|
-
*/
|
|
37
|
-
export type SessionInfo = Session
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* События, которые может генерировать менеджер сессий
|
|
41
|
-
*/
|
|
42
|
-
export enum SessionEvent {
|
|
43
|
-
/** Сессия была добавлена */
|
|
44
|
-
SESSION_ADDED = 'session:added',
|
|
45
|
-
/** Сессия была удалена */
|
|
46
|
-
SESSION_REMOVED = 'session:removed',
|
|
47
|
-
/** Сессия подключилась */
|
|
48
|
-
SESSION_CONNECTED = 'session:connected',
|
|
49
|
-
/** Сессия отключилась */
|
|
50
|
-
SESSION_DISCONNECTED = 'session:disconnected',
|
|
51
|
-
/** Произошла ошибка в сессии */
|
|
52
|
-
SESSION_ERROR = 'session:error',
|
|
53
|
-
|
|
54
|
-
/** Сессия стала недействительной */
|
|
55
|
-
SESSION_INVALID = 'session:invalid',
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Данные события добавления/удаления сессии
|
|
60
|
-
*/
|
|
61
|
-
export interface SessionEventData {
|
|
62
|
-
sessionId: string
|
|
63
|
-
sessionInfo?: Session
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Данные события подключения/отключения
|
|
68
|
-
*/
|
|
69
|
-
export interface SessionConnectionEventData {
|
|
70
|
-
sessionId: string
|
|
71
|
-
isConnected: boolean
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Данные события ошибки
|
|
76
|
-
*/
|
|
77
|
-
export interface SessionErrorEventData {
|
|
78
|
-
sessionId: string
|
|
79
|
-
error: Error
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Данные события удаления сессии
|
|
84
|
-
*/
|
|
85
|
-
export interface SessionRemovedEventData {
|
|
86
|
-
sessionId: string
|
|
87
|
-
error: Error
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Данные события недействительности сессии
|
|
92
|
-
*/
|
|
93
|
-
export interface SessionInvalidEventData {
|
|
94
|
-
sessionId: string
|
|
95
|
-
error: Error
|
|
96
|
-
}
|
package/src/utils/Deferrer.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export class Deferred<T> {
|
|
2
|
-
public promise: Promise<T>
|
|
3
|
-
public resolve: (value: T | PromiseLike<T>) => void = () => {}
|
|
4
|
-
public reject: (reason?: any) => void = () => {}
|
|
5
|
-
|
|
6
|
-
constructor() {
|
|
7
|
-
this.promise = new Promise<T>((resolve, reject) => {
|
|
8
|
-
this.resolve = resolve
|
|
9
|
-
this.reject = reject
|
|
10
|
-
})
|
|
11
|
-
}
|
|
12
|
-
}
|