bx-rest 1.3.0 → 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/CHANGELOG.md +83 -0
- package/README.en.md +207 -3
- package/README.md +207 -3
- package/esm2022/functions/errors.mjs +19 -2
- package/esm2022/public-api.mjs +6 -2
- package/esm2022/request-navvy/crm/item.mjs +1 -1
- package/esm2022/request-navvy/crm/type.mjs +1 -1
- package/esm2022/services/frame/frame.mjs +347 -0
- package/esm2022/services/frame/transport.mjs +224 -0
- package/esm2022/services/frame/types.mjs +2 -0
- package/esm2022/services/http/HttpBX.mjs +14 -6
- package/esm2022/services/http/authRefresh.mjs +89 -0
- package/esm2022/services/navvy/extends/navvy-pag-base.mjs +28 -5
- package/esm2022/services/navvy/navvy-alternative-pagination-navigation.mjs +2 -2
- package/esm2022/services/navvy/navvy-pag-nav-result-key-object.mjs +6 -7
- package/esm2022/services/navvy/navvy-pag-nav-result-key.mjs +6 -3
- package/esm2022/services/navvy/navvy-pag-nav-tasks.mjs +5 -4
- package/esm2022/services/navvy/navvy-pag-nav-with-useless-key.mjs +2 -2
- package/esm2022/services/navvy/navvy-pag.mjs +2 -2
- package/esm2022/typification/rest/crm/universal.mjs +1 -1
- package/esm2022/typification/settings.mjs +1 -1
- package/fesm2022/bx-rest.mjs +801 -97
- package/fesm2022/bx-rest.mjs.map +1 -1
- package/functions/errors.d.ts +18 -0
- package/package.json +4 -1
- package/public-api.d.ts +5 -1
- package/request-navvy/crm/item.d.ts +6 -6
- package/request-navvy/crm/type.d.ts +6 -6
- package/services/frame/frame.d.ts +191 -0
- package/services/frame/transport.d.ts +75 -0
- package/services/frame/types.d.ts +123 -0
- package/services/http/authRefresh.d.ts +19 -0
- package/services/navvy/extends/navvy-pag-base.d.ts +6 -0
- package/services/navvy/navvy-pag-nav-tasks.d.ts +3 -0
- package/typification/rest/crm/universal.d.ts +116 -0
- package/typification/settings.d.ts +17 -0
package/functions/errors.d.ts
CHANGED
|
@@ -11,7 +11,22 @@ export interface BXRestApiErrorDetails {
|
|
|
11
11
|
* the full response body (including REST v3 `validation`).
|
|
12
12
|
*/
|
|
13
13
|
cause?: unknown;
|
|
14
|
+
/**
|
|
15
|
+
* Why `BXRestSettings.auth.refresh` failed, when the request failed with
|
|
16
|
+
* an authorization error and the refresh could not fix it.
|
|
17
|
+
*/
|
|
18
|
+
authRefreshError?: unknown;
|
|
14
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Why `BXRestSettings.auth.refresh` failed. When a request fails with an
|
|
22
|
+
* authorization error and the refresh fails too, the library rethrows the
|
|
23
|
+
* original request error and puts the refresh failure into its
|
|
24
|
+
* `authRefreshError` field — on the `AxiosError` of `.resVanilla()` and the
|
|
25
|
+
* like, and on the `BXRestApiError` / `Error` of `.res()`.
|
|
26
|
+
*
|
|
27
|
+
* Returns `undefined` when there was no refresh or it succeeded.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getAuthRefreshError(error: unknown): unknown;
|
|
15
30
|
/**
|
|
16
31
|
* A Bitrix-level API error, e.g. `INSUFFICIENT_SCOPE` or `expired_token`.
|
|
17
32
|
*
|
|
@@ -20,12 +35,15 @@ export interface BXRestApiErrorDetails {
|
|
|
20
35
|
* the error comes in the body of a 2xx response, `.res()` resolves as
|
|
21
36
|
* `undefined` by default and fails with it only with
|
|
22
37
|
* `{ throwOnApiError: true }` — see the "Error handling" section of the README.
|
|
38
|
+
* `.resAll()` always fails with it on an error in the body of a 2xx response.
|
|
23
39
|
*/
|
|
24
40
|
export declare class BXRestApiError extends Error {
|
|
25
41
|
error: string | undefined;
|
|
26
42
|
error_description: string | undefined;
|
|
27
43
|
readonly status: number | undefined;
|
|
28
44
|
readonly method: string | undefined;
|
|
45
|
+
/** See `getAuthRefreshError()`. */
|
|
46
|
+
readonly authRefreshError: unknown;
|
|
29
47
|
constructor(error: string | undefined, error_description: string | undefined, details?: BXRestApiErrorDetails);
|
|
30
48
|
}
|
|
31
49
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bx-rest",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Bitrix24 REST API client and TypeScript SDK for Angular, Vue and browser apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bitrix",
|
|
@@ -77,6 +77,9 @@
|
|
|
77
77
|
"./typification/common": {
|
|
78
78
|
"types": "./typification/rest/common.d.ts"
|
|
79
79
|
},
|
|
80
|
+
"./typification/crm": {
|
|
81
|
+
"types": "./typification/rest/crm/index.d.ts"
|
|
82
|
+
},
|
|
80
83
|
"./typification/department": {
|
|
81
84
|
"types": "./typification/rest/department.d.ts"
|
|
82
85
|
},
|
package/public-api.d.ts
CHANGED
|
@@ -9,7 +9,11 @@ export { Navvy } from './services/navvy';
|
|
|
9
9
|
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
|
-
export { BXRestApiError } from './functions/errors';
|
|
12
|
+
export { BXRestApiError, getAuthRefreshError } from './functions/errors';
|
|
13
|
+
export { isBXRestAuthError } from './services/http/authRefresh';
|
|
14
|
+
export { BXRestFrame } from './services/frame/frame';
|
|
15
|
+
export { BXRestFrameError, BXRestFrameErrorCode } from './services/frame/transport';
|
|
16
|
+
export * from './services/frame/types';
|
|
13
17
|
export { BXRestResOptions } from './services/navvy/extends/navvy-pag-base';
|
|
14
18
|
export { HttpNavvyServices } from './services/http/httpNavvy';
|
|
15
19
|
export * as partNameMethods from './consts/part-name-methods';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { iBXRestCrmObject, iBXRestParamCrmEntityType, iBXRestParamCrmItemBatchImport, iBXRestParamCrmItemFields, iBXRestParamCrmItemId, iBXRestParamCrmItemImport, iBXRestParamCrmItemList, iBXRestParamCrmItemUpdate } from '../../typification/rest/crm';
|
|
1
|
+
import { iBXRestCrmItem, iBXRestCrmItemFieldsResult, iBXRestCrmItemResult, iBXRestCrmObject, iBXRestParamCrmEntityType, iBXRestParamCrmItemBatchImport, iBXRestParamCrmItemFields, iBXRestParamCrmItemId, iBXRestParamCrmItemImport, iBXRestParamCrmItemList, iBXRestParamCrmItemUpdate } from '../../typification/rest/crm';
|
|
2
2
|
import { BXRestNavvyCrmItemDelivery } from './item/delivery';
|
|
3
3
|
import { BXRestNavvyCrmItemDetails } from './item/details';
|
|
4
4
|
import { BXRestNavvyCrmItemPayment } from './item/payment';
|
|
@@ -24,7 +24,7 @@ export declare class BXRestNavvyCrmItem {
|
|
|
24
24
|
/**
|
|
25
25
|
* Создаёт элемент CRM.
|
|
26
26
|
*/
|
|
27
|
-
add(param: iBXRestParamCrmItemFields): import("../../services/navvy").NavvySimple<
|
|
27
|
+
add(param: iBXRestParamCrmItemFields): import("../../services/navvy").NavvySimple<iBXRestCrmItemResult, iBXRestCrmItemResult, iBXRestParamCrmItemFields | undefined>;
|
|
28
28
|
/**
|
|
29
29
|
* Пакетно импортирует элементы CRM.
|
|
30
30
|
*/
|
|
@@ -36,11 +36,11 @@ export declare class BXRestNavvyCrmItem {
|
|
|
36
36
|
/**
|
|
37
37
|
* Возвращает описание полей элемента CRM.
|
|
38
38
|
*/
|
|
39
|
-
fields(param: iBXRestParamCrmEntityType): import("../../services/navvy").NavvySimple<
|
|
39
|
+
fields(param: iBXRestParamCrmEntityType): import("../../services/navvy").NavvySimple<iBXRestCrmItemFieldsResult, iBXRestCrmItemFieldsResult, iBXRestParamCrmEntityType | undefined>;
|
|
40
40
|
/**
|
|
41
41
|
* Возвращает данные элемента CRM по идентификатору.
|
|
42
42
|
*/
|
|
43
|
-
get(param: iBXRestParamCrmItemId): import("../../services/navvy").NavvySimple<
|
|
43
|
+
get(param: iBXRestParamCrmItemId): import("../../services/navvy").NavvySimple<iBXRestCrmItemResult, iBXRestCrmItemResult, iBXRestParamCrmItemId | undefined>;
|
|
44
44
|
/**
|
|
45
45
|
* Импортирует элемент CRM.
|
|
46
46
|
*/
|
|
@@ -48,9 +48,9 @@ export declare class BXRestNavvyCrmItem {
|
|
|
48
48
|
/**
|
|
49
49
|
* Возвращает список элементов CRM.
|
|
50
50
|
*/
|
|
51
|
-
list(param: iBXRestParamCrmItemList): import("../../services/navvy").NavvyPagNavResultKey<
|
|
51
|
+
list(param: iBXRestParamCrmItemList): import("../../services/navvy").NavvyPagNavResultKey<iBXRestCrmItem, iBXRestCrmItem, iBXRestParamCrmItemList, "items">;
|
|
52
52
|
/**
|
|
53
53
|
* Изменяет поля элемента CRM.
|
|
54
54
|
*/
|
|
55
|
-
update(param: iBXRestParamCrmItemUpdate): import("../../services/navvy").NavvySimple<
|
|
55
|
+
update(param: iBXRestParamCrmItemUpdate): import("../../services/navvy").NavvySimple<iBXRestCrmItemResult, iBXRestCrmItemResult, iBXRestParamCrmItemUpdate | undefined>;
|
|
56
56
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { iBXRestCrmObject, iBXRestParamCrmEntityType, iBXRestParamCrmTypeAdd, iBXRestParamCrmTypeId, iBXRestParamCrmTypeList, iBXRestParamCrmTypeUpdate } from '../../typification/rest/crm';
|
|
1
|
+
import { iBXRestCrmObject, iBXRestCrmType, iBXRestCrmTypeResult, iBXRestParamCrmEntityType, iBXRestParamCrmTypeAdd, iBXRestParamCrmTypeId, iBXRestParamCrmTypeList, iBXRestParamCrmTypeUpdate } from '../../typification/rest/crm';
|
|
2
2
|
export declare class BXRestNavvyCrmType {
|
|
3
3
|
private readonly Navvy;
|
|
4
4
|
/**
|
|
5
5
|
* Создаёт новый смарт-процесс.
|
|
6
6
|
*/
|
|
7
|
-
add(param: iBXRestParamCrmTypeAdd): import("../../services/navvy").NavvySimple<
|
|
7
|
+
add(param: iBXRestParamCrmTypeAdd): import("../../services/navvy").NavvySimple<iBXRestCrmTypeResult, iBXRestCrmTypeResult, iBXRestParamCrmTypeAdd | undefined>;
|
|
8
8
|
/**
|
|
9
9
|
* Удаляет смарт-процесс.
|
|
10
10
|
*/
|
|
@@ -16,17 +16,17 @@ export declare class BXRestNavvyCrmType {
|
|
|
16
16
|
/**
|
|
17
17
|
* Возвращает смарт-процесс по идентификатору.
|
|
18
18
|
*/
|
|
19
|
-
get(param: iBXRestParamCrmTypeId): import("../../services/navvy").NavvySimple<
|
|
19
|
+
get(param: iBXRestParamCrmTypeId): import("../../services/navvy").NavvySimple<iBXRestCrmTypeResult, iBXRestCrmTypeResult, iBXRestParamCrmTypeId | undefined>;
|
|
20
20
|
/**
|
|
21
21
|
* Возвращает смарт-процесс по entityTypeId.
|
|
22
22
|
*/
|
|
23
|
-
getByEntityTypeId(param: iBXRestParamCrmEntityType): import("../../services/navvy").NavvySimple<
|
|
23
|
+
getByEntityTypeId(param: iBXRestParamCrmEntityType): import("../../services/navvy").NavvySimple<iBXRestCrmTypeResult, iBXRestCrmTypeResult, iBXRestParamCrmEntityType | undefined>;
|
|
24
24
|
/**
|
|
25
25
|
* Возвращает список смарт-процессов.
|
|
26
26
|
*/
|
|
27
|
-
list(param?: iBXRestParamCrmTypeList): import("../../services/navvy").NavvyPagNavResultKey<
|
|
27
|
+
list(param?: iBXRestParamCrmTypeList): import("../../services/navvy").NavvyPagNavResultKey<iBXRestCrmType, iBXRestCrmType, iBXRestParamCrmTypeList, "types">;
|
|
28
28
|
/**
|
|
29
29
|
* Обновляет смарт-процесс.
|
|
30
30
|
*/
|
|
31
|
-
update(param: iBXRestParamCrmTypeUpdate): import("../../services/navvy").NavvySimple<
|
|
31
|
+
update(param: iBXRestParamCrmTypeUpdate): import("../../services/navvy").NavvySimple<iBXRestCrmTypeResult, iBXRestCrmTypeResult, iBXRestParamCrmTypeUpdate | undefined>;
|
|
32
32
|
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { BXRestFrameOptions, iBXRestFrameAccess, iBXRestFrameAuth, iBXRestFrameCrmSelection, iBXRestFrameCrmSelectOptions, iBXRestFrameInit, iBXRestFrameOpenPathResult, iBXRestFramePlacementInfo, iBXRestFramePlacementInterface, iBXRestFrameSize, iBXRestFrameUser } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Команды порталу Bitrix24 из iframe приложения — без подключения BX24.js.
|
|
4
|
+
* Те же команды и те же имена, что у BX24.js, но вместо колбэков —
|
|
5
|
+
* промисы. Протокол внутренний и недокументированный, см. `transport.ts`.
|
|
6
|
+
*
|
|
7
|
+
* Создавайте один экземпляр на страницу и при старте приложения: параметры
|
|
8
|
+
* портала читаются в конструкторе (до того, как роутер перепишет адрес), а
|
|
9
|
+
* `firstRun` портал сообщает только в первом ответе на `getInitData`.
|
|
10
|
+
*
|
|
11
|
+
* Токены класс не логирует и никуда не сохраняет: `getAuth()` и
|
|
12
|
+
* `refreshAuth()` каждый раз спрашивают портал, а в `init()` токенов нет.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const frame = new BXRestFrame()
|
|
16
|
+
* const { lang, placement } = await frame.init()
|
|
17
|
+
* await frame.fitWindow()
|
|
18
|
+
* const user = await frame.selectUser()
|
|
19
|
+
*/
|
|
20
|
+
export declare class BXRestFrame {
|
|
21
|
+
private readonly transport;
|
|
22
|
+
private readonly timeout;
|
|
23
|
+
private initValue?;
|
|
24
|
+
private initRequest?;
|
|
25
|
+
private readonly dialogs;
|
|
26
|
+
/** Мессенджер — как `BX24.im`. Портал на эти команды не отвечает. */
|
|
27
|
+
readonly im: {
|
|
28
|
+
/** Позвонить сотруднику — `BX24.im.callTo()`. */
|
|
29
|
+
callTo: (userId: number | string, video?: boolean) => Promise<void>;
|
|
30
|
+
/** Позвонить на телефон — `BX24.im.phoneTo()`. */
|
|
31
|
+
phoneTo: (phone: string) => Promise<void>;
|
|
32
|
+
/** Открыть чат — `BX24.im.openMessenger()`. */
|
|
33
|
+
openMessenger: (dialogId?: number | string) => Promise<void>;
|
|
34
|
+
/** Открыть историю чата — `BX24.im.openHistory()`. */
|
|
35
|
+
openHistory: (dialogId: number | string) => Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
/** Встраивание — как `BX24.placement`. */
|
|
38
|
+
readonly placement: {
|
|
39
|
+
/** Код и параметры встраивания — `BX24.placement.info()`. */
|
|
40
|
+
info: () => Promise<iBXRestFramePlacementInfo>;
|
|
41
|
+
/** Команды и события текущего встраивания — `BX24.placement.getInterface()`. */
|
|
42
|
+
getInterface: () => Promise<iBXRestFramePlacementInterface>;
|
|
43
|
+
/**
|
|
44
|
+
* Команда встраивания — `BX24.placement.call()`. Набор команд зависит от
|
|
45
|
+
* встраивания (см. `getInterface()`). Не на все команды портал отвечает:
|
|
46
|
+
* без ответа за `timeout` промис завершается с `undefined`.
|
|
47
|
+
*/
|
|
48
|
+
call: (command: string, params?: unknown, options?: {
|
|
49
|
+
timeout?: number | false;
|
|
50
|
+
}) => Promise<unknown>;
|
|
51
|
+
/**
|
|
52
|
+
* Подписка на событие встраивания — `BX24.placement.bindEvent()`.
|
|
53
|
+
* `handler` вызывается при каждом событии. Возвращает функцию отписки:
|
|
54
|
+
* она только перестаёт вызывать `handler` — отменить подписку на
|
|
55
|
+
* стороне портала протокол не позволяет. Вне iframe бросает
|
|
56
|
+
* `BXRestFrameError` с кодом `NOT_IN_FRAME`.
|
|
57
|
+
*/
|
|
58
|
+
bindEvent: (event: string, handler: (data: unknown) => void) => () => void;
|
|
59
|
+
};
|
|
60
|
+
/** Настройки приложения для текущего пользователя — как `BX24.userOption`. */
|
|
61
|
+
readonly userOption: {
|
|
62
|
+
get: (name: string) => Promise<unknown>;
|
|
63
|
+
set: (name: string, value: unknown) => Promise<void>;
|
|
64
|
+
};
|
|
65
|
+
/** Настройки приложения для всего портала — как `BX24.appOption`. */
|
|
66
|
+
readonly appOption: {
|
|
67
|
+
get: (name: string) => Promise<unknown>;
|
|
68
|
+
/**
|
|
69
|
+
* Менять их может только администратор портала: остальным — ошибка
|
|
70
|
+
* `ACCESS_DENIED` (BX24.js в этом случае молча ничего не делает).
|
|
71
|
+
* Возвращает настройки приложения после сохранения.
|
|
72
|
+
*/
|
|
73
|
+
set: (name: string, value: unknown) => Promise<Record<string, unknown>>;
|
|
74
|
+
};
|
|
75
|
+
constructor(options?: BXRestFrameOptions);
|
|
76
|
+
/**
|
|
77
|
+
* Данные запуска приложения — аналог `BX24.init()`: язык, домен, права,
|
|
78
|
+
* встраивание, настройки, признаки установки. Запрашиваются у портала
|
|
79
|
+
* один раз, дальше берутся из памяти. Токенов здесь нет — см. `getAuth()`.
|
|
80
|
+
*/
|
|
81
|
+
init(): Promise<iBXRestFrameInit>;
|
|
82
|
+
/**
|
|
83
|
+
* Текущая авторизация приложения — аналог `BX24.getAuth()`. Каждый вызов —
|
|
84
|
+
* новый запрос `getInitData` к порталу.
|
|
85
|
+
*
|
|
86
|
+
* `expires_in` портал считает от срока жизни токена в момент выдачи, а не
|
|
87
|
+
* от остатка: если страница открыта давно, значение будет завышено (так
|
|
88
|
+
* же и у BX24.js). Для свежего токена используйте `refreshAuth()`.
|
|
89
|
+
*/
|
|
90
|
+
getAuth(): Promise<iBXRestFrameAuth>;
|
|
91
|
+
/**
|
|
92
|
+
* Новая авторизация приложения — аналог `BX24.refreshAuth()`: портал
|
|
93
|
+
* выпускает новую пару `access_token`/`refresh_token`. Если портал не может
|
|
94
|
+
* выдать токен, он показывает `alert` «Unable to get new token!» и не
|
|
95
|
+
* отвечает — тогда ошибка `TIMEOUT`.
|
|
96
|
+
*/
|
|
97
|
+
refreshAuth(): Promise<iBXRestFrameAuth>;
|
|
98
|
+
/**
|
|
99
|
+
* Завершить установку — аналог `BX24.installFinish()`: портал отмечает
|
|
100
|
+
* приложение установленным и перезагружает страницу. Делает что-то только
|
|
101
|
+
* на странице установщика (`init().install`), иначе — ничего, как и BX24.js.
|
|
102
|
+
*/
|
|
103
|
+
installFinish(): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Отметить, что первый запуск у этого пользователя пройден, — то, что
|
|
106
|
+
* BX24.js делает после последнего обработчика `BX24.install()`. Без этого
|
|
107
|
+
* `init().firstRun` останется `true` и при следующих запусках. Делает
|
|
108
|
+
* что-то только при первом запуске.
|
|
109
|
+
*/
|
|
110
|
+
firstRunFinish(): Promise<void>;
|
|
111
|
+
/** Задать размер фрейма — `BX24.resizeWindow()`. Возвращает размер, который выставил портал. */
|
|
112
|
+
resizeWindow(width: number | string, height: number | string): Promise<iBXRestFrameSize | undefined>;
|
|
113
|
+
/** Подогнать высоту фрейма под содержимое — `BX24.fitWindow()`. */
|
|
114
|
+
fitWindow(): Promise<iBXRestFrameSize | undefined>;
|
|
115
|
+
/**
|
|
116
|
+
* Перезагрузить страницу портала с приложением — `BX24.reloadWindow()`.
|
|
117
|
+
* Портал на эту команду не отвечает.
|
|
118
|
+
*/
|
|
119
|
+
reloadWindow(): Promise<void>;
|
|
120
|
+
/** Заголовок страницы портала — `BX24.setTitle()`. */
|
|
121
|
+
setTitle(title: string): Promise<{
|
|
122
|
+
title: string;
|
|
123
|
+
} | undefined>;
|
|
124
|
+
/** Прокрутить страницу портала — `BX24.scrollParentWindow()`. */
|
|
125
|
+
scrollParentWindow(scroll: number | string): Promise<{
|
|
126
|
+
scroll: number;
|
|
127
|
+
} | undefined>;
|
|
128
|
+
/**
|
|
129
|
+
* Диалог выбора одного сотрудника — `BX24.selectUser()`. Ждёт выбора без
|
|
130
|
+
* ограничения по времени: если пользователь закрыл диалог, портал не
|
|
131
|
+
* отвечает вовсе. Отменить ожидание — `signal` или новый вызов
|
|
132
|
+
* `selectUser()`/`selectUsers()` (ошибка `CANCELLED`).
|
|
133
|
+
*/
|
|
134
|
+
selectUser(options?: {
|
|
135
|
+
title?: string;
|
|
136
|
+
signal?: AbortSignal;
|
|
137
|
+
}): Promise<iBXRestFrameUser>;
|
|
138
|
+
/** Диалог выбора нескольких сотрудников — `BX24.selectUsers()`. Ожидание — как у `selectUser()`. */
|
|
139
|
+
selectUsers(options?: {
|
|
140
|
+
title?: string;
|
|
141
|
+
signal?: AbortSignal;
|
|
142
|
+
}): Promise<iBXRestFrameUser[]>;
|
|
143
|
+
/**
|
|
144
|
+
* Диалог выбора прав доступа — `BX24.selectAccess()`. `value` — коды,
|
|
145
|
+
* которые нельзя выбрать. Ожидание — как у `selectUser()`.
|
|
146
|
+
*/
|
|
147
|
+
selectAccess(options?: {
|
|
148
|
+
value?: string[];
|
|
149
|
+
signal?: AbortSignal;
|
|
150
|
+
}): Promise<iBXRestFrameAccess[]>;
|
|
151
|
+
/** Диалог выбора объектов CRM — `BX24.selectCRM()`. Ожидание — как у `selectUser()`. */
|
|
152
|
+
selectCRM(options?: iBXRestFrameCrmSelectOptions): Promise<iBXRestFrameCrmSelection>;
|
|
153
|
+
/**
|
|
154
|
+
* Открыть приложение в слайдере — `BX24.openApplication()`. Промис
|
|
155
|
+
* завершается, когда слайдер закрыли. `settings` — настройки слайдера
|
|
156
|
+
* (уходят как `bx24_<ключ>`, как в BX24.js).
|
|
157
|
+
*/
|
|
158
|
+
openApplication(params?: Record<string, unknown>, settings?: Record<string, unknown>, options?: {
|
|
159
|
+
signal?: AbortSignal;
|
|
160
|
+
}): Promise<void>;
|
|
161
|
+
/**
|
|
162
|
+
* Открыть страницу портала в слайдере — `BX24.openPath()`. Промис
|
|
163
|
+
* завершается, когда слайдер закрыли (`{ result: 'close' }`), или сразу,
|
|
164
|
+
* если путь не открылся (`{ result: 'error', errorCode }`).
|
|
165
|
+
*/
|
|
166
|
+
openPath(path: string, options?: {
|
|
167
|
+
signal?: AbortSignal;
|
|
168
|
+
}): Promise<iBXRestFrameOpenPathResult>;
|
|
169
|
+
/**
|
|
170
|
+
* Закрыть слайдер с приложением — `BX24.closeApplication()`. Если
|
|
171
|
+
* приложение открыто не в слайдере, ничего не происходит. Узнать о
|
|
172
|
+
* закрытии может открывший слайдер — через `openApplication()`.
|
|
173
|
+
*/
|
|
174
|
+
closeApplication(): Promise<void>;
|
|
175
|
+
/**
|
|
176
|
+
* Команда, на которую портал отвечает подтверждением. В некоторых
|
|
177
|
+
* встраиваниях портал на такие команды не отвечает (так считает и
|
|
178
|
+
* b24jssdk) — тогда промис завершается с `undefined`, а не ошибкой.
|
|
179
|
+
*/
|
|
180
|
+
private ack;
|
|
181
|
+
/**
|
|
182
|
+
* Диалоги ждут пользователя без таймаута. Портал держит один обработчик
|
|
183
|
+
* на диалог (у выбора сотрудников он общий для `selectUser` и
|
|
184
|
+
* `selectUsers`) и на прошлый вызов уже не ответит — поэтому новый вызов
|
|
185
|
+
* отменяет ожидание прошлого.
|
|
186
|
+
*/
|
|
187
|
+
private dialog;
|
|
188
|
+
private getInitData;
|
|
189
|
+
private toInit;
|
|
190
|
+
private toAuth;
|
|
191
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Обмен сообщениями между iframe приложения и порталом Bitrix24 — тот
|
|
3
|
+
* транспорт, на котором построены команды BX24.js: страница приложения шлёт
|
|
4
|
+
* команду родительскому окну портала через postMessage, портал отвечает
|
|
5
|
+
* сообщением с тем же callbackId.
|
|
6
|
+
*
|
|
7
|
+
* ВНИМАНИЕ: протокол внутренний и недокументированный — Bitrix24 может
|
|
8
|
+
* изменить его без предупреждения. Транспорт повторяет BX24.js
|
|
9
|
+
* (https://api.bitrix24.com/api/v1/, скачан 2026-10-29, Last-Modified
|
|
10
|
+
* 2022-03-17, sha256 945ad491df8ffb7490b89f4914a439b5a3f575c950c3480562815716a3e07f23)
|
|
11
|
+
* и сверен с ответной стороной портала — `/bitrix/js/rest/applayout.js`
|
|
12
|
+
* (Last-Modified 2024-05-15, sha256 3efd6ab57a4778493a26d10ae0987a82e19fc012ed9935f5c6afa78c4052fcb5).
|
|
13
|
+
* Всё знание о протоколе — только в этом модуле (`services/frame`).
|
|
14
|
+
*/
|
|
15
|
+
export type BXRestFrameErrorCode = 'NOT_IN_FRAME' | 'TIMEOUT' | 'NO_AUTH' | 'BAD_RESPONSE' | 'CANCELLED' | 'ACCESS_DENIED';
|
|
16
|
+
/**
|
|
17
|
+
* Ошибка обращения к порталу из iframe. `code`:
|
|
18
|
+
* - `NOT_IN_FRAME` — страница открыта не в iframe приложения Bitrix24;
|
|
19
|
+
* - `TIMEOUT` — портал не ответил за отведённое время;
|
|
20
|
+
* - `NO_AUTH` — портал ответил без токена;
|
|
21
|
+
* - `BAD_RESPONSE` — ответ портала не удалось разобрать;
|
|
22
|
+
* - `CANCELLED` — ожидание отменено через `signal` или новым вызовом того же диалога;
|
|
23
|
+
* - `ACCESS_DENIED` — команда доступна только администратору портала.
|
|
24
|
+
*/
|
|
25
|
+
export declare class BXRestFrameError extends Error {
|
|
26
|
+
readonly code: BXRestFrameErrorCode;
|
|
27
|
+
constructor(code: BXRestFrameErrorCode, message: string);
|
|
28
|
+
}
|
|
29
|
+
export interface FrameRequestOptions {
|
|
30
|
+
/** Сколько ждать ответа, мс; `false` — без ограничения (диалоги, слайдеры). */
|
|
31
|
+
timeout: number | false;
|
|
32
|
+
/**
|
|
33
|
+
* Что делать, если портал не ответил за `timeout`: `'reject'` — ошибка
|
|
34
|
+
* `TIMEOUT` (по умолчанию), `'resolve'` — завершиться с `undefined`.
|
|
35
|
+
*/
|
|
36
|
+
onTimeout?: 'reject' | 'resolve';
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Параметры портала (DOMAIN, PROTOCOL, APP_SID) читаются в конструкторе —
|
|
41
|
+
* так же, как это делает BX24.js, из `window.name`: портал задаёт имя
|
|
42
|
+
* iframe приложения в виде `DOMAIN|PROTOCOL|APP_SID`. Если там их нет —
|
|
43
|
+
* из query страницы (`?DOMAIN=…&PROTOCOL=…&APP_SID=…`), с которым портал
|
|
44
|
+
* открывает обработчик приложения. Конструктор не бросает исключений:
|
|
45
|
+
* вне iframe ошибку вернут сами команды.
|
|
46
|
+
*/
|
|
47
|
+
export declare class FrameTransport {
|
|
48
|
+
private readonly frame;
|
|
49
|
+
constructor();
|
|
50
|
+
/** Домен портала из параметров фрейма — как `BX24.getDomain()`. */
|
|
51
|
+
get domain(): string;
|
|
52
|
+
/**
|
|
53
|
+
* Команда, на которую портал не отвечает (`reloadWindow`, `imCallTo`, ...).
|
|
54
|
+
* Вне iframe бросает `BXRestFrameError` с кодом `NOT_IN_FRAME`.
|
|
55
|
+
*/
|
|
56
|
+
post(command: string, params: unknown): void;
|
|
57
|
+
/** Команда с одним ответом портала. */
|
|
58
|
+
request(command: string, params: unknown, options: FrameRequestOptions): Promise<unknown>;
|
|
59
|
+
/**
|
|
60
|
+
* Команда, на которую портал отвечает многократно (`placementBindEvent`):
|
|
61
|
+
* `handler` вызывается на каждый ответ. Возвращает функцию отписки —
|
|
62
|
+
* она только перестаёт слушать: отменить подписку на стороне портала
|
|
63
|
+
* протокол не позволяет. Вне iframe бросает `BXRestFrameError`.
|
|
64
|
+
*/
|
|
65
|
+
subscribe(command: string, params: unknown, handler: (data: unknown) => void): () => void;
|
|
66
|
+
private requireFrame;
|
|
67
|
+
/**
|
|
68
|
+
* Формат — как у BX24.js. Обычно строка `команда:параметры:callbackId:APP_SID`
|
|
69
|
+
* (портал разбирает её с конца, поэтому параметры и callbackId могут быть
|
|
70
|
+
* пустыми); для команд с `:` в имени — объект.
|
|
71
|
+
*/
|
|
72
|
+
private send;
|
|
73
|
+
/** Ответ портала — строка `callbackId:JSON` (или `callbackId:`, если ответ пустой). */
|
|
74
|
+
private listen;
|
|
75
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
export interface BXRestFrameOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Сколько ждать ответа портала на команду, мс. По умолчанию 10000. Вне
|
|
4
|
+
* iframe портала ответа не будет никогда. Диалоги и слайдеры ждут
|
|
5
|
+
* пользователя без ограничения.
|
|
6
|
+
*/
|
|
7
|
+
timeout?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Авторизация приложения — в том же виде, что у `BX24.getAuth()`.
|
|
11
|
+
*/
|
|
12
|
+
export interface iBXRestFrameAuth {
|
|
13
|
+
access_token: string;
|
|
14
|
+
refresh_token: string;
|
|
15
|
+
/**
|
|
16
|
+
* Момент истечения `access_token` — миллисекунды с 1 января 1970 года,
|
|
17
|
+
* как у `BX24.getAuth()`. Не срок жизни в секундах, как в ответе
|
|
18
|
+
* OAuth-сервера! Сравнивайте с `Date.now()`.
|
|
19
|
+
*/
|
|
20
|
+
expires_in: number;
|
|
21
|
+
/** Адрес портала без протокола, например `mycompany.bitrix24.ru`. */
|
|
22
|
+
domain: string;
|
|
23
|
+
/** Постоянный идентификатор портала. */
|
|
24
|
+
member_id: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Данные, которые портал передаёт приложению при запуске (`getInitData`), —
|
|
28
|
+
* без токенов: их отдаёт `getAuth()`.
|
|
29
|
+
*/
|
|
30
|
+
export interface iBXRestFrameInit {
|
|
31
|
+
/** Адрес портала без протокола — как `BX24.getDomain()`. */
|
|
32
|
+
domain: string;
|
|
33
|
+
/** Язык интерфейса — как `BX24.getLang()`. */
|
|
34
|
+
lang: string;
|
|
35
|
+
/** Путь к REST на портале, например `/rest`. */
|
|
36
|
+
path: string;
|
|
37
|
+
/** Портал открыт по https. */
|
|
38
|
+
https: boolean;
|
|
39
|
+
memberId: string;
|
|
40
|
+
/** Пользователь — администратор портала, как `BX24.isAdmin()`. */
|
|
41
|
+
isAdmin: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Страница открыта как установщик приложения: установку завершает
|
|
44
|
+
* `installFinish()`.
|
|
45
|
+
*/
|
|
46
|
+
install: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Первый запуск приложения этим пользователем (этой версии). Портал
|
|
49
|
+
* сообщает его только в первом ответе на `getInitData` за загрузку страницы.
|
|
50
|
+
*/
|
|
51
|
+
firstRun: boolean;
|
|
52
|
+
/** Код встраивания, например `DEFAULT` или `CRM_DEAL_DETAIL_TAB`. */
|
|
53
|
+
placement: string;
|
|
54
|
+
placementOptions: unknown;
|
|
55
|
+
userOptions: Record<string, unknown>;
|
|
56
|
+
appOptions: Record<string, unknown>;
|
|
57
|
+
}
|
|
58
|
+
/** Размер фрейма, который выставил портал. */
|
|
59
|
+
export interface iBXRestFrameSize {
|
|
60
|
+
width: number;
|
|
61
|
+
height: number;
|
|
62
|
+
}
|
|
63
|
+
/** Сотрудник из диалога `selectUser()`/`selectUsers()`. */
|
|
64
|
+
export interface iBXRestFrameUser {
|
|
65
|
+
/** Приходит строкой. */
|
|
66
|
+
id: string;
|
|
67
|
+
name: string;
|
|
68
|
+
/** Работает в подразделении, подчинённом текущему пользователю. */
|
|
69
|
+
sub: boolean;
|
|
70
|
+
/** Руководит подразделением текущего пользователя или вышестоящим. */
|
|
71
|
+
sup: boolean;
|
|
72
|
+
position: string | null;
|
|
73
|
+
/** Путь к аватару относительно адреса портала. */
|
|
74
|
+
photo: string;
|
|
75
|
+
url: string;
|
|
76
|
+
}
|
|
77
|
+
/** Право доступа из диалога `selectAccess()`. */
|
|
78
|
+
export interface iBXRestFrameAccess {
|
|
79
|
+
/** Источник кода: `intranet`, `socnetgroup`, `group`, ... */
|
|
80
|
+
provider: string;
|
|
81
|
+
/** Код доступа, например `IU1`, `D5`, `SG4_K`. */
|
|
82
|
+
id: string;
|
|
83
|
+
name: string;
|
|
84
|
+
}
|
|
85
|
+
export type BXRestFrameCrmType = 'lead' | 'contact' | 'company' | 'deal' | 'quote';
|
|
86
|
+
export interface iBXRestFrameCrmSelectOptions {
|
|
87
|
+
/** Какие типы объектов показывать. */
|
|
88
|
+
entityType?: BXRestFrameCrmType[];
|
|
89
|
+
/** Можно выбрать несколько объектов. */
|
|
90
|
+
multiple?: boolean;
|
|
91
|
+
/** Объекты, отмеченные при открытии: идентификаторы по типам. */
|
|
92
|
+
value?: Partial<Record<BXRestFrameCrmType, number[]>>;
|
|
93
|
+
signal?: AbortSignal;
|
|
94
|
+
}
|
|
95
|
+
/** Объект CRM из диалога `selectCRM()`. */
|
|
96
|
+
export interface iBXRestFrameCrmEntity {
|
|
97
|
+
/** С префиксом типа: `L_`, `C_`, `CO_`, `D_`, `Q_`. */
|
|
98
|
+
id: string;
|
|
99
|
+
type: BXRestFrameCrmType;
|
|
100
|
+
place: string;
|
|
101
|
+
title: string;
|
|
102
|
+
desc: string;
|
|
103
|
+
url?: string;
|
|
104
|
+
image?: string;
|
|
105
|
+
}
|
|
106
|
+
/** Результат `selectCRM()`: объекты по типам, внутри — под ключами `0`, `1`, ... */
|
|
107
|
+
export type iBXRestFrameCrmSelection = Partial<Record<BXRestFrameCrmType, Record<string, iBXRestFrameCrmEntity>>>;
|
|
108
|
+
/** Результат `openPath()`. */
|
|
109
|
+
export interface iBXRestFrameOpenPathResult {
|
|
110
|
+
/** `close` — пользователь закрыл слайдер; `error` — путь не открылся. */
|
|
111
|
+
result: 'close' | 'error';
|
|
112
|
+
/** `PATH_NOT_AVAILABLE` или `METHOD_NOT_SUPPORTED_ON_DEVICE`. */
|
|
113
|
+
errorCode?: string;
|
|
114
|
+
}
|
|
115
|
+
/** Команды и события текущего встраивания. */
|
|
116
|
+
export interface iBXRestFramePlacementInterface {
|
|
117
|
+
command: string[];
|
|
118
|
+
event: string[];
|
|
119
|
+
}
|
|
120
|
+
export interface iBXRestFramePlacementInfo {
|
|
121
|
+
placement: string;
|
|
122
|
+
options: unknown;
|
|
123
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
/**
|
|
3
|
+
* Условие продления по умолчанию (`BXRestSettings.auth.isAuthError`):
|
|
4
|
+
* - ответ с ошибкой Bitrix `expired_token` или `invalid_token` — при любом статусе;
|
|
5
|
+
* - ответ 401 без тела ошибки Bitrix — например, пустой ответ своего
|
|
6
|
+
* бэкенд-прокси, у которого нет действующего токена.
|
|
7
|
+
*
|
|
8
|
+
* Ответ 401 с другим кодом Bitrix ошибкой авторизации не считается.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isBXRestAuthError(error: unknown): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Повтор запроса после продления авторизации (`BXRestSettings.auth.refresh`).
|
|
13
|
+
*
|
|
14
|
+
* `request$` должен быть "холодным" и читать настройки при подписке (как
|
|
15
|
+
* `defer()` в HttpBXServices): повтор — это повторная подписка, поэтому
|
|
16
|
+
* токен, адрес и заголовки берутся уже новые. На второй попытке ошибка не
|
|
17
|
+
* перехватывается — запрос повторяется не больше одного раза.
|
|
18
|
+
*/
|
|
19
|
+
export declare function withAuthRefresh<T>(request$: Observable<T>): Observable<T>;
|
|
@@ -39,4 +39,10 @@ export declare abstract class NavvyPagBase<T, R, P> {
|
|
|
39
39
|
mapForVanilla(): Observable<iBXRestAnswer<ReturnTypeNavvy<T, R>> | undefined>;
|
|
40
40
|
res(options?: BXRestResOptions): Observable<ReturnTypeNavvy<T, R> | undefined>;
|
|
41
41
|
mapAndError<T>(request: Observable<iBXRestAnswer<T> | undefined>, options?: BXRestResOptions): Observable<T | undefined>;
|
|
42
|
+
/**
|
|
43
|
+
* Первая страница для `.resAll()`. Ошибка Bitrix в теле ответа 2xx становится `BXRestApiError`:
|
|
44
|
+
* страниц в таком ответе нет, и без этого `.resAll()` завершился бы безликим `EmptyError`.
|
|
45
|
+
*/
|
|
46
|
+
protected resFirstPage(): Observable<iBXRestAnswer<T> | undefined>;
|
|
47
|
+
private apiErrorFromBody;
|
|
42
48
|
}
|
|
@@ -5,6 +5,9 @@ export declare class NavvyPagNavTasks<T, R, P extends iBXRestPagination> extends
|
|
|
5
5
|
tasks: T[] | undefined;
|
|
6
6
|
}, R[], P> {
|
|
7
7
|
save: ReturnTypeNavvy<T, R>[];
|
|
8
|
+
constructor(url: string[], param: P, map?: (param: {
|
|
9
|
+
tasks: T[] | undefined;
|
|
10
|
+
} | undefined) => R[] | undefined, restApi?: boolean);
|
|
8
11
|
resAll(): import("rxjs").Observable<ReturnTypeNavvy<T, R>[]>;
|
|
9
12
|
private resultAllEnd;
|
|
10
13
|
private mapResForGetAll;
|