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.
- package/README.md +248 -0
- package/dist/cjs/api/agents-api.js +94 -0
- package/dist/cjs/api/agents-api.js.map +1 -0
- package/dist/cjs/api/code-modification-api.js +60 -0
- package/dist/cjs/api/code-modification-api.js.map +1 -0
- package/dist/cjs/api/context-api.js +58 -0
- package/dist/cjs/api/context-api.js.map +1 -0
- package/dist/cjs/api/projects-api.js +82 -0
- package/dist/cjs/api/projects-api.js.map +1 -0
- package/dist/cjs/api/reasoning-api.js +73 -0
- package/dist/cjs/api/reasoning-api.js.map +1 -0
- package/dist/cjs/api/search-api.js +54 -0
- package/dist/cjs/api/search-api.js.map +1 -0
- package/dist/cjs/code-solver-sdk.js +327 -0
- package/dist/cjs/code-solver-sdk.js.map +1 -0
- package/dist/cjs/index.js +118 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces/http-client.js +3 -0
- package/dist/cjs/interfaces/http-client.js.map +1 -0
- package/dist/cjs/interfaces/sdk-options.js +3 -0
- package/dist/cjs/interfaces/sdk-options.js.map +1 -0
- package/dist/cjs/models/types.js +17 -0
- package/dist/cjs/models/types.js.map +1 -0
- package/dist/cjs/utils/code-solver-websocket-client.js +267 -0
- package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -0
- package/dist/cjs/utils/http-client.js +234 -0
- package/dist/cjs/utils/http-client.js.map +1 -0
- package/dist/cjs/utils/indexing-websocket-client.js +107 -0
- package/dist/cjs/utils/indexing-websocket-client.js.map +1 -0
- package/dist/cjs/utils/sse-client.js +233 -0
- package/dist/cjs/utils/sse-client.js.map +1 -0
- package/dist/cjs/utils/websocket-client.js +268 -0
- package/dist/cjs/utils/websocket-client.js.map +1 -0
- package/dist/esm/api/agents-api.js +90 -0
- package/dist/esm/api/agents-api.js.map +1 -0
- package/dist/esm/api/code-modification-api.js +56 -0
- package/dist/esm/api/code-modification-api.js.map +1 -0
- package/dist/esm/api/context-api.js +54 -0
- package/dist/esm/api/context-api.js.map +1 -0
- package/dist/esm/api/projects-api.js +78 -0
- package/dist/esm/api/projects-api.js.map +1 -0
- package/dist/esm/api/reasoning-api.js +69 -0
- package/dist/esm/api/reasoning-api.js.map +1 -0
- package/dist/esm/api/search-api.js +50 -0
- package/dist/esm/api/search-api.js.map +1 -0
- package/dist/esm/code-solver-sdk.js +323 -0
- package/dist/esm/code-solver-sdk.js.map +1 -0
- package/dist/esm/index.js +1882 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interfaces/http-client.js +2 -0
- package/dist/esm/interfaces/http-client.js.map +1 -0
- package/dist/esm/interfaces/sdk-options.js +2 -0
- package/dist/esm/interfaces/sdk-options.js.map +1 -0
- package/dist/esm/models/types.js +14 -0
- package/dist/esm/models/types.js.map +1 -0
- package/dist/esm/types/api/agents-api.d.ts +141 -0
- package/dist/esm/types/api/agents-api.d.ts.map +1 -0
- package/dist/esm/types/api/code-modification-api.d.ts +104 -0
- package/dist/esm/types/api/code-modification-api.d.ts.map +1 -0
- package/dist/esm/types/api/context-api.d.ts +86 -0
- package/dist/esm/types/api/context-api.d.ts.map +1 -0
- package/dist/esm/types/api/projects-api.d.ts +89 -0
- package/dist/esm/types/api/projects-api.d.ts.map +1 -0
- package/dist/esm/types/api/reasoning-api.d.ts +130 -0
- package/dist/esm/types/api/reasoning-api.d.ts.map +1 -0
- package/dist/esm/types/api/search-api.d.ts +92 -0
- package/dist/esm/types/api/search-api.d.ts.map +1 -0
- package/dist/esm/types/code-solver-sdk.d.ts +145 -0
- package/dist/esm/types/code-solver-sdk.d.ts.map +1 -0
- package/dist/esm/types/index.d.ts +81 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/interfaces/http-client.d.ts +110 -0
- package/dist/esm/types/interfaces/http-client.d.ts.map +1 -0
- package/dist/esm/types/interfaces/sdk-options.d.ts +34 -0
- package/dist/esm/types/interfaces/sdk-options.d.ts.map +1 -0
- package/dist/esm/types/models/types.d.ts +139 -0
- package/dist/esm/types/models/types.d.ts.map +1 -0
- package/dist/esm/types/utils/code-solver-websocket-client.d.ts +138 -0
- package/dist/esm/types/utils/code-solver-websocket-client.d.ts.map +1 -0
- package/dist/esm/types/utils/http-client.d.ts +85 -0
- package/dist/esm/types/utils/http-client.d.ts.map +1 -0
- package/dist/esm/types/utils/indexing-websocket-client.d.ts +123 -0
- package/dist/esm/types/utils/indexing-websocket-client.d.ts.map +1 -0
- package/dist/esm/types/utils/sse-client.d.ts +92 -0
- package/dist/esm/types/utils/sse-client.d.ts.map +1 -0
- package/dist/esm/types/utils/websocket-client.d.ts +118 -0
- package/dist/esm/types/utils/websocket-client.d.ts.map +1 -0
- package/dist/esm/utils/code-solver-websocket-client.js +263 -0
- package/dist/esm/utils/code-solver-websocket-client.js.map +1 -0
- package/dist/esm/utils/http-client.js +227 -0
- package/dist/esm/utils/http-client.js.map +1 -0
- package/dist/esm/utils/indexing-websocket-client.js +103 -0
- package/dist/esm/utils/indexing-websocket-client.js.map +1 -0
- package/dist/esm/utils/sse-client.js +229 -0
- package/dist/esm/utils/sse-client.js.map +1 -0
- package/dist/esm/utils/websocket-client.js +264 -0
- package/dist/esm/utils/websocket-client.js.map +1 -0
- package/dist/index.d.ts +1599 -0
- package/dist/types/api/agents-api.d.ts +141 -0
- package/dist/types/api/agents-api.d.ts.map +1 -0
- package/dist/types/api/code-modification-api.d.ts +104 -0
- package/dist/types/api/code-modification-api.d.ts.map +1 -0
- package/dist/types/api/context-api.d.ts +86 -0
- package/dist/types/api/context-api.d.ts.map +1 -0
- package/dist/types/api/projects-api.d.ts +89 -0
- package/dist/types/api/projects-api.d.ts.map +1 -0
- package/dist/types/api/reasoning-api.d.ts +130 -0
- package/dist/types/api/reasoning-api.d.ts.map +1 -0
- package/dist/types/api/search-api.d.ts +92 -0
- package/dist/types/api/search-api.d.ts.map +1 -0
- package/dist/types/code-solver-sdk.d.ts +145 -0
- package/dist/types/code-solver-sdk.d.ts.map +1 -0
- package/dist/types/index.d.ts +81 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interfaces/http-client.d.ts +110 -0
- package/dist/types/interfaces/http-client.d.ts.map +1 -0
- package/dist/types/interfaces/sdk-options.d.ts +34 -0
- package/dist/types/interfaces/sdk-options.d.ts.map +1 -0
- package/dist/types/models/types.d.ts +139 -0
- package/dist/types/models/types.d.ts.map +1 -0
- package/dist/types/utils/code-solver-websocket-client.d.ts +138 -0
- package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -0
- package/dist/types/utils/http-client.d.ts +85 -0
- package/dist/types/utils/http-client.d.ts.map +1 -0
- package/dist/types/utils/indexing-websocket-client.d.ts +123 -0
- package/dist/types/utils/indexing-websocket-client.d.ts.map +1 -0
- package/dist/types/utils/sse-client.d.ts +92 -0
- package/dist/types/utils/sse-client.d.ts.map +1 -0
- package/dist/types/utils/websocket-client.d.ts +118 -0
- package/dist/types/utils/websocket-client.d.ts.map +1 -0
- package/dist/umd/code-solver-sdk.js +1902 -0
- package/dist/umd/code-solver-sdk.js.map +1 -0
- package/dist/umd/code-solver-sdk.min.js +2 -0
- package/dist/umd/code-solver-sdk.min.js.map +1 -0
- package/dist/umd/types/api/agents-api.d.ts +141 -0
- package/dist/umd/types/api/agents-api.d.ts.map +1 -0
- package/dist/umd/types/api/code-modification-api.d.ts +104 -0
- package/dist/umd/types/api/code-modification-api.d.ts.map +1 -0
- package/dist/umd/types/api/context-api.d.ts +86 -0
- package/dist/umd/types/api/context-api.d.ts.map +1 -0
- package/dist/umd/types/api/projects-api.d.ts +89 -0
- package/dist/umd/types/api/projects-api.d.ts.map +1 -0
- package/dist/umd/types/api/reasoning-api.d.ts +130 -0
- package/dist/umd/types/api/reasoning-api.d.ts.map +1 -0
- package/dist/umd/types/api/search-api.d.ts +92 -0
- package/dist/umd/types/api/search-api.d.ts.map +1 -0
- package/dist/umd/types/code-solver-sdk.d.ts +145 -0
- package/dist/umd/types/code-solver-sdk.d.ts.map +1 -0
- package/dist/umd/types/index.d.ts +81 -0
- package/dist/umd/types/index.d.ts.map +1 -0
- package/dist/umd/types/interfaces/http-client.d.ts +110 -0
- package/dist/umd/types/interfaces/http-client.d.ts.map +1 -0
- package/dist/umd/types/interfaces/sdk-options.d.ts +34 -0
- package/dist/umd/types/interfaces/sdk-options.d.ts.map +1 -0
- package/dist/umd/types/models/types.d.ts +139 -0
- package/dist/umd/types/models/types.d.ts.map +1 -0
- package/dist/umd/types/utils/code-solver-websocket-client.d.ts +138 -0
- package/dist/umd/types/utils/code-solver-websocket-client.d.ts.map +1 -0
- package/dist/umd/types/utils/http-client.d.ts +85 -0
- package/dist/umd/types/utils/http-client.d.ts.map +1 -0
- package/dist/umd/types/utils/indexing-websocket-client.d.ts +123 -0
- package/dist/umd/types/utils/indexing-websocket-client.d.ts.map +1 -0
- package/dist/umd/types/utils/sse-client.d.ts +92 -0
- package/dist/umd/types/utils/sse-client.d.ts.map +1 -0
- package/dist/umd/types/utils/websocket-client.d.ts +118 -0
- package/dist/umd/types/utils/websocket-client.d.ts.map +1 -0
- 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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"}
|