solver-sdk 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +248 -0
  2. package/dist/cjs/api/agents-api.js +94 -0
  3. package/dist/cjs/api/agents-api.js.map +1 -0
  4. package/dist/cjs/api/code-modification-api.js +60 -0
  5. package/dist/cjs/api/code-modification-api.js.map +1 -0
  6. package/dist/cjs/api/context-api.js +58 -0
  7. package/dist/cjs/api/context-api.js.map +1 -0
  8. package/dist/cjs/api/projects-api.js +82 -0
  9. package/dist/cjs/api/projects-api.js.map +1 -0
  10. package/dist/cjs/api/reasoning-api.js +73 -0
  11. package/dist/cjs/api/reasoning-api.js.map +1 -0
  12. package/dist/cjs/api/search-api.js +54 -0
  13. package/dist/cjs/api/search-api.js.map +1 -0
  14. package/dist/cjs/code-solver-sdk.js +327 -0
  15. package/dist/cjs/code-solver-sdk.js.map +1 -0
  16. package/dist/cjs/index.js +118 -0
  17. package/dist/cjs/index.js.map +1 -0
  18. package/dist/cjs/interfaces/http-client.js +3 -0
  19. package/dist/cjs/interfaces/http-client.js.map +1 -0
  20. package/dist/cjs/interfaces/sdk-options.js +3 -0
  21. package/dist/cjs/interfaces/sdk-options.js.map +1 -0
  22. package/dist/cjs/models/types.js +17 -0
  23. package/dist/cjs/models/types.js.map +1 -0
  24. package/dist/cjs/utils/code-solver-websocket-client.js +267 -0
  25. package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -0
  26. package/dist/cjs/utils/http-client.js +234 -0
  27. package/dist/cjs/utils/http-client.js.map +1 -0
  28. package/dist/cjs/utils/indexing-websocket-client.js +107 -0
  29. package/dist/cjs/utils/indexing-websocket-client.js.map +1 -0
  30. package/dist/cjs/utils/sse-client.js +233 -0
  31. package/dist/cjs/utils/sse-client.js.map +1 -0
  32. package/dist/cjs/utils/websocket-client.js +268 -0
  33. package/dist/cjs/utils/websocket-client.js.map +1 -0
  34. package/dist/esm/api/agents-api.js +90 -0
  35. package/dist/esm/api/agents-api.js.map +1 -0
  36. package/dist/esm/api/code-modification-api.js +56 -0
  37. package/dist/esm/api/code-modification-api.js.map +1 -0
  38. package/dist/esm/api/context-api.js +54 -0
  39. package/dist/esm/api/context-api.js.map +1 -0
  40. package/dist/esm/api/projects-api.js +78 -0
  41. package/dist/esm/api/projects-api.js.map +1 -0
  42. package/dist/esm/api/reasoning-api.js +69 -0
  43. package/dist/esm/api/reasoning-api.js.map +1 -0
  44. package/dist/esm/api/search-api.js +50 -0
  45. package/dist/esm/api/search-api.js.map +1 -0
  46. package/dist/esm/code-solver-sdk.js +323 -0
  47. package/dist/esm/code-solver-sdk.js.map +1 -0
  48. package/dist/esm/index.js +1882 -0
  49. package/dist/esm/index.js.map +1 -0
  50. package/dist/esm/interfaces/http-client.js +2 -0
  51. package/dist/esm/interfaces/http-client.js.map +1 -0
  52. package/dist/esm/interfaces/sdk-options.js +2 -0
  53. package/dist/esm/interfaces/sdk-options.js.map +1 -0
  54. package/dist/esm/models/types.js +14 -0
  55. package/dist/esm/models/types.js.map +1 -0
  56. package/dist/esm/types/api/agents-api.d.ts +141 -0
  57. package/dist/esm/types/api/agents-api.d.ts.map +1 -0
  58. package/dist/esm/types/api/code-modification-api.d.ts +104 -0
  59. package/dist/esm/types/api/code-modification-api.d.ts.map +1 -0
  60. package/dist/esm/types/api/context-api.d.ts +86 -0
  61. package/dist/esm/types/api/context-api.d.ts.map +1 -0
  62. package/dist/esm/types/api/projects-api.d.ts +89 -0
  63. package/dist/esm/types/api/projects-api.d.ts.map +1 -0
  64. package/dist/esm/types/api/reasoning-api.d.ts +130 -0
  65. package/dist/esm/types/api/reasoning-api.d.ts.map +1 -0
  66. package/dist/esm/types/api/search-api.d.ts +92 -0
  67. package/dist/esm/types/api/search-api.d.ts.map +1 -0
  68. package/dist/esm/types/code-solver-sdk.d.ts +145 -0
  69. package/dist/esm/types/code-solver-sdk.d.ts.map +1 -0
  70. package/dist/esm/types/index.d.ts +81 -0
  71. package/dist/esm/types/index.d.ts.map +1 -0
  72. package/dist/esm/types/interfaces/http-client.d.ts +110 -0
  73. package/dist/esm/types/interfaces/http-client.d.ts.map +1 -0
  74. package/dist/esm/types/interfaces/sdk-options.d.ts +34 -0
  75. package/dist/esm/types/interfaces/sdk-options.d.ts.map +1 -0
  76. package/dist/esm/types/models/types.d.ts +139 -0
  77. package/dist/esm/types/models/types.d.ts.map +1 -0
  78. package/dist/esm/types/utils/code-solver-websocket-client.d.ts +138 -0
  79. package/dist/esm/types/utils/code-solver-websocket-client.d.ts.map +1 -0
  80. package/dist/esm/types/utils/http-client.d.ts +85 -0
  81. package/dist/esm/types/utils/http-client.d.ts.map +1 -0
  82. package/dist/esm/types/utils/indexing-websocket-client.d.ts +123 -0
  83. package/dist/esm/types/utils/indexing-websocket-client.d.ts.map +1 -0
  84. package/dist/esm/types/utils/sse-client.d.ts +92 -0
  85. package/dist/esm/types/utils/sse-client.d.ts.map +1 -0
  86. package/dist/esm/types/utils/websocket-client.d.ts +118 -0
  87. package/dist/esm/types/utils/websocket-client.d.ts.map +1 -0
  88. package/dist/esm/utils/code-solver-websocket-client.js +263 -0
  89. package/dist/esm/utils/code-solver-websocket-client.js.map +1 -0
  90. package/dist/esm/utils/http-client.js +227 -0
  91. package/dist/esm/utils/http-client.js.map +1 -0
  92. package/dist/esm/utils/indexing-websocket-client.js +103 -0
  93. package/dist/esm/utils/indexing-websocket-client.js.map +1 -0
  94. package/dist/esm/utils/sse-client.js +229 -0
  95. package/dist/esm/utils/sse-client.js.map +1 -0
  96. package/dist/esm/utils/websocket-client.js +264 -0
  97. package/dist/esm/utils/websocket-client.js.map +1 -0
  98. package/dist/index.d.ts +1599 -0
  99. package/dist/types/api/agents-api.d.ts +141 -0
  100. package/dist/types/api/agents-api.d.ts.map +1 -0
  101. package/dist/types/api/code-modification-api.d.ts +104 -0
  102. package/dist/types/api/code-modification-api.d.ts.map +1 -0
  103. package/dist/types/api/context-api.d.ts +86 -0
  104. package/dist/types/api/context-api.d.ts.map +1 -0
  105. package/dist/types/api/projects-api.d.ts +89 -0
  106. package/dist/types/api/projects-api.d.ts.map +1 -0
  107. package/dist/types/api/reasoning-api.d.ts +130 -0
  108. package/dist/types/api/reasoning-api.d.ts.map +1 -0
  109. package/dist/types/api/search-api.d.ts +92 -0
  110. package/dist/types/api/search-api.d.ts.map +1 -0
  111. package/dist/types/code-solver-sdk.d.ts +145 -0
  112. package/dist/types/code-solver-sdk.d.ts.map +1 -0
  113. package/dist/types/index.d.ts +81 -0
  114. package/dist/types/index.d.ts.map +1 -0
  115. package/dist/types/interfaces/http-client.d.ts +110 -0
  116. package/dist/types/interfaces/http-client.d.ts.map +1 -0
  117. package/dist/types/interfaces/sdk-options.d.ts +34 -0
  118. package/dist/types/interfaces/sdk-options.d.ts.map +1 -0
  119. package/dist/types/models/types.d.ts +139 -0
  120. package/dist/types/models/types.d.ts.map +1 -0
  121. package/dist/types/utils/code-solver-websocket-client.d.ts +138 -0
  122. package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -0
  123. package/dist/types/utils/http-client.d.ts +85 -0
  124. package/dist/types/utils/http-client.d.ts.map +1 -0
  125. package/dist/types/utils/indexing-websocket-client.d.ts +123 -0
  126. package/dist/types/utils/indexing-websocket-client.d.ts.map +1 -0
  127. package/dist/types/utils/sse-client.d.ts +92 -0
  128. package/dist/types/utils/sse-client.d.ts.map +1 -0
  129. package/dist/types/utils/websocket-client.d.ts +118 -0
  130. package/dist/types/utils/websocket-client.d.ts.map +1 -0
  131. package/dist/umd/code-solver-sdk.js +1902 -0
  132. package/dist/umd/code-solver-sdk.js.map +1 -0
  133. package/dist/umd/code-solver-sdk.min.js +2 -0
  134. package/dist/umd/code-solver-sdk.min.js.map +1 -0
  135. package/dist/umd/types/api/agents-api.d.ts +141 -0
  136. package/dist/umd/types/api/agents-api.d.ts.map +1 -0
  137. package/dist/umd/types/api/code-modification-api.d.ts +104 -0
  138. package/dist/umd/types/api/code-modification-api.d.ts.map +1 -0
  139. package/dist/umd/types/api/context-api.d.ts +86 -0
  140. package/dist/umd/types/api/context-api.d.ts.map +1 -0
  141. package/dist/umd/types/api/projects-api.d.ts +89 -0
  142. package/dist/umd/types/api/projects-api.d.ts.map +1 -0
  143. package/dist/umd/types/api/reasoning-api.d.ts +130 -0
  144. package/dist/umd/types/api/reasoning-api.d.ts.map +1 -0
  145. package/dist/umd/types/api/search-api.d.ts +92 -0
  146. package/dist/umd/types/api/search-api.d.ts.map +1 -0
  147. package/dist/umd/types/code-solver-sdk.d.ts +145 -0
  148. package/dist/umd/types/code-solver-sdk.d.ts.map +1 -0
  149. package/dist/umd/types/index.d.ts +81 -0
  150. package/dist/umd/types/index.d.ts.map +1 -0
  151. package/dist/umd/types/interfaces/http-client.d.ts +110 -0
  152. package/dist/umd/types/interfaces/http-client.d.ts.map +1 -0
  153. package/dist/umd/types/interfaces/sdk-options.d.ts +34 -0
  154. package/dist/umd/types/interfaces/sdk-options.d.ts.map +1 -0
  155. package/dist/umd/types/models/types.d.ts +139 -0
  156. package/dist/umd/types/models/types.d.ts.map +1 -0
  157. package/dist/umd/types/utils/code-solver-websocket-client.d.ts +138 -0
  158. package/dist/umd/types/utils/code-solver-websocket-client.d.ts.map +1 -0
  159. package/dist/umd/types/utils/http-client.d.ts +85 -0
  160. package/dist/umd/types/utils/http-client.d.ts.map +1 -0
  161. package/dist/umd/types/utils/indexing-websocket-client.d.ts +123 -0
  162. package/dist/umd/types/utils/indexing-websocket-client.d.ts.map +1 -0
  163. package/dist/umd/types/utils/sse-client.d.ts +92 -0
  164. package/dist/umd/types/utils/sse-client.d.ts.map +1 -0
  165. package/dist/umd/types/utils/websocket-client.d.ts +118 -0
  166. package/dist/umd/types/utils/websocket-client.d.ts.map +1 -0
  167. package/package.json +98 -0
@@ -0,0 +1,103 @@
1
+ import { WebSocketClient } from './websocket-client.js';
2
+ /**
3
+ * События индексации
4
+ */
5
+ export var IndexingEvent;
6
+ (function (IndexingEvent) {
7
+ /** Начало индексации */
8
+ IndexingEvent["START"] = "indexing_start";
9
+ /** Прогресс индексации */
10
+ IndexingEvent["PROGRESS"] = "indexing_progress";
11
+ /** Завершение индексации */
12
+ IndexingEvent["COMPLETE"] = "indexing_complete";
13
+ /** Ошибка индексации */
14
+ IndexingEvent["ERROR"] = "indexing_error";
15
+ })(IndexingEvent || (IndexingEvent = {}));
16
+ /**
17
+ * WebSocket клиент для работы с индексацией
18
+ */
19
+ export class IndexingWebSocketClient extends WebSocketClient {
20
+ /**
21
+ * Создает новый WebSocket клиент для индексации
22
+ * @param {string} url URL для подключения
23
+ * @param {IndexingWebSocketOptions} [options] Опции клиента
24
+ */
25
+ constructor(url, options = {}) {
26
+ // Сохраняем базовый URL
27
+ const baseUrl = url;
28
+ // Формируем URL с параметрами для проекта если он указан
29
+ let targetUrl = url;
30
+ if (options.projectId) {
31
+ const urlWithParams = new URL(url);
32
+ urlWithParams.searchParams.append('projectId', options.projectId);
33
+ urlWithParams.searchParams.append('type', 'indexing');
34
+ targetUrl = urlWithParams.toString();
35
+ }
36
+ super(targetUrl, {
37
+ ...options,
38
+ headers: {
39
+ ...(options.headers || {}),
40
+ ...(options.apiKey ? { 'Authorization': `Bearer ${options.apiKey}` } : {})
41
+ }
42
+ });
43
+ /** Идентификатор проекта */
44
+ this.projectId = null;
45
+ this.baseUrl = baseUrl;
46
+ this.projectId = options.projectId || null;
47
+ }
48
+ /**
49
+ * Устанавливает идентификатор проекта
50
+ * @param {string} projectId Идентификатор проекта
51
+ */
52
+ setProjectId(projectId) {
53
+ this.projectId = projectId;
54
+ }
55
+ /**
56
+ * Подключается к WebSocket для отслеживания индексации
57
+ * @param {string} [projectId] Идентификатор проекта (если не был указан в конструкторе)
58
+ * @returns {Promise<void>}
59
+ */
60
+ async connect(projectId) {
61
+ const targetProjectId = projectId || this.projectId;
62
+ if (!targetProjectId) {
63
+ throw new Error('Project ID is required for indexing WebSocket connection');
64
+ }
65
+ // Сохраняем ID проекта
66
+ this.projectId = targetProjectId;
67
+ // Если проект изменился и клиент уже подключен, отключаемся
68
+ if (projectId && this.isConnected()) {
69
+ this.close();
70
+ }
71
+ // Выполняем соединение
72
+ await super.connect();
73
+ }
74
+ /**
75
+ * Подписывается на события начала индексации
76
+ * @param {(data: {projectId: string}) => void} handler Обработчик события
77
+ */
78
+ onStart(handler) {
79
+ this.on(IndexingEvent.START, handler);
80
+ }
81
+ /**
82
+ * Подписывается на события прогресса индексации
83
+ * @param {(data: IndexingProgressData) => void} handler Обработчик события
84
+ */
85
+ onProgress(handler) {
86
+ this.on(IndexingEvent.PROGRESS, handler);
87
+ }
88
+ /**
89
+ * Подписывается на события завершения индексации
90
+ * @param {(data: IndexingCompleteData) => void} handler Обработчик события
91
+ */
92
+ onComplete(handler) {
93
+ this.on(IndexingEvent.COMPLETE, handler);
94
+ }
95
+ /**
96
+ * Подписывается на события ошибок индексации
97
+ * @param {(data: IndexingErrorData) => void} handler Обработчик события
98
+ */
99
+ onError(handler) {
100
+ this.on(IndexingEvent.ERROR, handler);
101
+ }
102
+ }
103
+ //# sourceMappingURL=indexing-websocket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexing-websocket-client.js","sourceRoot":"","sources":["../../../src/utils/indexing-websocket-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA0B,MAAM,uBAAuB,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAN,IAAY,aAYX;AAZD,WAAY,aAAa;IACvB,wBAAwB;IACxB,yCAAwB,CAAA;IAExB,0BAA0B;IAC1B,+CAA8B,CAAA;IAE9B,4BAA4B;IAC5B,+CAA8B,CAAA;IAE9B,wBAAwB;IACxB,yCAAwB,CAAA;AAC1B,CAAC,EAZW,aAAa,KAAb,aAAa,QAYxB;AAkFD;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,eAAe;IAO1D;;;;OAIG;IACH,YAAY,GAAW,EAAE,UAAoC,EAAE;QAC7D,wBAAwB;QACxB,MAAM,OAAO,GAAG,GAAG,CAAC;QAEpB,yDAAyD;QACzD,IAAI,SAAS,GAAG,GAAG,CAAC;QACpB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAClE,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACtD,SAAS,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,SAAS,EAAE;YACf,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC1B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3E;SACF,CAAC,CAAC;QA9BL,4BAA4B;QACpB,cAAS,GAAkB,IAAI,CAAC;QA+BtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,SAAiB;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,OAAO,CAAC,SAAkB;QACrC,MAAM,eAAe,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QAEpD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC;QAEjC,4DAA4D;QAC5D,IAAI,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QAED,uBAAuB;QACvB,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,OAA4C;QACzD,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,OAA6C;QAC7D,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,OAA6C;QAC7D,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,OAA0C;QACvD,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,229 @@
1
+ import { EventSourcePolyfill } from 'event-source-polyfill';
2
+ // В браузере будем использовать нативный EventSource или полифилл
3
+ const BrowserEventSource = typeof EventSource !== 'undefined' ? EventSource : EventSourcePolyfill;
4
+ // Проверяем, находимся ли мы в браузере
5
+ const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';
6
+ /**
7
+ * Клиент для работы с Server-Sent Events (SSE)
8
+ * Поддерживает работу как в браузере, так и в Node.js
9
+ */
10
+ export class SseClient {
11
+ /**
12
+ * Создает новый SSE клиент
13
+ * @param {string} url URL для подключения
14
+ * @param {SseClientOptions} [options] Опции клиента
15
+ */
16
+ constructor(url, options = {}) {
17
+ /** Экземпляр EventSource */
18
+ this.eventSource = null;
19
+ /** Счетчик попыток переподключения */
20
+ this.retryCount = 0;
21
+ /** Флаг, указывающий, что соединение было закрыто намеренно */
22
+ this.intentionallyClosed = false;
23
+ /** Таймер переподключения */
24
+ this.reconnectTimer = null;
25
+ /** Таймер таймаута соединения */
26
+ this.connectionTimeoutTimer = null;
27
+ /** Обработчики событий */
28
+ this.eventHandlers = {};
29
+ this.url = url;
30
+ this.options = {
31
+ headers: options.headers || {},
32
+ connectionTimeout: options.connectionTimeout || 30000,
33
+ maxRetries: options.maxRetries || 5,
34
+ retryDelay: options.retryDelay || 1000,
35
+ maxRetryDelay: options.maxRetryDelay || 30000
36
+ };
37
+ }
38
+ /**
39
+ * Подключается к SSE эндпоинту
40
+ * @returns {Promise<void>}
41
+ */
42
+ connect() {
43
+ // Если соединение уже установлено, возвращаем Promise.resolve
44
+ if (this.eventSource && this.eventSource.readyState === 1) {
45
+ return Promise.resolve();
46
+ }
47
+ // Сбрасываем флаг намеренного закрытия
48
+ this.intentionallyClosed = false;
49
+ return new Promise((resolve, reject) => {
50
+ try {
51
+ // Создаем новый экземпляр EventSource
52
+ const EventSourceImpl = isBrowser ? BrowserEventSource : require('eventsource');
53
+ this.eventSource = new EventSourceImpl(this.url, {
54
+ headers: this.options.headers,
55
+ withCredentials: true
56
+ });
57
+ // Устанавливаем таймаут соединения
58
+ this.connectionTimeoutTimer = setTimeout(() => {
59
+ if (this.eventSource && this.eventSource.readyState !== 1) {
60
+ reject(new Error('Таймаут подключения SSE'));
61
+ this.close();
62
+ }
63
+ }, this.options.connectionTimeout);
64
+ // Проверяем, что this.eventSource не null
65
+ if (!this.eventSource) {
66
+ reject(new Error('Не удалось создать EventSource'));
67
+ return;
68
+ }
69
+ // Обработчик открытия соединения
70
+ this.eventSource.onopen = () => {
71
+ clearTimeout(this.connectionTimeoutTimer);
72
+ this.retryCount = 0;
73
+ resolve();
74
+ this.dispatchEvent('open', {});
75
+ };
76
+ // Обработчик сообщений
77
+ this.eventSource.onmessage = (event) => {
78
+ try {
79
+ const data = JSON.parse(event.data);
80
+ this.dispatchEvent('message', data);
81
+ // Также вызываем специальный обработчик для конкретного типа события,
82
+ // если такой тип указан в данных
83
+ if (data && data.type) {
84
+ this.dispatchEvent(data.type, data);
85
+ }
86
+ }
87
+ catch (error) {
88
+ this.dispatchEvent('error', { error, message: 'Ошибка при обработке сообщения SSE' });
89
+ }
90
+ };
91
+ // Обработчик ошибок
92
+ this.eventSource.onerror = (error) => {
93
+ clearTimeout(this.connectionTimeoutTimer);
94
+ if (this.intentionallyClosed) {
95
+ return;
96
+ }
97
+ // Если соединение уже установлено и произошла ошибка, просто сообщаем об ошибке
98
+ if (this.eventSource && this.eventSource.readyState === 1) {
99
+ this.dispatchEvent('error', { error, message: 'Ошибка SSE соединения' });
100
+ return;
101
+ }
102
+ // Если это первая попытка подключения, отклоняем Promise
103
+ if (this.retryCount === 0) {
104
+ reject(new Error('Ошибка подключения SSE'));
105
+ }
106
+ // Запускаем процесс переподключения
107
+ this.reconnect();
108
+ };
109
+ // Настраиваем обработчики для всех добавленных событий
110
+ for (const eventType in this.eventHandlers) {
111
+ if (eventType !== 'message' && eventType !== 'open' && eventType !== 'error') {
112
+ this.eventSource.addEventListener(eventType, (event) => {
113
+ try {
114
+ const data = JSON.parse(event.data);
115
+ this.dispatchEvent(eventType, data);
116
+ }
117
+ catch (e) {
118
+ this.dispatchEvent(eventType, event.data);
119
+ }
120
+ });
121
+ }
122
+ }
123
+ }
124
+ catch (error) {
125
+ reject(error);
126
+ }
127
+ });
128
+ }
129
+ /**
130
+ * Закрывает SSE соединение
131
+ */
132
+ close() {
133
+ this.intentionallyClosed = true;
134
+ // Очищаем таймеры
135
+ clearTimeout(this.reconnectTimer);
136
+ clearTimeout(this.connectionTimeoutTimer);
137
+ // Закрываем соединение
138
+ if (this.eventSource) {
139
+ this.eventSource.close();
140
+ this.eventSource = null;
141
+ }
142
+ this.dispatchEvent('close', {});
143
+ }
144
+ /**
145
+ * Добавляет обработчик события
146
+ * @param {string} eventType Тип события
147
+ * @param {SseEventHandler} handler Обработчик события
148
+ */
149
+ on(eventType, handler) {
150
+ if (!this.eventHandlers[eventType]) {
151
+ this.eventHandlers[eventType] = [];
152
+ // Если соединение уже установлено, добавляем обработчик события
153
+ if (this.eventSource && this.eventSource.readyState === 1 &&
154
+ eventType !== 'message' && eventType !== 'open' && eventType !== 'error') {
155
+ this.eventSource.addEventListener(eventType, (event) => {
156
+ try {
157
+ const data = JSON.parse(event.data);
158
+ this.dispatchEvent(eventType, data);
159
+ }
160
+ catch (e) {
161
+ this.dispatchEvent(eventType, event.data);
162
+ }
163
+ });
164
+ }
165
+ }
166
+ this.eventHandlers[eventType].push(handler);
167
+ }
168
+ /**
169
+ * Удаляет обработчик события
170
+ * @param {string} eventType Тип события
171
+ * @param {SseEventHandler} [handler] Обработчик события (если не указан, удаляются все обработчики)
172
+ */
173
+ off(eventType, handler) {
174
+ if (!this.eventHandlers[eventType]) {
175
+ return;
176
+ }
177
+ if (!handler) {
178
+ // Если обработчик не указан, удаляем все обработчики для данного события
179
+ delete this.eventHandlers[eventType];
180
+ }
181
+ else {
182
+ // Если обработчик указан, удаляем только его
183
+ this.eventHandlers[eventType] = this.eventHandlers[eventType].filter(h => h !== handler);
184
+ // Если обработчиков больше нет, удаляем массив
185
+ if (this.eventHandlers[eventType].length === 0) {
186
+ delete this.eventHandlers[eventType];
187
+ }
188
+ }
189
+ }
190
+ /**
191
+ * Вызывает обработчики для указанного события
192
+ * @param {string} eventType Тип события
193
+ * @param {any} data Данные события
194
+ */
195
+ dispatchEvent(eventType, data) {
196
+ if (!this.eventHandlers[eventType]) {
197
+ return;
198
+ }
199
+ for (const handler of this.eventHandlers[eventType]) {
200
+ try {
201
+ handler(data);
202
+ }
203
+ catch (e) {
204
+ console.error(`Ошибка в обработчике события ${eventType}:`, e);
205
+ }
206
+ }
207
+ }
208
+ /**
209
+ * Переподключается к SSE эндпоинту с экспоненциальной задержкой
210
+ * @private
211
+ */
212
+ reconnect() {
213
+ // Увеличиваем счетчик попыток
214
+ this.retryCount++;
215
+ // Если превышено максимальное количество попыток, прекращаем
216
+ if (this.retryCount > (this.options.maxRetries || 5)) {
217
+ this.dispatchEvent('maxRetries', { retries: this.retryCount });
218
+ return;
219
+ }
220
+ // Вычисляем задержку перед переподключением с экспоненциальным ростом
221
+ const delay = Math.min((this.options.retryDelay || 1000) * Math.pow(2, this.retryCount - 1), this.options.maxRetryDelay || 30000);
222
+ // Пытаемся переподключиться после задержки
223
+ this.reconnectTimer = setTimeout(() => {
224
+ this.dispatchEvent('reconnect', { attempt: this.retryCount });
225
+ this.connect().catch(() => { });
226
+ }, delay);
227
+ }
228
+ }
229
+ //# sourceMappingURL=sse-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../../../src/utils/sse-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * Базовый класс для WebSocket клиентов
3
+ */
4
+ export class WebSocketClient {
5
+ /**
6
+ * Создает новый WebSocket клиент
7
+ * @param {string} url URL для подключения
8
+ * @param {WebSocketClientOptions} [options] Опции клиента
9
+ */
10
+ constructor(url, options = {}) {
11
+ /** Экземпляр WebSocket */
12
+ this.webSocket = null;
13
+ /** Счетчик попыток переподключения */
14
+ this.retryCount = 0;
15
+ /** Флаг, указывающий, что соединение было закрыто намеренно */
16
+ this.intentionallyClosed = false;
17
+ /** Таймер переподключения */
18
+ this.reconnectTimer = null;
19
+ /** Таймер таймаута соединения */
20
+ this.connectionTimeoutTimer = null;
21
+ /** Обработчики событий */
22
+ this.eventHandlers = {};
23
+ /** Очередь сообщений для отправки после подключения */
24
+ this.messageQueue = [];
25
+ /** Состояние соединения */
26
+ this.connected = false;
27
+ this.url = url;
28
+ this.options = {
29
+ headers: options.headers || {},
30
+ connectionTimeout: options.connectionTimeout || 30000,
31
+ protocols: options.protocols || [],
32
+ maxRetries: options.maxRetries || 5,
33
+ retryDelay: options.retryDelay || 1000,
34
+ maxRetryDelay: options.maxRetryDelay || 30000,
35
+ autoReconnect: options.autoReconnect !== undefined ? options.autoReconnect : true
36
+ };
37
+ // Определяем среду выполнения
38
+ this.isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';
39
+ }
40
+ /**
41
+ * Подключается к WebSocket серверу
42
+ * @returns {Promise<void>}
43
+ */
44
+ connect() {
45
+ // Если соединение уже установлено, возвращаем Promise.resolve
46
+ if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {
47
+ return Promise.resolve();
48
+ }
49
+ // Сбрасываем флаг намеренного закрытия
50
+ this.intentionallyClosed = false;
51
+ return new Promise((resolve, reject) => {
52
+ try {
53
+ // Создаем новый экземпляр WebSocket
54
+ if (this.isBrowser) {
55
+ // Браузерное окружение
56
+ this.webSocket = new WebSocket(this.url, this.options.protocols);
57
+ }
58
+ else {
59
+ // Node.js окружение
60
+ try {
61
+ // Динамически импортируем ws модуль в Node.js
62
+ const WebSocketImpl = require('ws');
63
+ this.webSocket = new WebSocketImpl(this.url, {
64
+ headers: this.options.headers,
65
+ protocol: this.options.protocols
66
+ });
67
+ }
68
+ catch (error) {
69
+ reject(new Error('Не удалось загрузить модуль ws в Node.js: ' + error.message));
70
+ return;
71
+ }
72
+ }
73
+ // Устанавливаем таймаут соединения
74
+ this.connectionTimeoutTimer = setTimeout(() => {
75
+ if (this.webSocket && this.webSocket.readyState !== WebSocket.OPEN) {
76
+ reject(new Error('Таймаут подключения WebSocket'));
77
+ this.close();
78
+ }
79
+ }, this.options.connectionTimeout);
80
+ // Обработчик открытия соединения
81
+ this.webSocket.onopen = () => {
82
+ clearTimeout(this.connectionTimeoutTimer);
83
+ this.retryCount = 0;
84
+ this.connected = true;
85
+ // Отправляем сообщения из очереди
86
+ while (this.messageQueue.length > 0) {
87
+ const message = this.messageQueue.shift();
88
+ if (message && this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {
89
+ this.webSocket.send(message);
90
+ }
91
+ }
92
+ resolve();
93
+ this.dispatchEvent('open', {});
94
+ };
95
+ // Обработчик сообщений
96
+ this.webSocket.onmessage = (event) => {
97
+ try {
98
+ // Пытаемся распарсить сообщение как JSON
99
+ let data = event.data;
100
+ if (typeof data === 'string') {
101
+ try {
102
+ data = JSON.parse(data);
103
+ }
104
+ catch (e) {
105
+ // Если не удалось распарсить, оставляем как есть
106
+ }
107
+ }
108
+ this.dispatchEvent('message', data);
109
+ }
110
+ catch (e) {
111
+ console.error('Ошибка при обработке сообщения WebSocket:', e);
112
+ }
113
+ };
114
+ // Обработчик закрытия соединения
115
+ this.webSocket.onclose = (event) => {
116
+ clearTimeout(this.connectionTimeoutTimer);
117
+ this.connected = false;
118
+ this.dispatchEvent('close', { code: event.code, reason: event.reason });
119
+ // Если соединение было закрыто намеренно, не пытаемся переподключиться
120
+ if (this.intentionallyClosed) {
121
+ return;
122
+ }
123
+ // Если включено автоматическое переподключение, пытаемся переподключиться
124
+ if (this.options.autoReconnect) {
125
+ this.reconnect();
126
+ }
127
+ };
128
+ // Обработчик ошибок
129
+ this.webSocket.onerror = (error) => {
130
+ this.dispatchEvent('error', error);
131
+ // Если соединение не установлено и это первая попытка, отклоняем Promise
132
+ if (!this.connected && this.retryCount === 0) {
133
+ clearTimeout(this.connectionTimeoutTimer);
134
+ reject(new Error('Ошибка подключения WebSocket'));
135
+ }
136
+ };
137
+ }
138
+ catch (error) {
139
+ reject(error);
140
+ }
141
+ });
142
+ }
143
+ /**
144
+ * Переподключается к WebSocket серверу
145
+ * @private
146
+ */
147
+ reconnect() {
148
+ // Увеличиваем счетчик попыток
149
+ this.retryCount++;
150
+ // Если превышено максимальное количество попыток, не пытаемся переподключиться
151
+ if (this.retryCount > (this.options.maxRetries || 5)) {
152
+ this.dispatchEvent('maxRetries', { retries: this.retryCount });
153
+ return;
154
+ }
155
+ // Вычисляем задержку перед переподключением с экспоненциальным ростом
156
+ const delay = Math.min((this.options.retryDelay || 1000) * Math.pow(2, this.retryCount - 1), this.options.maxRetryDelay || 30000);
157
+ // Пытаемся переподключиться после задержки
158
+ this.reconnectTimer = setTimeout(() => {
159
+ this.dispatchEvent('reconnect', { attempt: this.retryCount });
160
+ this.connect().catch(() => { });
161
+ }, delay);
162
+ }
163
+ /**
164
+ * Закрывает WebSocket соединение
165
+ * @param {number} [code=1000] Код закрытия
166
+ * @param {string} [reason] Причина закрытия
167
+ */
168
+ close(code = 1000, reason) {
169
+ this.intentionallyClosed = true;
170
+ // Очищаем таймеры
171
+ clearTimeout(this.reconnectTimer);
172
+ clearTimeout(this.connectionTimeoutTimer);
173
+ // Очищаем очередь сообщений
174
+ this.messageQueue = [];
175
+ // Закрываем соединение
176
+ if (this.webSocket) {
177
+ if (this.webSocket.readyState === WebSocket.OPEN) {
178
+ this.webSocket.close(code, reason);
179
+ }
180
+ this.webSocket = null;
181
+ }
182
+ this.connected = false;
183
+ }
184
+ /**
185
+ * Отправляет сообщение через WebSocket
186
+ * @param {string | object} message Сообщение для отправки
187
+ * @returns {boolean} Успешно ли отправлено сообщение
188
+ */
189
+ send(message) {
190
+ const data = typeof message === 'string' ? message : JSON.stringify(message);
191
+ if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {
192
+ this.webSocket.send(data);
193
+ return true;
194
+ }
195
+ else {
196
+ // Если соединение не установлено, добавляем сообщение в очередь
197
+ this.messageQueue.push(data);
198
+ // Если соединение не установлено и не закрыто намеренно, пытаемся подключиться
199
+ if ((!this.webSocket || this.webSocket.readyState === WebSocket.CLOSED) && !this.intentionallyClosed) {
200
+ this.connect().catch(() => { });
201
+ }
202
+ return false;
203
+ }
204
+ }
205
+ /**
206
+ * Проверяет, установлено ли соединение
207
+ * @returns {boolean} Установлено ли соединение
208
+ */
209
+ isConnected() {
210
+ return this.webSocket !== null && this.webSocket.readyState === WebSocket.OPEN;
211
+ }
212
+ /**
213
+ * Добавляет обработчик события
214
+ * @param {string} eventType Тип события
215
+ * @param {WebSocketEventHandler} handler Обработчик события
216
+ */
217
+ on(eventType, handler) {
218
+ if (!this.eventHandlers[eventType]) {
219
+ this.eventHandlers[eventType] = [];
220
+ }
221
+ this.eventHandlers[eventType].push(handler);
222
+ }
223
+ /**
224
+ * Удаляет обработчик события
225
+ * @param {string} eventType Тип события
226
+ * @param {WebSocketEventHandler} [handler] Обработчик события (если не указан, удаляются все обработчики)
227
+ */
228
+ off(eventType, handler) {
229
+ if (!this.eventHandlers[eventType]) {
230
+ return;
231
+ }
232
+ if (!handler) {
233
+ // Если обработчик не указан, удаляем все обработчики для данного события
234
+ delete this.eventHandlers[eventType];
235
+ }
236
+ else {
237
+ // Если обработчик указан, удаляем только его
238
+ this.eventHandlers[eventType] = this.eventHandlers[eventType].filter(h => h !== handler);
239
+ // Если обработчиков больше нет, удаляем массив
240
+ if (this.eventHandlers[eventType].length === 0) {
241
+ delete this.eventHandlers[eventType];
242
+ }
243
+ }
244
+ }
245
+ /**
246
+ * Вызывает обработчики для указанного события
247
+ * @param {string} eventType Тип события
248
+ * @param {any} data Данные события
249
+ */
250
+ dispatchEvent(eventType, data) {
251
+ if (!this.eventHandlers[eventType]) {
252
+ return;
253
+ }
254
+ for (const handler of this.eventHandlers[eventType]) {
255
+ try {
256
+ handler(data);
257
+ }
258
+ catch (e) {
259
+ console.error(`Ошибка в обработчике события ${eventType}:`, e);
260
+ }
261
+ }
262
+ }
263
+ }
264
+ //# sourceMappingURL=websocket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../../../src/utils/websocket-client.ts"],"names":[],"mappings":"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"}