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