directual-api 1.4.1 → 1.5.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 +160 -29
- package/lib/api.js +5 -1
- package/lib/api.js.map +1 -1
- package/lib/directual.d.ts +1 -0
- package/lib/directual.js.map +1 -1
- package/lib/endpoint.d.ts +55 -0
- package/lib/endpoint.js +376 -0
- package/lib/endpoint.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,60 +2,191 @@
|
|
|
2
2
|
The Directual Web Library serves as the base JavaScript library for Directual based projects.
|
|
3
3
|
https://directual.com/
|
|
4
4
|
|
|
5
|
-
## Support
|
|
6
|
-
* Explorer 11
|
|
7
|
-
* Chrome 43+
|
|
8
|
-
* Node 8.9+
|
|
9
|
-
|
|
10
5
|
## Install
|
|
11
6
|
```sh
|
|
12
7
|
npm install directual-api
|
|
13
8
|
```
|
|
14
9
|
|
|
15
|
-
## Usage
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
16
12
|
```js
|
|
17
|
-
const
|
|
13
|
+
const Directual = require('directual-api');
|
|
18
14
|
|
|
19
|
-
const
|
|
15
|
+
const api = new Directual.default({
|
|
20
16
|
appID: '...',
|
|
21
|
-
//apiHost: '
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
// apiHost: 'https://api.directual.com' // optional, default
|
|
18
|
+
// streamApiHost: 'https://api.alfa.directual.com' // optional, default (streaming is on alfa for now)
|
|
19
|
+
});
|
|
20
|
+
```
|
|
24
21
|
|
|
22
|
+
### Authentication
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
```js
|
|
25
|
+
// Login
|
|
26
|
+
api.auth.login('username', 'password').then((token) => {
|
|
27
|
+
console.log('sessionID: ' + token.sessionID);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Check session
|
|
31
|
+
api.auth.isAuthorize(sessionID, (isAuth, token) => {
|
|
32
|
+
console.log('authorized:', isAuth);
|
|
33
|
+
});
|
|
30
34
|
|
|
31
|
-
//
|
|
35
|
+
// Logout
|
|
36
|
+
api.auth.logout(sessionID);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Read data (GET)
|
|
40
|
+
|
|
41
|
+
```js
|
|
32
42
|
api
|
|
33
43
|
.structure('UsageHistory')
|
|
34
|
-
.getData('test', {sessionID:
|
|
44
|
+
.getData('test', { sessionID: '...', page: 0 })
|
|
35
45
|
.then((response) => {
|
|
36
|
-
console.dir(response, { depth: null })
|
|
46
|
+
console.dir(response, { depth: null });
|
|
37
47
|
})
|
|
38
48
|
.catch((e) => {
|
|
39
|
-
if(e.response.status === 403){
|
|
40
|
-
//
|
|
49
|
+
if (e.response.status === 403) {
|
|
50
|
+
// API endpoint requires authorization
|
|
41
51
|
}
|
|
42
|
-
if(e.response.status === 400){
|
|
43
|
-
//
|
|
52
|
+
if (e.response.status === 400) {
|
|
53
|
+
// API endpoint not found
|
|
44
54
|
}
|
|
45
|
-
})
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Write data (POST)
|
|
46
59
|
|
|
47
|
-
|
|
60
|
+
```js
|
|
48
61
|
api
|
|
49
62
|
.structure('UsageHistory')
|
|
50
|
-
.setData('test', { id: 1 }, {sessionID:
|
|
63
|
+
.setData('test', { id: 1 }, { sessionID: '...' })
|
|
51
64
|
.then((response) => {
|
|
52
|
-
console.dir(response, { depth: null })
|
|
65
|
+
console.dir(response, { depth: null });
|
|
53
66
|
})
|
|
54
67
|
.catch((e) => {
|
|
55
68
|
if (e.response.status === 403) {
|
|
56
|
-
//
|
|
69
|
+
// API endpoint requires authorization
|
|
57
70
|
}
|
|
58
71
|
if (e.response.status === 400) {
|
|
59
|
-
//
|
|
72
|
+
// API endpoint not found
|
|
60
73
|
}
|
|
61
|
-
})
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Streaming (SSE)
|
|
78
|
+
|
|
79
|
+
Default stream host: `https://api.alfa.directual.com` (override via `streamApiHost` config).
|
|
80
|
+
|
|
81
|
+
#### Init/Subscribe streaming (`initStream`) — recommended
|
|
82
|
+
|
|
83
|
+
Two-phase mechanism: POST to init returns a `streamId`, then we subscribe to the SSE stream.
|
|
84
|
+
|
|
85
|
+
- Init: `POST /good/api/v5/stream/init/{structure}/{method}`
|
|
86
|
+
- Subscribe: `GET /api/v5/stream/subscribe/{streamId}`
|
|
87
|
+
|
|
88
|
+
```js
|
|
89
|
+
const stream = api
|
|
90
|
+
.structure('ai_actions')
|
|
91
|
+
.initStream(
|
|
92
|
+
'platformAIActions',
|
|
93
|
+
{ prompt: 'hello' }, // request body
|
|
94
|
+
{ sessionID: '...' }, // query params
|
|
95
|
+
{
|
|
96
|
+
onData: (data, event) => {
|
|
97
|
+
console.log(event, data);
|
|
98
|
+
},
|
|
99
|
+
onError: (error) => {
|
|
100
|
+
console.error('stream error:', error);
|
|
101
|
+
},
|
|
102
|
+
onComplete: () => {
|
|
103
|
+
console.log('stream finished');
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
// abort the stream at any time
|
|
109
|
+
stream.abort();
|
|
110
|
+
|
|
111
|
+
// await completion
|
|
112
|
+
stream.promise.then(() => console.log('done'));
|
|
113
|
+
|
|
114
|
+
// get the streamId (resolves after init completes)
|
|
115
|
+
stream.streamId.then(id => console.log('stream id:', id));
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
You can also use the two phases separately:
|
|
119
|
+
|
|
120
|
+
```js
|
|
121
|
+
// Phase 1: init — get streamId
|
|
122
|
+
const streamId = await api
|
|
123
|
+
.structure('ai_actions')
|
|
124
|
+
.streamInit('platformAIActions', { prompt: 'hello' }, { sessionID: '...' });
|
|
125
|
+
|
|
126
|
+
// Phase 2: subscribe — read SSE events
|
|
127
|
+
const stream = api
|
|
128
|
+
.structure('ai_actions')
|
|
129
|
+
.streamSubscribe(streamId, {
|
|
130
|
+
onData: (data, event) => console.log(event, data),
|
|
131
|
+
onComplete: () => console.log('done'),
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
#### Legacy: single-request streaming (`setStream`)
|
|
136
|
+
|
|
137
|
+
Single POST where the response body IS the SSE stream.
|
|
138
|
+
Endpoint: `POST /good/api/v5/stream/{structure}/{method}`.
|
|
139
|
+
|
|
140
|
+
```js
|
|
141
|
+
const stream = api
|
|
142
|
+
.structure('UsageHistory')
|
|
143
|
+
.setStream(
|
|
144
|
+
'test',
|
|
145
|
+
{ prompt: 'hello' }, // request body
|
|
146
|
+
{ sessionID: '...' }, // query params
|
|
147
|
+
{
|
|
148
|
+
onData: (data, event) => {
|
|
149
|
+
// event: 'start' | 'chunk' | 'done'
|
|
150
|
+
// data is auto-parsed from JSON (double-encoding handled)
|
|
151
|
+
console.log(event, data);
|
|
152
|
+
},
|
|
153
|
+
onError: (error) => {
|
|
154
|
+
console.error('stream error:', error);
|
|
155
|
+
},
|
|
156
|
+
onComplete: () => {
|
|
157
|
+
console.log('stream finished');
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
// abort the stream at any time
|
|
163
|
+
stream.abort();
|
|
164
|
+
|
|
165
|
+
// or await completion
|
|
166
|
+
stream.promise.then(() => {
|
|
167
|
+
console.log('done');
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### Types
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
import { InitStreamResponse, StreamCallbacks, StreamResponse } from 'directual-api';
|
|
175
|
+
|
|
176
|
+
interface StreamCallbacks {
|
|
177
|
+
onData: (data: any, event: string) => void;
|
|
178
|
+
onError?: (error: Error) => void;
|
|
179
|
+
onComplete?: () => void;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
interface StreamResponse {
|
|
183
|
+
abort: () => void;
|
|
184
|
+
promise: Promise<void>;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
interface InitStreamResponse {
|
|
188
|
+
abort: () => void;
|
|
189
|
+
promise: Promise<void>;
|
|
190
|
+
streamId: Promise<string>;
|
|
191
|
+
}
|
|
192
|
+
```
|
package/lib/api.js
CHANGED
|
@@ -22,6 +22,7 @@ exports.__useDefault = exports.Structure = exports.Config = void 0;
|
|
|
22
22
|
var endpoint_1 = __importDefault(require("./endpoint"));
|
|
23
23
|
var auth_1 = require("./auth");
|
|
24
24
|
var defaultApiHost = 'https://api.directual.com';
|
|
25
|
+
var defaultStreamApiHost = 'https://api.alfa.directual.com';
|
|
25
26
|
var Config = /** @class */ (function () {
|
|
26
27
|
function Config(config) {
|
|
27
28
|
this.config = config;
|
|
@@ -44,9 +45,12 @@ var Api = /** @class */ (function () {
|
|
|
44
45
|
function Api(config) {
|
|
45
46
|
this.config = {};
|
|
46
47
|
this.config = config;
|
|
47
|
-
if (
|
|
48
|
+
if (config.apiHost === undefined) {
|
|
48
49
|
this.config.apiHost = defaultApiHost;
|
|
49
50
|
}
|
|
51
|
+
if (config.streamApiHost === undefined) {
|
|
52
|
+
this.config.streamApiHost = defaultStreamApiHost;
|
|
53
|
+
}
|
|
50
54
|
this.auth = new auth_1.Auth(config);
|
|
51
55
|
}
|
|
52
56
|
Api.prototype.structure = function (name) {
|
package/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEA,wDAAkC;AAClC,+BAA8B;AAC9B,IAAM,cAAc,GAAG,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEA,wDAAkC;AAClC,+BAA8B;AAC9B,IAAM,cAAc,GAAG,2BAA2B,CAAC;AACnD,IAAM,oBAAoB,GAAG,gCAAgC,CAAC;AAE9D;IAGE,gBAAY,MAAW;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IACH,aAAC;AAAD,CAAC,AAND,IAMC;AANY,wBAAM;AAQnB;IAA+B,6BAAQ;IACrC,mBAAY,IAAY,EAAE,MAAW;QACnC,YAAA,MAAK,WAAE,SAAC;QAER,KAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,KAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;IACvB,CAAC;IACH,gBAAC;AAAD,CAAC,AAPD,CAA+B,kBAAQ,GAOtC;AAPY,8BAAS;AAStB;IAIE,aAAY,MAAW;QAHvB,WAAM,GAAQ,EAAE,CAAC;QAIf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC;QACvC,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,oBAAoB,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,WAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,uBAAS,GAAT,UAAU,IAAY;QACpB,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IACH,UAAC;AAAD,CAAC,AAlBD,IAkBC;AAED,kBAAe,GAAG,CAAC;AACR,QAAA,YAAY,GAAG,IAAI,CAAC"}
|
package/lib/directual.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Api from './api';
|
|
2
2
|
export { compareStringByField, extractResponseArray, extractResponseData, extractResponseObject, isDef, isEmptyString, isNotEmpty, isNotEmptyString, numberOfDigitsGreaterThan, stringToArray, } from './utils';
|
|
3
|
+
export { InitStreamResponse, StreamCallbacks, StreamResponse } from './endpoint';
|
|
3
4
|
export { EventType } from './events/EventType';
|
|
4
5
|
export { KeyCodes } from './events/KeyCodes';
|
|
5
6
|
export { HttpStatus, isSuccess } from './net/HttpStatus';
|
package/lib/directual.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directual.js","sourceRoot":"","sources":["../src/directual.ts"],"names":[],"mappings":";;;;;;AAAA,8CAA0C;AAG1C,iCAWiB;AAVf,6GAAA,oBAAoB,OAAA;AACpB,6GAAA,oBAAoB,OAAA;AACpB,4GAAA,mBAAmB,OAAA;AACnB,8GAAA,qBAAqB,OAAA;AACrB,8FAAA,KAAK,OAAA;AACL,sGAAA,aAAa,OAAA;AACb,mGAAA,UAAU,OAAA;AACV,yGAAA,gBAAgB,OAAA;AAChB,kHAAA,yBAAyB,OAAA;AACzB,sGAAA,aAAa,OAAA;
|
|
1
|
+
{"version":3,"file":"directual.js","sourceRoot":"","sources":["../src/directual.ts"],"names":[],"mappings":";;;;;;AAAA,8CAA0C;AAG1C,iCAWiB;AAVf,6GAAA,oBAAoB,OAAA;AACpB,6GAAA,oBAAoB,OAAA;AACpB,4GAAA,mBAAmB,OAAA;AACnB,8GAAA,qBAAqB,OAAA;AACrB,8FAAA,KAAK,OAAA;AACL,sGAAA,aAAa,OAAA;AACb,mGAAA,UAAU,OAAA;AACV,yGAAA,gBAAgB,OAAA;AAChB,kHAAA,yBAAyB,OAAA;AACzB,sGAAA,aAAa,OAAA;AAKf,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,8CAA6C;AAApC,oGAAA,QAAQ,OAAA;AAEjB,+CAAyD;AAAhD,wGAAA,UAAU,OAAA;AAAE,uGAAA,SAAS,OAAA;AAE9B,kBAAe,aAAG,CAAC"}
|
package/lib/endpoint.d.ts
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/** Коллбэки для SSE-стрима */
|
|
2
|
+
export interface StreamCallbacks {
|
|
3
|
+
onData: (data: any, event: string) => void;
|
|
4
|
+
onError?: (error: Error) => void;
|
|
5
|
+
onComplete?: () => void;
|
|
6
|
+
}
|
|
7
|
+
/** Управление стримом: abort + промис завершения */
|
|
8
|
+
export interface StreamResponse {
|
|
9
|
+
abort: () => void;
|
|
10
|
+
promise: Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/** Управление стримом через init/subscribe: abort + промис + streamId */
|
|
13
|
+
export interface InitStreamResponse {
|
|
14
|
+
abort: () => void;
|
|
15
|
+
promise: Promise<void>;
|
|
16
|
+
streamId: Promise<string>;
|
|
17
|
+
}
|
|
1
18
|
export default class Endpoint {
|
|
2
19
|
name: string;
|
|
3
20
|
config: any;
|
|
@@ -13,4 +30,42 @@ export default class Endpoint {
|
|
|
13
30
|
* @return {Promise}
|
|
14
31
|
*/
|
|
15
32
|
setData(name: string, data?: object, params?: object): Promise<any>;
|
|
33
|
+
/**
|
|
34
|
+
* POST-стрим через SSE.
|
|
35
|
+
* URL: /good/api/v5/stream/{структура}/{метод}
|
|
36
|
+
*
|
|
37
|
+
* @return {StreamResponse} — abort() для отмены, promise для ожидания завершения
|
|
38
|
+
*/
|
|
39
|
+
setStream(name: string, data?: object, params?: object, callbacks?: StreamCallbacks): StreamResponse;
|
|
40
|
+
/**
|
|
41
|
+
* Инициализация стрима (фаза 1 нового механизма).
|
|
42
|
+
* POST на /good/api/v5/stream/init/{структура}/{метод} → streamId
|
|
43
|
+
*/
|
|
44
|
+
streamInit(name: string, data?: object, params?: object): Promise<string>;
|
|
45
|
+
/**
|
|
46
|
+
* Подписка на стрим по streamId (фаза 2 нового механизма).
|
|
47
|
+
* GET на /api/v5/stream/subscribe/{streamId}
|
|
48
|
+
*/
|
|
49
|
+
streamSubscribe(streamId: string, callbacks?: StreamCallbacks): StreamResponse;
|
|
50
|
+
/**
|
|
51
|
+
* Стрим через init/subscribe (новый механизм Directual).
|
|
52
|
+
* 1. POST на /good/api/v5/stream/init/{структура}/{метод} → streamId
|
|
53
|
+
* 2. GET на /api/v5/stream/subscribe/{streamId} → SSE-стрим
|
|
54
|
+
*
|
|
55
|
+
* Объединяет обе фазы, API коллбэков идентичен setStream.
|
|
56
|
+
*/
|
|
57
|
+
initStream(name: string, data?: object, params?: object, callbacks?: StreamCallbacks): InitStreamResponse;
|
|
58
|
+
/**
|
|
59
|
+
* Собирает URL для стрим-эндпоинта с query-параметрами
|
|
60
|
+
*/
|
|
61
|
+
private buildStreamUrl;
|
|
62
|
+
/**
|
|
63
|
+
* URL для init-эндпоинта: /good/api/v5/stream/init/{структура}/{метод}
|
|
64
|
+
*/
|
|
65
|
+
private buildStreamInitUrl;
|
|
66
|
+
/**
|
|
67
|
+
* Читает SSE-стрим, парсит события, дёргает коллбэки.
|
|
68
|
+
* При abort тихо завершается без ошибки.
|
|
69
|
+
*/
|
|
70
|
+
private processStream;
|
|
16
71
|
}
|
package/lib/endpoint.js
CHANGED
|
@@ -10,6 +10,42 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
};
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
24
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
13
49
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
50
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
51
|
};
|
|
@@ -23,6 +59,64 @@ var axiosInstance = axios_1.default.create({
|
|
|
23
59
|
},
|
|
24
60
|
},
|
|
25
61
|
});
|
|
62
|
+
/**
|
|
63
|
+
* Парсит буфер SSE-событий.
|
|
64
|
+
* Разбивает по двойному переводу строки, вытаскивает event: и data: поля.
|
|
65
|
+
* Directual шлёт двойную JSON-кодировку (data:"<json-строка>"),
|
|
66
|
+
* поэтому парсим рекурсивно — если после первого parse получили строку, парсим ещё раз.
|
|
67
|
+
*/
|
|
68
|
+
function parseSSEBuffer(buffer) {
|
|
69
|
+
var events = [];
|
|
70
|
+
var parts = buffer.split('\n\n');
|
|
71
|
+
// Последний кусок может быть незавершённым
|
|
72
|
+
var remaining = parts.pop() || '';
|
|
73
|
+
for (var i = 0; i < parts.length; i++) {
|
|
74
|
+
var part = parts[i];
|
|
75
|
+
if (!part.trim())
|
|
76
|
+
continue;
|
|
77
|
+
var lines = part.split('\n');
|
|
78
|
+
var dataLines = [];
|
|
79
|
+
var eventType = 'message';
|
|
80
|
+
for (var j = 0; j < lines.length; j++) {
|
|
81
|
+
var line = lines[j];
|
|
82
|
+
// event-тип (start, chunk, done)
|
|
83
|
+
if (line.indexOf('event: ') === 0) {
|
|
84
|
+
eventType = line.slice(7).trim();
|
|
85
|
+
}
|
|
86
|
+
else if (line.indexOf('event:') === 0) {
|
|
87
|
+
eventType = line.slice(6).trim();
|
|
88
|
+
// data-поле
|
|
89
|
+
}
|
|
90
|
+
else if (line.indexOf('data: ') === 0) {
|
|
91
|
+
dataLines.push(line.slice(6));
|
|
92
|
+
}
|
|
93
|
+
else if (line.indexOf('data:') === 0) {
|
|
94
|
+
dataLines.push(line.slice(5));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (dataLines.length > 0) {
|
|
98
|
+
var rawData = dataLines.join('\n');
|
|
99
|
+
var parsed = rawData;
|
|
100
|
+
try {
|
|
101
|
+
parsed = JSON.parse(rawData);
|
|
102
|
+
// Двойная кодировка — если получили строку, пробуем распарсить ещё раз
|
|
103
|
+
if (typeof parsed === 'string') {
|
|
104
|
+
try {
|
|
105
|
+
parsed = JSON.parse(parsed);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
// Не JSON внутри — ну и хуй с ним, оставляем строку
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
// Совсем не JSON — отдаём как есть
|
|
114
|
+
}
|
|
115
|
+
events.push({ type: eventType, data: parsed });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { events: events, remaining: remaining };
|
|
119
|
+
}
|
|
26
120
|
var Endpoint = /** @class */ (function () {
|
|
27
121
|
function Endpoint() {
|
|
28
122
|
}
|
|
@@ -52,6 +146,288 @@ var Endpoint = /** @class */ (function () {
|
|
|
52
146
|
})
|
|
53
147
|
.then(utils_1.extractResponseData);
|
|
54
148
|
};
|
|
149
|
+
/**
|
|
150
|
+
* POST-стрим через SSE.
|
|
151
|
+
* URL: /good/api/v5/stream/{структура}/{метод}
|
|
152
|
+
*
|
|
153
|
+
* @return {StreamResponse} — abort() для отмены, promise для ожидания завершения
|
|
154
|
+
*/
|
|
155
|
+
Endpoint.prototype.setStream = function (name, data, params, callbacks) {
|
|
156
|
+
var url = this.buildStreamUrl(name, params);
|
|
157
|
+
var controller = new AbortController();
|
|
158
|
+
var promise = this.processStream(url, {
|
|
159
|
+
method: 'POST',
|
|
160
|
+
headers: {
|
|
161
|
+
'Content-Type': 'application/json',
|
|
162
|
+
Accept: 'text/event-stream',
|
|
163
|
+
},
|
|
164
|
+
body: data ? JSON.stringify(data) : undefined,
|
|
165
|
+
signal: controller.signal,
|
|
166
|
+
}, callbacks);
|
|
167
|
+
return { abort: function () { return controller.abort(); }, promise: promise };
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* Инициализация стрима (фаза 1 нового механизма).
|
|
171
|
+
* POST на /good/api/v5/stream/init/{структура}/{метод} → streamId
|
|
172
|
+
*/
|
|
173
|
+
Endpoint.prototype.streamInit = function (name, data, params) {
|
|
174
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
175
|
+
var url, response, result;
|
|
176
|
+
return __generator(this, function (_a) {
|
|
177
|
+
switch (_a.label) {
|
|
178
|
+
case 0:
|
|
179
|
+
url = this.buildStreamInitUrl(name, params);
|
|
180
|
+
return [4 /*yield*/, fetch(url, {
|
|
181
|
+
method: 'POST',
|
|
182
|
+
headers: { 'Content-Type': 'application/json' },
|
|
183
|
+
body: data ? JSON.stringify(data) : undefined,
|
|
184
|
+
})];
|
|
185
|
+
case 1:
|
|
186
|
+
response = _a.sent();
|
|
187
|
+
if (!response.ok) {
|
|
188
|
+
throw new Error("HTTP ".concat(response.status, ": ").concat(response.statusText));
|
|
189
|
+
}
|
|
190
|
+
return [4 /*yield*/, response.json()];
|
|
191
|
+
case 2:
|
|
192
|
+
result = _a.sent();
|
|
193
|
+
if (typeof result === 'string')
|
|
194
|
+
return [2 /*return*/, result];
|
|
195
|
+
if (result && result.streamId)
|
|
196
|
+
return [2 /*return*/, result.streamId];
|
|
197
|
+
throw new Error('streamInit: streamId не найден в ответе');
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Подписка на стрим по streamId (фаза 2 нового механизма).
|
|
204
|
+
* GET на /api/v5/stream/subscribe/{streamId}
|
|
205
|
+
*/
|
|
206
|
+
Endpoint.prototype.streamSubscribe = function (streamId, callbacks) {
|
|
207
|
+
var host = (this.config.streamApiHost || '').replace(/\/+$/, '');
|
|
208
|
+
var url = "".concat(host, "/api/v5/stream/subscribe/").concat(streamId);
|
|
209
|
+
var controller = new AbortController();
|
|
210
|
+
var promise = this.processStream(url, {
|
|
211
|
+
method: 'GET',
|
|
212
|
+
headers: { Accept: 'text/event-stream' },
|
|
213
|
+
signal: controller.signal,
|
|
214
|
+
}, callbacks);
|
|
215
|
+
return { abort: function () { return controller.abort(); }, promise: promise };
|
|
216
|
+
};
|
|
217
|
+
/**
|
|
218
|
+
* Стрим через init/subscribe (новый механизм Directual).
|
|
219
|
+
* 1. POST на /good/api/v5/stream/init/{структура}/{метод} → streamId
|
|
220
|
+
* 2. GET на /api/v5/stream/subscribe/{streamId} → SSE-стрим
|
|
221
|
+
*
|
|
222
|
+
* Объединяет обе фазы, API коллбэков идентичен setStream.
|
|
223
|
+
*/
|
|
224
|
+
Endpoint.prototype.initStream = function (name, data, params, callbacks) {
|
|
225
|
+
var _this = this;
|
|
226
|
+
var controller = new AbortController();
|
|
227
|
+
var resolveStreamId;
|
|
228
|
+
var rejectStreamId;
|
|
229
|
+
var streamIdPromise = new Promise(function (resolve, reject) {
|
|
230
|
+
resolveStreamId = resolve;
|
|
231
|
+
rejectStreamId = reject;
|
|
232
|
+
});
|
|
233
|
+
// Глушим unhandled rejection если никто не слушает streamId
|
|
234
|
+
streamIdPromise.catch(function () { });
|
|
235
|
+
var promise = (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
236
|
+
var initUrl, initResponse, error_1, err, err, result, error_2, err, streamId, err, host, subscribeUrl;
|
|
237
|
+
return __generator(this, function (_a) {
|
|
238
|
+
switch (_a.label) {
|
|
239
|
+
case 0:
|
|
240
|
+
initUrl = this.buildStreamInitUrl(name, params);
|
|
241
|
+
_a.label = 1;
|
|
242
|
+
case 1:
|
|
243
|
+
_a.trys.push([1, 3, , 4]);
|
|
244
|
+
return [4 /*yield*/, fetch(initUrl, {
|
|
245
|
+
method: 'POST',
|
|
246
|
+
headers: { 'Content-Type': 'application/json' },
|
|
247
|
+
body: data ? JSON.stringify(data) : undefined,
|
|
248
|
+
signal: controller.signal,
|
|
249
|
+
})];
|
|
250
|
+
case 2:
|
|
251
|
+
initResponse = _a.sent();
|
|
252
|
+
return [3 /*break*/, 4];
|
|
253
|
+
case 3:
|
|
254
|
+
error_1 = _a.sent();
|
|
255
|
+
if (error_1 instanceof Error && error_1.name === 'AbortError') {
|
|
256
|
+
rejectStreamId(new Error('Aborted'));
|
|
257
|
+
return [2 /*return*/];
|
|
258
|
+
}
|
|
259
|
+
err = error_1 instanceof Error ? error_1 : new Error(String(error_1));
|
|
260
|
+
rejectStreamId(err);
|
|
261
|
+
if (callbacks && callbacks.onError)
|
|
262
|
+
callbacks.onError(err);
|
|
263
|
+
throw err;
|
|
264
|
+
case 4:
|
|
265
|
+
if (!initResponse.ok) {
|
|
266
|
+
err = new Error("HTTP ".concat(initResponse.status, ": ").concat(initResponse.statusText));
|
|
267
|
+
rejectStreamId(err);
|
|
268
|
+
if (callbacks && callbacks.onError)
|
|
269
|
+
callbacks.onError(err);
|
|
270
|
+
throw err;
|
|
271
|
+
}
|
|
272
|
+
_a.label = 5;
|
|
273
|
+
case 5:
|
|
274
|
+
_a.trys.push([5, 7, , 8]);
|
|
275
|
+
return [4 /*yield*/, initResponse.json()];
|
|
276
|
+
case 6:
|
|
277
|
+
result = _a.sent();
|
|
278
|
+
return [3 /*break*/, 8];
|
|
279
|
+
case 7:
|
|
280
|
+
error_2 = _a.sent();
|
|
281
|
+
err = new Error('streamInit: невалидный JSON в ответе');
|
|
282
|
+
rejectStreamId(err);
|
|
283
|
+
if (callbacks && callbacks.onError)
|
|
284
|
+
callbacks.onError(err);
|
|
285
|
+
throw err;
|
|
286
|
+
case 8:
|
|
287
|
+
streamId = typeof result === 'string' ? result : result && result.streamId;
|
|
288
|
+
if (!streamId) {
|
|
289
|
+
err = new Error('streamInit: streamId не найден в ответе');
|
|
290
|
+
rejectStreamId(err);
|
|
291
|
+
if (callbacks && callbacks.onError)
|
|
292
|
+
callbacks.onError(err);
|
|
293
|
+
throw err;
|
|
294
|
+
}
|
|
295
|
+
resolveStreamId(streamId);
|
|
296
|
+
host = (this.config.streamApiHost || '').replace(/\/+$/, '');
|
|
297
|
+
subscribeUrl = "".concat(host, "/api/v5/stream/subscribe/").concat(streamId);
|
|
298
|
+
return [4 /*yield*/, this.processStream(subscribeUrl, {
|
|
299
|
+
method: 'GET',
|
|
300
|
+
headers: { Accept: 'text/event-stream' },
|
|
301
|
+
signal: controller.signal,
|
|
302
|
+
}, callbacks)];
|
|
303
|
+
case 9:
|
|
304
|
+
_a.sent();
|
|
305
|
+
return [2 /*return*/];
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}); })();
|
|
309
|
+
return {
|
|
310
|
+
abort: function () { return controller.abort(); },
|
|
311
|
+
promise: promise,
|
|
312
|
+
streamId: streamIdPromise,
|
|
313
|
+
};
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* Собирает URL для стрим-эндпоинта с query-параметрами
|
|
317
|
+
*/
|
|
318
|
+
Endpoint.prototype.buildStreamUrl = function (method, params) {
|
|
319
|
+
var allParams = __assign(__assign({}, this.config), params);
|
|
320
|
+
var query = new URLSearchParams();
|
|
321
|
+
Object.keys(allParams).forEach(function (key) {
|
|
322
|
+
if (allParams[key] !== undefined && allParams[key] !== null) {
|
|
323
|
+
query.append(key, String(allParams[key]));
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
// Обрезаем trailing слэши, чтобы '' и '/' давали same-origin путь
|
|
327
|
+
var host = (this.config.streamApiHost || '').replace(/\/+$/, '');
|
|
328
|
+
return "".concat(host, "/good/api/v5/stream/").concat(this.name, "/").concat(method, "?").concat(query.toString());
|
|
329
|
+
};
|
|
330
|
+
/**
|
|
331
|
+
* URL для init-эндпоинта: /good/api/v5/stream/init/{структура}/{метод}
|
|
332
|
+
*/
|
|
333
|
+
Endpoint.prototype.buildStreamInitUrl = function (method, params) {
|
|
334
|
+
var allParams = __assign(__assign({}, this.config), params);
|
|
335
|
+
var query = new URLSearchParams();
|
|
336
|
+
Object.keys(allParams).forEach(function (key) {
|
|
337
|
+
if (allParams[key] !== undefined && allParams[key] !== null) {
|
|
338
|
+
query.append(key, String(allParams[key]));
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
var host = (this.config.streamApiHost || '').replace(/\/+$/, '');
|
|
342
|
+
return "".concat(host, "/good/api/v5/stream/init/").concat(this.name, "/").concat(method, "?").concat(query.toString());
|
|
343
|
+
};
|
|
344
|
+
/**
|
|
345
|
+
* Читает SSE-стрим, парсит события, дёргает коллбэки.
|
|
346
|
+
* При abort тихо завершается без ошибки.
|
|
347
|
+
*/
|
|
348
|
+
Endpoint.prototype.processStream = function (url, init, callbacks) {
|
|
349
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
350
|
+
var response, error_3, err, err, body, err, reader, decoder, buffer, chunk, parsed, i, parsed, i, error_4, err;
|
|
351
|
+
return __generator(this, function (_a) {
|
|
352
|
+
switch (_a.label) {
|
|
353
|
+
case 0:
|
|
354
|
+
_a.trys.push([0, 2, , 3]);
|
|
355
|
+
return [4 /*yield*/, fetch(url, init)];
|
|
356
|
+
case 1:
|
|
357
|
+
response = _a.sent();
|
|
358
|
+
return [3 /*break*/, 3];
|
|
359
|
+
case 2:
|
|
360
|
+
error_3 = _a.sent();
|
|
361
|
+
if (error_3 instanceof Error && error_3.name === 'AbortError')
|
|
362
|
+
return [2 /*return*/];
|
|
363
|
+
err = error_3 instanceof Error ? error_3 : new Error(String(error_3));
|
|
364
|
+
if (callbacks && callbacks.onError)
|
|
365
|
+
callbacks.onError(err);
|
|
366
|
+
throw err;
|
|
367
|
+
case 3:
|
|
368
|
+
if (!response.ok) {
|
|
369
|
+
err = new Error("HTTP ".concat(response.status, ": ").concat(response.statusText));
|
|
370
|
+
if (callbacks && callbacks.onError)
|
|
371
|
+
callbacks.onError(err);
|
|
372
|
+
throw err;
|
|
373
|
+
}
|
|
374
|
+
body = response.body;
|
|
375
|
+
if (!body) {
|
|
376
|
+
err = new Error('Response body is null — стрим недоступен');
|
|
377
|
+
if (callbacks && callbacks.onError)
|
|
378
|
+
callbacks.onError(err);
|
|
379
|
+
throw err;
|
|
380
|
+
}
|
|
381
|
+
reader = body.getReader();
|
|
382
|
+
decoder = new TextDecoder();
|
|
383
|
+
buffer = '';
|
|
384
|
+
_a.label = 4;
|
|
385
|
+
case 4:
|
|
386
|
+
_a.trys.push([4, 8, , 9]);
|
|
387
|
+
_a.label = 5;
|
|
388
|
+
case 5:
|
|
389
|
+
if (!true) return [3 /*break*/, 7];
|
|
390
|
+
return [4 /*yield*/, reader.read()];
|
|
391
|
+
case 6:
|
|
392
|
+
chunk = _a.sent();
|
|
393
|
+
if (chunk.done)
|
|
394
|
+
return [3 /*break*/, 7];
|
|
395
|
+
buffer += decoder.decode(chunk.value, { stream: true });
|
|
396
|
+
parsed = parseSSEBuffer(buffer);
|
|
397
|
+
buffer = parsed.remaining;
|
|
398
|
+
for (i = 0; i < parsed.events.length; i++) {
|
|
399
|
+
if (callbacks && callbacks.onData) {
|
|
400
|
+
callbacks.onData(parsed.events[i].data, parsed.events[i].type);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return [3 /*break*/, 5];
|
|
404
|
+
case 7:
|
|
405
|
+
// Дочитываем остатки буфера
|
|
406
|
+
if (buffer.trim()) {
|
|
407
|
+
parsed = parseSSEBuffer(buffer + '\n\n');
|
|
408
|
+
for (i = 0; i < parsed.events.length; i++) {
|
|
409
|
+
if (callbacks && callbacks.onData) {
|
|
410
|
+
callbacks.onData(parsed.events[i].data, parsed.events[i].type);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (callbacks && callbacks.onComplete) {
|
|
415
|
+
callbacks.onComplete();
|
|
416
|
+
}
|
|
417
|
+
return [3 /*break*/, 9];
|
|
418
|
+
case 8:
|
|
419
|
+
error_4 = _a.sent();
|
|
420
|
+
if (error_4 instanceof Error && error_4.name === 'AbortError')
|
|
421
|
+
return [2 /*return*/];
|
|
422
|
+
err = error_4 instanceof Error ? error_4 : new Error(String(error_4));
|
|
423
|
+
if (callbacks && callbacks.onError)
|
|
424
|
+
callbacks.onError(err);
|
|
425
|
+
throw err;
|
|
426
|
+
case 9: return [2 /*return*/];
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
};
|
|
55
431
|
return Endpoint;
|
|
56
432
|
}());
|
|
57
433
|
exports.default = Endpoint;
|
package/lib/endpoint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iCAA8C;AAC9C,gDAA0B;AAE1B,IAAM,aAAa,GAAG,eAAK,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,cAAc,EAAE,kBAAkB;SACnC;KACF;CACF,CAAC,CAAC;AAEH;IAAA;IAqCA,CAAC;IAjCC;;;;OAIG;IACH,0BAAO,GAAP,UAAQ,IAAY,EAAE,MAAe,EAAE,OAAgB;QACrD,OAAO,aAAa;aACjB,OAAO,YACN,MAAM,EAAE,KAAK,EACb,GAAG,EAAE,4BAAqB,IAAI,CAAC,IAAI,cAAI,IAAI,CAAE,EAC7C,OAAO,EAAE,UAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAE,EACjC,MAAM,wBAAO,IAAI,CAAC,MAAM,GAAK,MAAM,KAChC,OAAO,EACV;aACD,IAAI,CAAC,2BAAmB,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,0BAAO,GAAP,UAAQ,IAAY,EAAE,IAAa,EAAE,MAAe;QAClD,OAAO,aAAa;aACjB,OAAO,CAAC;YACP,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,4BAAqB,IAAI,CAAC,IAAI,cAAI,IAAI,CAAE;YAC7C,OAAO,EAAE,UAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAE;YACjC,MAAM,wBAAO,IAAI,CAAC,MAAM,GAAK,MAAM,CAAE;YACrC,IAAI,MAAA;SACL,CAAC;aACD,IAAI,CAAC,2BAAmB,CAAC,CAAC;IAC/B,CAAC;IACH,eAAC;AAAD,CAAC,AArCD,IAqCC"}
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":"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"}
|