Перейти до вмісту
Довідник SDK

TypeScript SDK

Клієнт, стрім, пошук термінала й помилки пакета @spectre-trade/terminal.

Встановлення

npm install @spectre-trade/terminal

Terminal

Клієнт одного запущеного термінала.

Створіть його з токеном або дозвольте Terminal.discover знайти порт і токен та перевірити версію API. Усі методи async: вони кидають ApiError на відповідь не 2xx і TerminalUnreachableError, коли відповіді немає.

ПолеТипОпис
hoststring
portnumber
timeoutMsnumber
baseUrlstringhttp://127.0.0.1:48180/v1/ — токен до неї не входить.

Terminal()

new Terminal(options: TerminalOptions)

discover()

static discover(options: DiscoverOptions = {}): Promise<Terminal>

Знайти термінал і перевірити його: токен — з options.token або SPECTRE_LOCAL_API_TOKEN (інакше TokenMissingError), порт — з options.port або instance.json (інакше 48180; LocalApiDisabledError, коли файл каже, що API вимкнено), потім один GET /v1/meta. api_version, відмінна від "1", — це IncompatibleTerminalError; відповідь unauthorized — це ApiError, повідомлення якої каже, що токен може бути застарілим або API вимкнено.

ОпціїТипОпис
tokenнеобов’язковийstringМає пріоритет над SPECTRE_LOCAL_API_TOKEN.
portнеобов’язковийnumberМає пріоритет над instance.json.
hostнеобов’язковийstring
timeoutMsнеобов’язковийnumber
instancePathнеобов’язковийstringЧитати цей файл замість шляху instance.json, залежного від ОС (для тестів).

meta()

meta(): Promise<Meta>

GET /v1/meta: версія API, збірка, права токена, ліміти, топіки стріму.

Операція HTTP: GET /v1/meta

health()

health(): Promise<Health>

GET /v1/health.

Операція HTTP: GET /v1/health

connections()

connections(): Promise<List<Connection>>

GET /v1/connections (connections:read).

Операція HTTP: GET /v1/connections

connection()

connection(id: number): Promise<Connection>

GET /v1/connections/{id} (connections:read); not_found для невідомого id.

Операція HTTP: GET /v1/connections/{id}

instruments()

instruments(options: InstrumentsOptions): Promise<InstrumentsPage>

GET /v1/instruments (market:read): одна сторінка довідника біржі й ринку, за connectionId або exchange + market. Ідіть за next_cursor вручну або використовуйте iterInstruments.

Операція HTTP: GET /v1/instruments

ОпціїТипОпис
connectionIdнеобов’язковийnumber
exchangeнеобов’язковийstring
marketнеобов’язковийstring
qнеобов’язковийstringЧастина символу або базової монети, без урахування регістру.
limitнеобов’язковийnumber1–2000, типово 500.
cursorнеобов’язковийstringnext_cursor попередньої сторінки.

iterInstruments()

iterInstruments(options: InstrumentsOptions): AsyncGenerator<Instrument, void, undefined>

Усі інструменти, що відповідають параметрам, сторінка за сторінкою.

ОпціїТипОпис
connectionIdнеобов’язковийnumber
exchangeнеобов’язковийstring
marketнеобов’язковийstring
qнеобов’язковийstringЧастина символу або базової монети, без урахування регістру.
limitнеобов’язковийnumber1–2000, типово 500.
cursorнеобов’язковийstringnext_cursor попередньої сторінки.

intervals()

intervals(): Promise<Intervals>

GET /v1/market/intervals (market:read): інтервали свічок і кластерів.

Операція HTTP: GET /v1/market/intervals

candles()

candles(instrument: InstrumentAddress, options: CandlesOptions): Promise<Candles>

GET /v1/market/candles (market:read): історія свічок, від старих до нових.

Операція HTTP: GET /v1/market/candles

ОпціїТипОпис
intervalstringКод із /v1/market/intervals: 1m, 5m, …
limitнеобов’язковийnumberДо 2000, типово 500.
endнеобов’язковийnumberПрава межа, мілісекунди UTC; типово — зараз.
connectionIdнеобов’язковийnumber

trades()

trades(instrument: InstrumentAddress, options: TradesOptions = {}): Promise<Trades>

GET /v1/market/trades (market:read): останні угоди пари, від старих до нових. Пара без підписки відкривається на вимогу, і виклик може тривати до 3 с.

Операція HTTP: GET /v1/market/trades

ОпціїТипОпис
limitнеобов’язковийnumber1–1000 останніх, типово 100.
sinceTsнеобов’язковийnumberНе раніше цього часу отримання, мілісекунди UTC.
connectionIdнеобов’язковийnumber

snapshot()

snapshot(instrument: InstrumentAddress, options: ConnectionOptions = {}): Promise<Snapshot>

GET /v1/market/snapshot (market:read): найкращі bid/ask, остання угода, ціна маркування, тікер.

Операція HTTP: GET /v1/market/snapshot

ОпціїТипОпис
connectionIdнеобов’язковийnumber

orderbook()

orderbook(instrument: InstrumentAddress, options: OrderbookOptions = {}): Promise<Orderbook>

GET /v1/market/orderbook (market:read); unavailable, якщо повний стакан не надійшов за 3 с.

Операція HTTP: GET /v1/market/orderbook

ОпціїТипОпис
depthнеобов’язковийnumber1–200, типово 50.
connectionIdнеобов’язковийnumber

clusters()

clusters(instrument: InstrumentAddress, options: ConnectionOptions = {}): Promise<Clusters>

GET /v1/market/clusters (market:read): до десяти бакетів за інтервалом, вибраним у терміналі. Перший виклик для інструмента, не відкритого у вікні, може відповісти not_active (409); повтор за кілька секунд знаходить кластери.

Операція HTTP: GET /v1/market/clusters

ОпціїТипОпис
connectionIdнеобов’язковийnumber

accountOrders()

accountOrders(connectionId: number): Promise<AccountOrders>

GET /v1/account/orders (account:read): відкриті заявки й тригерні заявки одного підключення, той самий зріз, який бачить вікно термінала. not_found для невідомого підключення.

Операція HTTP: GET /v1/account/orders

accountPositions()

accountPositions(connectionId: number): Promise<AccountPositions>

GET /v1/account/positions (account:read): відкриті позиції одного підключення.

Операція HTTP: GET /v1/account/positions

accountBalances()

accountBalances(connectionId: number): Promise<AccountBalances>

GET /v1/account/balances (account:read): для кожної валюти — останнє значення, яке біржа надіслала відтоді, як увімкнено API. Валюти, з якою відтоді нічого не відбувалося, немає.

Операція HTTP: GET /v1/account/balances

accountFills()

accountFills(connectionId: number, options: AccountFillsOptions = {}): Promise<AccountFills>

GET /v1/account/fills (account:read): виконання підключення відтоді, як увімкнено API (остання тисяча), від старих до нових.

Операція HTTP: GET /v1/account/fills

ОпціїТипОпис
limitнеобов’язковийnumber1–1000 останніх, типово 100.
sinceTsнеобов’язковийnumberНе раніше цього часу біржі, мілісекунди UTC.

placeOrder()

placeOrder(options: PlaceOrderOptions): Promise<Accepted>

POST /v1/orders (trading:write): поставити лімітну або ринкову заявку тією самою командою, що й вікно. Відповідь означає «прийнято терміналом», а не біржею: стежте за account.orders у стрімі або за accountOrders, де заявка з’явиться під key. not_tradable (409) для вимкненого підключення, підключення лише для читання або без облікових даних, invalid_request (400) для чужого інструмента чи відхиленого розміру або ціни, rate_limited (429) понад limits.commands_per_second.

Операція HTTP: POST /v1/orders

ОпціїТипОпис
connectionIdnumberТоргове підключення; типового немає.
instrumentInstrumentAddress
sideSide
typeOrderTypelimit потребує price, market ціни не приймає.
priceнеобов’язковийDecimal
sizeнеобов’язковийDecimalКількість у базовій монеті; рівно одне з size і notional.
notionalнеобов’язковийDecimalСума у валюті котирування; рівно одне з size і notional.
reduceOnlyнеобов’язковийbooleanТипово false.
postOnlyнеобов’язковийbooleanТипово false.
timeInForceнеобов’язковийTimeInForceВідсутній — типове значення біржі.
clientKeyнеобов’язковийstringКлюч ідемпотентності: повтор із тим самим ключем повертає попередню відповідь і не дублює заявку (термінал пам’ятає останню тисячу).

cancelOrder()

cancelOrder(options: CancelOrderOptions): Promise<Accepted>

DELETE /v1/orders/{id} (trading:write): скасувати одну заявку за ключем термінала (t-…) або ідентифікатором біржі. Скасування йде на біржу напряму; підтвердження надходить через стрім.

Операція HTTP: DELETE /v1/orders/{id}

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress
orderIdstringКлюч термінала (t-…) або ідентифікатор заявки на біржі.

cancelAll()

cancelAll(options: InstrumentCommandOptions): Promise<Accepted>

POST /v1/orders/cancel-all (trading:write): скасувати всі заявки інструмента, як це робить пробіл.

Операція HTTP: POST /v1/orders/cancel-all

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress

closePosition()

closePosition(options: InstrumentCommandOptions): Promise<Accepted>

POST /v1/positions/close (trading:write): закрити позицію інструмента так, як це робить вікно — ринковою заявкою на розмір позиції на ф’ючерсах, «скасувати все й закрити» однією атомарною командою на споті. invalid_request без відкритої позиції.

Операція HTTP: POST /v1/positions/close

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress

placeTrigger()

placeTrigger(options: PlaceTriggerOptions): Promise<Accepted>

POST /v1/orders/trigger (trading:write): стоп-лос, тейк-профіт або стоп, поставлений тими самими сервісами, що й у вікні. stop_loss і take_profit ставляться на відкриту позицію (сторона, розмір і правило беруться з неї; без позиції — invalid_request); stop потребує side і notional. key у відповіді — це ключ тригера (sl_…, tp_…, stop_…), який з’являється як client_id тригера в accountOrders; скасування і зміна використовують числовий id звідти. unsupported (501) на біржі без тригерних заявок у терміналі.

Операція HTTP: POST /v1/orders/trigger

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress
kindTriggerTypestop_loss і take_profit ставляться на відкриту позицію; stop — окрема заявка.
triggerPriceDecimal
sideнеобов’язковийSideЛише для stop.
notionalнеобов’язковийDecimalЛише для stop: сума у валюті котирування.
ruleнеобов’язковийTriggerRuleЛише для stop; без нього — вище ринку для купівлі, нижче для продажу.
clientKeyнеобов’язковийstringКлюч ідемпотентності, як у Terminal.placeOrder.

cancelTrigger()

cancelTrigger(options: CancelTriggerOptions): Promise<Accepted>

DELETE /v1/orders/trigger/{id} (trading:write): скасувати один тригер за його числовим id.

Операція HTTP: DELETE /v1/orders/trigger/{id}

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress
triggerIdstring | numberЧисловий id тригера з accountOrders().triggers.

cancelAllTriggers()

cancelAllTriggers(options: InstrumentCommandOptions): Promise<Accepted>

POST /v1/orders/trigger/cancel-all (trading:write): скасувати всі тригери інструмента; звичайні заявки лишаються.

Операція HTTP: POST /v1/orders/trigger/cancel-all

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress

amendTrigger()

amendTrigger(options: AmendTriggerOptions): Promise<Accepted>

PATCH /v1/orders/trigger/{id} (trading:write): перенести тригер на нову ціну — послідовна заміна, як у вікні: скасувати, потім поставити. kind обов’язковий; stop потребує ще й свого side. key дорівнює null.

Операція HTTP: PATCH /v1/orders/trigger/{id}

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress
triggerIdstring | numberЧисловий id тригера з accountOrders().triggers.
kindTriggerType
triggerPriceDecimal
sideнеобов’язковийSideЛише для stop.
ruleнеобов’язковийTriggerRuleЛише для stop.

leverage()

leverage(options: InstrumentCommandOptions): Promise<Leverage>

GET /v1/account/leverage (account:read): плече і режим маржі ф’ючерсного інструмента з кешу термінала. Інструмент, якого термінал ще не торкався, — це not_active (409): відкрийте його у вікні або викличте setLeverage — так він потрапляє в кеш.

Операція HTTP: GET /v1/account/leverage

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress

setLeverage()

setLeverage(options: SetLeverageOptions): Promise<Accepted>

POST /v1/account/leverage (trading:write): встановити плече так, як це робить вікно — рівно одне з leverage (ціле число ≥ 1) і mode (max, smart). Застосоване значення видно в leverage після відповіді біржі.

Операція HTTP: POST /v1/account/leverage

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress
leverageнеобов’язковийnumberЦіле число, не менше за 1.
modeнеобов’язковий"max" | "smart"

setMarginMode()

setMarginMode(options: SetMarginModeOptions): Promise<Accepted>

POST /v1/account/margin-mode (trading:write): cross або isolated. Зміну з відкритою позицією біржа відхиляє, як і у вікні; відповідь accepted цього ще не знає.

Операція HTTP: POST /v1/account/margin-mode

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress
marginModeMarginMode

workspace()

workspace(): Promise<Workspace>

GET /v1/workspace (workspace:read): усі вікна з їхніми вкладками, стеками та графіками, зі знімка, який вікно публікує на кожну структурну зміну. Ідентифікатори внутрішні для цього запуску термінала.

Операція HTTP: GET /v1/workspace

workspaceWindow()

workspaceWindow(options: WindowOptions): Promise<WorkspaceWindow>

GET /v1/workspace/windows/{id} (workspace:read): одне вікно; невідомий id — це not_found.

Операція HTTP: GET /v1/workspace/windows/{id}

ОпціїТипОпис
windowIdnumber

openStack()

openStack(options: OpenStackOptions): Promise<WorkspaceOutcome>

POST /v1/workspace/stacks (workspace:write): стек інструмента в новій вкладці або новому вікні, з графіком над ним, якщо задано chart. Відповідь називає вікно, вкладку й нові віджети. Інструмент, якого немає в довіднику термінала, — це invalid_request.

Операція HTTP: POST /v1/workspace/stacks

ОпціїТипОпис
instrumentInstrumentAddress
connectionIdнеобов’язковийnumberБез нього вибирається за загальним правилом.
chartнеобов’язковийbooleanГрафік того самого інструмента над стеком.
targetнеобов’язковийOpenTargetnew_tab (типово) або new_window.
windowIdнеобов’язковийnumberВікно для нової вкладки; без нього — вікно у фокусі.
activateнеобов’язковийbooleanfalse відкриває вкладку у фоні; нове вікно завжди отримує фокус.

openTab()

openTab(options: OpenTabOptions): Promise<WorkspaceOutcome>

POST /v1/workspace/tabs (workspace:write): вкладка з колонкою на кожен елемент — стек і, з chart, графік над ним — у новій вкладці або новому вікні. Без name назва — це єдиний інструмент або перший плюс кількість інших. Відмова називає елемент (items[1]: …), і до вікна не доходить нічого.

Операція HTTP: POST /v1/workspace/tabs

ОпціїТипОпис
itemsArray<TabItemOptions | InstrumentAddress>Колонки по порядку, від однієї до п’ятдесяти; сама адреса — це стек без графіка.
nameнеобов’язковийstringДо 64 символів; без неї термінал називає вкладку за інструментами.
targetнеобов’язковийOpenTargetnew_tab (типово) або new_window.
windowIdнеобов’язковийnumberВікно для нової вкладки; без нього — вікно у фокусі.
activateнеобов’язковийbooleanfalse відкриває вкладку у фоні; нове вікно завжди отримує фокус.

addStacks()

addStacks(options: AddStacksOptions): Promise<WorkspaceOutcome>

POST /v1/workspace/windows/{id}/tabs/{tab}/stacks (workspace:write): ті самі колонки після останньої колонки вкладки; вкладка зберігає назву й ширини колонок. Відповідь перелічує лише додані віджети.

Операція HTTP: POST /v1/workspace/windows/{id}/tabs/{tab}/stacks

ОпціїТипОпис
windowIdnumber
tabIdnumber
itemsArray<TabItemOptions | InstrumentAddress>Колонки по порядку, від однієї до п’ятдесяти; сама адреса — це стек без графіка.

openMultiview()

openMultiview(options: OpenMultiviewOptions): Promise<WorkspaceOutcome>

POST /v1/workspace/multiview (workspace:write): монета на всіх біржах «Розкладки бірж», той самий план, що й у кнопки «Мультив’ю» вікна. Жодної комірки для монети — not_found.

Операція HTTP: POST /v1/workspace/multiview

ОпціїТипОпис
basestringМонета (BTC) або пара (BTC/USDT).
targetнеобов’язковийOpenTargetБез нього вирішує налаштування «Відкривати» мультив’ю.
windowIdнеобов’язковийnumber
activateнеобов’язковийboolean

setStackInstrument()

setStackInstrument(options: StackInstrumentOptions): Promise<WorkspaceOutcome>

PATCH /v1/workspace/stacks/{widget_id} (workspace:write): інший інструмент у стеку та його графіках.

Операція HTTP: PATCH /v1/workspace/stacks/{widget_id}

ОпціїТипОпис
widgetIdnumber
instrumentInstrumentAddress
connectionIdнеобов’язковийnumber

closeStack()

closeStack(options: StackOptions): Promise<WorkspaceOutcome>

DELETE /v1/workspace/stacks/{widget_id} (workspace:write): закрити один стек, як це робить його кнопка закриття.

Операція HTTP: DELETE /v1/workspace/stacks/{widget_id}

ОпціїТипОпис
widgetIdnumber

closeTab()

closeTab(options: TabOptions): Promise<WorkspaceOutcome>

DELETE /v1/workspace/windows/{id}/tabs/{tab} (workspace:write): єдина вкладка вікна — це invalid_request.

Операція HTTP: DELETE /v1/workspace/windows/{id}/tabs/{tab}

ОпціїТипОпис
windowIdnumber
tabIdnumber

activateTab()

activateTab(options: TabOptions): Promise<WorkspaceOutcome>

POST /v1/workspace/windows/{id}/tabs/{tab}/activate (workspace:write): вибрати вкладку; фокус вікна не змінюється.

Операція HTTP: POST /v1/workspace/windows/{id}/tabs/{tab}/activate

ОпціїТипОпис
windowIdnumber
tabIdnumber

closeWindow()

closeWindow(options: WindowOptions): Promise<WorkspaceOutcome>

DELETE /v1/workspace/windows/{id} (workspace:write): головне вікно — це invalid_request.

Операція HTTP: DELETE /v1/workspace/windows/{id}

ОпціїТипОпис
windowIdnumber

activateWindow()

activateWindow(options: WindowOptions): Promise<WorkspaceOutcome>

POST /v1/workspace/windows/{id}/activate (workspace:write): відновити, якщо згорнуте, і вивести на передній план.

Операція HTTP: POST /v1/workspace/windows/{id}/activate

ОпціїТипОпис
windowIdnumber

settings()

settings(options: SettingsOptions = {}): Promise<Settings>

GET /v1/settings (settings:read): рядки так, як вони зберігаються, без підставлених типових значень. Без параметрів — глобальні рядки без підключення. Кожен рядок каже, чи він writable через updateSettings.

Операція HTTP: GET /v1/settings

ОпціїТипОпис
scopeнеобов’язковий"global" | "order_book"global (типово) або order_book.
categoryнеобов’язковийstring
keyнеобов’язковийstring
connectionIdнеобов’язковийnumberРядки підключення; без нього — рядки без підключення.
instrumentнеобов’язковийInstrumentAddressРядки пари (область order_book).

orderbookSettings()

orderbookSettings(options: InstrumentCommandOptions): Promise<OrderbookSettings>

GET /v1/settings/orderbook (settings:read): налаштування стека інструмента такими, як їх бачить його стек на підключенні — рядок пари, типове значення підключення, рядок пари без підключення, глобальне типове значення — з resolved_from у кожного ключа.

Операція HTTP: GET /v1/settings/orderbook

ОпціїТипОпис
connectionIdnumber
instrumentInstrumentAddress

updateSettings()

updateSettings(changes: SettingChange[]): Promise<SettingsApplied>

PATCH /v1/settings (settings:write): записати налаштування так, як це робить Settings App. Кожна зміна спершу перевіряється за словником термінала (invalid_request із назвою changes[i], нічого не записується; плече тут — unsupported, використовуйте setLeverage), потім зміни застосовуються по порядку: той самий рядок, подія вікну й службові кеші, що й у Settings App. Перша зміна, яку не вдалося застосувати, відхиляє виклик; попередні лишаються застосованими.

Операція HTTP: PATCH /v1/settings

stream()

stream(options: StreamOptions = {}): Promise<Stream>

Відкрити /v1/stream. Лише в Node: токен передається в заголовку рукостискання.

ОпціїТипОпис
timeoutMsнеобов’язковийnumberТайм-аут рукостискання; типово — timeoutMs клієнта.

StreamProtocol

Половина протоколу стріму без сокета: видає ідентифікатори запитів, тримає запити, що чекають на відповідь, завершує їх кадрами subscribed / unsubscribed / error і перетворює все інше на кадри, які перебирає споживач. Чиста, тому тестується без сервера.

nextRequestId()

nextRequestId(): string

Новий request_id, унікальний у межах цього стріму.

expect()

expect(requestId: string): Promise<ReplyFrame>

Зареєструвати запит і отримати проміс, який завершить його відповідь.

pendingCount

pendingCount: number

Запити, які ще чекають на відповідь.

route()

route(raw: unknown): StreamFrame | undefined

Класифікувати декодований кадр. Відповіді на наші запити завершують відповідний проміс і повертають undefined; event, gap і помилки підписок повертаються споживачу; все невідоме або пошкоджене відкидається.

abortAll()

abortAll(error: Error): void

Відхилити всі запити, що чекають, наприклад коли сокет закривається.

Stream

class Stream extends AsyncIterable<StreamFrame>

Живе з’єднання /v1/stream.

Отримайте його через terminal.stream(). Підпишіться через subscribe, потім перебирайте: for await (const frame of stream) видає події, пропуски й помилки підписок у порядку надходження, буферизовані без обмеження, поки споживач зайнятий (сервер захищає себе сам: клієнт, який відстає довше ніж на 5 с, закривається з 4008). Перебирає один споживач за раз; другий одночасний next() просто чекає своєї черги.

Коли з’єднання закриває сервер, перебір завершується; для 1001, 4008, 4029 і втраченого з’єднання (1006) він завершується викиданням StreamClosedError. closeCode і closeReason встановлюються в будь-якому разі. Закриття з боку клієнта (close або break із циклу) завершує перебір штатно.

connect()

static connect(options: StreamConnectOptions): Promise<Stream>

Відкрити WebSocket і завершити рукостискання. Відхиляється з TerminalUnreachableError, коли термінал його не приймає: WebSocket Node повідомляє про відхилене рукостискання (термінал не запущено, API вимкнено, токен відхилено) однією загальною помилкою, тож ці три випадки не розрізняються.

ОпціїТипОпис
urlstringws://127.0.0.1:48180/v1/stream.
tokenstring
timeoutMsнеобов’язковийnumberТайм-аут рукостискання; типово 10 000.

url

url: string

URL стріму (ніколи не містить токена).

closed

closed: boolean

true, щойно сокет закрито, хоч би хто його закрив.

closeCode

closeCode: number | undefined

Код закриття WebSocket, після закриття.

closeReason

closeReason: string | undefined

Причина закриття WebSocket, після закриття.

subscribe()

subscribe(options: SubscribeOptions): Promise<Subscribed>

Підписатися на топік інструмента або на топік рахунку підключення. Виконується з кадром subscribed сервера (плюс запитаний topic і, для ринкових топіків, instrument) і відхиляється зі StreamRequestError на відповідь error сервера; події інших підписок тим часом надходять далі. Зважайте на ліміт термінала на нові підписки на біржах на секунду (/v1/meta); топіки рахунку не звертаються до біржі й не надсилають кадру зі знімком — спершу прочитайте поточний стан операціями /v1/account/*.

ОпціїТипОпис
topicTopic
instrumentнеобов’язковийInstrumentAddressОбов’язковий для ринкових топіків; для account.* ігнорується.
connectionIdнеобов’язковийnumberОбов’язковий для account.*; для ринкових топіків без нього вибирається за загальним правилом.
paramsнеобов’язковийBookTopParamsЇх читає лише book.top; назви як на дроті (depth, interval_ms).

unsubscribe()

unsubscribe(subscription: Subscribed | SubscribedFrame | string): Promise<void>

Зняти підписку негайно. Приймає значення, з яким виконався subscribe, або сам ідентифікатор sub. Виконується на unsubscribed сервера.

close()

close(code: number = CLOSE_NORMAL, reason?: string): Promise<void>

Закрити стрім. Сервер завершує рукостискання закриття кодом клієнта; проміс виконується, коли це сталося, або після короткої паузи, якщо цього так і не сталося. Повторний виклик безпечний.

Пошук термінала

КонстантиЗначенняОпис
DEFAULT_PORT48180Порт, який слухає термінал, якщо SPECTRE_LOCAL_API_PORT не задає інший.
TOKEN_ENV"SPECTRE_LOCAL_API_TOKEN"Змінна середовища, з якої читається токен.

instancePath()

function instancePath(options: DiscoveryEnvironment = {}): string

Шлях до instance.json термінала, за ОС:

  • Linux: $XDG_DATA_HOME/spectre-terminal/instance.json, інакше ~/.local/share/spectre-terminal/instance.json;
  • macOS: ~/Library/Application Support/spectre-terminal/instance.json;
  • Windows: %LOCALAPPDATA%\spectre-terminal\instance.json, інакше %USERPROFILE%\AppData\Local\....

Це повторює власний каталог даних термінала (dirs::data_local_dir).

readPort()

function readPort(options: ReadPortOptions = {}): Promise<number | undefined>

Порт Local API, опублікований в instance.json.

Повертає undefined, коли файлу немає або його не вдалося прочитати (термінал не запущено, або термінал не публікує це поле): тоді той, хто викликав, бере DEFAULT_PORT. Кидає LocalApiDisabledError, коли файл є, але local_api_port дорівнює null або відсутній — термінал запущено, а API вимкнено. Читає лише це одне поле.

tokenFromEnv()

function tokenFromEnv(env: Record<string, string | undefined> = process.env): string | undefined

Токен зі SPECTRE_LOCAL_API_TOKEN або undefined, якщо змінну не задано чи вона порожня.

Помилки

SpectreTerminalError

class SpectreTerminalError extends Error

Базовий клас усіх помилок, які кидає цей пакет.

ApiError

class ApiError extends SpectreTerminalError

Термінал відповів статусом не 2xx.

code — стабільний код із конверта помилки контракту (unauthorized, not_found, rate_limited, …); status — HTTP-статус. Тіло не 2xx, яке не є конвертом, дає код "unknown".

ПолеТипОпис
codestringСтабільний код помилки з контракту або "unknown".
statusnumberHTTP-статус відповіді.
detailstringПовідомлення сервера для людини, без префікса.

TerminalUnreachableError

class TerminalUnreachableError extends SpectreTerminalError

HTTP-відповіді немає взагалі: з’єднання відхилено, запит перевищив тайм-аут, несподіване перенаправлення або рукостискання WebSocket не завершилося. Початкова помилка — у cause.

LocalApiDisabledError

class LocalApiDisabledError extends SpectreTerminalError

instance.json існує, але не публікує порту Local API: термінал запущено з вимкненим API, або файл лишився від термінала, який не завершив роботу штатно. У будь-якому разі порту для підключення немає, поки API не ввімкнено в Settings App (Загальні → Local API).

TokenMissingError

class TokenMissingError extends SpectreTerminalError

Ні параметр token, ні SPECTRE_LOCAL_API_TOKEN не дали токена.

IncompatibleTerminalError

class IncompatibleTerminalError extends SpectreTerminalError

/v1/meta повідомив версію API, якою цей клієнт не говорить.

ПолеТипОпис
apiVersionstringapi_version, яку повідомив термінал.
appVersionstringapp_version, яку повідомив термінал.

StreamRequestError

class StreamRequestError extends SpectreTerminalError

Стрім відповів на запит subscribe або unsubscribe кадром error. code — код помилки з контракту (not_found, rate_limited, invalid_request, …). Інші підписки надходять далі.

ПолеТипОпис
codestringСтабільний код помилки з контракту.
detailstringПовідомлення сервера для людини, без префікса.

StreamClosedError

class StreamClosedError extends SpectreTerminalError

Сервер закрив стрім із причини, на яку споживач має відреагувати: 1001 — API вимкнено або токен перевипущено; 4008 — цей клієнт читав надто повільно; 4029 — ліміт з’єднань на токен. Також кидається для 1006, коли з’єднання обірвалося без кадру закриття, і з subscribe / unsubscribe на вже закритому стрімі.

ПолеТипОпис
codenumberКод закриття WebSocket.
reasonstringПричина закриття, надіслана сервером; може бути порожньою.

Зібрано з коду @spectre-trade/terminal, коміт 2d1c324.

На цій сторінці