bx-rest 1.5.0 → 1.6.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/CHANGELOG.md +177 -0
- package/README.en.md +116 -5
- package/README.md +117 -5
- package/esm2022/functions/errors.mjs +17 -5
- package/esm2022/functions/mapResult.mjs +4 -2
- package/esm2022/functions/uniqueElementCode.mjs +24 -0
- package/esm2022/map/disk.mjs +13 -0
- package/esm2022/map/im/recent.mjs +1 -9
- package/esm2022/map/task.mjs +11 -5
- package/esm2022/map/tasks/task.mjs +3 -3
- package/esm2022/map/tasks.mjs +4 -3
- package/esm2022/map/user.mjs +5 -4
- package/esm2022/public-api.mjs +2 -2
- package/esm2022/request-navvy/bizproc.mjs +19 -10
- package/esm2022/request-navvy/calendar/event.mjs +1 -9
- package/esm2022/request-navvy/disk/operation.mjs +3 -10
- package/esm2022/request-navvy/pull/config.mjs +1 -3
- package/esm2022/request-navvy/socialnetwork/api/livefeed.mjs +1 -5
- package/esm2022/request-navvy/task/operation/elapseditem.mjs +14 -71
- package/esm2022/request-navvy/tasks/task.mjs +1 -119
- package/esm2022/rest/map.mjs +3 -3
- package/esm2022/rest/navvy.mjs +66 -64
- package/esm2022/services/base.mjs +7 -7
- package/esm2022/services/context.mjs +59 -0
- package/esm2022/services/http/HttpBX.mjs +55 -20
- package/esm2022/services/http/authRefresh.mjs +25 -23
- package/esm2022/services/http/http.mjs +14 -69
- package/esm2022/services/http/middleware.mjs +149 -0
- package/esm2022/services/http/sessionKey.mjs +16 -5
- package/esm2022/services/http/transport.mjs +5 -0
- package/esm2022/services/navvy/extends/navvy-pag-base.mjs +63 -9
- package/esm2022/services/navvy/navvy-alternative-pagination-navigation.mjs +21 -71
- package/esm2022/services/navvy/navvy-pag-nav-result-key-object.mjs +10 -49
- package/esm2022/services/navvy/navvy-pag-nav-result-key.mjs +14 -73
- package/esm2022/services/navvy/navvy-pag-nav-tasks.mjs +4 -76
- package/esm2022/services/navvy/navvy-pag-nav-with-useless-key.mjs +10 -76
- package/esm2022/services/navvy/navvy-pag.mjs +7 -65
- package/esm2022/services/navvy/navvy-support.mjs +2 -15
- package/esm2022/services/navvy.mjs +18 -31
- package/esm2022/typification/rest/calendar/event/get.mjs +1 -1
- package/esm2022/typification/rest/settings.mjs +1 -1
- package/esm2022/typification/rest/tasks/task/get.mjs +1 -1
- package/esm2022/typification/rest/user/user.mjs +1 -1
- package/esm2022/typification/settings.mjs +1 -1
- package/fesm2022/bx-rest.mjs +860 -2038
- package/fesm2022/bx-rest.mjs.map +1 -1
- package/functions/errors.d.ts +9 -0
- package/functions/uniqueElementCode.d.ts +12 -0
- package/map/disk.d.ts +10 -0
- package/map/task.d.ts +3 -3
- package/map/tasks/task.d.ts +1 -1
- package/map/tasks.d.ts +1 -1
- package/package.json +5 -2
- package/public-api.d.ts +7 -3
- package/request-navvy/pull/config.d.ts +0 -2
- package/rest/map.d.ts +2 -2
- package/rest/navvy.d.ts +9 -0
- package/services/context.d.ts +43 -0
- package/services/http/HttpBX.d.ts +10 -0
- package/services/http/authRefresh.d.ts +5 -1
- package/services/http/http.d.ts +12 -9
- package/services/http/middleware.d.ts +31 -0
- package/services/http/sessionKey.d.ts +10 -0
- package/services/http/transport.d.ts +28 -0
- package/services/navvy/extends/navvy-pag-base.d.ts +16 -2
- package/services/navvy/navvy-alternative-pagination-navigation.d.ts +5 -2
- package/services/navvy/navvy-pag-nav-result-key-object.d.ts +0 -2
- package/services/navvy/navvy-pag-nav-result-key.d.ts +1 -4
- package/services/navvy/navvy-pag-nav-tasks.d.ts +2 -9
- package/services/navvy/navvy-pag-nav-with-useless-key.d.ts +0 -2
- package/services/navvy/navvy-pag.d.ts +0 -2
- package/services/navvy/navvy-support.d.ts +0 -10
- package/services/navvy.d.ts +1 -0
- package/typification/rest/calendar/event/get.d.ts +1 -1
- package/typification/rest/settings.d.ts +1 -0
- package/typification/rest/user/user.d.ts +3 -3
- package/typification/settings.d.ts +34 -0
- package/esm2022/functions/errorHandler.mjs +0 -34
- package/esm2022/request/app.mjs +0 -13
- package/esm2022/request/bizproc/activity.mjs +0 -3
- package/esm2022/request/bizproc/event.mjs +0 -3
- package/esm2022/request/bizproc/robot.mjs +0 -3
- package/esm2022/request/bizproc/task.mjs +0 -3
- package/esm2022/request/bizproc/workflow/instance.mjs +0 -3
- package/esm2022/request/bizproc/workflow/template.mjs +0 -3
- package/esm2022/request/bizproc/workflow.mjs +0 -18
- package/esm2022/request/bizproc.mjs +0 -15
- package/esm2022/request/department.mjs +0 -26
- package/esm2022/request/disk/attachedObject.mjs +0 -14
- package/esm2022/request/disk/file.mjs +0 -18
- package/esm2022/request/disk/folder.mjs +0 -117
- package/esm2022/request/disk.mjs +0 -11
- package/esm2022/request/lists/element.mjs +0 -18
- package/esm2022/request/lists/field.mjs +0 -35
- package/esm2022/request/lists.mjs +0 -86
- package/esm2022/request/log/blogcomment.mjs +0 -3
- package/esm2022/request/log/blogpost.mjs +0 -18
- package/esm2022/request/log.mjs +0 -9
- package/esm2022/request/pull/application/config.mjs +0 -11
- package/esm2022/request/pull/channel/public.mjs +0 -18
- package/esm2022/request/pull/config.mjs +0 -13
- package/esm2022/request/pull.mjs +0 -11
- package/esm2022/request/server.mjs +0 -14
- package/esm2022/request/socialnetwork/api/contentview.mjs +0 -14
- package/esm2022/request/socialnetwork/api/livefeed/blogpost/important.mjs +0 -14
- package/esm2022/request/socialnetwork/api/livefeed/blogpost.mjs +0 -7
- package/esm2022/request/socialnetwork/api/livefeed.mjs +0 -7
- package/esm2022/request/socialnetwork/api.mjs +0 -9
- package/esm2022/request/socialnetwork.mjs +0 -8
- package/esm2022/request/sonet_group.mjs +0 -24
- package/esm2022/request/task/commentitem.mjs +0 -32
- package/esm2022/request/task/elapseditem.mjs +0 -40
- package/esm2022/request/task/item/userfield.mjs +0 -14
- package/esm2022/request/task/item.mjs +0 -7
- package/esm2022/request/task/planner.mjs +0 -11
- package/esm2022/request/task.mjs +0 -13
- package/esm2022/request/tasks/task/result.mjs +0 -22
- package/esm2022/request/tasks/task.mjs +0 -110
- package/esm2022/request/tasks.mjs +0 -7
- package/esm2022/request/user/userfield.mjs +0 -14
- package/esm2022/request/user.mjs +0 -40
- package/esm2022/rest/base.mjs +0 -39
- package/esm2022/services/http/HttpData.mjs +0 -77
- package/esm2022/services/http/base/base.mjs +0 -4
- package/esm2022/services/http/httpNavvy.mjs +0 -14
- package/esm2022/typification/base/answers.mjs +0 -438
- package/esm2022/typification/base/params.mjs +0 -525
- package/esm2022/typification/base/workpiece/methods-list.mjs +0 -2
- package/esm2022/typification/base/workpiece/methods.mjs +0 -2
- package/functions/errorHandler.d.ts +0 -10
- package/request/app.d.ts +0 -8
- package/request/bizproc/activity.d.ts +0 -2
- package/request/bizproc/event.d.ts +0 -2
- package/request/bizproc/robot.d.ts +0 -2
- package/request/bizproc/task.d.ts +0 -2
- package/request/bizproc/workflow/instance.d.ts +0 -2
- package/request/bizproc/workflow/template.d.ts +0 -2
- package/request/bizproc/workflow.d.ts +0 -13
- package/request/bizproc.d.ts +0 -12
- package/request/department.d.ts +0 -18
- package/request/disk/attachedObject.d.ts +0 -8
- package/request/disk/file.d.ts +0 -10
- package/request/disk/folder.d.ts +0 -96
- package/request/disk.d.ts +0 -8
- package/request/lists/element.d.ts +0 -11
- package/request/lists/field.d.ts +0 -11
- package/request/lists.d.ts +0 -31
- package/request/log/blogcomment.d.ts +0 -2
- package/request/log/blogpost.d.ts +0 -11
- package/request/log.d.ts +0 -6
- package/request/pull/application/config.d.ts +0 -5
- package/request/pull/channel/public.d.ts +0 -5
- package/request/pull/config.d.ts +0 -7
- package/request/pull.d.ts +0 -8
- package/request/server.d.ts +0 -7
- package/request/socialnetwork/api/contentview.d.ts +0 -6
- package/request/socialnetwork/api/livefeed/blogpost/important.d.ts +0 -6
- package/request/socialnetwork/api/livefeed/blogpost.d.ts +0 -4
- package/request/socialnetwork/api/livefeed.d.ts +0 -4
- package/request/socialnetwork/api.d.ts +0 -6
- package/request/socialnetwork.d.ts +0 -4
- package/request/sonet_group.d.ts +0 -8
- package/request/task/commentitem.d.ts +0 -23
- package/request/task/elapseditem.d.ts +0 -26
- package/request/task/item/userfield.d.ts +0 -6
- package/request/task/item.d.ts +0 -4
- package/request/task/planner.d.ts +0 -4
- package/request/task.d.ts +0 -10
- package/request/tasks/task/result.d.ts +0 -13
- package/request/tasks/task.d.ts +0 -37
- package/request/tasks.d.ts +0 -4
- package/request/user/userfield.d.ts +0 -8
- package/request/user.d.ts +0 -24
- package/rest/base.d.ts +0 -33
- package/services/http/HttpData.d.ts +0 -7
- package/services/http/base/base.d.ts +0 -7
- package/services/http/httpNavvy.d.ts +0 -10
- package/typification/base/answers.d.ts +0 -12
- package/typification/base/params.d.ts +0 -16
- package/typification/base/workpiece/methods-list.d.ts +0 -247
- package/typification/base/workpiece/methods.d.ts +0 -20
package/functions/errors.d.ts
CHANGED
|
@@ -69,3 +69,12 @@ export declare function parseBXRestErrorBody(body: unknown): {
|
|
|
69
69
|
* Bitrix error body, so the caller can keep its own handling for them.
|
|
70
70
|
*/
|
|
71
71
|
export declare function bxRestApiErrorFromHttp(err: unknown, method: string): BXRestApiError | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* HTTP-ответ из ошибки транспорта: `response: { status, data }`. Так устроен
|
|
74
|
+
* `AxiosError`, и так же должны отклоняться свои транспорты (middleware).
|
|
75
|
+
* Для сетевых ошибок, отмены и прочих ошибок — `undefined`.
|
|
76
|
+
*/
|
|
77
|
+
export declare function httpErrorResponse(error: unknown): {
|
|
78
|
+
status: number;
|
|
79
|
+
data: unknown;
|
|
80
|
+
} | undefined;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Символьный код нового элемента списка: `bx_rest_` и 128 случайных бит в hex.
|
|
3
|
+
* Только латиница, цифры и `_`: допустимые символы документация Bitrix24 не
|
|
4
|
+
* описывает.
|
|
5
|
+
*
|
|
6
|
+
* Случайные байты дают `crypto.getRandomValues` (в отличие от
|
|
7
|
+
* `crypto.randomUUID`, он есть и на страницах по http). Глобального `crypto`
|
|
8
|
+
* нет только в Node 18: там байты берутся из `Math.random`. Это не
|
|
9
|
+
* криптостойко, но код нужен лишь уникальный, а совпадение с уже занятым кодом
|
|
10
|
+
* ловит повтор в вызывающем методе.
|
|
11
|
+
*/
|
|
12
|
+
export declare function uniqueElementCode(): string;
|
package/map/disk.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BXRestMapDiskFolder } from './disk/folder';
|
|
2
|
+
import { BXRestMapDiskAttachedObject } from './disk/attachedObject';
|
|
3
|
+
import { BXRestMapDiskFile } from './disk/file';
|
|
4
|
+
import { BXRestMapDiskStorage } from './disk/storage';
|
|
5
|
+
export declare class BXRestMapDisk {
|
|
6
|
+
readonly folder: BXRestMapDiskFolder;
|
|
7
|
+
readonly attachedObject: BXRestMapDiskAttachedObject;
|
|
8
|
+
readonly file: BXRestMapDiskFile;
|
|
9
|
+
readonly storage: BXRestMapDiskStorage;
|
|
10
|
+
}
|
package/map/task.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { BXRestMapTaskCommentItem } from './task/commentitem';
|
|
|
2
2
|
import { BXRestMapTaskElapsedItem } from './task/elapseditem';
|
|
3
3
|
import { BXRestMapTaskStage } from './task/stages';
|
|
4
4
|
export declare class BXRestMapTask {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
static get commentItem(): typeof BXRestMapTaskCommentItem;
|
|
6
|
+
static get elapsedItem(): typeof BXRestMapTaskElapsedItem;
|
|
7
|
+
static get stages(): typeof BXRestMapTaskStage;
|
|
8
8
|
}
|
package/map/tasks/task.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { BXRestMapTasksTaskResult } from './task/result';
|
|
|
5
5
|
import { iBXRestHttpTask, iBXRestTask } from '../../typification/rest/tasks/task';
|
|
6
6
|
import { iBXRestTaskFieldsName } from '../../typification/rest/tasks/base/fields-name';
|
|
7
7
|
export declare class BXRestMapTasksTask {
|
|
8
|
-
|
|
8
|
+
static get result(): typeof BXRestMapTasksTaskResult;
|
|
9
9
|
static getAccess(v: iBXRestTaskGetAccess | undefined): Record<number, import("../../typification/rest/task/access/getaccess").iBXRestTaskGetAccessItem> | undefined;
|
|
10
10
|
static add(item: {
|
|
11
11
|
task: iBXRestTasksTaskGetHttpDefault;
|
package/map/tasks.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bx-rest",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Bitrix24 REST API client and TypeScript SDK for Angular, Vue and browser apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bitrix",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"url": "git+https://github.com/Aricatofuka/bx-rest.git"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"axios": "^1.
|
|
35
|
+
"axios": "^1.21.0",
|
|
36
36
|
"countries-and-timezones": "^3.7.2",
|
|
37
37
|
"just-camel-case": "^6.2.0",
|
|
38
38
|
"just-clone": "^6.2.0",
|
|
@@ -68,6 +68,9 @@
|
|
|
68
68
|
"./typification/app": {
|
|
69
69
|
"types": "./typification/rest/app.d.ts"
|
|
70
70
|
},
|
|
71
|
+
"./typification/batch": {
|
|
72
|
+
"types": "./typification/rest/batch.d.ts"
|
|
73
|
+
},
|
|
71
74
|
"./typification/bizproc": {
|
|
72
75
|
"types": "./typification/rest/bizproc.d.ts"
|
|
73
76
|
},
|
package/public-api.d.ts
CHANGED
|
@@ -10,11 +10,15 @@ export { HttpBXServices as BXRestRequest } from './services/http/HttpBX';
|
|
|
10
10
|
export { SessionKeyServices, SessionKeyError } from './services/http/sessionKey';
|
|
11
11
|
export { instanceOfiBXRestAnswerSuccess as isBXRestAnswerSuccess } from './functions/mapResult';
|
|
12
12
|
export { BXRestApiError, getAuthRefreshError } from './functions/errors';
|
|
13
|
+
export type { BXRestApiErrorDetails } from './functions/errors';
|
|
13
14
|
export { isBXRestAuthError } from './services/http/authRefresh';
|
|
14
15
|
export { BXRestFrame } from './services/frame/frame';
|
|
15
|
-
export { BXRestFrameError
|
|
16
|
+
export { BXRestFrameError } from './services/frame/transport';
|
|
17
|
+
export type { BXRestFrameErrorCode } from './services/frame/transport';
|
|
16
18
|
export * from './services/frame/types';
|
|
17
|
-
export { BXRestResOptions } from './services/navvy/extends/navvy-pag-base';
|
|
18
|
-
export {
|
|
19
|
+
export type { BXRestResOptions } from './services/navvy/extends/navvy-pag-base';
|
|
20
|
+
export type { iBXRestSettings } from './typification/settings';
|
|
19
21
|
export * as partNameMethods from './consts/part-name-methods';
|
|
20
22
|
export * as BXBaseServices from './services/base';
|
|
23
|
+
export type { BXRestRequestConfig, BXRestSend, BXRestMiddleware } from './services/http/transport';
|
|
24
|
+
export { BXRestTimeoutError } from './services/http/middleware';
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { iBXRestPullConfigGet, iBXRestPullConfigGetHttp } from '../../typification/rest/pull';
|
|
2
|
-
import { BXRestMapPullChannelPublic } from '../../map/channel/public';
|
|
3
2
|
export declare class BXRestNavvyPullConfig {
|
|
4
3
|
url: {
|
|
5
4
|
/**
|
|
@@ -8,7 +7,6 @@ export declare class BXRestNavvyPullConfig {
|
|
|
8
7
|
get: string[];
|
|
9
8
|
};
|
|
10
9
|
private Navvy;
|
|
11
|
-
static public: BXRestMapPullChannelPublic;
|
|
12
10
|
/**
|
|
13
11
|
* @experimental
|
|
14
12
|
* Этот метод находится в процессе тестирования и может измениться.
|
package/rest/map.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { BXRestMapLists } from '../map/lists';
|
|
|
2
2
|
import { BXRestMapUser } from '../map/user';
|
|
3
3
|
import { BXRestMapSonetGroup } from '../map/sonet_group';
|
|
4
4
|
import { BXRestMapServer } from '../map/server';
|
|
5
|
-
import {
|
|
5
|
+
import { BXRestMapDisk } from '../map/disk';
|
|
6
6
|
import { BXRestMapCalendar } from '../map/calendar';
|
|
7
7
|
import { BXRestMapLog } from '../map/log';
|
|
8
8
|
import { BXRestMapTask } from '../map/task';
|
|
@@ -12,7 +12,7 @@ export declare class BXRestMap {
|
|
|
12
12
|
get sonet_group(): typeof BXRestMapSonetGroup;
|
|
13
13
|
get server(): typeof BXRestMapServer;
|
|
14
14
|
get lists(): typeof BXRestMapLists;
|
|
15
|
-
get disk(): typeof
|
|
15
|
+
get disk(): typeof BXRestMapDisk;
|
|
16
16
|
get calendar(): typeof BXRestMapCalendar;
|
|
17
17
|
get log(): typeof BXRestMapLog;
|
|
18
18
|
get task(): typeof BXRestMapTask;
|
package/rest/navvy.d.ts
CHANGED
|
@@ -45,6 +45,7 @@ import { BXRestNavvyEventLog } from '../request-navvy/eventlog/index';
|
|
|
45
45
|
import { BXRestNavvyPlacement } from '../request-navvy/placement';
|
|
46
46
|
import { BXRestNavvyUserFieldType } from '../request-navvy/userfieldtype';
|
|
47
47
|
import { iBXRestParamScope } from '../typification/rest/common';
|
|
48
|
+
import { iBXRestSettings } from '../typification/settings';
|
|
48
49
|
export declare class BXRestNavvy {
|
|
49
50
|
readonly ai: BXRestNavvyAi;
|
|
50
51
|
readonly mailService: BXRestNavvyMailService;
|
|
@@ -95,6 +96,14 @@ export declare class BXRestNavvy {
|
|
|
95
96
|
/** Проверка доступности возможностей портала. */
|
|
96
97
|
readonly feature: BXRestNavvyFeature;
|
|
97
98
|
readonly Navvy: Navvy;
|
|
99
|
+
/**
|
|
100
|
+
* @param settings Свои настройки клиента: адрес портала, способ авторизации,
|
|
101
|
+
* заголовки. Все запросы этого клиента идут с ними, даже если глобальные
|
|
102
|
+
* `BXRestSettings` позже изменятся. Так в одном процессе можно работать
|
|
103
|
+
* с несколькими порталами. Без аргумента клиент работает с глобальными
|
|
104
|
+
* `BXRestSettings`, как раньше.
|
|
105
|
+
*/
|
|
106
|
+
constructor(settings?: iBXRestSettings);
|
|
98
107
|
/**
|
|
99
108
|
* Возвращает базовую информацию о текущем пользователе без scope `user`.
|
|
100
109
|
*
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { iBXRestSettings } from '../typification/settings';
|
|
2
|
+
import type { AxiosInstance } from 'axios';
|
|
3
|
+
/**
|
|
4
|
+
* Контекст клиента: его настройки, экземпляр axios и общее состояние
|
|
5
|
+
* продления авторизации и очереди `throttle`.
|
|
6
|
+
*
|
|
7
|
+
* Объекты библиотеки запоминают контекст в момент создания
|
|
8
|
+
* (`currentContext()`), поэтому все запросы клиента `new BXRestNavvy(settings)`
|
|
9
|
+
* идут с его настройками, а не с глобальными. Внутренняя деталь библиотеки.
|
|
10
|
+
*/
|
|
11
|
+
export declare class BXRestContext {
|
|
12
|
+
private readonly own?;
|
|
13
|
+
/** Идущее сейчас продление авторизации, его ждут все упавшие запросы клиента. */
|
|
14
|
+
pendingRefresh: Promise<void> | undefined;
|
|
15
|
+
/** Сколько продлений уже завершилось успешно. */
|
|
16
|
+
refreshCount: number;
|
|
17
|
+
/** Экземпляр axios клиента: один на контекст, создаётся при первом запросе. */
|
|
18
|
+
axios: AxiosInstance | undefined;
|
|
19
|
+
/** Очередь `throttle`: когда можно отправить следующий запрос клиента (мс, Date.now()). */
|
|
20
|
+
throttleNextSlot: number;
|
|
21
|
+
constructor(own?: iBXRestSettings | undefined);
|
|
22
|
+
/**
|
|
23
|
+
* Свои настройки клиента, а без них — глобальные `BXRestSettings.value`,
|
|
24
|
+
* прочитанные в момент обращения: `BXRestSettings.update()` заменяет объект.
|
|
25
|
+
*/
|
|
26
|
+
get settings(): iBXRestSettings;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Контекст глобальных настроек. С ним работают `new BXRestNavvy()` без
|
|
30
|
+
* аргумента и объекты, созданные приложением напрямую (`new Navvy()`,
|
|
31
|
+
* `new BXRestRequest()`).
|
|
32
|
+
*/
|
|
33
|
+
export declare const globalContext: BXRestContext;
|
|
34
|
+
export declare function currentContext(): BXRestContext;
|
|
35
|
+
/**
|
|
36
|
+
* Делает `ctx` текущим и возвращает прежний контекст. Вызывающий обязан
|
|
37
|
+
* вернуть его через `restoreContext()` в `finally`: иначе после исключения
|
|
38
|
+
* чужие настройки достанутся объектам, созданным позже.
|
|
39
|
+
*/
|
|
40
|
+
export declare function enterContext(ctx: BXRestContext): BXRestContext;
|
|
41
|
+
export declare function restoreContext(previous: BXRestContext): void;
|
|
42
|
+
/** Создаёт объекты в контексте `ctx` и возвращает прежний контекст, даже при исключении. */
|
|
43
|
+
export declare function runInContext<T>(ctx: BXRestContext, build: () => T): T;
|
|
@@ -32,6 +32,16 @@ export declare class HttpBXServices extends HttpServices {
|
|
|
32
32
|
get<T>(name: string[], params?: any, headers?: Record<string, string>): Observable<iBXRestAnswer<T> | undefined>;
|
|
33
33
|
httpPost<T>(url: string, params?: any, settings?: iHttpParamSettings, headers?: Record<string, string>): Observable<T | undefined>;
|
|
34
34
|
httpGet<T>(url: string, params?: any, settings?: iHttpParamSettings, headers?: Record<string, string>): Observable<T | undefined>;
|
|
35
|
+
/**
|
|
36
|
+
* Отправка через шаги из настроек: `retryOnQueryLimit`, `throttle`,
|
|
37
|
+
* `timeout`, затем `middleware`; последним идёт axios клиента. Настройки
|
|
38
|
+
* читаются при подписке. Отписка отменяет HTTP-запрос (AbortSignal).
|
|
39
|
+
* Ошибка транспорта уходит дальше как есть: у axios в ней весь запрос,
|
|
40
|
+
* вместе с токеном и секретом вебхука (см. README, «Обработка ошибок»).
|
|
41
|
+
*/
|
|
42
|
+
private send;
|
|
43
|
+
/** Транспорт по умолчанию: axios клиента, как и раньше через post()/get(). */
|
|
44
|
+
private axiosSend;
|
|
35
45
|
/**
|
|
36
46
|
* Заголовки запроса: `BXRestSettings.headers`, поверх них — заголовки
|
|
37
47
|
* конкретного запроса, поверх всего — `required`. В `required` идёт
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
+
import { BXRestContext } from '../context';
|
|
2
3
|
/**
|
|
3
4
|
* Условие продления по умолчанию (`BXRestSettings.auth.isAuthError`):
|
|
4
5
|
* - ответ с ошибкой Bitrix `expired_token` или `invalid_token` — при любом статусе;
|
|
@@ -15,5 +16,8 @@ export declare function isBXRestAuthError(error: unknown): boolean;
|
|
|
15
16
|
* `defer()` в HttpBXServices): повтор — это повторная подписка, поэтому
|
|
16
17
|
* токен, адрес и заголовки берутся уже новые. На второй попытке ошибка не
|
|
17
18
|
* перехватывается — запрос повторяется не больше одного раза.
|
|
19
|
+
*
|
|
20
|
+
* `ctx` — контекст клиента, из которого берутся `refresh`, `isAuthError` и
|
|
21
|
+
* общее состояние продления.
|
|
18
22
|
*/
|
|
19
|
-
export declare function withAuthRefresh<T>(request$: Observable<T
|
|
23
|
+
export declare function withAuthRefresh<T>(request$: Observable<T>, ctx?: BXRestContext): Observable<T>;
|
package/services/http/http.d.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
1
|
import { AxiosInstance } from 'axios';
|
|
3
|
-
import { SessionKeyServices } from '
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
import { SessionKeyServices } from './sessionKey';
|
|
3
|
+
/**
|
|
4
|
+
* Общая часть HTTP-клиента: экземпляр axios и источник токена и адреса.
|
|
5
|
+
* Сами запросы отправляет `HttpBXServices` (`BXRestRequest`).
|
|
6
|
+
*/
|
|
7
|
+
export declare class HttpServices {
|
|
8
8
|
readonly session: SessionKeyServices;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Экземпляр axios клиента. Один на контекст (клиента со своими настройками
|
|
11
|
+
* или глобальные настройки) и создаётся при первом запросе — раньше каждый
|
|
12
|
+
* объект запроса создавал свой.
|
|
13
|
+
*/
|
|
14
|
+
protected get axiosInstance(): AxiosInstance;
|
|
12
15
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BXRestMiddleware } from './transport';
|
|
2
|
+
import { iBXRestSettings } from '../../typification/settings';
|
|
3
|
+
/** `retryOnQueryLimit: true`: всего 3 попытки, пауза перед второй — 1000 мс, дальше вдвое больше. */
|
|
4
|
+
export declare const DEFAULT_RETRY_ON_QUERY_LIMIT: {
|
|
5
|
+
attempts: number;
|
|
6
|
+
delay: number;
|
|
7
|
+
};
|
|
8
|
+
/** `timeout: true`: 60 000 мс на один HTTP-запрос. */
|
|
9
|
+
export declare const DEFAULT_TIMEOUT = 60000;
|
|
10
|
+
/** `throttle: true`: 2 запроса в секунду — лимит Bitrix24 на обычных тарифах. */
|
|
11
|
+
export declare const DEFAULT_THROTTLE: {
|
|
12
|
+
perSecond: number;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Запрос не завершился за время из `timeout` в настройках. В `.resVanilla()`
|
|
16
|
+
* приходит сама эта ошибка, в `.res()` — в `cause`.
|
|
17
|
+
*/
|
|
18
|
+
export declare class BXRestTimeoutError extends Error {
|
|
19
|
+
readonly timeout: number;
|
|
20
|
+
constructor(timeout: number);
|
|
21
|
+
}
|
|
22
|
+
/** Где клиент хранит очередь `throttle` — в своём контексте. */
|
|
23
|
+
export interface ThrottleState {
|
|
24
|
+
throttleNextSlot: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Встроенные шаги из настроек, в этом порядке: повтор, очередь, таймаут.
|
|
28
|
+
* Повтор — снаружи: каждая попытка заново встаёт в очередь и получает свой
|
|
29
|
+
* таймаут. Таймаут — внутри очереди: ожидание своей очереди его не тратит.
|
|
30
|
+
*/
|
|
31
|
+
export declare function builtInMiddleware(settings: iBXRestSettings, state: ThrottleState): BXRestMiddleware[];
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { Observable, Subscription } from 'rxjs';
|
|
2
2
|
import { iBXRestAuth } from '../../typification/auth/save';
|
|
3
|
+
import { BXRestContext } from '../context';
|
|
4
|
+
import type { BXRestMiddleware } from './transport';
|
|
3
5
|
type IKeyAuth = 'sessid' | 'auth' | string;
|
|
4
6
|
export declare class SessionKeyError extends Error {
|
|
5
7
|
constructor(message: string);
|
|
6
8
|
}
|
|
7
9
|
export declare class SessionKeyServices {
|
|
10
|
+
/**
|
|
11
|
+
* Контекст клиента, в котором создан объект: внутри `new BXRestNavvy(settings)`
|
|
12
|
+
* — контекст этого клиента, в остальных случаях — глобальные настройки.
|
|
13
|
+
* Объявлен первым: конструктор ниже уже читает настройки.
|
|
14
|
+
*/
|
|
15
|
+
readonly ctx: BXRestContext;
|
|
8
16
|
authHave: boolean;
|
|
9
17
|
authData: iBXRestAuth | undefined;
|
|
10
18
|
subscribe: {
|
|
@@ -26,6 +34,8 @@ export declare class SessionKeyServices {
|
|
|
26
34
|
* результата не меняла сами настройки.
|
|
27
35
|
*/
|
|
28
36
|
getHeaders(): Record<string, string>;
|
|
37
|
+
/** Свои middleware из настроек (`middleware`), читаются при каждом запросе — как и остальные настройки. */
|
|
38
|
+
getMiddleware(): readonly BXRestMiddleware[];
|
|
29
39
|
getSessid(): string;
|
|
30
40
|
getAuthParams(): string | undefined;
|
|
31
41
|
getCheckAuthParamsIsOn(): boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Запрос, который HTTP-слой bx-rest передаёт middleware и транспорту.
|
|
3
|
+
*/
|
|
4
|
+
export interface BXRestRequestConfig {
|
|
5
|
+
method: 'GET' | 'POST';
|
|
6
|
+
/** Полный адрес; у GET — вместе со строкой параметров. */
|
|
7
|
+
url: string;
|
|
8
|
+
/** Тело POST: объект (уходит JSON) или строка x-www-form-urlencoded. */
|
|
9
|
+
data?: unknown;
|
|
10
|
+
headers: Record<string, string>;
|
|
11
|
+
/** Прикладывать ли cookie браузера (`credentials: 'include'` у fetch). */
|
|
12
|
+
withCredentials: boolean;
|
|
13
|
+
/** Отмена запроса. */
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Отправляет запрос и возвращает тело ответа. На ответ не 2xx отклоняется
|
|
18
|
+
* ошибкой с полем `response: { status, data }` — как `AxiosError`: по нему
|
|
19
|
+
* библиотека узнаёт ошибки Bitrix и ошибки авторизации.
|
|
20
|
+
*/
|
|
21
|
+
export type BXRestSend = (config: BXRestRequestConfig) => Promise<unknown>;
|
|
22
|
+
/**
|
|
23
|
+
* Шаг перед отправкой. Может поменять запрос, повторить его, подождать или
|
|
24
|
+
* вовсе не звать `next` — тогда middleware сам становится транспортом.
|
|
25
|
+
*/
|
|
26
|
+
export type BXRestMiddleware = (config: BXRestRequestConfig, next: BXRestSend) => Promise<unknown>;
|
|
27
|
+
/** Первый middleware в списке — внешний: он первым видит запрос и последним — ответ. */
|
|
28
|
+
export declare function composeMiddleware(middleware: readonly BXRestMiddleware[], terminal: BXRestSend): BXRestSend;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
-
import { iBXRestAnswer } from '../../../typification/rest/base/answer';
|
|
2
|
+
import { iBXRestAnswer, iBXRestAnswerSuccess } from '../../../typification/rest/base/answer';
|
|
3
3
|
import { HttpBXServices } from '../../http/HttpBX';
|
|
4
4
|
import { ReturnTypeNavvy } from '../navvy-support';
|
|
5
|
+
import { iBXRestPagination } from '../../../typification/rest/base/api-pagination-bx';
|
|
5
6
|
export interface BXRestResOptions {
|
|
6
7
|
/**
|
|
7
8
|
* When `true`, a Bitrix-level API error that comes in the body of a 2xx
|
|
@@ -16,6 +17,11 @@ export interface BXRestResOptions {
|
|
|
16
17
|
*/
|
|
17
18
|
throwOnApiError?: boolean;
|
|
18
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Параметры остальных страниц для методов с постраничной навигацией через `start`.
|
|
22
|
+
* Отсчёт идёт от `start` самого запроса: первая страница уже получена именно с него.
|
|
23
|
+
*/
|
|
24
|
+
export declare function offsetPageParams<P extends iBXRestPagination>(param: P, total: number | undefined, pageSize: number): P[];
|
|
19
25
|
export declare abstract class NavvyPagBase<T, R, P> {
|
|
20
26
|
protected url: string[];
|
|
21
27
|
protected param: P;
|
|
@@ -43,6 +49,14 @@ export declare abstract class NavvyPagBase<T, R, P> {
|
|
|
43
49
|
* Первая страница для `.resAll()`. Ошибка Bitrix в теле ответа 2xx становится `BXRestApiError`:
|
|
44
50
|
* страниц в таком ответе нет, и без этого `.resAll()` завершился бы безликим `EmptyError`.
|
|
45
51
|
*/
|
|
46
|
-
protected resFirstPage(): Observable<
|
|
52
|
+
protected resFirstPage(): Observable<iBXRestAnswerSuccess<T>>;
|
|
53
|
+
/**
|
|
54
|
+
* Остальные страницы для `.resAll()`, в порядке `params`. Команды уходят через `batch`,
|
|
55
|
+
* пакеты — по очереди. Ошибка любой страницы завершает весь запрос: неполный список
|
|
56
|
+
* выглядел бы для вызывающего кода как полный.
|
|
57
|
+
*/
|
|
58
|
+
protected resPages<Page>(params: P[]): Observable<Page[]>;
|
|
59
|
+
private batchPages;
|
|
60
|
+
private notRestAnswerError;
|
|
47
61
|
private apiErrorFromBody;
|
|
48
62
|
}
|
|
@@ -9,6 +9,9 @@ import { NavvyPagBase } from './extends/navvy-pag-base';
|
|
|
9
9
|
*/
|
|
10
10
|
export declare class NavvyAlterPagNav<T, R, P extends iBXRestAlternativePagination> extends NavvyPagBase<T[], R[], P> {
|
|
11
11
|
resAll(): import("rxjs").Observable<ReturnTypeNavvy<T, R>[]>;
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Параметры остальных страниц. Размер страницы берётся из запроса: портал ограничивает
|
|
14
|
+
* его 50 записями, но вызывающий код может попросить и меньше.
|
|
15
|
+
*/
|
|
16
|
+
private pageParams;
|
|
14
17
|
}
|
|
@@ -6,7 +6,5 @@ export declare class NavvyPagNavResultKeyObject<T, R, P extends iBXRestPaginatio
|
|
|
6
6
|
private readonly key;
|
|
7
7
|
constructor(url: string[], param: P, key: K, mapResult?: (param: KeyedObjectResult<K, T> | undefined) => R[] | undefined);
|
|
8
8
|
resAll(): import("rxjs").Observable<R[] | undefined>;
|
|
9
|
-
private resultAllEnd;
|
|
10
|
-
private mapResult;
|
|
11
9
|
}
|
|
12
10
|
export {};
|
|
@@ -4,10 +4,7 @@ import { NavvyPagBase } from './extends/navvy-pag-base';
|
|
|
4
4
|
type KeyedResult<K extends string, T> = Record<K, T[] | undefined>;
|
|
5
5
|
export declare class NavvyPagNavResultKey<T, R, P extends iBXRestPagination, K extends string> extends NavvyPagBase<KeyedResult<K, T>, R[], P> {
|
|
6
6
|
private readonly key;
|
|
7
|
-
|
|
8
|
-
constructor(url: string[], param: P, key: K, map?: (param: KeyedResult<K, T> | undefined) => R[] | undefined);
|
|
7
|
+
constructor(url: string[], param: P, key: K, map?: (param: KeyedResult<K, T> | undefined) => R[] | undefined, restApi?: boolean);
|
|
9
8
|
resAll(): import("rxjs").Observable<ReturnTypeNavvy<T, R>[]>;
|
|
10
|
-
private resultAllEnd;
|
|
11
|
-
private mapResForGetAll;
|
|
12
9
|
}
|
|
13
10
|
export {};
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import { iBXRestPagination } from '../../typification/rest/base/api-pagination-bx';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export declare class NavvyPagNavTasks<T, R, P extends iBXRestPagination> extends NavvyPagBase<{
|
|
5
|
-
tasks: T[] | undefined;
|
|
6
|
-
}, R[], P> {
|
|
7
|
-
save: ReturnTypeNavvy<T, R>[];
|
|
2
|
+
import { NavvyPagNavResultKey } from './navvy-pag-nav-result-key';
|
|
3
|
+
export declare class NavvyPagNavTasks<T, R, P extends iBXRestPagination> extends NavvyPagNavResultKey<T, R, P, 'tasks'> {
|
|
8
4
|
constructor(url: string[], param: P, map?: (param: {
|
|
9
5
|
tasks: T[] | undefined;
|
|
10
6
|
} | undefined) => R[] | undefined, restApi?: boolean);
|
|
11
|
-
resAll(): import("rxjs").Observable<ReturnTypeNavvy<T, R>[]>;
|
|
12
|
-
private resultAllEnd;
|
|
13
|
-
private mapResForGetAll;
|
|
14
7
|
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { iBXRestPagination } from '../../typification/rest/base/api-pagination-bx';
|
|
2
2
|
import { NavvyPagBase } from './extends/navvy-pag-base';
|
|
3
|
-
import { ReturnTypeNavvy } from './navvy-support';
|
|
4
3
|
export declare class NavvyPagNavWithUselessKey<T, R, P extends iBXRestPagination> extends NavvyPagBase<Record<string, T>, R[], P> {
|
|
5
|
-
save: ReturnTypeNavvy<Record<string, T>, R[]>;
|
|
6
4
|
resAll(): import("rxjs").Observable<R[] | undefined>;
|
|
7
5
|
}
|
|
@@ -2,7 +2,5 @@ import { iBXRestPagination } from '../../typification/rest/base/api-pagination-b
|
|
|
2
2
|
import { ReturnTypeNavvy } from './navvy-support';
|
|
3
3
|
import { NavvyPagBase } from './extends/navvy-pag-base';
|
|
4
4
|
export declare class NavvyPag<T, R, P extends iBXRestPagination> extends NavvyPagBase<T[], R[], P> {
|
|
5
|
-
save: ReturnTypeNavvy<T, R>[];
|
|
6
5
|
resAll(): import("rxjs").Observable<ReturnTypeNavvy<T, R>[]>;
|
|
7
|
-
private mapResForGetAll;
|
|
8
6
|
}
|
|
@@ -1,11 +1 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import { iBXRestAnswer } from '../../typification/rest/base/answer';
|
|
3
1
|
export type ReturnTypeNavvy<T, R> = T extends R ? T : R;
|
|
4
|
-
export declare abstract class NavvySupport<C, T, R> {
|
|
5
|
-
requestClass: C;
|
|
6
|
-
pageSize: number;
|
|
7
|
-
protected constructor(requestClass: C);
|
|
8
|
-
mapAndError<T>(request: Observable<iBXRestAnswer<T> | undefined>): Observable<T | undefined>;
|
|
9
|
-
abstract resVanilla(): Observable<iBXRestAnswer<T> | undefined>;
|
|
10
|
-
abstract res(): ReturnTypeNavvy<Observable<T | undefined>, Observable<R | undefined>>;
|
|
11
|
-
}
|
package/services/navvy.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export * from './navvy/navvy-pag';
|
|
|
15
15
|
export * from './navvy/navvy-pag-nav-result-key-object';
|
|
16
16
|
export * from './navvy/navvy-support';
|
|
17
17
|
export declare class Navvy {
|
|
18
|
+
private readonly ctx;
|
|
18
19
|
simple<T, R = T, A = undefined>(url: string[], arg?: A, map?: (param: T | undefined) => R | undefined): NavvySimple<T, R, (A & ({} | null)) | undefined>;
|
|
19
20
|
simpleV3<T, R = T, A = undefined>(url: string[], arg?: A, map?: (param: T | undefined) => R | undefined): NavvySimple<T, R, (A & ({} | null)) | undefined>;
|
|
20
21
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CountryCode, TimezoneName } from 'countries-and-timezones';
|
|
1
|
+
import type { CountryCode, TimezoneName } from 'countries-and-timezones' with { 'resolution-mode': 'import' };
|
|
2
2
|
import { iBXRestCalendarTypeEvent } from '../base/type';
|
|
3
3
|
import { iBXRestYesNo } from '../../base/yes-no';
|
|
4
4
|
export interface iBXRestCalendarEventGetAnswer extends iBXRestCalendarEventGetAnswerBase {
|
|
@@ -2,8 +2,8 @@ import { iBXRestYesNo } from '../base/yes-no';
|
|
|
2
2
|
export interface iBXRestUser extends iBXRestUserBase {
|
|
3
3
|
ID: number;
|
|
4
4
|
IS_ONLINE: boolean;
|
|
5
|
-
DATE_REGISTER
|
|
6
|
-
PERSONAL_BIRTHDAY
|
|
5
|
+
DATE_REGISTER?: Date;
|
|
6
|
+
PERSONAL_BIRTHDAY?: Date;
|
|
7
7
|
LAST_LOGIN?: Date;
|
|
8
8
|
}
|
|
9
9
|
export interface iBXRestUserHttp extends iBXRestUserBase {
|
|
@@ -22,7 +22,7 @@ interface iBXRestUserBase {
|
|
|
22
22
|
PERSONAL_GENDER?: iAllBXGender;
|
|
23
23
|
PERSONAL_PROFESSION?: string;
|
|
24
24
|
PERSONAL_WWW?: string;
|
|
25
|
-
PERSONAL_BIRTHDAY
|
|
25
|
+
PERSONAL_BIRTHDAY?: string | Date;
|
|
26
26
|
PERSONAL_PHOTO: string | null;
|
|
27
27
|
PERSONAL_ICQ: string | null;
|
|
28
28
|
PERSONAL_PHONE: string | null;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BXRestMiddleware } from '../services/http/transport';
|
|
1
2
|
export interface iBXRestSettings {
|
|
2
3
|
auth: {
|
|
3
4
|
source: 'cookies' | 'localStorage' | 'off' | (() => string);
|
|
@@ -41,4 +42,37 @@ export interface iBXRestSettings {
|
|
|
41
42
|
* библиотека всегда выставляет сама — от него зависит формат тела запроса.
|
|
42
43
|
*/
|
|
43
44
|
headers?: Record<string, string>;
|
|
45
|
+
/**
|
|
46
|
+
* Повтор запроса, когда портал отвечает `QUERY_LIMIT_EXCEEDED` (превышен
|
|
47
|
+
* лимит частоты запросов, HTTP 503). `attempts` — сколько всего попыток
|
|
48
|
+
* вместе с первой, `delay` — пауза перед второй попыткой в мс, дальше она
|
|
49
|
+
* растёт вдвое. `true` — значения по умолчанию: `{ attempts: 3, delay: 1000 }`.
|
|
50
|
+
* Если не задано — запрос не повторяется.
|
|
51
|
+
*/
|
|
52
|
+
retryOnQueryLimit?: boolean | {
|
|
53
|
+
attempts?: number;
|
|
54
|
+
delay?: number;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Предельное время одного HTTP-запроса, мс: дольше — запрос отменяется
|
|
58
|
+
* с ошибкой `BXRestTimeoutError`. Ожидание очереди `throttle` и паузы
|
|
59
|
+
* `retryOnQueryLimit` сюда не входят, у каждой попытки повтора своё время.
|
|
60
|
+
* `true` — 60 000 мс. Если не задано — время не ограничено.
|
|
61
|
+
*/
|
|
62
|
+
timeout?: boolean | number;
|
|
63
|
+
/**
|
|
64
|
+
* Не больше `perSecond` запросов в секунду: лишние ждут своей очереди.
|
|
65
|
+
* Очередь своя у каждого клиента `new BXRestNavvy(settings)` и общая у
|
|
66
|
+
* всех, кто работает с глобальными `BXRestSettings`. `true` — 2 запроса
|
|
67
|
+
* в секунду, лимит Bitrix24 на обычных тарифах. Если не задано — без очереди.
|
|
68
|
+
*/
|
|
69
|
+
throttle?: boolean | {
|
|
70
|
+
perSecond?: number;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Свои шаги перед отправкой каждого запроса: логирование, подмена
|
|
74
|
+
* заголовков, свой транспорт вместо axios. Первый в списке — внешний.
|
|
75
|
+
* Идут после `retryOnQueryLimit`, `throttle` и `timeout`, перед axios.
|
|
76
|
+
*/
|
|
77
|
+
middleware?: BXRestMiddleware[];
|
|
44
78
|
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export function CatchError(options) {
|
|
2
|
-
return function (target, propertyKey, descriptor) {
|
|
3
|
-
const original = descriptor.value;
|
|
4
|
-
descriptor.value = function (...args) {
|
|
5
|
-
try {
|
|
6
|
-
return original.apply(this, args);
|
|
7
|
-
}
|
|
8
|
-
catch (err) {
|
|
9
|
-
const errorInfo = {
|
|
10
|
-
message: `❌ Error in ${target.constructor.name}.${propertyKey}`,
|
|
11
|
-
args,
|
|
12
|
-
error: err instanceof Error ? err.message : String(err),
|
|
13
|
-
stack: err instanceof Error ? err.stack : new Error().stack,
|
|
14
|
-
};
|
|
15
|
-
console.error(formatError(errorInfo));
|
|
16
|
-
if (options?.rethrow)
|
|
17
|
-
throw err;
|
|
18
|
-
return options?.defaultValue;
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
return descriptor;
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
// Общая функция форматирования
|
|
25
|
-
export function formatError(info) {
|
|
26
|
-
const stackLines = info.stack?.split('\n').slice(2).join('\n');
|
|
27
|
-
return [
|
|
28
|
-
info.message,
|
|
29
|
-
info.args ? ` • args: ${JSON.stringify(info.args)}` : '',
|
|
30
|
-
info.error ? ` • error: ${info.error}` : '',
|
|
31
|
-
` • stack trace:\n${stackLines}`,
|
|
32
|
-
].join('\n');
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvZnVuY3Rpb25zL2Vycm9ySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsVUFBVSxDQUFDLE9BQW1EO0lBQzVFLE9BQU8sVUFDTCxNQUFXLEVBQ1gsV0FBbUIsRUFDbkIsVUFBOEI7UUFFOUIsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQTtRQUVqQyxVQUFVLENBQUMsS0FBSyxHQUFHLFVBQVUsR0FBRyxJQUFXO1lBQ3pDLElBQUksQ0FBQztnQkFDSCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ25DLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sU0FBUyxHQUFHO29CQUNoQixPQUFPLEVBQUUsY0FBYyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUU7b0JBQy9ELElBQUk7b0JBQ0osS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7b0JBQ3ZELEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEtBQUs7aUJBQzVELENBQUE7Z0JBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtnQkFFckMsSUFBSSxPQUFPLEVBQUUsT0FBTztvQkFBRSxNQUFNLEdBQUcsQ0FBQTtnQkFDL0IsT0FBTyxPQUFPLEVBQUUsWUFBWSxDQUFBO1lBQzlCLENBQUM7UUFDSCxDQUFDLENBQUE7UUFFRCxPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDLENBQUE7QUFDSCxDQUFDO0FBRUQsK0JBQStCO0FBQy9CLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBdUU7SUFDakcsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM5RCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU87UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDN0Msc0JBQXNCLFVBQVUsRUFBRTtLQUNuQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gQ2F0Y2hFcnJvcihvcHRpb25zPzogeyByZXRocm93PzogYm9vbGVhbjsgZGVmYXVsdFZhbHVlPzogYW55IH0pIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKFxyXG4gICAgdGFyZ2V0OiBhbnksXHJcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxyXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXHJcbiAgKSB7XHJcbiAgICBjb25zdCBvcmlnaW5hbCA9IGRlc2NyaXB0b3IudmFsdWVcclxuXHJcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpXHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnN0IGVycm9ySW5mbyA9IHtcclxuICAgICAgICAgIG1lc3NhZ2U6IGDinYwgRXJyb3IgaW4gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxyXG4gICAgICAgICAgYXJncyxcclxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXHJcbiAgICAgICAgICBzdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiBuZXcgRXJyb3IoKS5zdGFjayxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0RXJyb3IoZXJyb3JJbmZvKSlcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJldGhyb3cpIHRocm93IGVyclxyXG4gICAgICAgIHJldHVybiBvcHRpb25zPy5kZWZhdWx0VmFsdWVcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkZXNjcmlwdG9yXHJcbiAgfVxyXG59XHJcblxyXG4vLyDQntCx0YnQsNGPINGE0YPQvdC60YbQuNGPINGE0L7RgNC80LDRgtC40YDQvtCy0LDQvdC40Y9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEVycm9yKGluZm86IHsgbWVzc2FnZTogc3RyaW5nOyBhcmdzPzogYW55W107IGVycm9yPzogc3RyaW5nOyBzdGFjaz86IHN0cmluZyB9KTogc3RyaW5nIHtcclxuICBjb25zdCBzdGFja0xpbmVzID0gaW5mby5zdGFjaz8uc3BsaXQoJ1xcbicpLnNsaWNlKDIpLmpvaW4oJ1xcbicpXHJcbiAgcmV0dXJuIFtcclxuICAgIGluZm8ubWVzc2FnZSxcclxuICAgIGluZm8uYXJncyA/IGAgICDigKIgYXJnczogJHtKU09OLnN0cmluZ2lmeShpbmZvLmFyZ3MpfWAgOiAnJyxcclxuICAgIGluZm8uZXJyb3IgPyBgICAg4oCiIGVycm9yOiAke2luZm8uZXJyb3J9YCA6ICcnLFxyXG4gICAgYCAgIOKAoiBzdGFjayB0cmFjZTpcXG4ke3N0YWNrTGluZXN9YCxcclxuICBdLmpvaW4oJ1xcbicpXHJcbn1cclxuIl19
|