solver-sdk 1.8.1 → 1.9.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 (116) hide show
  1. package/dist/cjs/api/projects-api.js +4 -6
  2. package/dist/cjs/api/projects-api.js.map +1 -1
  3. package/dist/cjs/code-solver-sdk.js +13 -10
  4. package/dist/cjs/code-solver-sdk.js.map +1 -1
  5. package/dist/cjs/constants/websocket-events.constants.js +14 -1
  6. package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
  7. package/dist/cjs/constants/websocket-namespaces.constants.js +18 -0
  8. package/dist/cjs/constants/websocket-namespaces.constants.js.map +1 -0
  9. package/dist/cjs/interfaces/websocket/callbacks.interfaces.js +3 -0
  10. package/dist/cjs/interfaces/websocket/callbacks.interfaces.js.map +1 -0
  11. package/dist/cjs/interfaces/websocket/client-options.interfaces.js +3 -0
  12. package/dist/cjs/interfaces/websocket/client-options.interfaces.js.map +1 -0
  13. package/dist/cjs/interfaces/websocket/events.interfaces.js +3 -0
  14. package/dist/cjs/interfaces/websocket/events.interfaces.js.map +1 -0
  15. package/dist/cjs/interfaces/websocket/stats.interfaces.js +3 -0
  16. package/dist/cjs/interfaces/websocket/stats.interfaces.js.map +1 -0
  17. package/dist/cjs/utils/code-solver-websocket-client.js +382 -1503
  18. package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
  19. package/dist/cjs/utils/connection-state-manager.js +133 -0
  20. package/dist/cjs/utils/connection-state-manager.js.map +1 -0
  21. package/dist/cjs/utils/logger.js +106 -0
  22. package/dist/cjs/utils/logger.js.map +1 -0
  23. package/dist/cjs/utils/ping-pong-manager.js +306 -0
  24. package/dist/cjs/utils/ping-pong-manager.js.map +1 -0
  25. package/dist/cjs/utils/session-manager.js +114 -0
  26. package/dist/cjs/utils/session-manager.js.map +1 -0
  27. package/dist/cjs/ws/base-ws-client.js +286 -0
  28. package/dist/cjs/ws/base-ws-client.js.map +1 -0
  29. package/dist/cjs/ws/dependencies-ws-client.js +11 -0
  30. package/dist/cjs/ws/dependencies-ws-client.js.map +1 -0
  31. package/dist/cjs/ws/diagnostics-service.js +170 -0
  32. package/dist/cjs/ws/diagnostics-service.js.map +1 -0
  33. package/dist/cjs/ws/indexing-ws-client.js +223 -0
  34. package/dist/cjs/ws/indexing-ws-client.js.map +1 -0
  35. package/dist/cjs/ws/notifications-ws-client.js +12 -0
  36. package/dist/cjs/ws/notifications-ws-client.js.map +1 -0
  37. package/dist/cjs/ws/reasoning-ws-client.js +330 -0
  38. package/dist/cjs/ws/reasoning-ws-client.js.map +1 -0
  39. package/dist/esm/api/projects-api.js +4 -6
  40. package/dist/esm/api/projects-api.js.map +1 -1
  41. package/dist/esm/code-solver-sdk.js +6 -3
  42. package/dist/esm/code-solver-sdk.js.map +1 -1
  43. package/dist/esm/constants/websocket-events.constants.js +13 -0
  44. package/dist/esm/constants/websocket-events.constants.js.map +1 -1
  45. package/dist/esm/constants/websocket-namespaces.constants.js +15 -0
  46. package/dist/esm/constants/websocket-namespaces.constants.js.map +1 -0
  47. package/dist/esm/interfaces/websocket/callbacks.interfaces.js +2 -0
  48. package/dist/esm/interfaces/websocket/callbacks.interfaces.js.map +1 -0
  49. package/dist/esm/interfaces/websocket/client-options.interfaces.js +2 -0
  50. package/dist/esm/interfaces/websocket/client-options.interfaces.js.map +1 -0
  51. package/dist/esm/interfaces/websocket/events.interfaces.js +2 -0
  52. package/dist/esm/interfaces/websocket/events.interfaces.js.map +1 -0
  53. package/dist/esm/interfaces/websocket/stats.interfaces.js +2 -0
  54. package/dist/esm/interfaces/websocket/stats.interfaces.js.map +1 -0
  55. package/dist/esm/utils/code-solver-websocket-client.js +381 -1503
  56. package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
  57. package/dist/esm/utils/connection-state-manager.js +129 -0
  58. package/dist/esm/utils/connection-state-manager.js.map +1 -0
  59. package/dist/esm/utils/logger.js +101 -0
  60. package/dist/esm/utils/logger.js.map +1 -0
  61. package/dist/esm/utils/ping-pong-manager.js +302 -0
  62. package/dist/esm/utils/ping-pong-manager.js.map +1 -0
  63. package/dist/esm/utils/session-manager.js +109 -0
  64. package/dist/esm/utils/session-manager.js.map +1 -0
  65. package/dist/esm/ws/base-ws-client.js +282 -0
  66. package/dist/esm/ws/base-ws-client.js.map +1 -0
  67. package/dist/esm/ws/dependencies-ws-client.js +7 -0
  68. package/dist/esm/ws/dependencies-ws-client.js.map +1 -0
  69. package/dist/esm/ws/diagnostics-service.js +166 -0
  70. package/dist/esm/ws/diagnostics-service.js.map +1 -0
  71. package/dist/esm/ws/indexing-ws-client.js +219 -0
  72. package/dist/esm/ws/indexing-ws-client.js.map +1 -0
  73. package/dist/esm/ws/notifications-ws-client.js +8 -0
  74. package/dist/esm/ws/notifications-ws-client.js.map +1 -0
  75. package/dist/esm/ws/reasoning-ws-client.js +326 -0
  76. package/dist/esm/ws/reasoning-ws-client.js.map +1 -0
  77. package/dist/types/api/projects-api.d.ts.map +1 -1
  78. package/dist/types/code-solver-sdk.d.ts +2 -1
  79. package/dist/types/code-solver-sdk.d.ts.map +1 -1
  80. package/dist/types/constants/websocket-events.constants.d.ts +12 -0
  81. package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
  82. package/dist/types/constants/websocket-namespaces.constants.d.ts +14 -0
  83. package/dist/types/constants/websocket-namespaces.constants.d.ts.map +1 -0
  84. package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts +30 -0
  85. package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts.map +1 -0
  86. package/dist/types/interfaces/websocket/client-options.interfaces.d.ts +51 -0
  87. package/dist/types/interfaces/websocket/client-options.interfaces.d.ts.map +1 -0
  88. package/dist/types/interfaces/websocket/events.interfaces.d.ts +165 -0
  89. package/dist/types/interfaces/websocket/events.interfaces.d.ts.map +1 -0
  90. package/dist/types/interfaces/websocket/stats.interfaces.d.ts +72 -0
  91. package/dist/types/interfaces/websocket/stats.interfaces.d.ts.map +1 -0
  92. package/dist/types/utils/code-solver-websocket-client.d.ts +70 -616
  93. package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
  94. package/dist/types/utils/connection-state-manager.d.ts +94 -0
  95. package/dist/types/utils/connection-state-manager.d.ts.map +1 -0
  96. package/dist/types/utils/logger.d.ts +62 -0
  97. package/dist/types/utils/logger.d.ts.map +1 -0
  98. package/dist/types/utils/ping-pong-manager.d.ts +118 -0
  99. package/dist/types/utils/ping-pong-manager.d.ts.map +1 -0
  100. package/dist/types/utils/session-manager.d.ts +98 -0
  101. package/dist/types/utils/session-manager.d.ts.map +1 -0
  102. package/dist/types/ws/base-ws-client.d.ts +119 -0
  103. package/dist/types/ws/base-ws-client.d.ts.map +1 -0
  104. package/dist/types/ws/dependencies-ws-client.d.ts +6 -0
  105. package/dist/types/ws/dependencies-ws-client.d.ts.map +1 -0
  106. package/dist/types/ws/diagnostics-service.d.ts +93 -0
  107. package/dist/types/ws/diagnostics-service.d.ts.map +1 -0
  108. package/dist/types/ws/indexing-ws-client.d.ts +78 -0
  109. package/dist/types/ws/indexing-ws-client.d.ts.map +1 -0
  110. package/dist/types/ws/notifications-ws-client.d.ts +5 -0
  111. package/dist/types/ws/notifications-ws-client.d.ts.map +1 -0
  112. package/dist/types/ws/reasoning-ws-client.d.ts +87 -0
  113. package/dist/types/ws/reasoning-ws-client.d.ts.map +1 -0
  114. package/docs/AUTHENTICATION.md +31 -127
  115. package/docs/WEBSOCKET.md +51 -211
  116. package/package.json +1 -1
@@ -0,0 +1,282 @@
1
+ import { WebSocketClient } from '../utils/websocket-client.js';
2
+ import { WebSocketNamespace } from '../constants/websocket-namespaces.constants.js';
3
+ import { WebSocketEvents as WsEvents } from '../constants/websocket-events.constants.js';
4
+ import { createWebSocketLogger } from '../utils/logger.js';
5
+ import { SessionManager } from '../utils/session-manager.js';
6
+ import { PingPongManager } from '../utils/ping-pong-manager.js';
7
+ import { ConnectionStateManager } from '../utils/connection-state-manager.js';
8
+ /**
9
+ * Базовый абстрактный класс для всех WebSocket клиентов
10
+ */
11
+ export class BaseWebSocketClient {
12
+ /**
13
+ * Создает новый базовый WebSocket клиент
14
+ * @param {WebSocketNamespace} namespace Пространство имен WebSocket
15
+ * @param {string} baseURL Базовый URL API
16
+ * @param {BaseWebSocketClientOptions} options Опции клиента
17
+ */
18
+ constructor(namespace, baseURL, options = {}) {
19
+ /** WebSocket клиент */
20
+ this.client = null;
21
+ this.namespace = namespace;
22
+ this.baseURL = baseURL.replace(/^http/, 'ws');
23
+ // Добавляем заголовок авторизации, если задан API ключ
24
+ this.options = {
25
+ ...options,
26
+ headers: {
27
+ ...(options.headers || {}),
28
+ ...(options.apiKey ? { 'Authorization': `Bearer ${options.apiKey}` } : {})
29
+ }
30
+ };
31
+ // Инициализируем логгер
32
+ this.logger = typeof options.logger === 'function'
33
+ ? createWebSocketLogger(`WebSocket:${namespace}`, options.logger)
34
+ : (options.logger || createWebSocketLogger(`WebSocket:${namespace}`));
35
+ // Инициализируем менеджеры
36
+ this.sessionManager = new SessionManager({
37
+ enableSessionPersistence: options.enableSessionPersistence,
38
+ logger: this.logger.withPrefix('SessionManager')
39
+ });
40
+ this.pingPongManager = new PingPongManager({
41
+ pingInterval: options.pingInterval,
42
+ pingTimeoutThreshold: options.pingTimeoutThreshold,
43
+ logger: this.logger.withPrefix('PingPongManager')
44
+ });
45
+ this.connectionStateManager = new ConnectionStateManager({
46
+ reconnectStrategy: options.reconnectStrategy === 'fibonacci' ? 'exponential' : options.reconnectStrategy,
47
+ retryDelay: options.retryDelay,
48
+ maxRetryDelay: options.maxRetryDelay,
49
+ logger: this.logger.withPrefix('ConnectionStateManager')
50
+ });
51
+ }
52
+ /**
53
+ * Подключается к серверу WebSocket
54
+ * @param {Record<string, any>} [params={}] Дополнительные параметры для подключения
55
+ * @returns {Promise<boolean>} Успешность подключения
56
+ */
57
+ async connect(params = {}) {
58
+ try {
59
+ // Если клиент уже существует, проверяем его состояние
60
+ if (this.client) {
61
+ if (this.client.isConnected()) {
62
+ this.logger.debug(`Уже подключен к ${this.namespace}`);
63
+ return true;
64
+ }
65
+ else {
66
+ // Закрываем существующее соединение
67
+ this.client.close();
68
+ this.client = null;
69
+ }
70
+ }
71
+ // Формируем URL для подключения
72
+ const url = this.buildConnectionUrl(params);
73
+ this.logger.debug(`Подключение к ${url}`, {
74
+ namespace: String(this.namespace),
75
+ params: Object.keys(params)
76
+ });
77
+ // Создаем новый WebSocket клиент
78
+ this.client = new WebSocketClient(url, {
79
+ ...this.options,
80
+ namespace: String(this.namespace),
81
+ // Преобразуем объект Logger в функцию логирования для WebSocketClient
82
+ logger: (level, message, data) => {
83
+ if (level === 'error')
84
+ this.logger.error(message, data);
85
+ else if (level === 'warn')
86
+ this.logger.warn(message, data);
87
+ else if (level === 'info')
88
+ this.logger.info(message, data);
89
+ else
90
+ this.logger.debug(message, data);
91
+ }
92
+ });
93
+ // Устанавливаем обработчики событий
94
+ this.setupEventHandlers();
95
+ // Подключаемся к серверу
96
+ await this.client.connect();
97
+ // Регистрируем клиент в менеджере ping/pong
98
+ this.pingPongManager.registerClient(this.namespace, this.client);
99
+ // Обновляем состояние подключения
100
+ this.connectionStateManager.registerSuccessfulConnection(this.namespace);
101
+ // Включаем механизм ping/pong, если настроено
102
+ if (this.options.enableAutoPing !== false) {
103
+ this.pingPongManager.enablePingPong(this.namespace);
104
+ }
105
+ return true;
106
+ }
107
+ catch (error) {
108
+ this.logger.error(`Ошибка при подключении к ${this.namespace}`, error);
109
+ // Обновляем состояние подключения
110
+ this.connectionStateManager.registerDisconnection(this.namespace);
111
+ return false;
112
+ }
113
+ }
114
+ /**
115
+ * Формирует URL для подключения
116
+ * @param {Record<string, any>} params Параметры для подключения
117
+ * @returns {string} URL для подключения
118
+ */
119
+ buildConnectionUrl(params) {
120
+ let baseUrl;
121
+ let namespaceStr = '';
122
+ // Добавляем namespace в URL путь (стандартный подход Socket.IO)
123
+ if (this.namespace !== WebSocketNamespace.DEFAULT) {
124
+ namespaceStr = String(this.namespace);
125
+ if (!namespaceStr.startsWith('/')) {
126
+ namespaceStr = '/' + namespaceStr;
127
+ }
128
+ }
129
+ // Формируем правильный URL для Socket.IO
130
+ if (this.baseURL.endsWith('/socket.io') || this.baseURL.endsWith('/socket.io/')) {
131
+ // Для случая когда URL заканчивается на /socket.io, убираем слеш
132
+ const cleanBaseUrl = this.baseURL.endsWith('/')
133
+ ? this.baseURL.slice(0, -1)
134
+ : this.baseURL;
135
+ // Добавляем namespace к URL
136
+ baseUrl = cleanBaseUrl + namespaceStr;
137
+ }
138
+ else {
139
+ // Для случая когда URL не содержит /socket.io
140
+ baseUrl = this.baseURL + namespaceStr;
141
+ }
142
+ // Создаем URL объект с параметрами
143
+ const url = new URL(baseUrl);
144
+ // Добавляем обязательные параметры для Socket.IO
145
+ url.searchParams.append('EIO', '4');
146
+ url.searchParams.append('transport', 'websocket');
147
+ // Добавляем параметры к URL
148
+ Object.entries(params).forEach(([key, value]) => {
149
+ if (value !== undefined) {
150
+ url.searchParams.append(key, String(value));
151
+ }
152
+ });
153
+ return url.toString();
154
+ }
155
+ /**
156
+ * Устанавливает обработчики событий для WebSocket клиента
157
+ */
158
+ setupEventHandlers() {
159
+ if (!this.client)
160
+ return;
161
+ // Добавляем обработчик для успешного подключения
162
+ this.client.on('open', () => {
163
+ this.logger.debug(`Подключение к ${this.namespace} установлено`, {
164
+ socketId: this.client?.getSocketId()
165
+ });
166
+ // Отправляем сообщение аутентификации, если задан API ключ
167
+ if (this.options.apiKey) {
168
+ this.authenticate();
169
+ }
170
+ });
171
+ // Логирование ошибок
172
+ this.client.on('error', (error) => {
173
+ this.logger.error(`Ошибка соединения с ${this.namespace}`, error);
174
+ });
175
+ // Логирование разъединений
176
+ this.client.on('close', (event) => {
177
+ this.logger.debug(`Соединение с ${this.namespace} закрыто: ${event.code || 'нет кода'}, ${event.reason || 'Причина не указана'}`);
178
+ // Обновляем состояние подключения
179
+ this.connectionStateManager.registerDisconnection(this.namespace);
180
+ // Отключаем ping/pong
181
+ this.pingPongManager.disablePingPong(this.namespace);
182
+ });
183
+ }
184
+ /**
185
+ * Отправляет аутентификационные данные на сервер
186
+ */
187
+ authenticate() {
188
+ if (!this.client || !this.options.apiKey)
189
+ return;
190
+ try {
191
+ this.logger.debug(`Отправка аутентификации для ${this.namespace}`);
192
+ // Отправляем сообщение аутентификации
193
+ this.send(WsEvents.AUTHENTICATE, {
194
+ token: this.options.apiKey
195
+ });
196
+ }
197
+ catch (error) {
198
+ this.logger.error(`Ошибка при отправке аутентификации: ${error instanceof Error ? error.message : String(error)}`);
199
+ }
200
+ }
201
+ /**
202
+ * Отключается от сервера WebSocket
203
+ */
204
+ disconnect() {
205
+ // Отключаем ping/pong
206
+ this.pingPongManager.disablePingPong(this.namespace);
207
+ // Закрываем соединение
208
+ if (this.client) {
209
+ this.client.close();
210
+ this.client = null;
211
+ }
212
+ // Обновляем состояние подключения
213
+ this.connectionStateManager.registerDisconnection(this.namespace);
214
+ this.logger.debug(`Отключено от ${this.namespace}`);
215
+ }
216
+ /**
217
+ * Проверяет, подключен ли клиент к серверу
218
+ * @returns {boolean} true, если клиент подключен
219
+ */
220
+ isConnected() {
221
+ return !!this.client && this.client.isConnected();
222
+ }
223
+ /**
224
+ * Получает ID сокета
225
+ * @returns {string | null} ID сокета или null, если не подключен
226
+ */
227
+ getSocketId() {
228
+ return this.client ? this.client.getSocketId() : null;
229
+ }
230
+ /**
231
+ * Отправляет событие на сервер
232
+ * @param {string} eventType Тип события
233
+ * @param {any} [data] Данные события
234
+ * @returns {boolean} Успешность отправки
235
+ */
236
+ send(eventType, data) {
237
+ if (!this.client) {
238
+ this.logger.warn(`Попытка отправить событие ${eventType}, но клиент не подключен`);
239
+ return false;
240
+ }
241
+ return this.client.send({
242
+ event: eventType,
243
+ data
244
+ });
245
+ }
246
+ /**
247
+ * Отправляет событие и ожидает ответа
248
+ * @param {string} eventType Тип события
249
+ * @param {any} data Данные события
250
+ * @param {number} [timeout=5000] Таймаут ожидания ответа в миллисекундах
251
+ * @returns {Promise<any>} Ответ сервера
252
+ */
253
+ async emitWithAck(eventType, data, timeout = 5000) {
254
+ if (!this.client) {
255
+ throw new Error(`Попытка отправить событие ${eventType} с подтверждением, но клиент не подключен`);
256
+ }
257
+ return this.client.emitWithAck(eventType, data, timeout);
258
+ }
259
+ /**
260
+ * Добавляет обработчик события
261
+ * @param {string} eventType Тип события
262
+ * @param {(data: any) => void} handler Обработчик события
263
+ */
264
+ on(eventType, handler) {
265
+ if (!this.client) {
266
+ this.logger.warn(`Попытка добавить обработчик для события ${eventType}, но клиент не подключен`);
267
+ return;
268
+ }
269
+ this.client.on(eventType, handler);
270
+ }
271
+ /**
272
+ * Удаляет обработчик события
273
+ * @param {string} eventType Тип события
274
+ * @param {(data: any) => void} [handler] Обработчик события (если не указан, удаляются все обработчики)
275
+ */
276
+ off(eventType, handler) {
277
+ if (!this.client)
278
+ return;
279
+ this.client.off(eventType, handler);
280
+ }
281
+ }
282
+ //# sourceMappingURL=base-ws-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-ws-client.js","sourceRoot":"","sources":["../../../src/ws/base-ws-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { BaseWebSocketClient } from './base-ws-client';
2
+ export class DependenciesWsClient extends BaseWebSocketClient {
3
+ constructor(namespace, baseURL, options = {}) {
4
+ super(namespace, baseURL, options);
5
+ }
6
+ }
7
+ //# sourceMappingURL=dependencies-ws-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies-ws-client.js","sourceRoot":"","sources":["../../../src/ws/dependencies-ws-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA8B,MAAM,kBAAkB,CAAC;AAGnF,MAAM,OAAO,oBAAqB,SAAQ,mBAAmB;IAC3D,YACE,SAA6B,EAC7B,OAAe,EACf,UAAsC,EAAE;QAExC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;CAEF"}
@@ -0,0 +1,166 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics-service.js","sourceRoot":"","sources":["../../../src/ws/diagnostics-service.ts"],"names":[],"mappings":"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"}