solver-sdk 2.7.3 → 2.7.5
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/dist/cjs/api/chat-api/index.js +53 -58
- package/dist/cjs/api/chat-api/index.js.map +1 -1
- package/dist/cjs/api/chat-api/stream-utils.js +126 -12
- package/dist/cjs/api/chat-api/stream-utils.js.map +1 -1
- package/dist/cjs/api/projects-api.js +83 -4
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/cjs/utils/code-solver-websocket-client.js +0 -48
- package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/cjs/utils/simple-connection-monitor.js +52 -0
- package/dist/cjs/utils/simple-connection-monitor.js.map +1 -0
- package/dist/cjs/ws/base-ws-client.js +8 -14
- package/dist/cjs/ws/base-ws-client.js.map +1 -1
- package/dist/cjs/ws/indexing-ws-client.js +46 -0
- package/dist/cjs/ws/indexing-ws-client.js.map +1 -1
- package/dist/esm/api/chat-api/index.js +54 -59
- package/dist/esm/api/chat-api/index.js.map +1 -1
- package/dist/esm/api/chat-api/stream-utils.js +126 -12
- package/dist/esm/api/chat-api/stream-utils.js.map +1 -1
- package/dist/esm/api/projects-api.js +83 -4
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/esm/utils/code-solver-websocket-client.js +0 -48
- package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/esm/utils/simple-connection-monitor.js +48 -0
- package/dist/esm/utils/simple-connection-monitor.js.map +1 -0
- package/dist/esm/ws/base-ws-client.js +8 -14
- package/dist/esm/ws/base-ws-client.js.map +1 -1
- package/dist/esm/ws/indexing-ws-client.js +46 -0
- package/dist/esm/ws/indexing-ws-client.js.map +1 -1
- package/dist/types/api/chat-api/index.d.ts.map +1 -1
- package/dist/types/api/chat-api/models.d.ts +4 -2
- package/dist/types/api/chat-api/models.d.ts.map +1 -1
- package/dist/types/api/chat-api/stream-utils.d.ts.map +1 -1
- package/dist/types/api/projects-api.d.ts +18 -0
- package/dist/types/api/projects-api.d.ts.map +1 -1
- package/dist/types/utils/code-solver-websocket-client.d.ts +0 -7
- package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
- package/dist/types/utils/simple-connection-monitor.d.ts +26 -0
- package/dist/types/utils/simple-connection-monitor.d.ts.map +1 -0
- package/dist/types/ws/base-ws-client.d.ts +3 -3
- package/dist/types/ws/base-ws-client.d.ts.map +1 -1
- package/dist/types/ws/indexing-ws-client.d.ts +16 -0
- package/dist/types/ws/indexing-ws-client.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/interfaces/websocket/stats.interfaces.js +0 -3
- package/dist/cjs/interfaces/websocket/stats.interfaces.js.map +0 -1
- package/dist/cjs/utils/ping-pong-manager.js +0 -306
- package/dist/cjs/utils/ping-pong-manager.js.map +0 -1
- package/dist/cjs/ws/diagnostics-service.js +0 -170
- package/dist/cjs/ws/diagnostics-service.js.map +0 -1
- package/dist/esm/interfaces/websocket/stats.interfaces.js +0 -2
- package/dist/esm/interfaces/websocket/stats.interfaces.js.map +0 -1
- package/dist/esm/utils/ping-pong-manager.js +0 -302
- package/dist/esm/utils/ping-pong-manager.js.map +0 -1
- package/dist/esm/ws/diagnostics-service.js +0 -166
- package/dist/esm/ws/diagnostics-service.js.map +0 -1
- package/dist/types/interfaces/websocket/stats.interfaces.d.ts +0 -72
- package/dist/types/interfaces/websocket/stats.interfaces.d.ts.map +0 -1
- package/dist/types/utils/ping-pong-manager.d.ts +0 -118
- package/dist/types/utils/ping-pong-manager.d.ts.map +0 -1
- package/dist/types/ws/diagnostics-service.d.ts +0 -93
- package/dist/types/ws/diagnostics-service.d.ts.map +0 -1
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
import { createWebSocketLogger } from './logger.js';
|
|
2
|
-
import { WebSocketEvents as WsEvents } from '../constants/websocket-events.constants.js';
|
|
3
|
-
/**
|
|
4
|
-
* Класс для управления механизмом ping/pong
|
|
5
|
-
*/
|
|
6
|
-
export class PingPongManager {
|
|
7
|
-
/**
|
|
8
|
-
* Создает новый менеджер ping/pong
|
|
9
|
-
* @param {PingPongManagerOptions} options Опции менеджера ping/pong
|
|
10
|
-
*/
|
|
11
|
-
constructor(options = {}) {
|
|
12
|
-
/** Таймеры для ping/pong */
|
|
13
|
-
this.pingIntervals = new Map();
|
|
14
|
-
/** Статистика ping/pong */
|
|
15
|
-
this.pingStats = new Map();
|
|
16
|
-
/** Количество последовательных таймаутов */
|
|
17
|
-
this.pingTimeouts = new Map();
|
|
18
|
-
/** Хранилище обработчиков ping/pong */
|
|
19
|
-
this.pingPongEventHandlers = new Map();
|
|
20
|
-
/** Клиенты WebSocket по namespace */
|
|
21
|
-
this.clients = new Map();
|
|
22
|
-
this.pingInterval = options.pingInterval || 30000;
|
|
23
|
-
this.pingTimeoutThreshold = options.pingTimeoutThreshold || 3;
|
|
24
|
-
this.logger = options.logger || createWebSocketLogger('PingPongManager');
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Регистрирует WebSocket клиент для указанного пространства имен
|
|
28
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
29
|
-
* @param {WebSocketClient} client WebSocket клиент
|
|
30
|
-
*/
|
|
31
|
-
registerClient(namespace, client) {
|
|
32
|
-
this.clients.set(namespace, client);
|
|
33
|
-
// Инициализируем статистику для namespace
|
|
34
|
-
if (!this.pingStats.has(namespace)) {
|
|
35
|
-
this.pingStats.set(namespace, {
|
|
36
|
-
namespace,
|
|
37
|
-
socketId: client.getSocketId(),
|
|
38
|
-
pingSent: 0,
|
|
39
|
-
pongReceived: 0,
|
|
40
|
-
averageRtt: 0,
|
|
41
|
-
minRtt: Number.MAX_SAFE_INTEGER,
|
|
42
|
-
maxRtt: 0,
|
|
43
|
-
lastRtt: 0,
|
|
44
|
-
lastPongTimestamp: 0,
|
|
45
|
-
isConnected: client.isConnected()
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
// Сбрасываем счетчик таймаутов
|
|
49
|
-
this.pingTimeouts.set(namespace, 0);
|
|
50
|
-
// Устанавливаем обработчик для события connection_pong
|
|
51
|
-
client.on(WsEvents.CONNECTION_PONG, this.createPongHandler(namespace));
|
|
52
|
-
this.logger.debug(`Зарегистрирован клиент для ${namespace}`, {
|
|
53
|
-
socketId: client.getSocketId()
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Удаляет регистрацию WebSocket клиента для указанного пространства имен
|
|
58
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
59
|
-
*/
|
|
60
|
-
unregisterClient(namespace) {
|
|
61
|
-
this.clients.delete(namespace);
|
|
62
|
-
this.logger.debug(`Удалена регистрация клиента для ${namespace}`);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Создает обработчик для события pong
|
|
66
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
67
|
-
* @returns {PingPongEventHandler} Обработчик события pong
|
|
68
|
-
*/
|
|
69
|
-
createPongHandler(namespace) {
|
|
70
|
-
return (data) => {
|
|
71
|
-
// Обновляем статистику
|
|
72
|
-
const stats = this.pingStats.get(namespace);
|
|
73
|
-
if (stats) {
|
|
74
|
-
stats.pongReceived++;
|
|
75
|
-
stats.lastPongTimestamp = Date.now();
|
|
76
|
-
// Рассчитываем RTT, если есть метка времени эхо
|
|
77
|
-
if (data && data.echo) {
|
|
78
|
-
const rtt = Date.now() - data.echo;
|
|
79
|
-
stats.lastRtt = rtt;
|
|
80
|
-
// Обновляем min и max
|
|
81
|
-
stats.minRtt = Math.min(stats.minRtt, rtt);
|
|
82
|
-
stats.maxRtt = Math.max(stats.maxRtt, rtt);
|
|
83
|
-
// Обновляем среднее значение
|
|
84
|
-
stats.averageRtt = (stats.averageRtt * (stats.pongReceived - 1) + rtt) / stats.pongReceived;
|
|
85
|
-
}
|
|
86
|
-
// Сбрасываем счетчик таймаутов
|
|
87
|
-
this.pingTimeouts.set(namespace, 0);
|
|
88
|
-
// Обновляем ID сокета, если он изменился
|
|
89
|
-
const client = this.clients.get(namespace);
|
|
90
|
-
if (client) {
|
|
91
|
-
stats.socketId = client.getSocketId();
|
|
92
|
-
stats.isConnected = client.isConnected();
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// Логируем получение pong
|
|
96
|
-
this.logger.debug(`Получен pong для ${namespace}`, {
|
|
97
|
-
rtt: stats?.lastRtt,
|
|
98
|
-
socketId: stats?.socketId
|
|
99
|
-
});
|
|
100
|
-
// Вызываем обработчики событий
|
|
101
|
-
this.notifyEventHandlers('connection_pong', {
|
|
102
|
-
namespace,
|
|
103
|
-
timestamp: Date.now(),
|
|
104
|
-
rtt: stats?.lastRtt,
|
|
105
|
-
socketId: stats?.socketId
|
|
106
|
-
});
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Уведомляет обработчики о событии
|
|
111
|
-
* @param {string} eventType Тип события
|
|
112
|
-
* @param {any} data Данные события
|
|
113
|
-
*/
|
|
114
|
-
notifyEventHandlers(eventType, data) {
|
|
115
|
-
const handlers = this.pingPongEventHandlers.get(eventType) || [];
|
|
116
|
-
for (const handler of handlers) {
|
|
117
|
-
try {
|
|
118
|
-
handler(data);
|
|
119
|
-
}
|
|
120
|
-
catch (error) {
|
|
121
|
-
this.logger.error(`Ошибка в обработчике события ${eventType}`, error);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Включает автоматическую отправку ping-сообщений
|
|
127
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
128
|
-
* @returns {boolean} true, если механизм успешно включен
|
|
129
|
-
*/
|
|
130
|
-
enablePingPong(namespace) {
|
|
131
|
-
const client = this.clients.get(namespace);
|
|
132
|
-
if (!client || !client.isConnected()) {
|
|
133
|
-
this.logger.warn(`Невозможно включить ping/pong для неактивного соединения в ${namespace}`);
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
// Останавливаем существующий таймер, если есть
|
|
137
|
-
this.disablePingPong(namespace);
|
|
138
|
-
// Инициализируем статистику, если не была создана
|
|
139
|
-
if (!this.pingStats.has(namespace)) {
|
|
140
|
-
this.pingStats.set(namespace, {
|
|
141
|
-
namespace,
|
|
142
|
-
socketId: client.getSocketId(),
|
|
143
|
-
pingSent: 0,
|
|
144
|
-
pongReceived: 0,
|
|
145
|
-
averageRtt: 0,
|
|
146
|
-
minRtt: Number.MAX_SAFE_INTEGER,
|
|
147
|
-
maxRtt: 0,
|
|
148
|
-
lastRtt: 0,
|
|
149
|
-
lastPongTimestamp: 0,
|
|
150
|
-
isConnected: client.isConnected()
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
// Сбрасываем счетчик таймаутов
|
|
154
|
-
this.pingTimeouts.set(namespace, 0);
|
|
155
|
-
// Устанавливаем интервал отправки ping
|
|
156
|
-
const pingInterval = setInterval(() => {
|
|
157
|
-
const currentClient = this.clients.get(namespace);
|
|
158
|
-
if (!currentClient || !currentClient.isConnected()) {
|
|
159
|
-
this.disablePingPong(namespace);
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
// Формируем данные ping
|
|
163
|
-
const pingData = {
|
|
164
|
-
timestamp: Date.now(),
|
|
165
|
-
echo: Date.now()
|
|
166
|
-
};
|
|
167
|
-
// Отправляем ping
|
|
168
|
-
const sent = currentClient.send({
|
|
169
|
-
event: WsEvents.CONNECTION_PING,
|
|
170
|
-
data: pingData
|
|
171
|
-
});
|
|
172
|
-
// Если успешно отправлено, обновляем статистику
|
|
173
|
-
if (sent) {
|
|
174
|
-
const stats = this.pingStats.get(namespace);
|
|
175
|
-
if (stats) {
|
|
176
|
-
stats.pingSent++;
|
|
177
|
-
}
|
|
178
|
-
this.logger.debug(`Отправлен ping для ${namespace}`, pingData);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
this.logger.warn(`Не удалось отправить ping для ${namespace}`);
|
|
182
|
-
}
|
|
183
|
-
// Проверяем таймаут
|
|
184
|
-
this.checkPingTimeout(namespace);
|
|
185
|
-
}, this.pingInterval);
|
|
186
|
-
// Сохраняем интервал
|
|
187
|
-
this.pingIntervals.set(namespace, pingInterval);
|
|
188
|
-
this.logger.info(`Включен механизм ping/pong для ${namespace} с интервалом ${this.pingInterval}ms`);
|
|
189
|
-
return true;
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Проверяет таймаут для ping/pong
|
|
193
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
194
|
-
*/
|
|
195
|
-
checkPingTimeout(namespace) {
|
|
196
|
-
const timeouts = this.pingTimeouts.get(namespace) || 0;
|
|
197
|
-
const stats = this.pingStats.get(namespace);
|
|
198
|
-
if (!stats)
|
|
199
|
-
return;
|
|
200
|
-
// Если разница между отправленными и полученными превышает порог,
|
|
201
|
-
// или последний pong был получен слишком давно
|
|
202
|
-
if ((stats.pingSent - stats.pongReceived > this.pingTimeoutThreshold) ||
|
|
203
|
-
(Date.now() - stats.lastPongTimestamp > this.pingInterval * this.pingTimeoutThreshold)) {
|
|
204
|
-
// Увеличиваем счетчик таймаутов
|
|
205
|
-
this.pingTimeouts.set(namespace, timeouts + 1);
|
|
206
|
-
if (timeouts + 1 >= this.pingTimeoutThreshold) {
|
|
207
|
-
// Соединение потеряно
|
|
208
|
-
this.logger.error(`Соединение потеряно (таймаут ping/pong) для ${namespace}`);
|
|
209
|
-
// Установка флага неактивного соединения
|
|
210
|
-
stats.isConnected = false;
|
|
211
|
-
// Уведомляем о таймауте соединения
|
|
212
|
-
this.notifyEventHandlers('connection_timeout', {
|
|
213
|
-
namespace,
|
|
214
|
-
socketId: stats.socketId,
|
|
215
|
-
timeouts: timeouts + 1,
|
|
216
|
-
threshold: this.pingTimeoutThreshold
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Отключает автоматическую отправку ping-сообщений
|
|
223
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
224
|
-
*/
|
|
225
|
-
disablePingPong(namespace) {
|
|
226
|
-
const interval = this.pingIntervals.get(namespace);
|
|
227
|
-
if (interval) {
|
|
228
|
-
clearInterval(interval);
|
|
229
|
-
this.pingIntervals.delete(namespace);
|
|
230
|
-
this.logger.info(`Отключен механизм ping/pong для ${namespace}`);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Отключает автоматическую отправку ping-сообщений для всех пространств имен
|
|
235
|
-
*/
|
|
236
|
-
disablePingPongAll() {
|
|
237
|
-
for (const [namespace, interval] of this.pingIntervals.entries()) {
|
|
238
|
-
clearInterval(interval);
|
|
239
|
-
this.pingIntervals.delete(namespace);
|
|
240
|
-
this.logger.info(`Отключен механизм ping/pong для ${namespace}`);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Получает статистику ping/pong для указанного пространства имен
|
|
245
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
246
|
-
* @returns {PingPongStats | null} Статистика ping/pong
|
|
247
|
-
*/
|
|
248
|
-
getPingStats(namespace) {
|
|
249
|
-
return this.pingStats.get(namespace) || null;
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Получает статистику ping/pong для всех пространств имен
|
|
253
|
-
* @returns {PingPongStats[]} Массив статистики ping/pong
|
|
254
|
-
*/
|
|
255
|
-
getAllPingStats() {
|
|
256
|
-
return Array.from(this.pingStats.values());
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Добавляет обработчик для событий ping/pong
|
|
260
|
-
* @param {string} eventType Тип события (connection_timeout, connection_pong)
|
|
261
|
-
* @param {PingPongEventHandler} handler Обработчик события
|
|
262
|
-
*/
|
|
263
|
-
onPingPongEvent(eventType, handler) {
|
|
264
|
-
if (!this.pingPongEventHandlers.has(eventType)) {
|
|
265
|
-
this.pingPongEventHandlers.set(eventType, []);
|
|
266
|
-
}
|
|
267
|
-
const handlers = this.pingPongEventHandlers.get(eventType);
|
|
268
|
-
if (handlers) {
|
|
269
|
-
handlers.push(handler);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Удаляет обработчик для событий ping/pong
|
|
274
|
-
* @param {string} eventType Тип события
|
|
275
|
-
* @param {PingPongEventHandler} [handler] Обработчик события (если не указан, удаляются все обработчики)
|
|
276
|
-
*/
|
|
277
|
-
offPingPongEvent(eventType, handler) {
|
|
278
|
-
if (!handler) {
|
|
279
|
-
// Если обработчик не указан, удаляем все обработчики для этого типа события
|
|
280
|
-
this.pingPongEventHandlers.delete(eventType);
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
// Если обработчик указан, удаляем только его
|
|
284
|
-
const handlers = this.pingPongEventHandlers.get(eventType);
|
|
285
|
-
if (handlers) {
|
|
286
|
-
const index = handlers.findIndex(h => h === handler);
|
|
287
|
-
if (index !== -1) {
|
|
288
|
-
handlers.splice(index, 1);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Проверяет, включен ли механизм ping/pong для указанного пространства имен
|
|
295
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
296
|
-
* @returns {boolean} true, если механизм включен
|
|
297
|
-
*/
|
|
298
|
-
isPingPongEnabled(namespace) {
|
|
299
|
-
return this.pingIntervals.has(namespace);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
//# sourceMappingURL=ping-pong-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ping-pong-manager.js","sourceRoot":"","sources":["../../../src/utils/ping-pong-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { SessionManager } from '../utils/session-manager.js';
|
|
2
|
-
import { PingPongManager } from '../utils/ping-pong-manager.js';
|
|
3
|
-
import { ConnectionStateManager } from '../utils/connection-state-manager.js';
|
|
4
|
-
import { createWebSocketLogger } from '../utils/logger.js';
|
|
5
|
-
/**
|
|
6
|
-
* Сервис для диагностики WebSocket соединений
|
|
7
|
-
*/
|
|
8
|
-
export class DiagnosticsService {
|
|
9
|
-
/**
|
|
10
|
-
* Создает новый сервис диагностики
|
|
11
|
-
* @param {DiagnosticsServiceOptions} options Опции сервиса
|
|
12
|
-
*/
|
|
13
|
-
constructor(options = {}) {
|
|
14
|
-
/** Таймер для проверки здоровья соединений */
|
|
15
|
-
this.healthCheckTimer = null;
|
|
16
|
-
/** Клиенты WebSocket по namespace */
|
|
17
|
-
this.clients = new Map();
|
|
18
|
-
this.healthCheckInterval = options.healthCheckInterval || 30000;
|
|
19
|
-
this.logger = options.logger || createWebSocketLogger('DiagnosticsService');
|
|
20
|
-
this.sessionManager = options.sessionManager || new SessionManager();
|
|
21
|
-
this.pingPongManager = options.pingPongManager || new PingPongManager();
|
|
22
|
-
this.connectionStateManager = options.connectionStateManager || new ConnectionStateManager();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Регистрирует WebSocket клиент для мониторинга
|
|
26
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
27
|
-
* @param {WebSocketClient} client WebSocket клиент
|
|
28
|
-
*/
|
|
29
|
-
registerClient(namespace, client) {
|
|
30
|
-
this.clients.set(namespace, client);
|
|
31
|
-
this.logger.debug(`Зарегистрирован клиент для ${namespace}`, {
|
|
32
|
-
socketId: client.getSocketId()
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Удаляет регистрацию WebSocket клиента
|
|
37
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
38
|
-
*/
|
|
39
|
-
unregisterClient(namespace) {
|
|
40
|
-
this.clients.delete(namespace);
|
|
41
|
-
this.logger.debug(`Удалена регистрация клиента для ${namespace}`);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Запускает периодическую проверку здоровья соединений
|
|
45
|
-
* @returns {boolean} true, если проверка успешно запущена
|
|
46
|
-
*/
|
|
47
|
-
startHealthCheck() {
|
|
48
|
-
// Останавливаем существующую проверку, если она есть
|
|
49
|
-
this.stopHealthCheck();
|
|
50
|
-
this.healthCheckTimer = setInterval(() => {
|
|
51
|
-
this.performHealthCheck();
|
|
52
|
-
}, this.healthCheckInterval);
|
|
53
|
-
this.logger.info(`Запущена периодическая проверка здоровья соединений с интервалом ${this.healthCheckInterval}ms`);
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Останавливает периодическую проверку здоровья соединений
|
|
58
|
-
*/
|
|
59
|
-
stopHealthCheck() {
|
|
60
|
-
if (this.healthCheckTimer) {
|
|
61
|
-
clearInterval(this.healthCheckTimer);
|
|
62
|
-
this.healthCheckTimer = null;
|
|
63
|
-
this.logger.info('Остановлена периодическая проверка здоровья соединений');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Выполняет проверку здоровья соединений
|
|
68
|
-
*/
|
|
69
|
-
performHealthCheck() {
|
|
70
|
-
for (const [namespace, client] of this.clients.entries()) {
|
|
71
|
-
try {
|
|
72
|
-
// Проверяем соединение через WebSocket клиент
|
|
73
|
-
if (!client.isConnected()) {
|
|
74
|
-
this.logger.warn(`Соединение с ${namespace} не активно`);
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
// Проверяем статистику ping/pong
|
|
78
|
-
const stats = this.pingPongManager.getPingStats(namespace);
|
|
79
|
-
if (stats) {
|
|
80
|
-
const now = Date.now();
|
|
81
|
-
// Если последний pong был получен слишком давно
|
|
82
|
-
if (stats.lastPongTimestamp && now - stats.lastPongTimestamp > this.healthCheckInterval * 2) {
|
|
83
|
-
this.logger.warn(`Долгое отсутствие активности для ${namespace}, последний pong: ${new Date(stats.lastPongTimestamp).toISOString()}`);
|
|
84
|
-
// Отправляем проверочный ping для обновления статистики
|
|
85
|
-
client.send({
|
|
86
|
-
event: 'connection_health_check',
|
|
87
|
-
data: { timestamp: now, echo: now }
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
this.logger.error(`Ошибка при проверке здоровья соединения ${namespace}`, error);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Выполняет диагностику соединения
|
|
99
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
100
|
-
* @returns {ConnectionDiagnostics} Диагностическая информация
|
|
101
|
-
*/
|
|
102
|
-
diagnoseConnection(namespace) {
|
|
103
|
-
const client = this.clients.get(namespace);
|
|
104
|
-
const stats = this.pingPongManager.getPingStats(namespace);
|
|
105
|
-
const state = this.connectionStateManager.getState(namespace);
|
|
106
|
-
const sessionToken = this.sessionManager.getSessionToken(namespace);
|
|
107
|
-
return {
|
|
108
|
-
namespace,
|
|
109
|
-
isConnected: client?.isConnected() || false,
|
|
110
|
-
socketId: client?.getSocketId() || null,
|
|
111
|
-
lastActivity: stats?.lastPongTimestamp || 0,
|
|
112
|
-
rtt: {
|
|
113
|
-
current: stats?.lastRtt || -1,
|
|
114
|
-
min: stats?.minRtt === Number.MAX_SAFE_INTEGER ? -1 : (stats?.minRtt || -1),
|
|
115
|
-
max: stats?.maxRtt || -1,
|
|
116
|
-
avg: stats?.averageRtt || -1
|
|
117
|
-
},
|
|
118
|
-
pingSent: stats?.pingSent || 0,
|
|
119
|
-
pongReceived: stats?.pongReceived || 0,
|
|
120
|
-
missedPongs: (stats?.pingSent || 0) - (stats?.pongReceived || 0),
|
|
121
|
-
timeoutCount: 0, // Это значение не хранится в PingPongManager, нужно дорабатывать логику
|
|
122
|
-
reconnectAttempts: state.reconnectAttempts,
|
|
123
|
-
lastConnectTime: state.lastConnectTime,
|
|
124
|
-
sessionRecovery: {
|
|
125
|
-
hasSessionToken: !!sessionToken,
|
|
126
|
-
tokenLength: sessionToken?.length || 0,
|
|
127
|
-
wasRecovered: !!sessionToken && (stats?.pongReceived || 0) > 0
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Выполняет диагностику всех соединений
|
|
133
|
-
* @returns {Record<string, ConnectionDiagnostics>} Диагностическая информация по всем соединениям
|
|
134
|
-
*/
|
|
135
|
-
diagnoseAllConnections() {
|
|
136
|
-
const result = {};
|
|
137
|
-
// Проверяем каждое зарегистрированное пространство имен
|
|
138
|
-
for (const namespace of this.clients.keys()) {
|
|
139
|
-
result[String(namespace)] = this.diagnoseConnection(namespace);
|
|
140
|
-
}
|
|
141
|
-
return result;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Получает статистику ping/pong для указанного пространства имен
|
|
145
|
-
* @param {WebSocketNamespace} namespace Пространство имен
|
|
146
|
-
* @returns {PingPongStats | null} Статистика ping/pong
|
|
147
|
-
*/
|
|
148
|
-
getPingStats(namespace) {
|
|
149
|
-
return this.pingPongManager.getPingStats(namespace);
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Возвращает функцию-обработчик для pong-ответов, которая рассчитывает RTT
|
|
153
|
-
* @returns {(data: any) => void} Функция-обработчик
|
|
154
|
-
*/
|
|
155
|
-
getPongHandler() {
|
|
156
|
-
return (data) => {
|
|
157
|
-
if (data && data.echo) {
|
|
158
|
-
const rtt = Date.now() - data.echo;
|
|
159
|
-
this.logger.debug(`[PONG] RTT: ${rtt}ms, namespace: ${data.namespace || 'unknown'}`);
|
|
160
|
-
return rtt;
|
|
161
|
-
}
|
|
162
|
-
return -1;
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
//# sourceMappingURL=diagnostics-service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics-service.js","sourceRoot":"","sources":["../../../src/ws/diagnostics-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { WebSocketNamespace } from '../../constants/websocket-namespaces.constants.js';
|
|
2
|
-
/**
|
|
3
|
-
* Интерфейс для статистики ping/pong сообщений
|
|
4
|
-
*/
|
|
5
|
-
export interface PingPongStats {
|
|
6
|
-
/** Намспейс, для которого собрана статистика */
|
|
7
|
-
namespace: WebSocketNamespace;
|
|
8
|
-
/** Socket ID */
|
|
9
|
-
socketId: string | null;
|
|
10
|
-
/** Количество отправленных ping-сообщений */
|
|
11
|
-
pingSent: number;
|
|
12
|
-
/** Количество полученных pong-ответов */
|
|
13
|
-
pongReceived: number;
|
|
14
|
-
/** Средняя задержка RTT (Round Trip Time) в миллисекундах */
|
|
15
|
-
averageRtt: number;
|
|
16
|
-
/** Минимальная задержка RTT в миллисекундах */
|
|
17
|
-
minRtt: number;
|
|
18
|
-
/** Максимальная задержка RTT в миллисекундах */
|
|
19
|
-
maxRtt: number;
|
|
20
|
-
/** Последняя задержка RTT в миллисекундах */
|
|
21
|
-
lastRtt: number;
|
|
22
|
-
/** Время последнего полученного pong-ответа */
|
|
23
|
-
lastPongTimestamp: number;
|
|
24
|
-
/** Статус соединения */
|
|
25
|
-
isConnected: boolean;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Интерфейс для диагностики соединения
|
|
29
|
-
*/
|
|
30
|
-
export interface ConnectionDiagnostics {
|
|
31
|
-
/** Пространство имен */
|
|
32
|
-
namespace: WebSocketNamespace;
|
|
33
|
-
/** Состояние соединения */
|
|
34
|
-
isConnected: boolean;
|
|
35
|
-
/** ID сокета */
|
|
36
|
-
socketId: string | null;
|
|
37
|
-
/** Время последней активности */
|
|
38
|
-
lastActivity: number;
|
|
39
|
-
/** Задержка RTT */
|
|
40
|
-
rtt: {
|
|
41
|
-
/** Текущая задержка */
|
|
42
|
-
current: number;
|
|
43
|
-
/** Минимальная задержка */
|
|
44
|
-
min: number;
|
|
45
|
-
/** Максимальная задержка */
|
|
46
|
-
max: number;
|
|
47
|
-
/** Средняя задержка */
|
|
48
|
-
avg: number;
|
|
49
|
-
};
|
|
50
|
-
/** Количество отправленных ping-сообщений */
|
|
51
|
-
pingSent: number;
|
|
52
|
-
/** Количество полученных pong-ответов */
|
|
53
|
-
pongReceived: number;
|
|
54
|
-
/** Количество пропущенных pong-ответов */
|
|
55
|
-
missedPongs: number;
|
|
56
|
-
/** Количество таймаутов */
|
|
57
|
-
timeoutCount: number;
|
|
58
|
-
/** Количество попыток переподключения */
|
|
59
|
-
reconnectAttempts: number;
|
|
60
|
-
/** Время последнего подключения */
|
|
61
|
-
lastConnectTime: number;
|
|
62
|
-
/** Информация о восстановлении сессии */
|
|
63
|
-
sessionRecovery: {
|
|
64
|
-
/** Наличие токена сессии */
|
|
65
|
-
hasSessionToken: boolean;
|
|
66
|
-
/** Длина токена сессии */
|
|
67
|
-
tokenLength: number;
|
|
68
|
-
/** Было ли восстановлено из сессии */
|
|
69
|
-
wasRecovered: boolean;
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=stats.interfaces.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stats.interfaces.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/websocket/stats.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,gBAAgB;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wBAAwB;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,wBAAwB;IACxB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,2BAA2B;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,GAAG,EAAE;QACH,uBAAuB;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,2BAA2B;QAC3B,GAAG,EAAE,MAAM,CAAC;QACZ,4BAA4B;QAC5B,GAAG,EAAE,MAAM,CAAC;QACZ,uBAAuB;QACvB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,eAAe,EAAE;QACf,4BAA4B;QAC5B,eAAe,EAAE,OAAO,CAAC;QACzB,0BAA0B;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,sCAAsC;QACtC,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;CACH"}
|