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.
Files changed (131) 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 → code-solver-sdk-v2.js} +220 -271
  4. package/dist/cjs/code-solver-sdk-v2.js.map +1 -0
  5. package/dist/cjs/constants/websocket-events.constants.js +37 -1
  6. package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
  7. package/dist/cjs/constants/websocket-namespaces.constants.js +20 -0
  8. package/dist/cjs/constants/websocket-namespaces.constants.js.map +1 -0
  9. package/dist/cjs/index.js +24 -49
  10. package/dist/cjs/index.js.map +1 -1
  11. package/dist/cjs/interfaces/websocket/callbacks.interfaces.js +3 -0
  12. package/dist/cjs/interfaces/websocket/callbacks.interfaces.js.map +1 -0
  13. package/dist/cjs/interfaces/websocket/client-options.interfaces.js +3 -0
  14. package/dist/cjs/interfaces/websocket/client-options.interfaces.js.map +1 -0
  15. package/dist/cjs/interfaces/websocket/events.interfaces.js +3 -0
  16. package/dist/cjs/interfaces/websocket/events.interfaces.js.map +1 -0
  17. package/dist/cjs/interfaces/websocket/stats.interfaces.js +3 -0
  18. package/dist/cjs/interfaces/websocket/stats.interfaces.js.map +1 -0
  19. package/dist/cjs/utils/code-solver-websocket-client.js +382 -1503
  20. package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
  21. package/dist/cjs/utils/connection-state-manager.js +133 -0
  22. package/dist/cjs/utils/connection-state-manager.js.map +1 -0
  23. package/dist/cjs/utils/logger.js +106 -0
  24. package/dist/cjs/utils/logger.js.map +1 -0
  25. package/dist/cjs/utils/ping-pong-manager.js +306 -0
  26. package/dist/cjs/utils/ping-pong-manager.js.map +1 -0
  27. package/dist/cjs/utils/session-manager.js +114 -0
  28. package/dist/cjs/utils/session-manager.js.map +1 -0
  29. package/dist/cjs/ws/base-ws-client.js +286 -0
  30. package/dist/cjs/ws/base-ws-client.js.map +1 -0
  31. package/dist/cjs/ws/dependencies-ws-client.js +11 -0
  32. package/dist/cjs/ws/dependencies-ws-client.js.map +1 -0
  33. package/dist/cjs/ws/diagnostics-service.js +170 -0
  34. package/dist/cjs/ws/diagnostics-service.js.map +1 -0
  35. package/dist/cjs/ws/filesystem-ws-client.js +315 -0
  36. package/dist/cjs/ws/filesystem-ws-client.js.map +1 -0
  37. package/dist/cjs/ws/indexing-ws-client.js +223 -0
  38. package/dist/cjs/ws/indexing-ws-client.js.map +1 -0
  39. package/dist/cjs/ws/notifications-ws-client.js +12 -0
  40. package/dist/cjs/ws/notifications-ws-client.js.map +1 -0
  41. package/dist/cjs/ws/reasoning-ws-client.js +330 -0
  42. package/dist/cjs/ws/reasoning-ws-client.js.map +1 -0
  43. package/dist/esm/api/projects-api.js +4 -6
  44. package/dist/esm/api/projects-api.js.map +1 -1
  45. package/dist/esm/{code-solver-sdk.js → code-solver-sdk-v2.js} +220 -271
  46. package/dist/esm/code-solver-sdk-v2.js.map +1 -0
  47. package/dist/esm/constants/websocket-events.constants.js +36 -0
  48. package/dist/esm/constants/websocket-events.constants.js.map +1 -1
  49. package/dist/esm/constants/websocket-namespaces.constants.js +17 -0
  50. package/dist/esm/constants/websocket-namespaces.constants.js.map +1 -0
  51. package/dist/esm/index.js +22 -97
  52. package/dist/esm/index.js.map +1 -1
  53. package/dist/esm/interfaces/websocket/callbacks.interfaces.js +2 -0
  54. package/dist/esm/interfaces/websocket/callbacks.interfaces.js.map +1 -0
  55. package/dist/esm/interfaces/websocket/client-options.interfaces.js +2 -0
  56. package/dist/esm/interfaces/websocket/client-options.interfaces.js.map +1 -0
  57. package/dist/esm/interfaces/websocket/events.interfaces.js +2 -0
  58. package/dist/esm/interfaces/websocket/events.interfaces.js.map +1 -0
  59. package/dist/esm/interfaces/websocket/stats.interfaces.js +2 -0
  60. package/dist/esm/interfaces/websocket/stats.interfaces.js.map +1 -0
  61. package/dist/esm/utils/code-solver-websocket-client.js +381 -1503
  62. package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
  63. package/dist/esm/utils/connection-state-manager.js +129 -0
  64. package/dist/esm/utils/connection-state-manager.js.map +1 -0
  65. package/dist/esm/utils/logger.js +101 -0
  66. package/dist/esm/utils/logger.js.map +1 -0
  67. package/dist/esm/utils/ping-pong-manager.js +302 -0
  68. package/dist/esm/utils/ping-pong-manager.js.map +1 -0
  69. package/dist/esm/utils/session-manager.js +109 -0
  70. package/dist/esm/utils/session-manager.js.map +1 -0
  71. package/dist/esm/ws/base-ws-client.js +282 -0
  72. package/dist/esm/ws/base-ws-client.js.map +1 -0
  73. package/dist/esm/ws/dependencies-ws-client.js +7 -0
  74. package/dist/esm/ws/dependencies-ws-client.js.map +1 -0
  75. package/dist/esm/ws/diagnostics-service.js +166 -0
  76. package/dist/esm/ws/diagnostics-service.js.map +1 -0
  77. package/dist/esm/ws/filesystem-ws-client.js +311 -0
  78. package/dist/esm/ws/filesystem-ws-client.js.map +1 -0
  79. package/dist/esm/ws/indexing-ws-client.js +219 -0
  80. package/dist/esm/ws/indexing-ws-client.js.map +1 -0
  81. package/dist/esm/ws/notifications-ws-client.js +8 -0
  82. package/dist/esm/ws/notifications-ws-client.js.map +1 -0
  83. package/dist/esm/ws/reasoning-ws-client.js +326 -0
  84. package/dist/esm/ws/reasoning-ws-client.js.map +1 -0
  85. package/dist/types/api/projects-api.d.ts.map +1 -1
  86. package/dist/types/{code-solver-sdk.d.ts → code-solver-sdk-v2.d.ts} +82 -85
  87. package/dist/types/code-solver-sdk-v2.d.ts.map +1 -0
  88. package/dist/types/constants/websocket-events.constants.d.ts +33 -0
  89. package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
  90. package/dist/types/constants/websocket-namespaces.constants.d.ts +16 -0
  91. package/dist/types/constants/websocket-namespaces.constants.d.ts.map +1 -0
  92. package/dist/types/index.d.ts +20 -90
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts +30 -0
  95. package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts.map +1 -0
  96. package/dist/types/interfaces/websocket/client-options.interfaces.d.ts +51 -0
  97. package/dist/types/interfaces/websocket/client-options.interfaces.d.ts.map +1 -0
  98. package/dist/types/interfaces/websocket/events.interfaces.d.ts +165 -0
  99. package/dist/types/interfaces/websocket/events.interfaces.d.ts.map +1 -0
  100. package/dist/types/interfaces/websocket/stats.interfaces.d.ts +72 -0
  101. package/dist/types/interfaces/websocket/stats.interfaces.d.ts.map +1 -0
  102. package/dist/types/utils/code-solver-websocket-client.d.ts +70 -616
  103. package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
  104. package/dist/types/utils/connection-state-manager.d.ts +94 -0
  105. package/dist/types/utils/connection-state-manager.d.ts.map +1 -0
  106. package/dist/types/utils/logger.d.ts +62 -0
  107. package/dist/types/utils/logger.d.ts.map +1 -0
  108. package/dist/types/utils/ping-pong-manager.d.ts +118 -0
  109. package/dist/types/utils/ping-pong-manager.d.ts.map +1 -0
  110. package/dist/types/utils/session-manager.d.ts +98 -0
  111. package/dist/types/utils/session-manager.d.ts.map +1 -0
  112. package/dist/types/ws/base-ws-client.d.ts +119 -0
  113. package/dist/types/ws/base-ws-client.d.ts.map +1 -0
  114. package/dist/types/ws/dependencies-ws-client.d.ts +6 -0
  115. package/dist/types/ws/dependencies-ws-client.d.ts.map +1 -0
  116. package/dist/types/ws/diagnostics-service.d.ts +93 -0
  117. package/dist/types/ws/diagnostics-service.d.ts.map +1 -0
  118. package/dist/types/ws/filesystem-ws-client.d.ts +203 -0
  119. package/dist/types/ws/filesystem-ws-client.d.ts.map +1 -0
  120. package/dist/types/ws/indexing-ws-client.d.ts +78 -0
  121. package/dist/types/ws/indexing-ws-client.d.ts.map +1 -0
  122. package/dist/types/ws/notifications-ws-client.d.ts +5 -0
  123. package/dist/types/ws/notifications-ws-client.d.ts.map +1 -0
  124. package/dist/types/ws/reasoning-ws-client.d.ts +87 -0
  125. package/dist/types/ws/reasoning-ws-client.d.ts.map +1 -0
  126. package/docs/AUTHENTICATION.md +31 -127
  127. package/docs/WEBSOCKET.md +51 -211
  128. package/package.json +1 -1
  129. package/dist/cjs/code-solver-sdk.js.map +0 -1
  130. package/dist/esm/code-solver-sdk.js.map +0 -1
  131. package/dist/types/code-solver-sdk.d.ts.map +0 -1
@@ -0,0 +1,302 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping-pong-manager.js","sourceRoot":"","sources":["../../../src/utils/ping-pong-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Класс для хранения токенов сессий в памяти
3
+ */
4
+ export class MemorySessionTokenStore {
5
+ constructor() {
6
+ /** Хранилище токенов */
7
+ this.tokens = new Map();
8
+ }
9
+ /**
10
+ * Получить токен сессии для указанного пространства имен
11
+ * @param {WebSocketNamespace} namespace Пространство имен
12
+ * @returns {string | null} Токен сессии или null, если не найден
13
+ */
14
+ getToken(namespace) {
15
+ return this.tokens.get(namespace) || null;
16
+ }
17
+ /**
18
+ * Сохранить токен сессии для указанного пространства имен
19
+ * @param {WebSocketNamespace} namespace Пространство имен
20
+ * @param {string} token Токен сессии
21
+ */
22
+ saveToken(namespace, token) {
23
+ this.tokens.set(namespace, token);
24
+ }
25
+ /**
26
+ * Удалить токен сессии для указанного пространства имен
27
+ * @param {WebSocketNamespace} namespace Пространство имен
28
+ */
29
+ removeToken(namespace) {
30
+ this.tokens.delete(namespace);
31
+ }
32
+ /**
33
+ * Проверить наличие токена для указанного пространства имен
34
+ * @param {WebSocketNamespace} namespace Пространство имен
35
+ * @returns {boolean} true, если токен есть
36
+ */
37
+ hasToken(namespace) {
38
+ return this.tokens.has(namespace);
39
+ }
40
+ /**
41
+ * Очистить все токены
42
+ */
43
+ clear() {
44
+ this.tokens.clear();
45
+ }
46
+ }
47
+ /**
48
+ * Класс для управления токенами сессий WebSocket
49
+ */
50
+ export class SessionManager {
51
+ /**
52
+ * Создает новый менеджер сессий
53
+ * @param {SessionManagerOptions} options Опции менеджера сессий
54
+ */
55
+ constructor(options = {}) {
56
+ /** Хранилище токенов сессий */
57
+ this.sessionTokens = new Map();
58
+ this.enableSessionPersistence = options.enableSessionPersistence !== false;
59
+ this.logger = options.logger || {
60
+ debug: () => { },
61
+ info: () => { },
62
+ warn: () => { },
63
+ error: () => { },
64
+ withPrefix: () => this.logger
65
+ };
66
+ }
67
+ /**
68
+ * Сохраняет токен сессии для пространства имен
69
+ * @param {string} namespace Пространство имен
70
+ * @param {string} token Токен сессии
71
+ */
72
+ saveSessionToken(namespace, token) {
73
+ if (!this.enableSessionPersistence) {
74
+ this.logger.debug(`Сохранение сессий отключено, игнорируем токен для ${namespace}`);
75
+ return;
76
+ }
77
+ this.logger.debug(`Сохранение токена сессии для ${namespace}`);
78
+ this.sessionTokens.set(namespace, token);
79
+ }
80
+ /**
81
+ * Получает токен сессии для пространства имен
82
+ * @param {string} namespace Пространство имен
83
+ * @returns {string | undefined} Токен сессии или undefined, если не найден
84
+ */
85
+ getSessionToken(namespace) {
86
+ if (!this.enableSessionPersistence) {
87
+ return undefined;
88
+ }
89
+ const token = this.sessionTokens.get(namespace);
90
+ this.logger.debug(`Получение токена сессии для ${namespace}: ${token ? 'найден' : 'не найден'}`);
91
+ return token;
92
+ }
93
+ /**
94
+ * Удаляет токен сессии для пространства имен
95
+ * @param {string} namespace Пространство имен
96
+ */
97
+ clearSessionToken(namespace) {
98
+ this.logger.debug(`Удаление токена сессии для ${namespace}`);
99
+ this.sessionTokens.delete(namespace);
100
+ }
101
+ /**
102
+ * Удаляет все токены сессий
103
+ */
104
+ clearAllSessionTokens() {
105
+ this.logger.debug('Удаление всех токенов сессий');
106
+ this.sessionTokens.clear();
107
+ }
108
+ }
109
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/utils/session-manager.ts"],"names":[],"mappings":"AAuBA;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAApC;QACE,wBAAwB;QAChB,WAAM,GAAoC,IAAI,GAAG,EAAE,CAAC;IA2C9D,CAAC;IAzCC;;;;OAIG;IACI,QAAQ,CAAC,SAA6B;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,SAA6B,EAAE,KAAa;QAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,WAAW,CAAC,SAA6B;QAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAC,SAA6B;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF;AAaD;;GAEG;AACH,MAAM,OAAO,cAAc;IAUzB;;;OAGG;IACH,YAAY,UAAiC,EAAE;QAb/C,+BAA+B;QACvB,kBAAa,GAAwB,IAAI,GAAG,EAAE,CAAC;QAarD,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,KAAK,KAAK,CAAC;QAC3E,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI;YAC9B,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM;SAC9B,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,SAAiB,EAAE,KAAa;QACtD,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qDAAqD,SAAS,EAAE,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,SAAiB;QACtC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAEjG,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,SAAiB;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,qBAAqB;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF"}