directual-api 1.4.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -29
- package/lib/api.js +4 -0
- 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 +27 -0
- package/lib/endpoint.js +214 -0
- package/lib/endpoint.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,60 +2,130 @@
|
|
|
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
|
+
```
|
|
21
|
+
|
|
22
|
+
### Authentication
|
|
24
23
|
|
|
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
|
+
});
|
|
34
|
+
|
|
35
|
+
// Logout
|
|
36
|
+
api.auth.logout(sessionID);
|
|
37
|
+
```
|
|
25
38
|
|
|
26
|
-
|
|
27
|
-
api.auth.login("test", "test").then((res)=>{
|
|
28
|
-
console.log("sessionID" + res.sessionID)
|
|
29
|
-
})
|
|
39
|
+
### Read data (GET)
|
|
30
40
|
|
|
31
|
-
|
|
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
|
+
Streaming methods use Server-Sent Events over HTTP.
|
|
80
|
+
Endpoint URL: `/good/api/v5/stream/{structure}/{method}` (instead of `/data/`).
|
|
81
|
+
Default stream host: `https://api.alfa.directual.com` (override via `streamApiHost` config).
|
|
82
|
+
|
|
83
|
+
#### POST stream (`setStream`)
|
|
84
|
+
|
|
85
|
+
```js
|
|
86
|
+
const stream = api
|
|
87
|
+
.structure('UsageHistory')
|
|
88
|
+
.setStream(
|
|
89
|
+
'test',
|
|
90
|
+
{ prompt: 'hello' }, // request body
|
|
91
|
+
{ sessionID: '...' }, // query params
|
|
92
|
+
{
|
|
93
|
+
onData: (data, event) => {
|
|
94
|
+
// event: 'start' | 'chunk' | 'done'
|
|
95
|
+
// data is auto-parsed from JSON (double-encoding handled)
|
|
96
|
+
console.log(event, data);
|
|
97
|
+
},
|
|
98
|
+
onError: (error) => {
|
|
99
|
+
console.error('stream error:', error);
|
|
100
|
+
},
|
|
101
|
+
onComplete: () => {
|
|
102
|
+
console.log('stream finished');
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
// abort the stream at any time
|
|
108
|
+
stream.abort();
|
|
109
|
+
|
|
110
|
+
// or await completion
|
|
111
|
+
stream.promise.then(() => {
|
|
112
|
+
console.log('done');
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### Types
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
import { StreamCallbacks, StreamResponse } from 'directual-api';
|
|
120
|
+
|
|
121
|
+
interface StreamCallbacks {
|
|
122
|
+
onData: (data: any, event: string) => void;
|
|
123
|
+
onError?: (error: Error) => void;
|
|
124
|
+
onComplete?: () => void;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
interface StreamResponse {
|
|
128
|
+
abort: () => void;
|
|
129
|
+
promise: Promise<void>;
|
|
130
|
+
}
|
|
131
|
+
```
|
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;
|
|
@@ -47,6 +48,9 @@ var Api = /** @class */ (function () {
|
|
|
47
48
|
if (!config.apiHost) {
|
|
48
49
|
this.config.apiHost = defaultApiHost;
|
|
49
50
|
}
|
|
51
|
+
if (!config.streamApiHost) {
|
|
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,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC1B,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 { 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,14 @@
|
|
|
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
|
+
}
|
|
1
12
|
export default class Endpoint {
|
|
2
13
|
name: string;
|
|
3
14
|
config: any;
|
|
@@ -13,4 +24,20 @@ export default class Endpoint {
|
|
|
13
24
|
* @return {Promise}
|
|
14
25
|
*/
|
|
15
26
|
setData(name: string, data?: object, params?: object): Promise<any>;
|
|
27
|
+
/**
|
|
28
|
+
* POST-стрим через SSE.
|
|
29
|
+
* URL: /good/api/v5/stream/{структура}/{метод}
|
|
30
|
+
*
|
|
31
|
+
* @return {StreamResponse} — abort() для отмены, promise для ожидания завершения
|
|
32
|
+
*/
|
|
33
|
+
setStream(name: string, data?: object, params?: object, callbacks?: StreamCallbacks): StreamResponse;
|
|
34
|
+
/**
|
|
35
|
+
* Собирает URL для стрим-эндпоинта с query-параметрами
|
|
36
|
+
*/
|
|
37
|
+
private buildStreamUrl;
|
|
38
|
+
/**
|
|
39
|
+
* Читает SSE-стрим, парсит события, дёргает коллбэки.
|
|
40
|
+
* При abort тихо завершается без ошибки.
|
|
41
|
+
*/
|
|
42
|
+
private processStream;
|
|
16
43
|
}
|
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,126 @@ 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
|
+
* Собирает URL для стрим-эндпоинта с query-параметрами
|
|
171
|
+
*/
|
|
172
|
+
Endpoint.prototype.buildStreamUrl = function (method, params) {
|
|
173
|
+
var allParams = __assign(__assign({}, this.config), params);
|
|
174
|
+
var query = new URLSearchParams();
|
|
175
|
+
Object.keys(allParams).forEach(function (key) {
|
|
176
|
+
if (allParams[key] !== undefined && allParams[key] !== null) {
|
|
177
|
+
query.append(key, String(allParams[key]));
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
return "".concat(this.config.streamApiHost, "/good/api/v5/stream/").concat(this.name, "/").concat(method, "?").concat(query.toString());
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Читает SSE-стрим, парсит события, дёргает коллбэки.
|
|
184
|
+
* При abort тихо завершается без ошибки.
|
|
185
|
+
*/
|
|
186
|
+
Endpoint.prototype.processStream = function (url, init, callbacks) {
|
|
187
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
188
|
+
var response, error_1, err, err, body, err, reader, decoder, buffer, chunk, parsed, i, parsed, i, error_2, err;
|
|
189
|
+
return __generator(this, function (_a) {
|
|
190
|
+
switch (_a.label) {
|
|
191
|
+
case 0:
|
|
192
|
+
_a.trys.push([0, 2, , 3]);
|
|
193
|
+
return [4 /*yield*/, fetch(url, init)];
|
|
194
|
+
case 1:
|
|
195
|
+
response = _a.sent();
|
|
196
|
+
return [3 /*break*/, 3];
|
|
197
|
+
case 2:
|
|
198
|
+
error_1 = _a.sent();
|
|
199
|
+
if (error_1 instanceof Error && error_1.name === 'AbortError')
|
|
200
|
+
return [2 /*return*/];
|
|
201
|
+
err = error_1 instanceof Error ? error_1 : new Error(String(error_1));
|
|
202
|
+
if (callbacks && callbacks.onError)
|
|
203
|
+
callbacks.onError(err);
|
|
204
|
+
throw err;
|
|
205
|
+
case 3:
|
|
206
|
+
if (!response.ok) {
|
|
207
|
+
err = new Error("HTTP ".concat(response.status, ": ").concat(response.statusText));
|
|
208
|
+
if (callbacks && callbacks.onError)
|
|
209
|
+
callbacks.onError(err);
|
|
210
|
+
throw err;
|
|
211
|
+
}
|
|
212
|
+
body = response.body;
|
|
213
|
+
if (!body) {
|
|
214
|
+
err = new Error('Response body is null — стрим недоступен');
|
|
215
|
+
if (callbacks && callbacks.onError)
|
|
216
|
+
callbacks.onError(err);
|
|
217
|
+
throw err;
|
|
218
|
+
}
|
|
219
|
+
reader = body.getReader();
|
|
220
|
+
decoder = new TextDecoder();
|
|
221
|
+
buffer = '';
|
|
222
|
+
_a.label = 4;
|
|
223
|
+
case 4:
|
|
224
|
+
_a.trys.push([4, 8, , 9]);
|
|
225
|
+
_a.label = 5;
|
|
226
|
+
case 5:
|
|
227
|
+
if (!true) return [3 /*break*/, 7];
|
|
228
|
+
return [4 /*yield*/, reader.read()];
|
|
229
|
+
case 6:
|
|
230
|
+
chunk = _a.sent();
|
|
231
|
+
if (chunk.done)
|
|
232
|
+
return [3 /*break*/, 7];
|
|
233
|
+
buffer += decoder.decode(chunk.value, { stream: true });
|
|
234
|
+
parsed = parseSSEBuffer(buffer);
|
|
235
|
+
buffer = parsed.remaining;
|
|
236
|
+
for (i = 0; i < parsed.events.length; i++) {
|
|
237
|
+
if (callbacks && callbacks.onData) {
|
|
238
|
+
callbacks.onData(parsed.events[i].data, parsed.events[i].type);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return [3 /*break*/, 5];
|
|
242
|
+
case 7:
|
|
243
|
+
// Дочитываем остатки буфера
|
|
244
|
+
if (buffer.trim()) {
|
|
245
|
+
parsed = parseSSEBuffer(buffer + '\n\n');
|
|
246
|
+
for (i = 0; i < parsed.events.length; i++) {
|
|
247
|
+
if (callbacks && callbacks.onData) {
|
|
248
|
+
callbacks.onData(parsed.events[i].data, parsed.events[i].type);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (callbacks && callbacks.onComplete) {
|
|
253
|
+
callbacks.onComplete();
|
|
254
|
+
}
|
|
255
|
+
return [3 /*break*/, 9];
|
|
256
|
+
case 8:
|
|
257
|
+
error_2 = _a.sent();
|
|
258
|
+
if (error_2 instanceof Error && error_2.name === 'AbortError')
|
|
259
|
+
return [2 /*return*/];
|
|
260
|
+
err = error_2 instanceof Error ? error_2 : new Error(String(error_2));
|
|
261
|
+
if (callbacks && callbacks.onError)
|
|
262
|
+
callbacks.onError(err);
|
|
263
|
+
throw err;
|
|
264
|
+
case 9: return [2 /*return*/];
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
};
|
|
55
269
|
return Endpoint;
|
|
56
270
|
}());
|
|
57
271
|
exports.default = Endpoint;
|
package/lib/endpoint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":"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"}
|