pmxtjs 2.35.29 → 2.35.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/generated/src/apis/DefaultApi.d.ts +33 -1
- package/dist/esm/generated/src/apis/DefaultApi.js +48 -1
- package/dist/esm/generated/src/models/WatchOrderBooks200Response.d.ts +48 -0
- package/dist/esm/generated/src/models/WatchOrderBooks200Response.js +48 -0
- package/dist/esm/generated/src/models/WatchOrderBooksRequest.d.ts +40 -0
- package/dist/esm/generated/src/models/WatchOrderBooksRequest.js +47 -0
- package/dist/esm/generated/src/models/WatchOrderBooksRequestArgsInner.d.ts +21 -0
- package/dist/esm/generated/src/models/WatchOrderBooksRequestArgsInner.js +47 -0
- package/dist/esm/generated/src/models/index.d.ts +3 -0
- package/dist/esm/generated/src/models/index.js +3 -0
- package/dist/esm/pmxt/client.d.ts +42 -0
- package/dist/esm/pmxt/client.js +149 -4
- package/dist/esm/pmxt/ws-client.d.ts +37 -0
- package/dist/esm/pmxt/ws-client.js +272 -0
- package/dist/generated/src/apis/DefaultApi.d.ts +33 -1
- package/dist/generated/src/apis/DefaultApi.js +48 -1
- package/dist/generated/src/models/WatchOrderBooks200Response.d.ts +48 -0
- package/dist/generated/src/models/WatchOrderBooks200Response.js +55 -0
- package/dist/generated/src/models/WatchOrderBooksRequest.d.ts +40 -0
- package/dist/generated/src/models/WatchOrderBooksRequest.js +54 -0
- package/dist/generated/src/models/WatchOrderBooksRequestArgsInner.d.ts +21 -0
- package/dist/generated/src/models/WatchOrderBooksRequestArgsInner.js +53 -0
- package/dist/generated/src/models/index.d.ts +3 -0
- package/dist/generated/src/models/index.js +3 -0
- package/dist/pmxt/client.d.ts +42 -0
- package/dist/pmxt/client.js +149 -4
- package/dist/pmxt/ws-client.d.ts +37 -0
- package/dist/pmxt/ws-client.js +276 -0
- package/generated/.openapi-generator/FILES +6 -0
- package/generated/docs/DefaultApi.md +71 -0
- package/generated/docs/WatchOrderBooks200Response.md +38 -0
- package/generated/docs/WatchOrderBooksRequest.md +36 -0
- package/generated/docs/WatchOrderBooksRequestArgsInner.md +32 -0
- package/generated/package.json +1 -1
- package/generated/src/apis/DefaultApi.ts +71 -0
- package/generated/src/models/WatchOrderBooks200Response.ts +96 -0
- package/generated/src/models/WatchOrderBooksRequest.ts +89 -0
- package/generated/src/models/WatchOrderBooksRequestArgsInner.ts +59 -0
- package/generated/src/models/index.ts +3 -0
- package/package.json +2 -2
- package/pmxt/client.ts +181 -8
- package/pmxt/ws-client.ts +347 -0
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Do not edit the class manually.
|
|
11
11
|
*/
|
|
12
12
|
import * as runtime from '../runtime.js';
|
|
13
|
-
import type { BaseResponse, BuildOrder200Response, BuildOrderRequest, CancelOrderRequest, CloseRequest, CompareMarketPrices200Response, CompareMarketPricesRequest, CreateOrder200Response, CreateOrderRequest, EventFilterCriteria, FetchArbitrage200Response, FetchBalance200Response, FetchEvent200Response, FetchEventMatches200Response, FetchEvents200Response, FetchEventsPaginated200Response, FetchMarket200Response, FetchMarketMatches200Response, FetchMarkets200Response, FetchMarketsPaginated200Response, FetchMatchedMarkets200Response, FetchMyTrades200Response, FetchOHLCV200Response, FetchOpenOrders200Response, FetchOrderBook200Response, FetchPositions200Response, FetchTrades200Response, FilterEventsRequest, FilterMarketsRequest, GetExecutionPrice200Response, GetExecutionPriceDetailed200Response, GetExecutionPriceDetailedRequest, GetExecutionPriceRequest, HealthCheck200Response, LoadMarkets200Response, LoadMarketsRequest, MarketFilterCriteria, SubmitOrderRequest, UnifiedEvent, UnifiedMarket, UnwatchAddressRequest, UnwatchOrderBookRequest, WatchAddress200Response, WatchAddressRequest, WatchOrderBookRequest, WatchTradesRequest } from '../models/index.js';
|
|
13
|
+
import type { BaseResponse, BuildOrder200Response, BuildOrderRequest, CancelOrderRequest, CloseRequest, CompareMarketPrices200Response, CompareMarketPricesRequest, CreateOrder200Response, CreateOrderRequest, EventFilterCriteria, FetchArbitrage200Response, FetchBalance200Response, FetchEvent200Response, FetchEventMatches200Response, FetchEvents200Response, FetchEventsPaginated200Response, FetchMarket200Response, FetchMarketMatches200Response, FetchMarkets200Response, FetchMarketsPaginated200Response, FetchMatchedMarkets200Response, FetchMyTrades200Response, FetchOHLCV200Response, FetchOpenOrders200Response, FetchOrderBook200Response, FetchPositions200Response, FetchTrades200Response, FilterEventsRequest, FilterMarketsRequest, GetExecutionPrice200Response, GetExecutionPriceDetailed200Response, GetExecutionPriceDetailedRequest, GetExecutionPriceRequest, HealthCheck200Response, LoadMarkets200Response, LoadMarketsRequest, MarketFilterCriteria, SubmitOrderRequest, UnifiedEvent, UnifiedMarket, UnwatchAddressRequest, UnwatchOrderBookRequest, WatchAddress200Response, WatchAddressRequest, WatchOrderBookRequest, WatchOrderBooks200Response, WatchOrderBooksRequest, WatchTradesRequest } from '../models/index.js';
|
|
14
14
|
export interface BuildOrderOperationRequest {
|
|
15
15
|
exchange: BuildOrderOperationExchangeEnum;
|
|
16
16
|
buildOrderRequest?: BuildOrderRequest;
|
|
@@ -279,6 +279,10 @@ export interface WatchOrderBookOperationRequest {
|
|
|
279
279
|
exchange: WatchOrderBookOperationExchangeEnum;
|
|
280
280
|
watchOrderBookRequest?: WatchOrderBookRequest;
|
|
281
281
|
}
|
|
282
|
+
export interface WatchOrderBooksOperationRequest {
|
|
283
|
+
exchange: WatchOrderBooksOperationExchangeEnum;
|
|
284
|
+
watchOrderBooksRequest?: WatchOrderBooksRequest;
|
|
285
|
+
}
|
|
282
286
|
export interface WatchTradesOperationRequest {
|
|
283
287
|
exchange: WatchTradesOperationExchangeEnum;
|
|
284
288
|
watchTradesRequest?: WatchTradesRequest;
|
|
@@ -669,6 +673,16 @@ export declare class DefaultApi extends runtime.BaseAPI {
|
|
|
669
673
|
* Watch Order Book
|
|
670
674
|
*/
|
|
671
675
|
watchOrderBook(requestParameters: WatchOrderBookOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<FetchOrderBook200Response>;
|
|
676
|
+
/**
|
|
677
|
+
* Watch multiple order books simultaneously via WebSocket. Returns a promise that resolves with a record of order book snapshots keyed by ID. Exchanges with native batch support (e.g. Kalshi) send a single subscribe message for all tickers; others fall back to individual watchOrderBook calls.
|
|
678
|
+
* Watch Order Books
|
|
679
|
+
*/
|
|
680
|
+
watchOrderBooksRaw(requestParameters: WatchOrderBooksOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<WatchOrderBooks200Response>>;
|
|
681
|
+
/**
|
|
682
|
+
* Watch multiple order books simultaneously via WebSocket. Returns a promise that resolves with a record of order book snapshots keyed by ID. Exchanges with native batch support (e.g. Kalshi) send a single subscribe message for all tickers; others fall back to individual watchOrderBook calls.
|
|
683
|
+
* Watch Order Books
|
|
684
|
+
*/
|
|
685
|
+
watchOrderBooks(requestParameters: WatchOrderBooksOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<WatchOrderBooks200Response>;
|
|
672
686
|
/**
|
|
673
687
|
* Watch trade executions in real-time via WebSocket. Returns a promise that resolves with the next trade(s). Call repeatedly in a loop to stream updates (CCXT Pro pattern).
|
|
674
688
|
* Watch Trades
|
|
@@ -1580,6 +1594,24 @@ export declare const WatchOrderBookOperationExchangeEnum: {
|
|
|
1580
1594
|
readonly Router: "router";
|
|
1581
1595
|
};
|
|
1582
1596
|
export type WatchOrderBookOperationExchangeEnum = typeof WatchOrderBookOperationExchangeEnum[keyof typeof WatchOrderBookOperationExchangeEnum];
|
|
1597
|
+
/**
|
|
1598
|
+
* @export
|
|
1599
|
+
*/
|
|
1600
|
+
export declare const WatchOrderBooksOperationExchangeEnum: {
|
|
1601
|
+
readonly Polymarket: "polymarket";
|
|
1602
|
+
readonly Kalshi: "kalshi";
|
|
1603
|
+
readonly KalshiDemo: "kalshi-demo";
|
|
1604
|
+
readonly Limitless: "limitless";
|
|
1605
|
+
readonly Probable: "probable";
|
|
1606
|
+
readonly Baozi: "baozi";
|
|
1607
|
+
readonly Myriad: "myriad";
|
|
1608
|
+
readonly Opinion: "opinion";
|
|
1609
|
+
readonly Metaculus: "metaculus";
|
|
1610
|
+
readonly Smarkets: "smarkets";
|
|
1611
|
+
readonly PolymarketUs: "polymarket_us";
|
|
1612
|
+
readonly Router: "router";
|
|
1613
|
+
};
|
|
1614
|
+
export type WatchOrderBooksOperationExchangeEnum = typeof WatchOrderBooksOperationExchangeEnum[keyof typeof WatchOrderBooksOperationExchangeEnum];
|
|
1583
1615
|
/**
|
|
1584
1616
|
* @export
|
|
1585
1617
|
*/
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* Do not edit the class manually.
|
|
13
13
|
*/
|
|
14
14
|
import * as runtime from '../runtime.js';
|
|
15
|
-
import { BaseResponseFromJSON, BuildOrder200ResponseFromJSON, BuildOrderRequestToJSON, CancelOrderRequestToJSON, CloseRequestToJSON, CompareMarketPrices200ResponseFromJSON, CompareMarketPricesRequestToJSON, CreateOrder200ResponseFromJSON, CreateOrderRequestToJSON, FetchArbitrage200ResponseFromJSON, FetchBalance200ResponseFromJSON, FetchEvent200ResponseFromJSON, FetchEventMatches200ResponseFromJSON, FetchEvents200ResponseFromJSON, FetchEventsPaginated200ResponseFromJSON, FetchMarket200ResponseFromJSON, FetchMarketMatches200ResponseFromJSON, FetchMarkets200ResponseFromJSON, FetchMarketsPaginated200ResponseFromJSON, FetchMatchedMarkets200ResponseFromJSON, FetchMyTrades200ResponseFromJSON, FetchOHLCV200ResponseFromJSON, FetchOpenOrders200ResponseFromJSON, FetchOrderBook200ResponseFromJSON, FetchPositions200ResponseFromJSON, FetchTrades200ResponseFromJSON, FilterEventsRequestToJSON, FilterMarketsRequestToJSON, GetExecutionPrice200ResponseFromJSON, GetExecutionPriceDetailed200ResponseFromJSON, GetExecutionPriceDetailedRequestToJSON, GetExecutionPriceRequestToJSON, HealthCheck200ResponseFromJSON, LoadMarkets200ResponseFromJSON, LoadMarketsRequestToJSON, SubmitOrderRequestToJSON, UnwatchAddressRequestToJSON, UnwatchOrderBookRequestToJSON, WatchAddress200ResponseFromJSON, WatchAddressRequestToJSON, WatchOrderBookRequestToJSON, WatchTradesRequestToJSON, } from '../models/index.js';
|
|
15
|
+
import { BaseResponseFromJSON, BuildOrder200ResponseFromJSON, BuildOrderRequestToJSON, CancelOrderRequestToJSON, CloseRequestToJSON, CompareMarketPrices200ResponseFromJSON, CompareMarketPricesRequestToJSON, CreateOrder200ResponseFromJSON, CreateOrderRequestToJSON, FetchArbitrage200ResponseFromJSON, FetchBalance200ResponseFromJSON, FetchEvent200ResponseFromJSON, FetchEventMatches200ResponseFromJSON, FetchEvents200ResponseFromJSON, FetchEventsPaginated200ResponseFromJSON, FetchMarket200ResponseFromJSON, FetchMarketMatches200ResponseFromJSON, FetchMarkets200ResponseFromJSON, FetchMarketsPaginated200ResponseFromJSON, FetchMatchedMarkets200ResponseFromJSON, FetchMyTrades200ResponseFromJSON, FetchOHLCV200ResponseFromJSON, FetchOpenOrders200ResponseFromJSON, FetchOrderBook200ResponseFromJSON, FetchPositions200ResponseFromJSON, FetchTrades200ResponseFromJSON, FilterEventsRequestToJSON, FilterMarketsRequestToJSON, GetExecutionPrice200ResponseFromJSON, GetExecutionPriceDetailed200ResponseFromJSON, GetExecutionPriceDetailedRequestToJSON, GetExecutionPriceRequestToJSON, HealthCheck200ResponseFromJSON, LoadMarkets200ResponseFromJSON, LoadMarketsRequestToJSON, SubmitOrderRequestToJSON, UnwatchAddressRequestToJSON, UnwatchOrderBookRequestToJSON, WatchAddress200ResponseFromJSON, WatchAddressRequestToJSON, WatchOrderBookRequestToJSON, WatchOrderBooks200ResponseFromJSON, WatchOrderBooksRequestToJSON, WatchTradesRequestToJSON, } from '../models/index.js';
|
|
16
16
|
/**
|
|
17
17
|
*
|
|
18
18
|
*/
|
|
@@ -1556,6 +1556,36 @@ export class DefaultApi extends runtime.BaseAPI {
|
|
|
1556
1556
|
const response = await this.watchOrderBookRaw(requestParameters, initOverrides);
|
|
1557
1557
|
return await response.value();
|
|
1558
1558
|
}
|
|
1559
|
+
/**
|
|
1560
|
+
* Watch multiple order books simultaneously via WebSocket. Returns a promise that resolves with a record of order book snapshots keyed by ID. Exchanges with native batch support (e.g. Kalshi) send a single subscribe message for all tickers; others fall back to individual watchOrderBook calls.
|
|
1561
|
+
* Watch Order Books
|
|
1562
|
+
*/
|
|
1563
|
+
async watchOrderBooksRaw(requestParameters, initOverrides) {
|
|
1564
|
+
if (requestParameters['exchange'] == null) {
|
|
1565
|
+
throw new runtime.RequiredError('exchange', 'Required parameter "exchange" was null or undefined when calling watchOrderBooks().');
|
|
1566
|
+
}
|
|
1567
|
+
const queryParameters = {};
|
|
1568
|
+
const headerParameters = {};
|
|
1569
|
+
headerParameters['Content-Type'] = 'application/json';
|
|
1570
|
+
let urlPath = `/api/{exchange}/watchOrderBooks`;
|
|
1571
|
+
urlPath = urlPath.replace(`{${"exchange"}}`, encodeURIComponent(String(requestParameters['exchange'])));
|
|
1572
|
+
const response = await this.request({
|
|
1573
|
+
path: urlPath,
|
|
1574
|
+
method: 'POST',
|
|
1575
|
+
headers: headerParameters,
|
|
1576
|
+
query: queryParameters,
|
|
1577
|
+
body: WatchOrderBooksRequestToJSON(requestParameters['watchOrderBooksRequest']),
|
|
1578
|
+
}, initOverrides);
|
|
1579
|
+
return new runtime.JSONApiResponse(response, (jsonValue) => WatchOrderBooks200ResponseFromJSON(jsonValue));
|
|
1580
|
+
}
|
|
1581
|
+
/**
|
|
1582
|
+
* Watch multiple order books simultaneously via WebSocket. Returns a promise that resolves with a record of order book snapshots keyed by ID. Exchanges with native batch support (e.g. Kalshi) send a single subscribe message for all tickers; others fall back to individual watchOrderBook calls.
|
|
1583
|
+
* Watch Order Books
|
|
1584
|
+
*/
|
|
1585
|
+
async watchOrderBooks(requestParameters, initOverrides) {
|
|
1586
|
+
const response = await this.watchOrderBooksRaw(requestParameters, initOverrides);
|
|
1587
|
+
return await response.value();
|
|
1588
|
+
}
|
|
1559
1589
|
/**
|
|
1560
1590
|
* Watch trade executions in real-time via WebSocket. Returns a promise that resolves with the next trade(s). Call repeatedly in a loop to stream updates (CCXT Pro pattern).
|
|
1561
1591
|
* Watch Trades
|
|
@@ -2427,6 +2457,23 @@ export const WatchOrderBookOperationExchangeEnum = {
|
|
|
2427
2457
|
PolymarketUs: 'polymarket_us',
|
|
2428
2458
|
Router: 'router'
|
|
2429
2459
|
};
|
|
2460
|
+
/**
|
|
2461
|
+
* @export
|
|
2462
|
+
*/
|
|
2463
|
+
export const WatchOrderBooksOperationExchangeEnum = {
|
|
2464
|
+
Polymarket: 'polymarket',
|
|
2465
|
+
Kalshi: 'kalshi',
|
|
2466
|
+
KalshiDemo: 'kalshi-demo',
|
|
2467
|
+
Limitless: 'limitless',
|
|
2468
|
+
Probable: 'probable',
|
|
2469
|
+
Baozi: 'baozi',
|
|
2470
|
+
Myriad: 'myriad',
|
|
2471
|
+
Opinion: 'opinion',
|
|
2472
|
+
Metaculus: 'metaculus',
|
|
2473
|
+
Smarkets: 'smarkets',
|
|
2474
|
+
PolymarketUs: 'polymarket_us',
|
|
2475
|
+
Router: 'router'
|
|
2476
|
+
};
|
|
2430
2477
|
/**
|
|
2431
2478
|
* @export
|
|
2432
2479
|
*/
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PMXT Sidecar API
|
|
3
|
+
* A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
|
|
4
|
+
*
|
|
5
|
+
* The version of the OpenAPI document: 0.4.4
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
9
|
+
* https://openapi-generator.tech
|
|
10
|
+
* Do not edit the class manually.
|
|
11
|
+
*/
|
|
12
|
+
import type { ErrorDetail } from './ErrorDetail.js';
|
|
13
|
+
import type { OrderBook } from './OrderBook.js';
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @export
|
|
17
|
+
* @interface WatchOrderBooks200Response
|
|
18
|
+
*/
|
|
19
|
+
export interface WatchOrderBooks200Response {
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @type {boolean}
|
|
23
|
+
* @memberof WatchOrderBooks200Response
|
|
24
|
+
*/
|
|
25
|
+
success?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
* @type {ErrorDetail}
|
|
29
|
+
* @memberof WatchOrderBooks200Response
|
|
30
|
+
*/
|
|
31
|
+
error?: ErrorDetail;
|
|
32
|
+
/**
|
|
33
|
+
*
|
|
34
|
+
* @type {{ [key: string]: OrderBook; }}
|
|
35
|
+
* @memberof WatchOrderBooks200Response
|
|
36
|
+
*/
|
|
37
|
+
data?: {
|
|
38
|
+
[key: string]: OrderBook;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if a given object implements the WatchOrderBooks200Response interface.
|
|
43
|
+
*/
|
|
44
|
+
export declare function instanceOfWatchOrderBooks200Response(value: object): value is WatchOrderBooks200Response;
|
|
45
|
+
export declare function WatchOrderBooks200ResponseFromJSON(json: any): WatchOrderBooks200Response;
|
|
46
|
+
export declare function WatchOrderBooks200ResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): WatchOrderBooks200Response;
|
|
47
|
+
export declare function WatchOrderBooks200ResponseToJSON(json: any): WatchOrderBooks200Response;
|
|
48
|
+
export declare function WatchOrderBooks200ResponseToJSONTyped(value?: WatchOrderBooks200Response | null, ignoreDiscriminator?: boolean): any;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* PMXT Sidecar API
|
|
5
|
+
* A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
|
|
6
|
+
*
|
|
7
|
+
* The version of the OpenAPI document: 0.4.4
|
|
8
|
+
*
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
11
|
+
* https://openapi-generator.tech
|
|
12
|
+
* Do not edit the class manually.
|
|
13
|
+
*/
|
|
14
|
+
import { mapValues } from '../runtime.js';
|
|
15
|
+
import { ErrorDetailFromJSON, ErrorDetailToJSON, } from './ErrorDetail.js';
|
|
16
|
+
import { OrderBookFromJSON, OrderBookToJSON, } from './OrderBook.js';
|
|
17
|
+
/**
|
|
18
|
+
* Check if a given object implements the WatchOrderBooks200Response interface.
|
|
19
|
+
*/
|
|
20
|
+
export function instanceOfWatchOrderBooks200Response(value) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
export function WatchOrderBooks200ResponseFromJSON(json) {
|
|
24
|
+
return WatchOrderBooks200ResponseFromJSONTyped(json, false);
|
|
25
|
+
}
|
|
26
|
+
export function WatchOrderBooks200ResponseFromJSONTyped(json, ignoreDiscriminator) {
|
|
27
|
+
if (json == null) {
|
|
28
|
+
return json;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
'success': json['success'] == null ? undefined : json['success'],
|
|
32
|
+
'error': json['error'] == null ? undefined : ErrorDetailFromJSON(json['error']),
|
|
33
|
+
'data': json['data'] == null ? undefined : (mapValues(json['data'], OrderBookFromJSON)),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function WatchOrderBooks200ResponseToJSON(json) {
|
|
37
|
+
return WatchOrderBooks200ResponseToJSONTyped(json, false);
|
|
38
|
+
}
|
|
39
|
+
export function WatchOrderBooks200ResponseToJSONTyped(value, ignoreDiscriminator = false) {
|
|
40
|
+
if (value == null) {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
'success': value['success'],
|
|
45
|
+
'error': ErrorDetailToJSON(value['error']),
|
|
46
|
+
'data': value['data'] == null ? undefined : (mapValues(value['data'], OrderBookToJSON)),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PMXT Sidecar API
|
|
3
|
+
* A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
|
|
4
|
+
*
|
|
5
|
+
* The version of the OpenAPI document: 0.4.4
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
9
|
+
* https://openapi-generator.tech
|
|
10
|
+
* Do not edit the class manually.
|
|
11
|
+
*/
|
|
12
|
+
import type { ExchangeCredentials } from './ExchangeCredentials.js';
|
|
13
|
+
import type { WatchOrderBooksRequestArgsInner } from './WatchOrderBooksRequestArgsInner.js';
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @export
|
|
17
|
+
* @interface WatchOrderBooksRequest
|
|
18
|
+
*/
|
|
19
|
+
export interface WatchOrderBooksRequest {
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @type {Array<WatchOrderBooksRequestArgsInner>}
|
|
23
|
+
* @memberof WatchOrderBooksRequest
|
|
24
|
+
*/
|
|
25
|
+
args: Array<WatchOrderBooksRequestArgsInner>;
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
* @type {ExchangeCredentials}
|
|
29
|
+
* @memberof WatchOrderBooksRequest
|
|
30
|
+
*/
|
|
31
|
+
credentials?: ExchangeCredentials;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if a given object implements the WatchOrderBooksRequest interface.
|
|
35
|
+
*/
|
|
36
|
+
export declare function instanceOfWatchOrderBooksRequest(value: object): value is WatchOrderBooksRequest;
|
|
37
|
+
export declare function WatchOrderBooksRequestFromJSON(json: any): WatchOrderBooksRequest;
|
|
38
|
+
export declare function WatchOrderBooksRequestFromJSONTyped(json: any, ignoreDiscriminator: boolean): WatchOrderBooksRequest;
|
|
39
|
+
export declare function WatchOrderBooksRequestToJSON(json: any): WatchOrderBooksRequest;
|
|
40
|
+
export declare function WatchOrderBooksRequestToJSONTyped(value?: WatchOrderBooksRequest | null, ignoreDiscriminator?: boolean): any;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* PMXT Sidecar API
|
|
5
|
+
* A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
|
|
6
|
+
*
|
|
7
|
+
* The version of the OpenAPI document: 0.4.4
|
|
8
|
+
*
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
11
|
+
* https://openapi-generator.tech
|
|
12
|
+
* Do not edit the class manually.
|
|
13
|
+
*/
|
|
14
|
+
import { ExchangeCredentialsFromJSON, ExchangeCredentialsToJSON, } from './ExchangeCredentials.js';
|
|
15
|
+
import { WatchOrderBooksRequestArgsInnerFromJSON, WatchOrderBooksRequestArgsInnerToJSON, } from './WatchOrderBooksRequestArgsInner.js';
|
|
16
|
+
/**
|
|
17
|
+
* Check if a given object implements the WatchOrderBooksRequest interface.
|
|
18
|
+
*/
|
|
19
|
+
export function instanceOfWatchOrderBooksRequest(value) {
|
|
20
|
+
if (!('args' in value) || value['args'] === undefined)
|
|
21
|
+
return false;
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
export function WatchOrderBooksRequestFromJSON(json) {
|
|
25
|
+
return WatchOrderBooksRequestFromJSONTyped(json, false);
|
|
26
|
+
}
|
|
27
|
+
export function WatchOrderBooksRequestFromJSONTyped(json, ignoreDiscriminator) {
|
|
28
|
+
if (json == null) {
|
|
29
|
+
return json;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
'args': (json['args'].map(WatchOrderBooksRequestArgsInnerFromJSON)),
|
|
33
|
+
'credentials': json['credentials'] == null ? undefined : ExchangeCredentialsFromJSON(json['credentials']),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function WatchOrderBooksRequestToJSON(json) {
|
|
37
|
+
return WatchOrderBooksRequestToJSONTyped(json, false);
|
|
38
|
+
}
|
|
39
|
+
export function WatchOrderBooksRequestToJSONTyped(value, ignoreDiscriminator = false) {
|
|
40
|
+
if (value == null) {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
'args': (value['args'].map(WatchOrderBooksRequestArgsInnerToJSON)),
|
|
45
|
+
'credentials': ExchangeCredentialsToJSON(value['credentials']),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PMXT Sidecar API
|
|
3
|
+
* A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
|
|
4
|
+
*
|
|
5
|
+
* The version of the OpenAPI document: 0.4.4
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
9
|
+
* https://openapi-generator.tech
|
|
10
|
+
* Do not edit the class manually.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* @type WatchOrderBooksRequestArgsInner
|
|
14
|
+
*
|
|
15
|
+
* @export
|
|
16
|
+
*/
|
|
17
|
+
export type WatchOrderBooksRequestArgsInner = Array<string> | number;
|
|
18
|
+
export declare function WatchOrderBooksRequestArgsInnerFromJSON(json: any): WatchOrderBooksRequestArgsInner;
|
|
19
|
+
export declare function WatchOrderBooksRequestArgsInnerFromJSONTyped(json: any, ignoreDiscriminator: boolean): WatchOrderBooksRequestArgsInner;
|
|
20
|
+
export declare function WatchOrderBooksRequestArgsInnerToJSON(json: any): any;
|
|
21
|
+
export declare function WatchOrderBooksRequestArgsInnerToJSONTyped(value?: WatchOrderBooksRequestArgsInner | null, ignoreDiscriminator?: boolean): any;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* PMXT Sidecar API
|
|
5
|
+
* A unified local sidecar API for prediction markets (Polymarket, Kalshi, Limitless). This API acts as a JSON-RPC-style gateway. Each endpoint corresponds to a specific method on the generic exchange implementation.
|
|
6
|
+
*
|
|
7
|
+
* The version of the OpenAPI document: 0.4.4
|
|
8
|
+
*
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
11
|
+
* https://openapi-generator.tech
|
|
12
|
+
* Do not edit the class manually.
|
|
13
|
+
*/
|
|
14
|
+
export function WatchOrderBooksRequestArgsInnerFromJSON(json) {
|
|
15
|
+
return WatchOrderBooksRequestArgsInnerFromJSONTyped(json, false);
|
|
16
|
+
}
|
|
17
|
+
export function WatchOrderBooksRequestArgsInnerFromJSONTyped(json, ignoreDiscriminator) {
|
|
18
|
+
if (json == null) {
|
|
19
|
+
return json;
|
|
20
|
+
}
|
|
21
|
+
if (typeof json === 'number') {
|
|
22
|
+
return json;
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(json)) {
|
|
25
|
+
if (json.every(item => typeof item === 'string')) {
|
|
26
|
+
return json;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
export function WatchOrderBooksRequestArgsInnerToJSON(json) {
|
|
32
|
+
return WatchOrderBooksRequestArgsInnerToJSONTyped(json, false);
|
|
33
|
+
}
|
|
34
|
+
export function WatchOrderBooksRequestArgsInnerToJSONTyped(value, ignoreDiscriminator = false) {
|
|
35
|
+
if (value == null) {
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
if (typeof value === 'number') {
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
if (Array.isArray(value)) {
|
|
42
|
+
if (value.every(item => typeof item === 'string')) {
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
@@ -91,4 +91,7 @@ export * from './WatchAddressRequest.js';
|
|
|
91
91
|
export * from './WatchAddressRequestArgsInner.js';
|
|
92
92
|
export * from './WatchOrderBookRequest.js';
|
|
93
93
|
export * from './WatchOrderBookRequestArgsInner.js';
|
|
94
|
+
export * from './WatchOrderBooks200Response.js';
|
|
95
|
+
export * from './WatchOrderBooksRequest.js';
|
|
96
|
+
export * from './WatchOrderBooksRequestArgsInner.js';
|
|
94
97
|
export * from './WatchTradesRequest.js';
|
|
@@ -93,4 +93,7 @@ export * from './WatchAddressRequest.js';
|
|
|
93
93
|
export * from './WatchAddressRequestArgsInner.js';
|
|
94
94
|
export * from './WatchOrderBookRequest.js';
|
|
95
95
|
export * from './WatchOrderBookRequestArgsInner.js';
|
|
96
|
+
export * from './WatchOrderBooks200Response.js';
|
|
97
|
+
export * from './WatchOrderBooksRequest.js';
|
|
98
|
+
export * from './WatchOrderBooksRequestArgsInner.js';
|
|
96
99
|
export * from './WatchTradesRequest.js';
|
|
@@ -75,6 +75,10 @@ export declare abstract class Exchange {
|
|
|
75
75
|
* POST directly and skip the GET probe for the lifetime of this client.
|
|
76
76
|
*/
|
|
77
77
|
private _getReadsUnsupported;
|
|
78
|
+
/** Shared WebSocket client for streaming methods (lazy). */
|
|
79
|
+
private _wsClient;
|
|
80
|
+
/** Sticky flag: true if the sidecar /ws endpoint is unavailable. */
|
|
81
|
+
private _wsUnsupported;
|
|
78
82
|
constructor(exchangeName: string, options?: ExchangeOptions);
|
|
79
83
|
private initializeServer;
|
|
80
84
|
protected handleResponse(response: any): any;
|
|
@@ -96,6 +100,18 @@ export declare abstract class Exchange {
|
|
|
96
100
|
* attempts to restart the sidecar.
|
|
97
101
|
*/
|
|
98
102
|
private fetchWithRetry;
|
|
103
|
+
/**
|
|
104
|
+
* Return the shared WebSocket client, creating it on first use.
|
|
105
|
+
*
|
|
106
|
+
* Returns `null` if the sidecar /ws endpoint was previously found
|
|
107
|
+
* to be unavailable, letting callers fall back to HTTP.
|
|
108
|
+
*/
|
|
109
|
+
private getOrCreateWs;
|
|
110
|
+
/**
|
|
111
|
+
* Attempt to use the WS transport for a watch method.
|
|
112
|
+
* Returns the raw data on success, or `null` if WS is unavailable.
|
|
113
|
+
*/
|
|
114
|
+
private watchViaWs;
|
|
99
115
|
/**
|
|
100
116
|
* Call an exchange-specific REST endpoint by its operationId.
|
|
101
117
|
* This provides direct access to all implicit API methods defined in
|
|
@@ -207,6 +223,32 @@ export declare abstract class Exchange {
|
|
|
207
223
|
* ```
|
|
208
224
|
*/
|
|
209
225
|
watchOrderBook(outcomeId: string | MarketOutcome, limit?: number): Promise<OrderBook>;
|
|
226
|
+
/**
|
|
227
|
+
* Watch real-time order book updates for multiple outcomes at once.
|
|
228
|
+
*
|
|
229
|
+
* Returns a record mapping each outcome ID (ticker) to its latest
|
|
230
|
+
* order book snapshot. Call repeatedly in a loop to stream updates
|
|
231
|
+
* (CCXT Pro pattern).
|
|
232
|
+
*
|
|
233
|
+
* Prefers the sidecar WebSocket transport when available, falling
|
|
234
|
+
* back to HTTP POST for older sidecars.
|
|
235
|
+
*
|
|
236
|
+
* @param outcomeIds - Array of outcome IDs (or MarketOutcome objects)
|
|
237
|
+
* @param limit - Optional depth limit for each order book
|
|
238
|
+
* @returns Record mapping ticker to OrderBook
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```typescript
|
|
242
|
+
* const ids = markets.slice(0, 3).map(m => m.outcomes[0].outcomeId);
|
|
243
|
+
* while (true) {
|
|
244
|
+
* const books = await exchange.watchOrderBooks(ids);
|
|
245
|
+
* for (const [ticker, ob] of Object.entries(books)) {
|
|
246
|
+
* console.log(`${ticker}: bid=${ob.bids[0]?.price}`);
|
|
247
|
+
* }
|
|
248
|
+
* }
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
watchOrderBooks(outcomeIds: (string | MarketOutcome)[], limit?: number): Promise<Record<string, OrderBook>>;
|
|
210
252
|
/**
|
|
211
253
|
* Watch real-time trade updates via WebSocket.
|
|
212
254
|
*
|
package/dist/esm/pmxt/client.js
CHANGED
|
@@ -9,6 +9,7 @@ import { MarketList, } from "./models.js";
|
|
|
9
9
|
import { ServerManager } from "./server-manager.js";
|
|
10
10
|
import { PmxtError, fromServerError } from "./errors.js";
|
|
11
11
|
import { resolvePmxtBaseUrl } from "./constants.js";
|
|
12
|
+
import { SidecarWsClient } from "./ws-client.js";
|
|
12
13
|
/**
|
|
13
14
|
* Resolve a MarketOutcome shorthand to a plain outcome ID string.
|
|
14
15
|
* Accepts either a raw string ID or a MarketOutcome object.
|
|
@@ -245,6 +246,10 @@ export class Exchange {
|
|
|
245
246
|
* POST directly and skip the GET probe for the lifetime of this client.
|
|
246
247
|
*/
|
|
247
248
|
_getReadsUnsupported = false;
|
|
249
|
+
/** Shared WebSocket client for streaming methods (lazy). */
|
|
250
|
+
_wsClient = null;
|
|
251
|
+
/** Sticky flag: true if the sidecar /ws endpoint is unavailable. */
|
|
252
|
+
_wsUnsupported = false;
|
|
248
253
|
constructor(exchangeName, options = {}) {
|
|
249
254
|
this.exchangeName = exchangeName.toLowerCase();
|
|
250
255
|
this.apiKey = options.apiKey;
|
|
@@ -380,6 +385,58 @@ export class Exchange {
|
|
|
380
385
|
}
|
|
381
386
|
throw lastError;
|
|
382
387
|
}
|
|
388
|
+
/**
|
|
389
|
+
* Return the shared WebSocket client, creating it on first use.
|
|
390
|
+
*
|
|
391
|
+
* Returns `null` if the sidecar /ws endpoint was previously found
|
|
392
|
+
* to be unavailable, letting callers fall back to HTTP.
|
|
393
|
+
*/
|
|
394
|
+
async getOrCreateWs() {
|
|
395
|
+
if (this._wsUnsupported)
|
|
396
|
+
return null;
|
|
397
|
+
if (this._wsClient?.connected)
|
|
398
|
+
return this._wsClient;
|
|
399
|
+
const host = this.resolveBaseUrl();
|
|
400
|
+
const accessToken = this.serverManager.getAccessToken();
|
|
401
|
+
const client = new SidecarWsClient(host, accessToken || undefined);
|
|
402
|
+
try {
|
|
403
|
+
// Trigger connection to validate the endpoint exists.
|
|
404
|
+
// subscribe() calls ensureConnected internally, but we want
|
|
405
|
+
// to detect failure eagerly so we can set _wsUnsupported.
|
|
406
|
+
await client.subscribe(this.exchangeName, "_ping", [], undefined, 3000).catch(() => {
|
|
407
|
+
// Expected -- no _ping method. The connection itself
|
|
408
|
+
// succeeded if we got a WS error frame back. If the
|
|
409
|
+
// connection itself failed, we'll catch below.
|
|
410
|
+
});
|
|
411
|
+
// If we got here without the connect promise rejecting,
|
|
412
|
+
// the WS endpoint exists.
|
|
413
|
+
if (!client.connected) {
|
|
414
|
+
throw new Error("WS handshake failed");
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
this._wsUnsupported = true;
|
|
419
|
+
client.close();
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
this._wsClient = client;
|
|
423
|
+
return this._wsClient;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Attempt to use the WS transport for a watch method.
|
|
427
|
+
* Returns the raw data on success, or `null` if WS is unavailable.
|
|
428
|
+
*/
|
|
429
|
+
async watchViaWs(method, args) {
|
|
430
|
+
const ws = await this.getOrCreateWs();
|
|
431
|
+
if (!ws)
|
|
432
|
+
return null;
|
|
433
|
+
try {
|
|
434
|
+
return await ws.subscribe(this.exchangeName, method, args, this.getCredentials());
|
|
435
|
+
}
|
|
436
|
+
catch {
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
383
440
|
// Low-Level API Access
|
|
384
441
|
/**
|
|
385
442
|
* Call an exchange-specific REST endpoint by its operationId.
|
|
@@ -1325,11 +1382,17 @@ export class Exchange {
|
|
|
1325
1382
|
async watchOrderBook(outcomeId, limit) {
|
|
1326
1383
|
await this.initPromise;
|
|
1327
1384
|
const resolvedOutcomeId = resolveOutcomeId(outcomeId);
|
|
1385
|
+
const args = [resolvedOutcomeId];
|
|
1386
|
+
if (limit !== undefined) {
|
|
1387
|
+
args.push(limit);
|
|
1388
|
+
}
|
|
1389
|
+
// Try WebSocket transport first
|
|
1390
|
+
const wsData = await this.watchViaWs("watchOrderBook", args);
|
|
1391
|
+
if (wsData !== null) {
|
|
1392
|
+
return convertOrderBook(wsData);
|
|
1393
|
+
}
|
|
1394
|
+
// HTTP fallback
|
|
1328
1395
|
try {
|
|
1329
|
-
const args = [resolvedOutcomeId];
|
|
1330
|
-
if (limit !== undefined) {
|
|
1331
|
-
args.push(limit);
|
|
1332
|
-
}
|
|
1333
1396
|
const response = await this.fetchWithRetry(`${this.resolveBaseUrl()}/api/${this.exchangeName}/watchOrderBook`, {
|
|
1334
1397
|
method: 'POST',
|
|
1335
1398
|
headers: { 'Content-Type': 'application/json', ...this.getAuthHeaders() },
|
|
@@ -1352,6 +1415,88 @@ export class Exchange {
|
|
|
1352
1415
|
throw new PmxtError(`Failed to watch order book: ${error}`);
|
|
1353
1416
|
}
|
|
1354
1417
|
}
|
|
1418
|
+
/**
|
|
1419
|
+
* Watch real-time order book updates for multiple outcomes at once.
|
|
1420
|
+
*
|
|
1421
|
+
* Returns a record mapping each outcome ID (ticker) to its latest
|
|
1422
|
+
* order book snapshot. Call repeatedly in a loop to stream updates
|
|
1423
|
+
* (CCXT Pro pattern).
|
|
1424
|
+
*
|
|
1425
|
+
* Prefers the sidecar WebSocket transport when available, falling
|
|
1426
|
+
* back to HTTP POST for older sidecars.
|
|
1427
|
+
*
|
|
1428
|
+
* @param outcomeIds - Array of outcome IDs (or MarketOutcome objects)
|
|
1429
|
+
* @param limit - Optional depth limit for each order book
|
|
1430
|
+
* @returns Record mapping ticker to OrderBook
|
|
1431
|
+
*
|
|
1432
|
+
* @example
|
|
1433
|
+
* ```typescript
|
|
1434
|
+
* const ids = markets.slice(0, 3).map(m => m.outcomes[0].outcomeId);
|
|
1435
|
+
* while (true) {
|
|
1436
|
+
* const books = await exchange.watchOrderBooks(ids);
|
|
1437
|
+
* for (const [ticker, ob] of Object.entries(books)) {
|
|
1438
|
+
* console.log(`${ticker}: bid=${ob.bids[0]?.price}`);
|
|
1439
|
+
* }
|
|
1440
|
+
* }
|
|
1441
|
+
* ```
|
|
1442
|
+
*/
|
|
1443
|
+
async watchOrderBooks(outcomeIds, limit) {
|
|
1444
|
+
await this.initPromise;
|
|
1445
|
+
const resolvedIds = outcomeIds.map(resolveOutcomeId);
|
|
1446
|
+
const args = [resolvedIds];
|
|
1447
|
+
if (limit !== undefined) {
|
|
1448
|
+
args.push(limit);
|
|
1449
|
+
}
|
|
1450
|
+
// Try WebSocket transport first
|
|
1451
|
+
const ws = await this.getOrCreateWs();
|
|
1452
|
+
if (ws) {
|
|
1453
|
+
try {
|
|
1454
|
+
const rawResult = await ws.subscribeBatch(this.exchangeName, "watchOrderBooks", args, this.getCredentials());
|
|
1455
|
+
if (rawResult && typeof rawResult === "object") {
|
|
1456
|
+
const result = {};
|
|
1457
|
+
for (const [k, v] of Object.entries(rawResult)) {
|
|
1458
|
+
if (v && typeof v === "object") {
|
|
1459
|
+
result[k] = convertOrderBook(v);
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
return result;
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
catch {
|
|
1466
|
+
// fall through to HTTP
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
// HTTP fallback
|
|
1470
|
+
try {
|
|
1471
|
+
const response = await this.fetchWithRetry(`${this.resolveBaseUrl()}/api/${this.exchangeName}/watchOrderBooks`, {
|
|
1472
|
+
method: 'POST',
|
|
1473
|
+
headers: { 'Content-Type': 'application/json', ...this.getAuthHeaders() },
|
|
1474
|
+
body: JSON.stringify({ args, credentials: this.getCredentials() }),
|
|
1475
|
+
});
|
|
1476
|
+
if (!response.ok) {
|
|
1477
|
+
const body = await response.json().catch(() => ({}));
|
|
1478
|
+
if (body.error && typeof body.error === "object") {
|
|
1479
|
+
throw fromServerError(body.error);
|
|
1480
|
+
}
|
|
1481
|
+
throw new PmxtError(body.error?.message || response.statusText);
|
|
1482
|
+
}
|
|
1483
|
+
const json = await response.json();
|
|
1484
|
+
const data = this.handleResponse(json);
|
|
1485
|
+
if (data && typeof data === "object") {
|
|
1486
|
+
const result = {};
|
|
1487
|
+
for (const [k, v] of Object.entries(data)) {
|
|
1488
|
+
result[k] = convertOrderBook(v);
|
|
1489
|
+
}
|
|
1490
|
+
return result;
|
|
1491
|
+
}
|
|
1492
|
+
return {};
|
|
1493
|
+
}
|
|
1494
|
+
catch (error) {
|
|
1495
|
+
if (error instanceof PmxtError)
|
|
1496
|
+
throw error;
|
|
1497
|
+
throw new PmxtError(`Failed to watch order books: ${error}`);
|
|
1498
|
+
}
|
|
1499
|
+
}
|
|
1355
1500
|
/**
|
|
1356
1501
|
* Watch real-time trade updates via WebSocket.
|
|
1357
1502
|
*
|