pmxtjs 2.35.30 → 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.
Files changed (42) hide show
  1. package/dist/esm/generated/src/apis/DefaultApi.d.ts +33 -1
  2. package/dist/esm/generated/src/apis/DefaultApi.js +48 -1
  3. package/dist/esm/generated/src/models/WatchOrderBooks200Response.d.ts +48 -0
  4. package/dist/esm/generated/src/models/WatchOrderBooks200Response.js +48 -0
  5. package/dist/esm/generated/src/models/WatchOrderBooksRequest.d.ts +40 -0
  6. package/dist/esm/generated/src/models/WatchOrderBooksRequest.js +47 -0
  7. package/dist/esm/generated/src/models/WatchOrderBooksRequestArgsInner.d.ts +21 -0
  8. package/dist/esm/generated/src/models/WatchOrderBooksRequestArgsInner.js +47 -0
  9. package/dist/esm/generated/src/models/index.d.ts +3 -0
  10. package/dist/esm/generated/src/models/index.js +3 -0
  11. package/dist/esm/pmxt/client.d.ts +42 -0
  12. package/dist/esm/pmxt/client.js +149 -4
  13. package/dist/esm/pmxt/ws-client.d.ts +37 -0
  14. package/dist/esm/pmxt/ws-client.js +272 -0
  15. package/dist/generated/src/apis/DefaultApi.d.ts +33 -1
  16. package/dist/generated/src/apis/DefaultApi.js +48 -1
  17. package/dist/generated/src/models/WatchOrderBooks200Response.d.ts +48 -0
  18. package/dist/generated/src/models/WatchOrderBooks200Response.js +55 -0
  19. package/dist/generated/src/models/WatchOrderBooksRequest.d.ts +40 -0
  20. package/dist/generated/src/models/WatchOrderBooksRequest.js +54 -0
  21. package/dist/generated/src/models/WatchOrderBooksRequestArgsInner.d.ts +21 -0
  22. package/dist/generated/src/models/WatchOrderBooksRequestArgsInner.js +53 -0
  23. package/dist/generated/src/models/index.d.ts +3 -0
  24. package/dist/generated/src/models/index.js +3 -0
  25. package/dist/pmxt/client.d.ts +42 -0
  26. package/dist/pmxt/client.js +149 -4
  27. package/dist/pmxt/ws-client.d.ts +37 -0
  28. package/dist/pmxt/ws-client.js +276 -0
  29. package/generated/.openapi-generator/FILES +6 -0
  30. package/generated/docs/DefaultApi.md +71 -0
  31. package/generated/docs/WatchOrderBooks200Response.md +38 -0
  32. package/generated/docs/WatchOrderBooksRequest.md +36 -0
  33. package/generated/docs/WatchOrderBooksRequestArgsInner.md +32 -0
  34. package/generated/package.json +1 -1
  35. package/generated/src/apis/DefaultApi.ts +71 -0
  36. package/generated/src/models/WatchOrderBooks200Response.ts +96 -0
  37. package/generated/src/models/WatchOrderBooksRequest.ts +89 -0
  38. package/generated/src/models/WatchOrderBooksRequestArgsInner.ts +59 -0
  39. package/generated/src/models/index.ts +3 -0
  40. package/package.json +2 -2
  41. package/pmxt/client.ts +181 -8
  42. 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
  *
@@ -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
  *