From 70aebdb1c5d3bab9c8d7d50ebf13474fa79d2de3 Mon Sep 17 00:00:00 2001 From: pskucherov Date: Fri, 6 May 2022 19:54:10 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B2=20readme=20appname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e1480d..00e1aff 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ import { createSdk } from '../sdk'; import { CandleInterval } from '../generated/marketdata'; !(async function example() { - const { marketData } = createSdk('YOUR_TOKEN'); + const { marketData } = createSdk('YOUR_TOKEN', 'YOUR_APP_NAME'); const candles = await marketData.getCandles({ figi: 'BBG0047315Y7', From a2ae9d72a388d6f4e49fbde6016dcb1aedce2de7 Mon Sep 17 00:00:00 2001 From: pskucherov Date: Fri, 6 May 2022 15:54:04 +0300 Subject: [PATCH 2/5] proto v1.0.7 --- protos/instruments.proto | 65 +++++++++++++++++++++++++++++++++++++++- protos/marketdata.proto | 3 +- protos/operations.proto | 6 ++-- protos/orders.proto | 2 +- protos/sandbox.proto | 2 +- 5 files changed, 71 insertions(+), 7 deletions(-) diff --git a/protos/instruments.proto b/protos/instruments.proto index 6b74e06..f16ecc0 100644 --- a/protos/instruments.proto +++ b/protos/instruments.proto @@ -70,6 +70,12 @@ service InstrumentsService {/*Сервис предназначен для по //Метод получения списка активов. rpc GetAssets (AssetsRequest) returns (AssetsResponse); + + //Метод получения избранных инструментов. + rpc GetFavorites (GetFavoritesRequest) returns (GetFavoritesResponse); + + //Метод редактирования избранных инструментов. + rpc EditFavorites (EditFavoritesRequest) returns (EditFavoritesResponse); } //Запрос расписания торгов @@ -252,6 +258,7 @@ message Bond { bool api_trade_available_flag = 39; //Признак доступности торгов через API. string uid = 40; //Уникальный идентификатор инструмента. + RealExchange real_exchange = 41; //Реальная площадка исполнения расчётов. } //Объект передачи информации о валюте. @@ -287,6 +294,7 @@ message Currency { bool api_trade_available_flag = 26; //Признак доступности торгов через API. string uid = 27; //Уникальный идентификатор инструмента. + RealExchange real_exchange = 28; //Реальная площадка исполнения расчётов. } //Объект передачи информации об инвестиционном фонде. @@ -326,6 +334,7 @@ message Etf { bool api_trade_available_flag = 30; //Признак доступности торгов через API. string uid = 31; //Уникальный идентификатор инструмента. + RealExchange real_exchange = 32; //Реальная площадка исполнения расчётов. } //Объект передачи информации о фьючерсе. @@ -366,6 +375,7 @@ message Future { bool api_trade_available_flag = 30; //Признак доступности торгов через API. string uid = 31; //Уникальный идентификатор инструмента. + RealExchange real_exchange = 32; //Реальная площадка исполнения расчётов. } //Объект передачи информации об акции. @@ -406,6 +416,7 @@ message Share { bool api_trade_available_flag = 32; //Признак доступности торгов через API. string uid = 33; //Уникальный идентификатор инструмента. + RealExchange real_exchange = 34; //Реальная площадка исполнения расчётов. } //Запрос НКД по облигации @@ -492,6 +503,7 @@ message Instrument { bool api_trade_available_flag = 24; //Признак доступности торгов через API. string uid = 25; //Уникальный идентификатор инструмента. + RealExchange real_exchange = 26; //Реальная площадка исполнения расчётов. } //Запрос дивидендов. @@ -745,4 +757,55 @@ message AssetInstrument { message InstrumentLink { string type = 1; //Тип связи. string instrument_uid = 2; //uid идентификатор связанного инструмента. -} \ No newline at end of file +} + +//Запрос избранных инструментов. +message GetFavoritesRequest { +} + +//Ответ избранных инструментов. +message GetFavoritesResponse { + repeated FavoriteInstrument favorite_instruments = 1; //Массив инструментов +} + +//Избранный инструмент. +message FavoriteInstrument { + string figi = 1; //Figi-идентификатор инструмента. + string ticker = 2; //Тикер инструмента. + string class_code = 3; //Класс-код инструмента. + string isin = 4; //Isin-идентификатор инструмента. + string instrument_type = 11; //Тип инструмента. + bool otc_flag = 16; //Признак внебиржевой ценной бумаги. + bool api_trade_available_flag = 17; //Признак доступности торгов через API. +} + +//Запрос редактирования избранных инструментов. +message EditFavoritesRequest { + repeated EditFavoritesRequestInstrument instruments = 1; //Массив инструментов. + EditFavoritesActionType action_type = 6; //Тип действия со списком. +} + +//Избранный инструмент для редактирования. +message EditFavoritesRequestInstrument { + string figi = 1; //Figi-идентификатор инструмента. +} + +//Тип действия со списком избранных инструментов. +enum EditFavoritesActionType { + EDIT_FAVORITES_ACTION_TYPE_UNSPECIFIED = 0; //Тип не определён. + EDIT_FAVORITES_ACTION_TYPE_ADD = 1; //Добавить в список. + EDIT_FAVORITES_ACTION_TYPE_DEL = 2; //Удалить из списка. +} + +//Результат редактирования избранных инструментов. +message EditFavoritesResponse { + repeated FavoriteInstrument favorite_instruments = 1; //Массив инструментов +} + +//Реальная площадка исполнения расчётов. +enum RealExchange { + REAL_EXCHANGE_UNSPECIFIED = 0; //Тип не определён. + REAL_EXCHANGE_MOEX = 1; //Московская биржа. + REAL_EXCHANGE_RTS = 2; //Санкт-Петербургская биржа. + REAL_EXCHANGE_OTC = 3; //Внебиржевой инструмент. +} diff --git a/protos/marketdata.proto b/protos/marketdata.proto index ff1d33b..e298ac6 100644 --- a/protos/marketdata.proto +++ b/protos/marketdata.proto @@ -344,6 +344,7 @@ message GetTradingStatusResponse { SecurityTradingStatus trading_status = 2; //Статус торговли инструментом. bool limit_order_available_flag = 3; //Признак доступности выставления лимитной заявки по инструменту. bool market_order_available_flag = 4; //Признак доступности выставления рыночной заявки по инструменту. + bool api_trade_available_flag = 5; //Признак доступности торгов через API. } //Запрос последних обезличенных сделок по инструменту. @@ -356,4 +357,4 @@ message GetLastTradesRequest { //Последние обезличенные сделки по инструменту. message GetLastTradesResponse { repeated Trade trades = 1; //Массив сделок -} \ No newline at end of file +} diff --git a/protos/operations.proto b/protos/operations.proto index 0012d54..e4c35dd 100644 --- a/protos/operations.proto +++ b/protos/operations.proto @@ -220,8 +220,8 @@ enum OperationState { //Тип операции. enum OperationType { OPERATION_TYPE_UNSPECIFIED = 0; //Тип операции не определён. - OPERATION_TYPE_INPUT = 1; //Завод денежных средств. - OPERATION_TYPE_BOND_TAX = 2; //Удержание налога по купонам. + OPERATION_TYPE_INPUT = 1; //Пополнение брокерского счёта. + OPERATION_TYPE_BOND_TAX = 2; //Удержание НДФЛ по купонам. OPERATION_TYPE_OUTPUT_SECURITIES = 3; //Вывод ЦБ. OPERATION_TYPE_OVERNIGHT = 4; //Доход по сделке РЕПО овернайт. OPERATION_TYPE_TAX = 5; //Удержание налога. @@ -236,7 +236,7 @@ enum OperationType { OPERATION_TYPE_MARGIN_FEE = 14; //Удержание комиссии за непокрытую позицию. OPERATION_TYPE_BUY = 15; //Покупка ЦБ. OPERATION_TYPE_BUY_CARD = 16; //Покупка ЦБ с карты. - OPERATION_TYPE_INPUT_SECURITIES = 17; //Завод ЦБ. + OPERATION_TYPE_INPUT_SECURITIES = 17; //Завод ценных бумаг из другого депозитария. OPERATION_TYPE_SELL_MARGIN = 18; //Продажа в результате Margin-call. OPERATION_TYPE_BROKER_FEE = 19; //Удержание комиссии за операцию. OPERATION_TYPE_BUY_MARGIN = 20; //Покупка в результате Margin-call. diff --git a/protos/orders.proto b/protos/orders.proto index 14cb66e..4fede3c 100644 --- a/protos/orders.proto +++ b/protos/orders.proto @@ -35,7 +35,7 @@ service OrdersService {/* Сервис предназначен для рабо //Запрос установки соединения. message TradesStreamRequest { - + repeated string accounts = 1; //Идентификаторы счетов. } //Информация о торговых поручениях. diff --git a/protos/sandbox.proto b/protos/sandbox.proto index 1a74fdc..83cf321 100644 --- a/protos/sandbox.proto +++ b/protos/sandbox.proto @@ -79,4 +79,4 @@ message SandboxPayInRequest { //Результат пополнения счёта, текущий баланс. message SandboxPayInResponse { MoneyValue balance = 1; //Текущий баланс счёта -} \ No newline at end of file +} From a04b54bbf2ba209289bcda27995949cc9bb7fcf2 Mon Sep 17 00:00:00 2001 From: pskucherov Date: Fri, 6 May 2022 19:26:01 +0300 Subject: [PATCH 3/5] =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B1=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=B8=D1=82=D1=8C=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middlewares/response.ts | 83 ++++++++++++++++++++----------------- src/sdk.ts | 7 ++-- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/src/middlewares/response.ts b/src/middlewares/response.ts index afd1796..96d3c9f 100644 --- a/src/middlewares/response.ts +++ b/src/middlewares/response.ts @@ -8,45 +8,54 @@ type ErrorTrailers = { rateLimitRemaining?: string; rateLimitReset?: string; }; +export type TypeLoggerCb = (errorMetadata: ErrorTrailers, error: ClientError | unknown) => void; -export async function* responseMiddleware( - call: ClientMiddlewareCall, - options: CallOptions, -) { - const { path } = call.method; - - const errorMetadata: ErrorTrailers = {}; - - options.onTrailer = (data: Metadata) => { - Object.assign(errorMetadata, { - trackId: data.get('x-tracking-id'), - message: data.get('message'), - rateLimit: data.get('x-ratelimit-limit'), - rateLimitRemaining: data.get('x-ratelimit-remaining'), - rateLimitReset: data.get('x-ratelimit-reset'), - }); - }; - - try { - if (!call.responseStream) { - return yield* call.next(call.request, options); - } else { - for await (const response of call.next(call.request, options)) { - yield response; +export function getMiddleware(loggerCb?: TypeLoggerCb) { + return async function* ( + call: ClientMiddlewareCall, + options: CallOptions, + ) { + const { path } = call.method; + + const errorMetadata: ErrorTrailers = {}; + + options.onTrailer = (data: Metadata) => { + Object.assign(errorMetadata, { + trackId: data.get('x-tracking-id'), + message: data.get('message'), + rateLimit: data.get('x-ratelimit-limit'), + rateLimitRemaining: data.get('x-ratelimit-remaining'), + rateLimitReset: data.get('x-ratelimit-reset'), + }); + }; + + try { + if (!call.responseStream) { + return yield* call.next(call.request, options); + } else { + for await (const response of call.next(call.request, options)) { + yield response; + } + + return; } + } catch (error) { + if (loggerCb) { + loggerCb(errorMetadata, error); + } else { - return; - } - } catch (error) { - if (error instanceof ClientError) { - console.log(errorMetadata); - console.log( - 'Client error:', - `${Status[error.code]}(${error.details}) \n${errorStatusDescribe.get(error.details)} \n${path}`, - ); - } else { - console.log(errorMetadata); - console.log('Client error: ', `error: ${error}`, path); + if (error instanceof ClientError) { + console.log(errorMetadata); + console.log( + 'Client error:', + `${Status[error.code]}(${error.details}) \n${errorStatusDescribe.get(error.details)} \n${path}`, + ); + } else { + console.log(errorMetadata); + console.log('Client error: ', `error: ${error}`, path); + } + + } } } -} +} \ No newline at end of file diff --git a/src/sdk.ts b/src/sdk.ts index 2cc19ef..9e011cf 100644 --- a/src/sdk.ts +++ b/src/sdk.ts @@ -8,16 +8,15 @@ import { MarketDataServiceDefinition, MarketDataStreamServiceDefinition } from ' import { OperationsServiceDefinition } from './generated/operations'; import { OrdersServiceDefinition, OrdersStreamServiceDefinition } from './generated/orders'; import { SandboxServiceDefinition } from './generated/sandbox'; -import { responseMiddleware } from './middlewares/response'; +import { getMiddleware, TypeLoggerCb } from './middlewares/response'; -export const createSdk = (token: string, appName?: string) => { +export const createSdk = (token: string, appName?: string, loggerCb?: TypeLoggerCb) => { const metadata = createMetadata(token, appName); const metadataCred = createMetadataCredentials(metadata); const sslCred = createSSLCredentials(metadataCred); - const channel = makeChannel(API_URL, sslCred); - const clientFactory = createClientFactory().use(responseMiddleware); + const clientFactory = createClientFactory().use(getMiddleware(loggerCb)); return { instruments: clientFactory.create(InstrumentsServiceDefinition, channel), From 09273806fc9e469c8ccbaebd80bddd446d52f682 Mon Sep 17 00:00:00 2001 From: pskucherov Date: Fri, 6 May 2022 20:31:20 +0300 Subject: [PATCH 4/5] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BE=D1=80=D0=B8=D0=B3=D0=B8?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20json=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=20=D1=81=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/api_errors.ts | 419 ++++++++++++++++++++++++++++++++++++ src/errors/errorStatus.ts | 132 ------------ src/middlewares/response.ts | 24 ++- 3 files changed, 438 insertions(+), 137 deletions(-) create mode 100644 src/errors/api_errors.ts delete mode 100644 src/errors/errorStatus.ts diff --git a/src/errors/api_errors.ts b/src/errors/api_errors.ts new file mode 100644 index 0000000..620c686 --- /dev/null +++ b/src/errors/api_errors.ts @@ -0,0 +1,419 @@ +// @copypaste https://github.com/Tinkoff/investAPI/blob/861941e4c404b14b8dbfc376bc56fe03d959d7fb/src/docs/errors/api_errors.json +type Errors = { + [index: string]: ErrorMessagesType +} + +export type ErrorMessagesType = { + "message": String, + "type": String, + "description": String, +} + +export const errorStatus: Errors = { + "30001": { + "message": "missing parameter: 'from'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *from* является обязательным.
Укажите корректный параметр *from*." + }, + "30002": { + "message": "the required period should not exceed 7 days", + "type": "INVALID_ARGUMENT", + "description": "Запрошенный период не может превышать 7 дней.
Укажите корректный период." + }, + "30003": { + "message": "'from' can't be less than the current date", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *from* не может быть меньше текущей даты.
Укажите корректный параметр *from*." + }, + "30004": { + "message": "missing parameter: 'to'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *to* является обязательным.
Укажите корректный параметр *to*." + }, + "30005": { + "message": "'id_type' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *id_type* имеет некорректное значение.
Список доступных значений: [*id_type*](https://tinkoff.github.io/investAPI/instruments#instrumentidtype)." + }, + "30006": { + "message": "missing parameter: 'id_type'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *id_type* является обязательным.
Укажите корректный параметр *id_type*." + }, + "30007": { + "message": "missing parameter: 'id'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *id* является обязательным.
Укажите корректный параметр *id*." + }, + "30008": { + "message": "missing parameter: 'figi'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *figi* является обязательным.
Укажите корректный параметр *figi*." + }, + "30009": { + "message": "'from' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *from* имеет некорректное значение.
Укажите корректный параметр *from*." + }, + "30010": { + "message": "'to' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *to* имеет некорректное значение.
Укажите корректный параметр *to*." + }, + "30011": { + "message": "interval is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *interval* имеет некорректное значение.
Список доступных значений: [*interval*](https://tinkoff.github.io/investAPI/marketdata#subscriptioninterval)." + }, + "30012": { + "message": "'to' can't be less than 'from'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *to* не может быть меньше параметра *from*.
Укажите корректные параметры *from* и *to*." + }, + "30013": { + "message": "'class_code' require for 'id_type' = 'ticker'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *class_code* не может быть пустым при поиске по тикеру.
Укажите корректный параметр *class_code*.
Подробнее: [Идентификация инструментов](https://tinkoff.github.io/investAPI/faq_identification/)." + }, + "30014": { + "message": "the maximum request period for the given candle interval has been exceeded", + "type": "INVALID_ARGUMENT", + "description": "Превышен максимальный период запроса для данного интервала свечи.
Укажите корректный интервал." + }, + "30015": { + "message": "missing parameter: 'quantity'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *quantity* является обязательным.
Укажите корректный параметр *quantity*." + }, + "30016": { + "message": "'quantity' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *quantity* имеет некорректное значение.
Укажите корректный параметр *quantity*." + }, + "30017": { + "message": "missing parameter: 'price'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *price* является обязательным.
Укажите корректный параметр *price*." + }, + "30018": { + "message": "price is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *price* имеет некорректное значение.
Укажите корректный параметр *price*." + }, + "30019": { + "message": "missing parameter: 'direction'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *direction* является обязательным.
Укажите корректный параметр *direction*." + }, + "30020": { + "message": "'direction' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *direction* имеет некорректное значение.
Список доступных значений: [*direction*](https://tinkoff.github.io/investAPI/stoporders/#stoporderdirection)." + }, + "30021": { + "message": "missing parameter: 'account_id'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *account_id* является обязательным.
Укажите корректный параметр *account_id*." + }, + "30025": { + "message": "missing parameter: 'order_type'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *order_type* является обязательным.
Укажите корректный параметр *order_type*." + }, + "30027": { + "message": "missing parameter: 'order_id'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *order_id* является обязательным.
Укажите корректный параметр *order_id*." + }, + "30031": { + "message": "missing parameter: 'depth'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *depth* является обязательным.
Укажите корректный параметр *depth*." + }, + "30032": { + "message": "depth is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *depth* имеет некорректное значение.
Укажите корректный параметр *depth*." + }, + "30033": { + "message": "missing parameter: 'trade_clearing_account' or 'class_code'", + "type": "INVALID_ARGUMENT", + "description": "Параметр *trade_clearing_account* или *class_code* не может быть пустым." + }, + "30034": { + "message": "not enough balance", + "type": "INVALID_ARGUMENT", + "description": "Недостаточно средств для совершения сделки (ошибка песочницы).
Пополните баланс нужной валюты." + }, + "30036": { + "message": "missing parameter: 'stop_price'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *stop_price* является обязательным.
Укажите корректный параметр *stop_price*." + }, + "30037": { + "message": "missing parameter: 'stop_order_type'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *stop_order_type* является обязательным.
Укажите корректный параметр *stop_order_type*." + }, + "30038": { + "message": "'stop_order_type' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *stop_order_type* имеет некорректное значение.
Список доступных значений: [*stop_order_type*](https://tinkoff.github.io/investAPI/stoporders/#stopordertype)." + }, + "30040": { + "message": "'expire_date' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *expire_date* имеет некорректное значение.
Укажите корректный параметр *expire_date*." + }, + "30041": { + "message": "the method is available only for futures", + "type": "INVALID_ARGUMENT", + "description": "Метод предназначен только для работы с фьючерсами.
Передайте во входные параметры метода идентификатор фьючерса." + }, + "30042": { + "message": "not enough assets for a margin trade", + "type": "INVALID_ARGUMENT", + "description": "Недостаточно активов для маржинальной сделки.
Проверьте маржинальные показатели счёта." + }, + "30043": { + "message": "missing parameter: 'expiration_type'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *expiration_type* является обязательным.
Укажите корректный параметр *expiration_type*." + }, + "30044": { + "message": "'expiration_type' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *expiration_type* имеет некорректное значение.
Список доступных значений: [*expiration_type*](https://tinkoff.github.io/investAPI/stoporders/#stoporderexpirationtype)." + }, + "30045": { + "message": "missing parameter: 'ticker'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *ticker* является обязательным.
Укажите корректный параметр *ticker*." + }, + "30047": { + "message": "price currency does not match the settlement currency", + "type": "INVALID_ARGUMENT", + "description": "Валюта цены не совпадает с валютой расчётов по инструменту.
Укажите корректную валюту цены." + }, + "30048": { + "message": "instrument type is not bond", + "type": "INVALID_ARGUMENT", + "description": "Метод предназначен только для запроса информации по облигации.
Передайте во входные параметры метода идентификатор облигации." + }, + "30049": { + "message": "post order error: %s", + "type": "INVALID_ARGUMENT", + "description": "Ошибка метода выставления торгового поручения.
Подробнее в тексте ошибки." + }, + "30050": { + "message": "'instrument_status' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *instrument_status* имеет некорректное значение.
Список доступных значений: [*instrument_status*](https://tinkoff.github.io/investAPI/instruments#instrumentstatus)." + }, + "30051": { + "message": "account margin status is disabled", + "type": "INVALID_ARGUMENT", + "description": "Для данного договора недоступна маржинальная торговля." + }, + "30052": { + "message": "instrument forbidden for trading by API", + "type": "INVALID_ARGUMENT", + "description": "Для данного инструмента недоступна торговля через API." + }, + "30053": { + "message": "post stop_order error: %s", + "type": "INVALID_ARGUMENT", + "description": "Ошибка метода выставления стоп-заявки.
Подробнее в тексте ошибки." + }, + "30054": { + "message": "instrument type is not a share or etf", + "type": "INVALID_ARGUMENT", + "description": "Тип инструмента не инвестиционный фонд или акция" + }, + "30055": { + "message": "order_id cannot be longer than 36 characters", + "type": "INVALID_ARGUMENT", + "description": "order_id не может быть длиннее 36 символов" + }, + "30056": { + "message": "stop order settlement currency is not supported", + "type": "INVALID_ARGUMENT", + "description": "Валюта выставления стоп-заявки не поддерживается" + }, + "30057": { + "message": "the order is a duplicate, but the order report was not found", + "type": "INVALID_ARGUMENT", + "description": "Заявка является дублем, но отчет по заявке не найден" + }, + "30058": { + "message": "task not completed yet, please try again later", + "type": "INVALID_ARGUMENT", + "description": "Выполнение задачи еще не завершено, попробуйте позже." + }, + "30059": { + "message": "cancel order error: %s", + "type": "INVALID_ARGUMENT", + "description": "Ошибка метода отмены заявки.
Подробнее в тексте ошибки." + }, + "30060": { + "message": "cancel stop-order error: %s", + "type": "INVALID_ARGUMENT", + "description": "Ошибка метода отмены стоп-заявки.
Подробнее в тексте ошибки." + }, + "30061": { + "message": "'from' value out of range", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *from* имеет некорректное значение.
Укажите значение в пределах от 1970-01-01T00:00:00Z до 2099-12-31T23:59:59.999999999Z включительно." + }, + "30062": { + "message": "'to' value out of range", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *to* имеет некорректное значение.
Укажите значение в пределах от 1970-01-01T00:00:00Z до 2099-12-31T23:59:59.999999999Z включительно." + }, + "30063": { + "message": "'expire_date' value out of range", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *expire_date* имеет некорректное значение.
Дата должна быть не ранее текущей и не позднее 2099-12-31T23:59:59.999999999Z." + }, + "30064": { + "message": "the required period should not exceed 31 days", + "type": "INVALID_ARGUMENT", + "description": "Запрошенный период не может превышать 31 дня.
Укажите корректный период." + }, + "30065": { + "message": "missing parameter: 'task_id'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *task_id* является обязательным.
Укажите корректный параметр *task_id*." + }, + "30066": { + "message": "missing parameter: 'payload'", + "type": "INVALID_ARGUMENT", + "description": "Входной параметр *payload* является обязательным.
Укажите корректный параметр *payload*." + }, + "30067": { + "message": "'action_type' is invalid", + "type": "INVALID_ARGUMENT", + "description": "Некорректное значение *action_type*.
Выберите допустимое значение." + }, + "30077": { + "message": "not available for OTC instruments", + "type": "INVALID_ARGUMENT", + "description": "Метод недоступен для внебиржевых инструментов." + }, + "30078": { + "message": "Incorrect minimum price increment", + "type": "INVALID_ARGUMENT", + "description": "Некорректный шаг изменения цены." + }, + "30079": { + "message": "instrument is not available for trading", + "type": "INVALID_ARGUMENT", + "description": "Инструмент недоступен для торгов." + }, + "30080": { + "message": "quantity must be positive", + "type": "INVALID_ARGUMENT", + "description": "Количество лотов должно быть положительным числом." + }, + "30081": { + "message": "account status is closed", + "type": "INVALID_ARGUMENT", + "description": "Аккаунт закрыт." + }, + "30082": { + "message": "account status is blocked", + "type": "INVALID_ARGUMENT", + "description": "Аккаунт заблокирован." + }, + "30083": { + "message": "order_type is invalid", + "type": "INVALID_ARGUMENT", + "description": "Некорректный тип заявки." + }, + "30084": { + "message": "maximum request period has been exceeded", + "type": "INVALID_ARGUMENT", + "description": "Превышен лимит запрашиваемого периода." + }, + "30085": { + "message": "price in points is available only for futures and bonds", + "type": "INVALID_ARGUMENT", + "description": "Тип цены в пунктах доступен только для фьючерсов и облигаций." + }, + "40002": { + "message": "insufficient privileges", + "type": "PERMISSION_DENIED", + "description": "Недостаточно прав для совершения операции.
Токен доступа имеет уровень прав read-only.
Подробнее: [Виды токенов](https://tinkoff.github.io/investAPI/index#_2)" + }, + + "50001": { + "message": "exchange not found", + "type": "NOT_FOUND", + "description": "Биржа не найдена по переданному *exchange_id*.
Укажите корректный *exchange_id*." + }, + "50002": { + "message": "instrument not found", + "type": "NOT_FOUND", + "description": "Инструмент не найден.
Укажите корректный идентификатор инструмента." + }, + "50004": { + "message": "account not found", + "type": "NOT_FOUND", + "description": "Счёт не найден по переданному *account_id*.
Укажите корректный *account_id*." + }, + "50005": { + "message": "order not found", + "type": "NOT_FOUND", + "description": "Торговое поручение не найдено по переданному *order_id*.
Укажите корректный *order_id*." + }, + "50006": { + "message": "stop-order not found", + "type": "NOT_FOUND", + "description": "Стоп-заявка не найдена по переданному *stop_order_id*.
Укажите корректный *stop_order_id*." + }, + "50007": { + "message": "task not found", + "type": "NOT_FOUND", + "description": "Задача не найдена." + }, + "50008": { + "message": "no orderbook provider", + "type": "NOT_FOUND", + "description": "Отсутствует источник данных по стаканам." + }, + "50009": { + "message": "asset not found", + "type": "NOT_FOUND", + "description": "Актив не найден.
Укажите корректный идентификатор актива." + }, + "70001": { + "message": "internal error", + "type": "INTERNAL", + "description": "Внутренняя ошибка сервиса.
Если ошибка повторяется, обратитесь в службу технической поддержки." + }, + "70002": { + "message": "internal network error", + "type": "INTERNAL", + "description": "Неизвестная сетевая ошибка, попробуйте выполнить запрос позднее.
Если ошибка повторяется, обратитесь в службу технической поддержки." + }, + "70003": { + "message": "internal error, please try again later", + "type": "INTERNAL", + "description": "Внутренняя ошибка сервиса, попробуйте выполнить запрос позднее.
Если ошибка повторяется, обратитесь в службу технической поддержки." + }, + "80001": { + "message": "limit of open streams exceeded", + "type": "RESOURCE_EXHAUSTED", + "description": "Превышен лимит одновременных открытых stream-соединений. Подробнее: [Лимитная политика](https://tinkoff.github.io/investAPI/limits/)" + }, + "80002": { + "message": "request limit exceeded", + "type": "RESOURCE_EXHAUSTED", + "description": "Превышен лимит запросов в минуту. Подробнее: [Лимитная политика](https://tinkoff.github.io/investAPI/limits/)" + }, + "90001": { + "message": "need confirmation: %s", + "type": "FAILED_PRECONDITION", + "description": "Требуется подтверждение операции.
Подробнее в тексте ошибки." + } +}; diff --git a/src/errors/errorStatus.ts b/src/errors/errorStatus.ts deleted file mode 100644 index 4953c1d..0000000 --- a/src/errors/errorStatus.ts +++ /dev/null @@ -1,132 +0,0 @@ -export const errorStatusDescribe = new Map([ - ['30001', 'Входной параметр from является обязательным. Укажите корректный параметр from.'], - ['30002', 'Запрошенный период не может превышать 7 дней. Укажите корректный период.'], - ['30003', 'Входной параметр from не может быть меньше текущей даты. Укажите корректный параметр from.'], - ['30004', 'Входной параметр to является обязательным. Укажите корректный параметр to.'], - [ - '30005', - 'Входной параметр id_type имеет некорректное значение. Список доступных значений: id_type.(https://tinkoff.github.io/investAPI/instruments#instrumentidtype)', - ], - ['30006', 'Входной параметр id_type является обязательным. Укажите корректный параметр id_type.'], - ['30007', 'Входной параметр id является обязательным. Укажите корректный параметр id.'], - ['30008', 'Входной параметр figi является обязательным. Укажите корректный параметр figi.'], - ['30009', 'Входной параметр from имеет некорректное значение. Укажите корректный параметр from.'], - ['30010', 'Входной параметр to имеет некорректное значение. Укажите корректный параметр to.'], - [ - '30011', - 'Входной параметр interval имеет некорректное значение. Список доступных значений: interval.(https://tinkoff.github.io/investAPI/marketdata#subscriptioninterval)', - ], - ['30012', 'Входной параметр to не может быть меньше параметра from. Укажите корректные параметры from и to.'], - [ - '30013', - 'Входной параметр class_code не может быть пустым при поиске по тикеру. Укажите корректный параметр class_code. Подробнее: Идентификация инструментов.(https://tinkoff.github.io/investAPI/faq_identification/)', - ], - ['30014', 'Превышен максимальный период запроса для данного интервала свечи. Укажите корректный интервал.'], - ['30015', 'Входной параметр quantity является обязательным. Укажите корректный параметр quantity.'], - ['30016', 'Входной параметр quantity имеет некорректное значение. Укажите корректный параметр quantity.'], - ['30017', 'Входной параметр price является обязательным. Укажите корректный параметр price.'], - ['30018', 'Входной параметр price имеет некорректное значение. Укажите корректный параметр price.'], - ['30019', 'Входной параметр direction является обязательным. Укажите корректный параметр direction.'], - [ - '30020', - 'Входной параметр direction имеет некорректное значение. Список доступных значений: direction.(https://tinkoff.github.io/investAPI/stoporders/#stoporderdirection)', - ], - ['30021', 'Входной параметр account_id является обязательным. Укажите корректный параметр account_id.'], - ['30025', 'Входной параметр order_type является обязательным. Укажите корректный параметр order_type.'], - ['30027', 'Входной параметр order_id является обязательным. Укажите корректный параметр order_id.'], - ['30031', 'Входной параметр depth является обязательным. Укажите корректный параметр depth.'], - ['30032', 'Входной параметр depth имеет некорректное значение. Укажите корректный параметр depth.'], - ['30033', 'Параметр trade_clearing_account или class_code не может быть пустым.'], - ['30034', 'Недостаточно средств для совершения сделки (ошибка песочницы). Пополните баланс нужной валюты.'], - ['30036', 'Входной параметр stop_price является обязательным. Укажите корректный параметр stop_price.'], - ['30037', 'Входной параметр stop_order_type является обязательным. Укажите корректный параметр stop_order_type.'], - [ - '30038', - 'Входной параметр stop_order_type имеет некорректное значение. Список доступных значений: stop_order_type.(https://tinkoff.github.io/investAPI/stoporders/#stopordertype)', - ], - ['30040', 'Входной параметр expire_date имеет некорректное значение. Укажите корректный параметр expire_date.'], - [ - '30041', - 'Метод предназначен только для работы с фьючерсами. Передайте во входные параметры метода идентификатор фьючерса.', - ], - ['30042', 'Недостаточно активов для маржинальной сделки. Проверьте маржинальные показатели счёта.'], - ['30043', 'Входной параметр expiration_type является обязательным. Укажите корректный параметр expiration_type.'], - [ - '30044', - 'Входной параметр expiration_type имеет некорректное значение. Список доступных значений: expiration_type.(https://tinkoff.github.io/investAPI/stoporders/#stoporderexpirationtype)', - ], - ['30045', 'Входной параметр ticker является обязательным. Укажите корректный параметр ticker.'], - ['30047', 'Валюта цены не совпадает с валютой расчётов по инструменту. Укажите корректную валюту цены.'], - [ - '30048', - 'Метод предназначен только для запроса информации по облигации. Передайте во входные параметры метода идентификатор облигации.', - ], - ['30049', 'Ошибка метода выставления торгового поручения. Подробнее в тексте ошибки.'], - [ - '30050', - 'Входной параметр instrument_status имеет некорректное значение. Список доступных значений: instrument_status.(https://tinkoff.github.io/investAPI/instruments#instrumentstatus)', - ], - ['30051', 'Для данного договора недоступна маржинальная торговля.'], - ['30052', 'Для данного инструмента недоступна торговля через API.'], - ['30053', 'Ошибка метода выставления стоп-заявки. Подробнее в тексте ошибки.'], - ['30054', 'Тип инструмента не инвестиционный фонд или акция'], - ['30055', 'order_id не может быть длиннее 36 символов'], - ['30056', 'Валюта выставления стоп-заявки не поддерживается'], - ['30057', 'Заявка является дублем, но отчет по заявке не найден'], - ['30058', 'Выполнение задачи еще не завершено, попробуйте позже.'], - ['30059', 'Ошибка метода отмены заявки. Подробнее в тексте ошибки.'], - ['30060', 'Ошибка метода отмены стоп-заявки. Подробнее в тексте ошибки.'], - [ - '30061', - 'Входной параметр from имеет некорректное значение. Укажите значение в пределах от 1970-01-01T00:00:00Z до 2099-12-31T23:59:59.999999999Z включительно.', - ], - [ - '30062', - 'Входной параметр to имеет некорректное значение. Укажите значение в пределах от 1970-01-01T00:00:00Z до 2099-12-31T23:59:59.999999999Z включительно.', - ], - [ - '30063', - 'Входной параметр expire_date имеет некорректное значение. Дата должна быть не ранее текущей и не позднее 2099-12-31T23:59:59.999999999Z.', - ], - ['30064', 'Запрошенный период не может превышать 31 дня. Укажите корректный период.'], - ['30065', 'Входной параметр task_id является обязательным. Укажите корректный параметр task_id.'], - ['30066', 'Входной параметр payload является обязательным. Укажите корректный параметр payload.'], - ['30077', 'Метод недоступен для внебиржевых инструментов.'], - ['30078', 'Некорректный шаг изменения цены.'], - ['30079', 'Инструмент недоступен для торгов.'], - ['30080', 'Количество лотов должно быть положительным числом.'], - ['30081', 'Аккаунт закрыт.'], - ['30082', 'Аккаунт заблокирован.'], - ['30083', 'Некорректный тип заявки.'], - ['30084', 'Превышен лимит запрашиваемого периода.'], - [ - '40002', - 'Недостаточно прав для совершения операции. Токен доступа имеет уровень прав read-only. Подробнее: Виды токенов(https://tinkoff.github.io/investAPI/index#_2)', - ], - ['50001', 'Биржа не найдена по переданному exchange_id. Укажите корректный exchange_id.'], - ['50002', 'Инструмент не найден. Укажите корректный идентификатор инструмента.'], - ['50004', 'Счёт не найден по переданному account_id. Укажите корректный account_id.'], - ['50005', 'Торговое поручение не найдено по переданному order_id. Укажите корректный order_id.'], - ['50006', 'Стоп-заявка не найдена по переданному stop_order_id. Укажите корректный stop_order_id.'], - ['50007', 'Задача не найдена.'], - ['50008', 'Отсутствует источник данных по стаканам.'], - ['50009', 'Актив не найден. Укажите корректный идентификатор актива.'], - ['70001', 'Внутренняя ошибка сервиса. Если ошибка повторяется, обратитесь в службу технической поддержки.'], - [ - '70002', - 'Неизвестная сетевая ошибка, попробуйте выполнить запрос позднее. Если ошибка повторяется, обратитесь в службу технической поддержки.', - ], - [ - '70003', - 'Внутренняя ошибка сервиса, попробуйте выполнить запрос позднее. Если ошибка повторяется, обратитесь в службу технической поддержки.', - ], - [ - '80001', - 'Превышен лимит одновременных открытых stream-соединений. Подробнее: Лимитная политика(https://tinkoff.github.io/investAPI/limits/)', - ], - [ - '80002', - 'Превышен лимит запросов в минуту. Подробнее: Лимитная политика(https://tinkoff.github.io/investAPI/limits/)', - ], - ['90001', 'Требуется подтверждение операции. Подробнее в тексте ошибки.'], -]); diff --git a/src/middlewares/response.ts b/src/middlewares/response.ts index 96d3c9f..55ca005 100644 --- a/src/middlewares/response.ts +++ b/src/middlewares/response.ts @@ -1,5 +1,5 @@ import { ClientError, ClientMiddlewareCall, Status, CallOptions, Metadata } from 'nice-grpc'; -import { errorStatusDescribe } from '../errors/errorStatus'; +import { errorStatus, ErrorMessagesType } from '../errors/api_errors'; type ErrorTrailers = { trackId?: string; @@ -8,7 +8,11 @@ type ErrorTrailers = { rateLimitRemaining?: string; rateLimitReset?: string; }; -export type TypeLoggerCb = (errorMetadata: ErrorTrailers, error: ClientError | unknown) => void; +export type TypeLoggerCb = ( + errorMetadata: ErrorTrailers, + error: ClientError | unknown, + messages?: ErrorMessagesType, +) => void; export function getMiddleware(loggerCb?: TypeLoggerCb) { return async function* ( @@ -40,15 +44,25 @@ export function getMiddleware(loggerCb?: TypeLoggerCb) { return; } } catch (error) { + const isClientError = error instanceof ClientError; + const errStatus = isClientError ? errorStatus[error.details] : undefined; + if (loggerCb) { - loggerCb(errorMetadata, error); + loggerCb( + errorMetadata, + error, + errStatus, + ); } else { - if (error instanceof ClientError) { + if (isClientError) { + const errDescription = errStatus && errorStatus[error.details] && + errorStatus[error.details].description; + console.log(errorMetadata); console.log( 'Client error:', - `${Status[error.code]}(${error.details}) \n${errorStatusDescribe.get(error.details)} \n${path}`, + `${Status[error.code]}(${error.details}) \n${errDescription || ''} \n${path}`, ); } else { console.log(errorMetadata); From 191929aedf5120beba1882b5c01b52ac904b8b41 Mon Sep 17 00:00:00 2001 From: pskucherov Date: Fri, 6 May 2022 20:44:25 +0300 Subject: [PATCH 5/5] eslint --fix --- src/errors/api_errors.ts | 841 ++++++++++++++++++------------------ src/middlewares/response.ts | 25 +- 2 files changed, 437 insertions(+), 429 deletions(-) diff --git a/src/errors/api_errors.ts b/src/errors/api_errors.ts index 620c686..10d3791 100644 --- a/src/errors/api_errors.ts +++ b/src/errors/api_errors.ts @@ -1,419 +1,440 @@ // @copypaste https://github.com/Tinkoff/investAPI/blob/861941e4c404b14b8dbfc376bc56fe03d959d7fb/src/docs/errors/api_errors.json type Errors = { - [index: string]: ErrorMessagesType -} + [index: string]: ErrorMessagesType; +}; export type ErrorMessagesType = { - "message": String, - "type": String, - "description": String, -} + message: string; + type: string; + description: string; +}; export const errorStatus: Errors = { - "30001": { - "message": "missing parameter: 'from'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *from* является обязательным.
Укажите корректный параметр *from*." - }, - "30002": { - "message": "the required period should not exceed 7 days", - "type": "INVALID_ARGUMENT", - "description": "Запрошенный период не может превышать 7 дней.
Укажите корректный период." - }, - "30003": { - "message": "'from' can't be less than the current date", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *from* не может быть меньше текущей даты.
Укажите корректный параметр *from*." - }, - "30004": { - "message": "missing parameter: 'to'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *to* является обязательным.
Укажите корректный параметр *to*." - }, - "30005": { - "message": "'id_type' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *id_type* имеет некорректное значение.
Список доступных значений: [*id_type*](https://tinkoff.github.io/investAPI/instruments#instrumentidtype)." - }, - "30006": { - "message": "missing parameter: 'id_type'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *id_type* является обязательным.
Укажите корректный параметр *id_type*." - }, - "30007": { - "message": "missing parameter: 'id'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *id* является обязательным.
Укажите корректный параметр *id*." - }, - "30008": { - "message": "missing parameter: 'figi'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *figi* является обязательным.
Укажите корректный параметр *figi*." - }, - "30009": { - "message": "'from' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *from* имеет некорректное значение.
Укажите корректный параметр *from*." - }, - "30010": { - "message": "'to' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *to* имеет некорректное значение.
Укажите корректный параметр *to*." - }, - "30011": { - "message": "interval is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *interval* имеет некорректное значение.
Список доступных значений: [*interval*](https://tinkoff.github.io/investAPI/marketdata#subscriptioninterval)." - }, - "30012": { - "message": "'to' can't be less than 'from'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *to* не может быть меньше параметра *from*.
Укажите корректные параметры *from* и *to*." - }, - "30013": { - "message": "'class_code' require for 'id_type' = 'ticker'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *class_code* не может быть пустым при поиске по тикеру.
Укажите корректный параметр *class_code*.
Подробнее: [Идентификация инструментов](https://tinkoff.github.io/investAPI/faq_identification/)." - }, - "30014": { - "message": "the maximum request period for the given candle interval has been exceeded", - "type": "INVALID_ARGUMENT", - "description": "Превышен максимальный период запроса для данного интервала свечи.
Укажите корректный интервал." - }, - "30015": { - "message": "missing parameter: 'quantity'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *quantity* является обязательным.
Укажите корректный параметр *quantity*." - }, - "30016": { - "message": "'quantity' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *quantity* имеет некорректное значение.
Укажите корректный параметр *quantity*." - }, - "30017": { - "message": "missing parameter: 'price'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *price* является обязательным.
Укажите корректный параметр *price*." - }, - "30018": { - "message": "price is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *price* имеет некорректное значение.
Укажите корректный параметр *price*." - }, - "30019": { - "message": "missing parameter: 'direction'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *direction* является обязательным.
Укажите корректный параметр *direction*." - }, - "30020": { - "message": "'direction' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *direction* имеет некорректное значение.
Список доступных значений: [*direction*](https://tinkoff.github.io/investAPI/stoporders/#stoporderdirection)." - }, - "30021": { - "message": "missing parameter: 'account_id'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *account_id* является обязательным.
Укажите корректный параметр *account_id*." - }, - "30025": { - "message": "missing parameter: 'order_type'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *order_type* является обязательным.
Укажите корректный параметр *order_type*." - }, - "30027": { - "message": "missing parameter: 'order_id'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *order_id* является обязательным.
Укажите корректный параметр *order_id*." - }, - "30031": { - "message": "missing parameter: 'depth'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *depth* является обязательным.
Укажите корректный параметр *depth*." - }, - "30032": { - "message": "depth is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *depth* имеет некорректное значение.
Укажите корректный параметр *depth*." - }, - "30033": { - "message": "missing parameter: 'trade_clearing_account' or 'class_code'", - "type": "INVALID_ARGUMENT", - "description": "Параметр *trade_clearing_account* или *class_code* не может быть пустым." - }, - "30034": { - "message": "not enough balance", - "type": "INVALID_ARGUMENT", - "description": "Недостаточно средств для совершения сделки (ошибка песочницы).
Пополните баланс нужной валюты." - }, - "30036": { - "message": "missing parameter: 'stop_price'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *stop_price* является обязательным.
Укажите корректный параметр *stop_price*." - }, - "30037": { - "message": "missing parameter: 'stop_order_type'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *stop_order_type* является обязательным.
Укажите корректный параметр *stop_order_type*." - }, - "30038": { - "message": "'stop_order_type' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *stop_order_type* имеет некорректное значение.
Список доступных значений: [*stop_order_type*](https://tinkoff.github.io/investAPI/stoporders/#stopordertype)." - }, - "30040": { - "message": "'expire_date' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *expire_date* имеет некорректное значение.
Укажите корректный параметр *expire_date*." - }, - "30041": { - "message": "the method is available only for futures", - "type": "INVALID_ARGUMENT", - "description": "Метод предназначен только для работы с фьючерсами.
Передайте во входные параметры метода идентификатор фьючерса." - }, - "30042": { - "message": "not enough assets for a margin trade", - "type": "INVALID_ARGUMENT", - "description": "Недостаточно активов для маржинальной сделки.
Проверьте маржинальные показатели счёта." - }, - "30043": { - "message": "missing parameter: 'expiration_type'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *expiration_type* является обязательным.
Укажите корректный параметр *expiration_type*." - }, - "30044": { - "message": "'expiration_type' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *expiration_type* имеет некорректное значение.
Список доступных значений: [*expiration_type*](https://tinkoff.github.io/investAPI/stoporders/#stoporderexpirationtype)." - }, - "30045": { - "message": "missing parameter: 'ticker'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *ticker* является обязательным.
Укажите корректный параметр *ticker*." - }, - "30047": { - "message": "price currency does not match the settlement currency", - "type": "INVALID_ARGUMENT", - "description": "Валюта цены не совпадает с валютой расчётов по инструменту.
Укажите корректную валюту цены." - }, - "30048": { - "message": "instrument type is not bond", - "type": "INVALID_ARGUMENT", - "description": "Метод предназначен только для запроса информации по облигации.
Передайте во входные параметры метода идентификатор облигации." - }, - "30049": { - "message": "post order error: %s", - "type": "INVALID_ARGUMENT", - "description": "Ошибка метода выставления торгового поручения.
Подробнее в тексте ошибки." - }, - "30050": { - "message": "'instrument_status' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *instrument_status* имеет некорректное значение.
Список доступных значений: [*instrument_status*](https://tinkoff.github.io/investAPI/instruments#instrumentstatus)." - }, - "30051": { - "message": "account margin status is disabled", - "type": "INVALID_ARGUMENT", - "description": "Для данного договора недоступна маржинальная торговля." - }, - "30052": { - "message": "instrument forbidden for trading by API", - "type": "INVALID_ARGUMENT", - "description": "Для данного инструмента недоступна торговля через API." - }, - "30053": { - "message": "post stop_order error: %s", - "type": "INVALID_ARGUMENT", - "description": "Ошибка метода выставления стоп-заявки.
Подробнее в тексте ошибки." - }, - "30054": { - "message": "instrument type is not a share or etf", - "type": "INVALID_ARGUMENT", - "description": "Тип инструмента не инвестиционный фонд или акция" - }, - "30055": { - "message": "order_id cannot be longer than 36 characters", - "type": "INVALID_ARGUMENT", - "description": "order_id не может быть длиннее 36 символов" - }, - "30056": { - "message": "stop order settlement currency is not supported", - "type": "INVALID_ARGUMENT", - "description": "Валюта выставления стоп-заявки не поддерживается" - }, - "30057": { - "message": "the order is a duplicate, but the order report was not found", - "type": "INVALID_ARGUMENT", - "description": "Заявка является дублем, но отчет по заявке не найден" - }, - "30058": { - "message": "task not completed yet, please try again later", - "type": "INVALID_ARGUMENT", - "description": "Выполнение задачи еще не завершено, попробуйте позже." - }, - "30059": { - "message": "cancel order error: %s", - "type": "INVALID_ARGUMENT", - "description": "Ошибка метода отмены заявки.
Подробнее в тексте ошибки." - }, - "30060": { - "message": "cancel stop-order error: %s", - "type": "INVALID_ARGUMENT", - "description": "Ошибка метода отмены стоп-заявки.
Подробнее в тексте ошибки." - }, - "30061": { - "message": "'from' value out of range", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *from* имеет некорректное значение.
Укажите значение в пределах от 1970-01-01T00:00:00Z до 2099-12-31T23:59:59.999999999Z включительно." - }, - "30062": { - "message": "'to' value out of range", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *to* имеет некорректное значение.
Укажите значение в пределах от 1970-01-01T00:00:00Z до 2099-12-31T23:59:59.999999999Z включительно." - }, - "30063": { - "message": "'expire_date' value out of range", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *expire_date* имеет некорректное значение.
Дата должна быть не ранее текущей и не позднее 2099-12-31T23:59:59.999999999Z." - }, - "30064": { - "message": "the required period should not exceed 31 days", - "type": "INVALID_ARGUMENT", - "description": "Запрошенный период не может превышать 31 дня.
Укажите корректный период." - }, - "30065": { - "message": "missing parameter: 'task_id'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *task_id* является обязательным.
Укажите корректный параметр *task_id*." - }, - "30066": { - "message": "missing parameter: 'payload'", - "type": "INVALID_ARGUMENT", - "description": "Входной параметр *payload* является обязательным.
Укажите корректный параметр *payload*." - }, - "30067": { - "message": "'action_type' is invalid", - "type": "INVALID_ARGUMENT", - "description": "Некорректное значение *action_type*.
Выберите допустимое значение." - }, - "30077": { - "message": "not available for OTC instruments", - "type": "INVALID_ARGUMENT", - "description": "Метод недоступен для внебиржевых инструментов." - }, - "30078": { - "message": "Incorrect minimum price increment", - "type": "INVALID_ARGUMENT", - "description": "Некорректный шаг изменения цены." - }, - "30079": { - "message": "instrument is not available for trading", - "type": "INVALID_ARGUMENT", - "description": "Инструмент недоступен для торгов." - }, - "30080": { - "message": "quantity must be positive", - "type": "INVALID_ARGUMENT", - "description": "Количество лотов должно быть положительным числом." - }, - "30081": { - "message": "account status is closed", - "type": "INVALID_ARGUMENT", - "description": "Аккаунт закрыт." - }, - "30082": { - "message": "account status is blocked", - "type": "INVALID_ARGUMENT", - "description": "Аккаунт заблокирован." - }, - "30083": { - "message": "order_type is invalid", - "type": "INVALID_ARGUMENT", - "description": "Некорректный тип заявки." - }, - "30084": { - "message": "maximum request period has been exceeded", - "type": "INVALID_ARGUMENT", - "description": "Превышен лимит запрашиваемого периода." - }, - "30085": { - "message": "price in points is available only for futures and bonds", - "type": "INVALID_ARGUMENT", - "description": "Тип цены в пунктах доступен только для фьючерсов и облигаций." - }, - "40002": { - "message": "insufficient privileges", - "type": "PERMISSION_DENIED", - "description": "Недостаточно прав для совершения операции.
Токен доступа имеет уровень прав read-only.
Подробнее: [Виды токенов](https://tinkoff.github.io/investAPI/index#_2)" + '30001': { + message: "missing parameter: 'from'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *from* является обязательным.
Укажите корректный параметр *from*.', + }, + '30002': { + message: 'the required period should not exceed 7 days', + type: 'INVALID_ARGUMENT', + description: 'Запрошенный период не может превышать 7 дней.
Укажите корректный период.', + }, + '30003': { + message: "'from' can't be less than the current date", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *from* не может быть меньше текущей даты.
Укажите корректный параметр *from*.', + }, + '30004': { + message: "missing parameter: 'to'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *to* является обязательным.
Укажите корректный параметр *to*.', + }, + '30005': { + message: "'id_type' is invalid", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *id_type* имеет некорректное значение.
Список доступных значений: [*id_type*](https://tinkoff.github.io/investAPI/instruments#instrumentidtype).', + }, + '30006': { + message: "missing parameter: 'id_type'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *id_type* является обязательным.
Укажите корректный параметр *id_type*.', + }, + '30007': { + message: "missing parameter: 'id'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *id* является обязательным.
Укажите корректный параметр *id*.', + }, + '30008': { + message: "missing parameter: 'figi'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *figi* является обязательным.
Укажите корректный параметр *figi*.', + }, + '30009': { + message: "'from' is invalid", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *from* имеет некорректное значение.
Укажите корректный параметр *from*.', + }, + '30010': { + message: "'to' is invalid", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *to* имеет некорректное значение.
Укажите корректный параметр *to*.', + }, + '30011': { + message: 'interval is invalid', + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *interval* имеет некорректное значение.
Список доступных значений: [*interval*](https://tinkoff.github.io/investAPI/marketdata#subscriptioninterval).', + }, + '30012': { + message: "'to' can't be less than 'from'", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *to* не может быть меньше параметра *from*.
Укажите корректные параметры *from* и *to*.', + }, + '30013': { + message: "'class_code' require for 'id_type' = 'ticker'", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *class_code* не может быть пустым при поиске по тикеру.
Укажите корректный параметр *class_code*.
Подробнее: [Идентификация инструментов](https://tinkoff.github.io/investAPI/faq_identification/).', + }, + '30014': { + message: 'the maximum request period for the given candle interval has been exceeded', + type: 'INVALID_ARGUMENT', + description: 'Превышен максимальный период запроса для данного интервала свечи.
Укажите корректный интервал.', + }, + '30015': { + message: "missing parameter: 'quantity'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *quantity* является обязательным.
Укажите корректный параметр *quantity*.', + }, + '30016': { + message: "'quantity' is invalid", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *quantity* имеет некорректное значение.
Укажите корректный параметр *quantity*.', + }, + '30017': { + message: "missing parameter: 'price'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *price* является обязательным.
Укажите корректный параметр *price*.', + }, + '30018': { + message: 'price is invalid', + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *price* имеет некорректное значение.
Укажите корректный параметр *price*.', + }, + '30019': { + message: "missing parameter: 'direction'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *direction* является обязательным.
Укажите корректный параметр *direction*.', + }, + '30020': { + message: "'direction' is invalid", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *direction* имеет некорректное значение.
Список доступных значений: [*direction*](https://tinkoff.github.io/investAPI/stoporders/#stoporderdirection).', + }, + '30021': { + message: "missing parameter: 'account_id'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *account_id* является обязательным.
Укажите корректный параметр *account_id*.', + }, + '30025': { + message: "missing parameter: 'order_type'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *order_type* является обязательным.
Укажите корректный параметр *order_type*.', + }, + '30027': { + message: "missing parameter: 'order_id'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *order_id* является обязательным.
Укажите корректный параметр *order_id*.', + }, + '30031': { + message: "missing parameter: 'depth'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *depth* является обязательным.
Укажите корректный параметр *depth*.', + }, + '30032': { + message: 'depth is invalid', + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *depth* имеет некорректное значение.
Укажите корректный параметр *depth*.', + }, + '30033': { + message: "missing parameter: 'trade_clearing_account' or 'class_code'", + type: 'INVALID_ARGUMENT', + description: 'Параметр *trade_clearing_account* или *class_code* не может быть пустым.', + }, + '30034': { + message: 'not enough balance', + type: 'INVALID_ARGUMENT', + description: 'Недостаточно средств для совершения сделки (ошибка песочницы).
Пополните баланс нужной валюты.', + }, + '30036': { + message: "missing parameter: 'stop_price'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *stop_price* является обязательным.
Укажите корректный параметр *stop_price*.', + }, + '30037': { + message: "missing parameter: 'stop_order_type'", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *stop_order_type* является обязательным.
Укажите корректный параметр *stop_order_type*.', + }, + '30038': { + message: "'stop_order_type' is invalid", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *stop_order_type* имеет некорректное значение.
Список доступных значений: [*stop_order_type*](https://tinkoff.github.io/investAPI/stoporders/#stopordertype).', + }, + '30040': { + message: "'expire_date' is invalid", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *expire_date* имеет некорректное значение.
Укажите корректный параметр *expire_date*.', + }, + '30041': { + message: 'the method is available only for futures', + type: 'INVALID_ARGUMENT', + description: + 'Метод предназначен только для работы с фьючерсами.
Передайте во входные параметры метода идентификатор фьючерса.', + }, + '30042': { + message: 'not enough assets for a margin trade', + type: 'INVALID_ARGUMENT', + description: 'Недостаточно активов для маржинальной сделки.
Проверьте маржинальные показатели счёта.', + }, + '30043': { + message: "missing parameter: 'expiration_type'", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *expiration_type* является обязательным.
Укажите корректный параметр *expiration_type*.', + }, + '30044': { + message: "'expiration_type' is invalid", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *expiration_type* имеет некорректное значение.
Список доступных значений: [*expiration_type*](https://tinkoff.github.io/investAPI/stoporders/#stoporderexpirationtype).', + }, + '30045': { + message: "missing parameter: 'ticker'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *ticker* является обязательным.
Укажите корректный параметр *ticker*.', + }, + '30047': { + message: 'price currency does not match the settlement currency', + type: 'INVALID_ARGUMENT', + description: 'Валюта цены не совпадает с валютой расчётов по инструменту.
Укажите корректную валюту цены.', + }, + '30048': { + message: 'instrument type is not bond', + type: 'INVALID_ARGUMENT', + description: + 'Метод предназначен только для запроса информации по облигации.
Передайте во входные параметры метода идентификатор облигации.', + }, + '30049': { + message: 'post order error: %s', + type: 'INVALID_ARGUMENT', + description: 'Ошибка метода выставления торгового поручения.
Подробнее в тексте ошибки.', + }, + '30050': { + message: "'instrument_status' is invalid", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *instrument_status* имеет некорректное значение.
Список доступных значений: [*instrument_status*](https://tinkoff.github.io/investAPI/instruments#instrumentstatus).', + }, + '30051': { + message: 'account margin status is disabled', + type: 'INVALID_ARGUMENT', + description: 'Для данного договора недоступна маржинальная торговля.', + }, + '30052': { + message: 'instrument forbidden for trading by API', + type: 'INVALID_ARGUMENT', + description: 'Для данного инструмента недоступна торговля через API.', + }, + '30053': { + message: 'post stop_order error: %s', + type: 'INVALID_ARGUMENT', + description: 'Ошибка метода выставления стоп-заявки.
Подробнее в тексте ошибки.', + }, + '30054': { + message: 'instrument type is not a share or etf', + type: 'INVALID_ARGUMENT', + description: 'Тип инструмента не инвестиционный фонд или акция', + }, + '30055': { + message: 'order_id cannot be longer than 36 characters', + type: 'INVALID_ARGUMENT', + description: 'order_id не может быть длиннее 36 символов', + }, + '30056': { + message: 'stop order settlement currency is not supported', + type: 'INVALID_ARGUMENT', + description: 'Валюта выставления стоп-заявки не поддерживается', + }, + '30057': { + message: 'the order is a duplicate, but the order report was not found', + type: 'INVALID_ARGUMENT', + description: 'Заявка является дублем, но отчет по заявке не найден', + }, + '30058': { + message: 'task not completed yet, please try again later', + type: 'INVALID_ARGUMENT', + description: 'Выполнение задачи еще не завершено, попробуйте позже.', + }, + '30059': { + message: 'cancel order error: %s', + type: 'INVALID_ARGUMENT', + description: 'Ошибка метода отмены заявки.
Подробнее в тексте ошибки.', + }, + '30060': { + message: 'cancel stop-order error: %s', + type: 'INVALID_ARGUMENT', + description: 'Ошибка метода отмены стоп-заявки.
Подробнее в тексте ошибки.', + }, + '30061': { + message: "'from' value out of range", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *from* имеет некорректное значение.
Укажите значение в пределах от 1970-01-01T00:00:00Z до 2099-12-31T23:59:59.999999999Z включительно.', + }, + '30062': { + message: "'to' value out of range", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *to* имеет некорректное значение.
Укажите значение в пределах от 1970-01-01T00:00:00Z до 2099-12-31T23:59:59.999999999Z включительно.', + }, + '30063': { + message: "'expire_date' value out of range", + type: 'INVALID_ARGUMENT', + description: + 'Входной параметр *expire_date* имеет некорректное значение.
Дата должна быть не ранее текущей и не позднее 2099-12-31T23:59:59.999999999Z.', + }, + '30064': { + message: 'the required period should not exceed 31 days', + type: 'INVALID_ARGUMENT', + description: 'Запрошенный период не может превышать 31 дня.
Укажите корректный период.', + }, + '30065': { + message: "missing parameter: 'task_id'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *task_id* является обязательным.
Укажите корректный параметр *task_id*.', + }, + '30066': { + message: "missing parameter: 'payload'", + type: 'INVALID_ARGUMENT', + description: 'Входной параметр *payload* является обязательным.
Укажите корректный параметр *payload*.', + }, + '30067': { + message: "'action_type' is invalid", + type: 'INVALID_ARGUMENT', + description: 'Некорректное значение *action_type*.
Выберите допустимое значение.', + }, + '30077': { + message: 'not available for OTC instruments', + type: 'INVALID_ARGUMENT', + description: 'Метод недоступен для внебиржевых инструментов.', + }, + '30078': { + message: 'Incorrect minimum price increment', + type: 'INVALID_ARGUMENT', + description: 'Некорректный шаг изменения цены.', + }, + '30079': { + message: 'instrument is not available for trading', + type: 'INVALID_ARGUMENT', + description: 'Инструмент недоступен для торгов.', + }, + '30080': { + message: 'quantity must be positive', + type: 'INVALID_ARGUMENT', + description: 'Количество лотов должно быть положительным числом.', + }, + '30081': { + message: 'account status is closed', + type: 'INVALID_ARGUMENT', + description: 'Аккаунт закрыт.', + }, + '30082': { + message: 'account status is blocked', + type: 'INVALID_ARGUMENT', + description: 'Аккаунт заблокирован.', + }, + '30083': { + message: 'order_type is invalid', + type: 'INVALID_ARGUMENT', + description: 'Некорректный тип заявки.', + }, + '30084': { + message: 'maximum request period has been exceeded', + type: 'INVALID_ARGUMENT', + description: 'Превышен лимит запрашиваемого периода.', + }, + '30085': { + message: 'price in points is available only for futures and bonds', + type: 'INVALID_ARGUMENT', + description: 'Тип цены в пунктах доступен только для фьючерсов и облигаций.', + }, + '40002': { + message: 'insufficient privileges', + type: 'PERMISSION_DENIED', + description: + 'Недостаточно прав для совершения операции.
Токен доступа имеет уровень прав read-only.
Подробнее: [Виды токенов](https://tinkoff.github.io/investAPI/index#_2)', }, - "50001": { - "message": "exchange not found", - "type": "NOT_FOUND", - "description": "Биржа не найдена по переданному *exchange_id*.
Укажите корректный *exchange_id*." - }, - "50002": { - "message": "instrument not found", - "type": "NOT_FOUND", - "description": "Инструмент не найден.
Укажите корректный идентификатор инструмента." - }, - "50004": { - "message": "account not found", - "type": "NOT_FOUND", - "description": "Счёт не найден по переданному *account_id*.
Укажите корректный *account_id*." - }, - "50005": { - "message": "order not found", - "type": "NOT_FOUND", - "description": "Торговое поручение не найдено по переданному *order_id*.
Укажите корректный *order_id*." - }, - "50006": { - "message": "stop-order not found", - "type": "NOT_FOUND", - "description": "Стоп-заявка не найдена по переданному *stop_order_id*.
Укажите корректный *stop_order_id*." - }, - "50007": { - "message": "task not found", - "type": "NOT_FOUND", - "description": "Задача не найдена." - }, - "50008": { - "message": "no orderbook provider", - "type": "NOT_FOUND", - "description": "Отсутствует источник данных по стаканам." - }, - "50009": { - "message": "asset not found", - "type": "NOT_FOUND", - "description": "Актив не найден.
Укажите корректный идентификатор актива." - }, - "70001": { - "message": "internal error", - "type": "INTERNAL", - "description": "Внутренняя ошибка сервиса.
Если ошибка повторяется, обратитесь в службу технической поддержки." - }, - "70002": { - "message": "internal network error", - "type": "INTERNAL", - "description": "Неизвестная сетевая ошибка, попробуйте выполнить запрос позднее.
Если ошибка повторяется, обратитесь в службу технической поддержки." - }, - "70003": { - "message": "internal error, please try again later", - "type": "INTERNAL", - "description": "Внутренняя ошибка сервиса, попробуйте выполнить запрос позднее.
Если ошибка повторяется, обратитесь в службу технической поддержки." - }, - "80001": { - "message": "limit of open streams exceeded", - "type": "RESOURCE_EXHAUSTED", - "description": "Превышен лимит одновременных открытых stream-соединений. Подробнее: [Лимитная политика](https://tinkoff.github.io/investAPI/limits/)" - }, - "80002": { - "message": "request limit exceeded", - "type": "RESOURCE_EXHAUSTED", - "description": "Превышен лимит запросов в минуту. Подробнее: [Лимитная политика](https://tinkoff.github.io/investAPI/limits/)" - }, - "90001": { - "message": "need confirmation: %s", - "type": "FAILED_PRECONDITION", - "description": "Требуется подтверждение операции.
Подробнее в тексте ошибки." - } + '50001': { + message: 'exchange not found', + type: 'NOT_FOUND', + description: 'Биржа не найдена по переданному *exchange_id*.
Укажите корректный *exchange_id*.', + }, + '50002': { + message: 'instrument not found', + type: 'NOT_FOUND', + description: 'Инструмент не найден.
Укажите корректный идентификатор инструмента.', + }, + '50004': { + message: 'account not found', + type: 'NOT_FOUND', + description: 'Счёт не найден по переданному *account_id*.
Укажите корректный *account_id*.', + }, + '50005': { + message: 'order not found', + type: 'NOT_FOUND', + description: 'Торговое поручение не найдено по переданному *order_id*.
Укажите корректный *order_id*.', + }, + '50006': { + message: 'stop-order not found', + type: 'NOT_FOUND', + description: 'Стоп-заявка не найдена по переданному *stop_order_id*.
Укажите корректный *stop_order_id*.', + }, + '50007': { + message: 'task not found', + type: 'NOT_FOUND', + description: 'Задача не найдена.', + }, + '50008': { + message: 'no orderbook provider', + type: 'NOT_FOUND', + description: 'Отсутствует источник данных по стаканам.', + }, + '50009': { + message: 'asset not found', + type: 'NOT_FOUND', + description: 'Актив не найден.
Укажите корректный идентификатор актива.', + }, + '70001': { + message: 'internal error', + type: 'INTERNAL', + description: 'Внутренняя ошибка сервиса.
Если ошибка повторяется, обратитесь в службу технической поддержки.', + }, + '70002': { + message: 'internal network error', + type: 'INTERNAL', + description: + 'Неизвестная сетевая ошибка, попробуйте выполнить запрос позднее.
Если ошибка повторяется, обратитесь в службу технической поддержки.', + }, + '70003': { + message: 'internal error, please try again later', + type: 'INTERNAL', + description: + 'Внутренняя ошибка сервиса, попробуйте выполнить запрос позднее.
Если ошибка повторяется, обратитесь в службу технической поддержки.', + }, + '80001': { + message: 'limit of open streams exceeded', + type: 'RESOURCE_EXHAUSTED', + description: + 'Превышен лимит одновременных открытых stream-соединений. Подробнее: [Лимитная политика](https://tinkoff.github.io/investAPI/limits/)', + }, + '80002': { + message: 'request limit exceeded', + type: 'RESOURCE_EXHAUSTED', + description: + 'Превышен лимит запросов в минуту. Подробнее: [Лимитная политика](https://tinkoff.github.io/investAPI/limits/)', + }, + '90001': { + message: 'need confirmation: %s', + type: 'FAILED_PRECONDITION', + description: 'Требуется подтверждение операции.
Подробнее в тексте ошибки.', + }, }; diff --git a/src/middlewares/response.ts b/src/middlewares/response.ts index 55ca005..e75a528 100644 --- a/src/middlewares/response.ts +++ b/src/middlewares/response.ts @@ -15,10 +15,7 @@ export type TypeLoggerCb = ( ) => void; export function getMiddleware(loggerCb?: TypeLoggerCb) { - return async function* ( - call: ClientMiddlewareCall, - options: CallOptions, - ) { + return async function* (call: ClientMiddlewareCall, options: CallOptions) { const { path } = call.method; const errorMetadata: ErrorTrailers = {}; @@ -48,28 +45,18 @@ export function getMiddleware(loggerCb?: TypeLoggerCb) { const errStatus = isClientError ? errorStatus[error.details] : undefined; if (loggerCb) { - loggerCb( - errorMetadata, - error, - errStatus, - ); + loggerCb(errorMetadata, error, errStatus); } else { - if (isClientError) { - const errDescription = errStatus && errorStatus[error.details] && - errorStatus[error.details].description; + const errDescription = errStatus && errorStatus[error.details] && errorStatus[error.details].description; console.log(errorMetadata); - console.log( - 'Client error:', - `${Status[error.code]}(${error.details}) \n${errDescription || ''} \n${path}`, - ); + console.log('Client error:', `${Status[error.code]}(${error.details}) \n${errDescription || ''} \n${path}`); } else { console.log(errorMetadata); console.log('Client error: ', `error: ${error}`, path); } - } } - } -} \ No newline at end of file + }; +}