pmxtjs 2.40.6 → 2.41.1

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 (79) hide show
  1. package/dist/esm/generated/src/apis/DefaultApi.d.ts +24 -24
  2. package/dist/esm/generated/src/apis/DefaultApi.js +24 -24
  3. package/dist/esm/generated/src/models/UnwatchAddressRequest.d.ts +1 -1
  4. package/dist/esm/generated/src/models/UnwatchAddressRequest.js +1 -3
  5. package/dist/esm/generated/src/models/UnwatchOrderBookRequest.d.ts +1 -1
  6. package/dist/esm/generated/src/models/UnwatchOrderBookRequest.js +1 -3
  7. package/dist/esm/generated/src/models/WatchAddressRequest.d.ts +2 -3
  8. package/dist/esm/generated/src/models/WatchAddressRequest.js +2 -5
  9. package/dist/esm/generated/src/models/WatchOrderBookRequest.d.ts +2 -3
  10. package/dist/esm/generated/src/models/WatchOrderBookRequest.js +2 -5
  11. package/dist/esm/generated/src/models/WatchOrderBooksRequest.d.ts +2 -3
  12. package/dist/esm/generated/src/models/WatchOrderBooksRequest.js +2 -5
  13. package/dist/esm/generated/src/models/WatchTradesRequest.d.ts +2 -3
  14. package/dist/esm/generated/src/models/WatchTradesRequest.js +2 -5
  15. package/dist/esm/generated/src/models/index.d.ts +0 -3
  16. package/dist/esm/generated/src/models/index.js +0 -3
  17. package/dist/esm/pmxt/client.d.ts +27 -6
  18. package/dist/esm/pmxt/client.js +132 -14
  19. package/dist/esm/pmxt/models.d.ts +11 -0
  20. package/dist/esm/pmxt/ws-client.d.ts +2 -1
  21. package/dist/esm/pmxt/ws-client.js +25 -14
  22. package/dist/generated/src/apis/DefaultApi.d.ts +24 -24
  23. package/dist/generated/src/apis/DefaultApi.js +24 -24
  24. package/dist/generated/src/models/UnwatchAddressRequest.d.ts +1 -1
  25. package/dist/generated/src/models/UnwatchAddressRequest.js +1 -3
  26. package/dist/generated/src/models/UnwatchOrderBookRequest.d.ts +1 -1
  27. package/dist/generated/src/models/UnwatchOrderBookRequest.js +1 -3
  28. package/dist/generated/src/models/WatchAddressRequest.d.ts +2 -3
  29. package/dist/generated/src/models/WatchAddressRequest.js +2 -5
  30. package/dist/generated/src/models/WatchOrderBookRequest.d.ts +2 -3
  31. package/dist/generated/src/models/WatchOrderBookRequest.js +2 -5
  32. package/dist/generated/src/models/WatchOrderBooksRequest.d.ts +2 -3
  33. package/dist/generated/src/models/WatchOrderBooksRequest.js +2 -5
  34. package/dist/generated/src/models/WatchTradesRequest.d.ts +2 -3
  35. package/dist/generated/src/models/WatchTradesRequest.js +2 -5
  36. package/dist/generated/src/models/index.d.ts +0 -3
  37. package/dist/generated/src/models/index.js +0 -3
  38. package/dist/pmxt/client.d.ts +27 -6
  39. package/dist/pmxt/client.js +132 -14
  40. package/dist/pmxt/models.d.ts +11 -0
  41. package/dist/pmxt/ws-client.d.ts +2 -1
  42. package/dist/pmxt/ws-client.js +25 -14
  43. package/generated/.openapi-generator/FILES +0 -6
  44. package/generated/docs/DefaultApi.md +24 -24
  45. package/generated/docs/WatchAddressRequest.md +1 -1
  46. package/generated/docs/WatchOrderBookRequest.md +1 -1
  47. package/generated/docs/WatchOrderBooksRequest.md +1 -1
  48. package/generated/docs/WatchTradesRequest.md +1 -1
  49. package/generated/package.json +1 -1
  50. package/generated/src/apis/DefaultApi.ts +24 -24
  51. package/generated/src/models/UnwatchAddressRequest.ts +2 -3
  52. package/generated/src/models/UnwatchOrderBookRequest.ts +2 -3
  53. package/generated/src/models/WatchAddressRequest.ts +4 -12
  54. package/generated/src/models/WatchOrderBookRequest.ts +4 -12
  55. package/generated/src/models/WatchOrderBooksRequest.ts +4 -12
  56. package/generated/src/models/WatchTradesRequest.ts +4 -12
  57. package/generated/src/models/index.ts +0 -3
  58. package/package.json +3 -2
  59. package/pmxt/client.ts +137 -16
  60. package/pmxt/models.ts +14 -0
  61. package/pmxt/ws-client.ts +26 -13
  62. package/dist/esm/generated/src/models/WatchAddressRequestArgsInner.d.ts +0 -21
  63. package/dist/esm/generated/src/models/WatchAddressRequestArgsInner.js +0 -37
  64. package/dist/esm/generated/src/models/WatchOrderBookRequestArgsInner.d.ts +0 -21
  65. package/dist/esm/generated/src/models/WatchOrderBookRequestArgsInner.js +0 -43
  66. package/dist/esm/generated/src/models/WatchOrderBooksRequestArgsInner.d.ts +0 -21
  67. package/dist/esm/generated/src/models/WatchOrderBooksRequestArgsInner.js +0 -47
  68. package/dist/generated/src/models/WatchAddressRequestArgsInner.d.ts +0 -21
  69. package/dist/generated/src/models/WatchAddressRequestArgsInner.js +0 -43
  70. package/dist/generated/src/models/WatchOrderBookRequestArgsInner.d.ts +0 -21
  71. package/dist/generated/src/models/WatchOrderBookRequestArgsInner.js +0 -49
  72. package/dist/generated/src/models/WatchOrderBooksRequestArgsInner.d.ts +0 -21
  73. package/dist/generated/src/models/WatchOrderBooksRequestArgsInner.js +0 -53
  74. package/generated/docs/WatchAddressRequestArgsInner.md +0 -32
  75. package/generated/docs/WatchOrderBookRequestArgsInner.md +0 -32
  76. package/generated/docs/WatchOrderBooksRequestArgsInner.md +0 -32
  77. package/generated/src/models/WatchAddressRequestArgsInner.ts +0 -49
  78. package/generated/src/models/WatchOrderBookRequestArgsInner.ts +0 -55
  79. package/generated/src/models/WatchOrderBooksRequestArgsInner.ts +0 -59
@@ -9,7 +9,6 @@
9
9
  * https://openapi-generator.tech
10
10
  * Do not edit the class manually.
11
11
  */
12
- import type { WatchAddressRequestArgsInner } from './WatchAddressRequestArgsInner';
13
12
  import type { ExchangeCredentials } from './ExchangeCredentials';
14
13
  /**
15
14
  *
@@ -19,10 +18,10 @@ import type { ExchangeCredentials } from './ExchangeCredentials';
19
18
  export interface WatchAddressRequest {
20
19
  /**
21
20
  *
22
- * @type {Array<WatchAddressRequestArgsInner>}
21
+ * @type {Array<string>}
23
22
  * @memberof WatchAddressRequest
24
23
  */
25
- args: Array<WatchAddressRequestArgsInner>;
24
+ args?: Array<string>;
26
25
  /**
27
26
  *
28
27
  * @type {ExchangeCredentials}
@@ -18,14 +18,11 @@ exports.WatchAddressRequestFromJSON = WatchAddressRequestFromJSON;
18
18
  exports.WatchAddressRequestFromJSONTyped = WatchAddressRequestFromJSONTyped;
19
19
  exports.WatchAddressRequestToJSON = WatchAddressRequestToJSON;
20
20
  exports.WatchAddressRequestToJSONTyped = WatchAddressRequestToJSONTyped;
21
- const WatchAddressRequestArgsInner_1 = require("./WatchAddressRequestArgsInner");
22
21
  const ExchangeCredentials_1 = require("./ExchangeCredentials");
23
22
  /**
24
23
  * Check if a given object implements the WatchAddressRequest interface.
25
24
  */
26
25
  function instanceOfWatchAddressRequest(value) {
27
- if (!('args' in value) || value['args'] === undefined)
28
- return false;
29
26
  return true;
30
27
  }
31
28
  function WatchAddressRequestFromJSON(json) {
@@ -36,7 +33,7 @@ function WatchAddressRequestFromJSONTyped(json, ignoreDiscriminator) {
36
33
  return json;
37
34
  }
38
35
  return {
39
- 'args': (json['args'].map(WatchAddressRequestArgsInner_1.WatchAddressRequestArgsInnerFromJSON)),
36
+ 'args': json['args'] == null ? undefined : json['args'],
40
37
  'credentials': json['credentials'] == null ? undefined : (0, ExchangeCredentials_1.ExchangeCredentialsFromJSON)(json['credentials']),
41
38
  };
42
39
  }
@@ -48,7 +45,7 @@ function WatchAddressRequestToJSONTyped(value, ignoreDiscriminator = false) {
48
45
  return value;
49
46
  }
50
47
  return {
51
- 'args': (value['args'].map(WatchAddressRequestArgsInner_1.WatchAddressRequestArgsInnerToJSON)),
48
+ 'args': value['args'],
52
49
  'credentials': (0, ExchangeCredentials_1.ExchangeCredentialsToJSON)(value['credentials']),
53
50
  };
54
51
  }
@@ -10,7 +10,6 @@
10
10
  * Do not edit the class manually.
11
11
  */
12
12
  import type { ExchangeCredentials } from './ExchangeCredentials';
13
- import type { WatchOrderBookRequestArgsInner } from './WatchOrderBookRequestArgsInner';
14
13
  /**
15
14
  *
16
15
  * @export
@@ -19,10 +18,10 @@ import type { WatchOrderBookRequestArgsInner } from './WatchOrderBookRequestArgs
19
18
  export interface WatchOrderBookRequest {
20
19
  /**
21
20
  *
22
- * @type {Array<WatchOrderBookRequestArgsInner>}
21
+ * @type {Array<string>}
23
22
  * @memberof WatchOrderBookRequest
24
23
  */
25
- args: Array<WatchOrderBookRequestArgsInner>;
24
+ args?: Array<string>;
26
25
  /**
27
26
  *
28
27
  * @type {ExchangeCredentials}
@@ -19,13 +19,10 @@ exports.WatchOrderBookRequestFromJSONTyped = WatchOrderBookRequestFromJSONTyped;
19
19
  exports.WatchOrderBookRequestToJSON = WatchOrderBookRequestToJSON;
20
20
  exports.WatchOrderBookRequestToJSONTyped = WatchOrderBookRequestToJSONTyped;
21
21
  const ExchangeCredentials_1 = require("./ExchangeCredentials");
22
- const WatchOrderBookRequestArgsInner_1 = require("./WatchOrderBookRequestArgsInner");
23
22
  /**
24
23
  * Check if a given object implements the WatchOrderBookRequest interface.
25
24
  */
26
25
  function instanceOfWatchOrderBookRequest(value) {
27
- if (!('args' in value) || value['args'] === undefined)
28
- return false;
29
26
  return true;
30
27
  }
31
28
  function WatchOrderBookRequestFromJSON(json) {
@@ -36,7 +33,7 @@ function WatchOrderBookRequestFromJSONTyped(json, ignoreDiscriminator) {
36
33
  return json;
37
34
  }
38
35
  return {
39
- 'args': (json['args'].map(WatchOrderBookRequestArgsInner_1.WatchOrderBookRequestArgsInnerFromJSON)),
36
+ 'args': json['args'] == null ? undefined : json['args'],
40
37
  'credentials': json['credentials'] == null ? undefined : (0, ExchangeCredentials_1.ExchangeCredentialsFromJSON)(json['credentials']),
41
38
  };
42
39
  }
@@ -48,7 +45,7 @@ function WatchOrderBookRequestToJSONTyped(value, ignoreDiscriminator = false) {
48
45
  return value;
49
46
  }
50
47
  return {
51
- 'args': (value['args'].map(WatchOrderBookRequestArgsInner_1.WatchOrderBookRequestArgsInnerToJSON)),
48
+ 'args': value['args'],
52
49
  'credentials': (0, ExchangeCredentials_1.ExchangeCredentialsToJSON)(value['credentials']),
53
50
  };
54
51
  }
@@ -10,7 +10,6 @@
10
10
  * Do not edit the class manually.
11
11
  */
12
12
  import type { ExchangeCredentials } from './ExchangeCredentials';
13
- import type { WatchOrderBooksRequestArgsInner } from './WatchOrderBooksRequestArgsInner';
14
13
  /**
15
14
  *
16
15
  * @export
@@ -19,10 +18,10 @@ import type { WatchOrderBooksRequestArgsInner } from './WatchOrderBooksRequestAr
19
18
  export interface WatchOrderBooksRequest {
20
19
  /**
21
20
  *
22
- * @type {Array<WatchOrderBooksRequestArgsInner>}
21
+ * @type {Array<string>}
23
22
  * @memberof WatchOrderBooksRequest
24
23
  */
25
- args: Array<WatchOrderBooksRequestArgsInner>;
24
+ args?: Array<string>;
26
25
  /**
27
26
  *
28
27
  * @type {ExchangeCredentials}
@@ -19,13 +19,10 @@ exports.WatchOrderBooksRequestFromJSONTyped = WatchOrderBooksRequestFromJSONType
19
19
  exports.WatchOrderBooksRequestToJSON = WatchOrderBooksRequestToJSON;
20
20
  exports.WatchOrderBooksRequestToJSONTyped = WatchOrderBooksRequestToJSONTyped;
21
21
  const ExchangeCredentials_1 = require("./ExchangeCredentials");
22
- const WatchOrderBooksRequestArgsInner_1 = require("./WatchOrderBooksRequestArgsInner");
23
22
  /**
24
23
  * Check if a given object implements the WatchOrderBooksRequest interface.
25
24
  */
26
25
  function instanceOfWatchOrderBooksRequest(value) {
27
- if (!('args' in value) || value['args'] === undefined)
28
- return false;
29
26
  return true;
30
27
  }
31
28
  function WatchOrderBooksRequestFromJSON(json) {
@@ -36,7 +33,7 @@ function WatchOrderBooksRequestFromJSONTyped(json, ignoreDiscriminator) {
36
33
  return json;
37
34
  }
38
35
  return {
39
- 'args': (json['args'].map(WatchOrderBooksRequestArgsInner_1.WatchOrderBooksRequestArgsInnerFromJSON)),
36
+ 'args': json['args'] == null ? undefined : json['args'],
40
37
  'credentials': json['credentials'] == null ? undefined : (0, ExchangeCredentials_1.ExchangeCredentialsFromJSON)(json['credentials']),
41
38
  };
42
39
  }
@@ -48,7 +45,7 @@ function WatchOrderBooksRequestToJSONTyped(value, ignoreDiscriminator = false) {
48
45
  return value;
49
46
  }
50
47
  return {
51
- 'args': (value['args'].map(WatchOrderBooksRequestArgsInner_1.WatchOrderBooksRequestArgsInnerToJSON)),
48
+ 'args': value['args'],
52
49
  'credentials': (0, ExchangeCredentials_1.ExchangeCredentialsToJSON)(value['credentials']),
53
50
  };
54
51
  }
@@ -10,7 +10,6 @@
10
10
  * Do not edit the class manually.
11
11
  */
12
12
  import type { ExchangeCredentials } from './ExchangeCredentials';
13
- import type { WatchOrderBookRequestArgsInner } from './WatchOrderBookRequestArgsInner';
14
13
  /**
15
14
  *
16
15
  * @export
@@ -19,10 +18,10 @@ import type { WatchOrderBookRequestArgsInner } from './WatchOrderBookRequestArgs
19
18
  export interface WatchTradesRequest {
20
19
  /**
21
20
  *
22
- * @type {Array<WatchOrderBookRequestArgsInner>}
21
+ * @type {Array<string>}
23
22
  * @memberof WatchTradesRequest
24
23
  */
25
- args: Array<WatchOrderBookRequestArgsInner>;
24
+ args?: Array<string>;
26
25
  /**
27
26
  *
28
27
  * @type {ExchangeCredentials}
@@ -19,13 +19,10 @@ exports.WatchTradesRequestFromJSONTyped = WatchTradesRequestFromJSONTyped;
19
19
  exports.WatchTradesRequestToJSON = WatchTradesRequestToJSON;
20
20
  exports.WatchTradesRequestToJSONTyped = WatchTradesRequestToJSONTyped;
21
21
  const ExchangeCredentials_1 = require("./ExchangeCredentials");
22
- const WatchOrderBookRequestArgsInner_1 = require("./WatchOrderBookRequestArgsInner");
23
22
  /**
24
23
  * Check if a given object implements the WatchTradesRequest interface.
25
24
  */
26
25
  function instanceOfWatchTradesRequest(value) {
27
- if (!('args' in value) || value['args'] === undefined)
28
- return false;
29
26
  return true;
30
27
  }
31
28
  function WatchTradesRequestFromJSON(json) {
@@ -36,7 +33,7 @@ function WatchTradesRequestFromJSONTyped(json, ignoreDiscriminator) {
36
33
  return json;
37
34
  }
38
35
  return {
39
- 'args': (json['args'].map(WatchOrderBookRequestArgsInner_1.WatchOrderBookRequestArgsInnerFromJSON)),
36
+ 'args': json['args'] == null ? undefined : json['args'],
40
37
  'credentials': json['credentials'] == null ? undefined : (0, ExchangeCredentials_1.ExchangeCredentialsFromJSON)(json['credentials']),
41
38
  };
42
39
  }
@@ -48,7 +45,7 @@ function WatchTradesRequestToJSONTyped(value, ignoreDiscriminator = false) {
48
45
  return value;
49
46
  }
50
47
  return {
51
- 'args': (value['args'].map(WatchOrderBookRequestArgsInner_1.WatchOrderBookRequestArgsInnerToJSON)),
48
+ 'args': value['args'],
52
49
  'credentials': (0, ExchangeCredentials_1.ExchangeCredentialsToJSON)(value['credentials']),
53
50
  };
54
51
  }
@@ -90,10 +90,7 @@ export * from './UnwatchOrderBookRequest';
90
90
  export * from './UserTrade';
91
91
  export * from './WatchAddress200Response';
92
92
  export * from './WatchAddressRequest';
93
- export * from './WatchAddressRequestArgsInner';
94
93
  export * from './WatchOrderBookRequest';
95
- export * from './WatchOrderBookRequestArgsInner';
96
94
  export * from './WatchOrderBooks200Response';
97
95
  export * from './WatchOrderBooksRequest';
98
- export * from './WatchOrderBooksRequestArgsInner';
99
96
  export * from './WatchTradesRequest';
@@ -108,10 +108,7 @@ __exportStar(require("./UnwatchOrderBookRequest"), exports);
108
108
  __exportStar(require("./UserTrade"), exports);
109
109
  __exportStar(require("./WatchAddress200Response"), exports);
110
110
  __exportStar(require("./WatchAddressRequest"), exports);
111
- __exportStar(require("./WatchAddressRequestArgsInner"), exports);
112
111
  __exportStar(require("./WatchOrderBookRequest"), exports);
113
- __exportStar(require("./WatchOrderBookRequestArgsInner"), exports);
114
112
  __exportStar(require("./WatchOrderBooks200Response"), exports);
115
113
  __exportStar(require("./WatchOrderBooksRequest"), exports);
116
- __exportStar(require("./WatchOrderBooksRequestArgsInner"), exports);
117
114
  __exportStar(require("./WatchTradesRequest"), exports);
@@ -5,7 +5,7 @@
5
5
  * OpenAPI client, matching the Python API exactly.
6
6
  */
7
7
  import { Configuration, DefaultApi, ExchangeCredentials } from "../generated/src/index.js";
8
- import { Balance, BuiltOrder, CreateOrderParams, EventFetchParams, EventFilterCriteria, EventFilterFunction, ExecutionPriceResult, MarketFetchParams, MarketFilterCriteria, MarketFilterFunction, MarketOutcome, MyTradesParams, Order, OrderBook, OrderHistoryParams, PaginatedMarketsResult, Position, PriceCandle, SubscribedAddressSnapshot, SubscriptionOption, Trade, UnifiedEvent, UnifiedMarket, UserTrade } from "./models.js";
8
+ import { Balance, BuiltOrder, CreateOrderParams, EventFetchParams, EventFilterCriteria, EventFilterFunction, ExecutionPriceResult, MarketFetchParams, MarketFilterCriteria, MarketFilterFunction, MarketOutcome, MyTradesParams, Order, OrderBook, OrderHistoryParams, PaginatedMarketsResult, Position, PriceCandle, SubscribedAddressSnapshot, SubscriptionOption, Trade, UnifiedEvent, UnifiedMarket, UserTrade, FirehoseEvent } from "./models.js";
9
9
  import { ServerManager } from "./server-manager.js";
10
10
  /**
11
11
  * Base exchange client options.
@@ -68,6 +68,8 @@ export declare abstract class Exchange {
68
68
  protected serverManager: ServerManager;
69
69
  protected initPromise: Promise<void>;
70
70
  protected isHosted: boolean;
71
+ private _hostedAccount?;
72
+ private _accountDiscoveryPromise?;
71
73
  /**
72
74
  * Sticky flag: set to `true` the first time a GET read is rejected by
73
75
  * the sidecar with 404/405 (i.e. an older pmxt-core that only supports
@@ -252,6 +254,28 @@ export declare abstract class Exchange {
252
254
  * ```
253
255
  */
254
256
  watchOrderBooks(outcomeIds: (string | MarketOutcome)[], limit?: number): Promise<Record<string, OrderBook>>;
257
+ /**
258
+ * Stream all orderbook updates across venues via the hosted WebSocket API.
259
+ *
260
+ * Returns a promise that resolves with the next book event.
261
+ * Call repeatedly in a loop to stream updates (CCXT Pro pattern).
262
+ * Requires hosted mode (`pmxtApiKey` set).
263
+ *
264
+ * @param venues - Optional venue filter (e.g. ["polymarket", "limitless"])
265
+ * @returns Next event with source, symbol, and orderbook
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * const poly = new Polymarket({ pmxtApiKey: "pmxt_xxx" });
270
+ * while (true) {
271
+ * const event = await poly.watchAllOrderBooks();
272
+ * console.log(event.source, event.symbol, event.orderbook.bids[0]);
273
+ * }
274
+ * ```
275
+ */
276
+ watchAllOrderBooks(venues?: string[]): Promise<FirehoseEvent>;
277
+ /** @deprecated Use {@link watchAllOrderBooks} instead. */
278
+ firehose(venues?: string[]): Promise<FirehoseEvent>;
255
279
  /**
256
280
  * Watch real-time trade updates via WebSocket.
257
281
  *
@@ -337,12 +361,9 @@ export declare abstract class Exchange {
337
361
  buildOrder(params: CreateOrderParams & {
338
362
  outcome?: MarketOutcome;
339
363
  }): Promise<BuiltOrder>;
364
+ private _discoverHostedAccount;
365
+ private _executeSorOrder;
340
366
  /**
341
- * Create a new order.
342
- *
343
- * @param params - Order parameters
344
- * @returns Created order
345
- *
346
367
  * @example
347
368
  * ```typescript
348
369
  * const order = await exchange.createOrder({
@@ -134,6 +134,8 @@ class Exchange {
134
134
  serverManager;
135
135
  initPromise;
136
136
  isHosted;
137
+ _hostedAccount;
138
+ _accountDiscoveryPromise;
137
139
  /**
138
140
  * Sticky flag: set to `true` the first time a GET read is rejected by
139
141
  * the sidecar with 404/405 (i.e. an older pmxt-core that only supports
@@ -191,9 +193,14 @@ class Exchange {
191
193
  this.api = new index_js_1.DefaultApi(this.config);
192
194
  }
193
195
  catch (error) {
194
- throw new errors_js_1.PmxtError(`Failed to start PMXT server: ${error}\n\n` +
196
+ const msg = `Failed to start PMXT server: ${error instanceof Error ? error.message : error}\n\n` +
195
197
  `Please ensure 'pmxt-core' is installed: npm install -g pmxt-core\n` +
196
- `Or start the server manually: pmxt-server`);
198
+ `Or start the server manually: pmxt-server`;
199
+ const pmxtError = new errors_js_1.PmxtError(msg);
200
+ if (error instanceof Error) {
201
+ pmxtError.cause = error;
202
+ }
203
+ throw pmxtError;
197
204
  }
198
205
  }
199
206
  }
@@ -292,8 +299,11 @@ class Exchange {
292
299
  if (this._wsClient?.connected)
293
300
  return this._wsClient;
294
301
  const host = this.resolveBaseUrl();
295
- const accessToken = this.serverManager.getAccessToken();
296
- const client = new ws_client_js_1.SidecarWsClient(host, accessToken || undefined);
302
+ const accessToken = this.isHosted
303
+ ? this.pmxtApiKey
304
+ : this.serverManager.getAccessToken();
305
+ const authParamName = this.isHosted ? "apiKey" : "token";
306
+ const client = new ws_client_js_1.SidecarWsClient(host, accessToken || undefined, authParamName);
297
307
  try {
298
308
  // Trigger connection to validate the endpoint exists.
299
309
  // subscribe() calls ensureConnected internally, but we want
@@ -328,8 +338,12 @@ class Exchange {
328
338
  try {
329
339
  return await ws.subscribe(this.exchangeName, method, args, this.getCredentials());
330
340
  }
331
- catch {
332
- return null;
341
+ catch (error) {
342
+ // Only fall back to HTTP for transport-level failures
343
+ if (error instanceof errors_js_1.PmxtError && /connection failed|no websocket/i.test(error.message)) {
344
+ return null;
345
+ }
346
+ throw error;
333
347
  }
334
348
  }
335
349
  // Low-Level API Access
@@ -1426,8 +1440,11 @@ class Exchange {
1426
1440
  return result;
1427
1441
  }
1428
1442
  }
1429
- catch {
1430
- // fall through to HTTP
1443
+ catch (error) {
1444
+ // Only fall through to HTTP for transport-level WS failures
1445
+ if (!(error instanceof errors_js_1.PmxtError) || !/connection failed|no websocket/i.test(error.message)) {
1446
+ throw error;
1447
+ }
1431
1448
  }
1432
1449
  }
1433
1450
  // HTTP fallback
@@ -1453,7 +1470,7 @@ class Exchange {
1453
1470
  }
1454
1471
  return result;
1455
1472
  }
1456
- return {};
1473
+ throw new errors_js_1.PmxtError("watchOrderBooks: unexpected response shape from server");
1457
1474
  }
1458
1475
  catch (error) {
1459
1476
  if (error instanceof errors_js_1.PmxtError)
@@ -1461,6 +1478,45 @@ class Exchange {
1461
1478
  throw new errors_js_1.PmxtError(`Failed to watch order books: ${error}`);
1462
1479
  }
1463
1480
  }
1481
+ /**
1482
+ * Stream all orderbook updates across venues via the hosted WebSocket API.
1483
+ *
1484
+ * Returns a promise that resolves with the next book event.
1485
+ * Call repeatedly in a loop to stream updates (CCXT Pro pattern).
1486
+ * Requires hosted mode (`pmxtApiKey` set).
1487
+ *
1488
+ * @param venues - Optional venue filter (e.g. ["polymarket", "limitless"])
1489
+ * @returns Next event with source, symbol, and orderbook
1490
+ *
1491
+ * @example
1492
+ * ```typescript
1493
+ * const poly = new Polymarket({ pmxtApiKey: "pmxt_xxx" });
1494
+ * while (true) {
1495
+ * const event = await poly.watchAllOrderBooks();
1496
+ * console.log(event.source, event.symbol, event.orderbook.bids[0]);
1497
+ * }
1498
+ * ```
1499
+ */
1500
+ async watchAllOrderBooks(venues) {
1501
+ await this.initPromise;
1502
+ if (!this.isHosted) {
1503
+ throw new errors_js_1.PmxtError("watchAllOrderBooks() requires hosted mode (set pmxtApiKey)");
1504
+ }
1505
+ const args = venues ? [venues] : [];
1506
+ const wsData = await this.watchViaWs("watchAllOrderBooks", args);
1507
+ if (wsData !== null) {
1508
+ return {
1509
+ source: wsData._source || "",
1510
+ symbol: wsData._symbol || "",
1511
+ orderbook: convertOrderBook(wsData),
1512
+ };
1513
+ }
1514
+ throw new errors_js_1.PmxtError("watchAllOrderBooks() requires WebSocket transport — connection failed");
1515
+ }
1516
+ /** @deprecated Use {@link watchAllOrderBooks} instead. */
1517
+ async firehose(venues) {
1518
+ return this.watchAllOrderBooks(venues);
1519
+ }
1464
1520
  /**
1465
1521
  * Watch real-time trade updates via WebSocket.
1466
1522
  *
@@ -1663,12 +1719,71 @@ class Exchange {
1663
1719
  throw new errors_js_1.PmxtError(`Failed to build order: ${error}`);
1664
1720
  }
1665
1721
  }
1722
+ async _discoverHostedAccount() {
1723
+ if (this._hostedAccount)
1724
+ return;
1725
+ if (!this._accountDiscoveryPromise) {
1726
+ this._accountDiscoveryPromise = (async () => {
1727
+ try {
1728
+ const res = await this.fetchWithRetry(`${this.resolveBaseUrl()}/v0/account`, { method: 'GET', headers: { ...this.getAuthHeaders() } });
1729
+ if (res.ok) {
1730
+ const body = await res.json();
1731
+ this._hostedAccount = { depositWallet: body.deposit_wallet, signatureType: body.signature_type };
1732
+ }
1733
+ else {
1734
+ this._hostedAccount = {};
1735
+ }
1736
+ }
1737
+ catch {
1738
+ this._hostedAccount = {};
1739
+ }
1740
+ })();
1741
+ }
1742
+ await this._accountDiscoveryPromise;
1743
+ }
1744
+ async _executeSorOrder(params) {
1745
+ await this._discoverHostedAccount();
1746
+ const buildRes = await this.fetchWithRetry(`${this.resolveBaseUrl()}/api/sor/buildOrder`, {
1747
+ method: 'POST',
1748
+ headers: { 'Content-Type': 'application/json', ...this.getAuthHeaders() },
1749
+ body: JSON.stringify({ args: [params] }),
1750
+ });
1751
+ if (!buildRes.ok)
1752
+ throw new errors_js_1.PmxtError(`buildOrder failed: ${await buildRes.text()}`);
1753
+ const buildJson = await buildRes.json();
1754
+ const { orderId, legs } = buildJson.data || buildJson;
1755
+ const fills = [];
1756
+ for (const leg of legs) {
1757
+ try {
1758
+ const { Polymarket, Limitless } = require('pmxt-core');
1759
+ const VenueClass = leg.venue === 'polymarket' ? Polymarket : leg.venue === 'limitless' ? Limitless : null;
1760
+ if (!VenueClass)
1761
+ throw new Error(`unsupported venue: ${leg.venue}`);
1762
+ const venueOpts = { privateKey: this.privateKey };
1763
+ if (leg.venue === 'polymarket' && this._hostedAccount?.depositWallet) {
1764
+ venueOpts.funderAddress = this._hostedAccount.depositWallet;
1765
+ venueOpts.signatureType = this._hostedAccount.signatureType || 3;
1766
+ }
1767
+ const venue = new VenueClass(venueOpts);
1768
+ const order = await venue.createOrder({ outcomeId: leg.tokenId, side: leg.side, amount: leg.shares, price: leg.price });
1769
+ const filledShares = order.filled || 0;
1770
+ fills.push({ venue: leg.venue, venueOrderId: order.id, venueMarketId: leg.venueMarketId, venueOutcomeId: leg.venueOutcomeId, shares: filledShares > 0 ? filledShares : leg.shares, price: order.price || leg.price, status: filledShares > 0 ? 'filled' : 'open' });
1771
+ }
1772
+ catch (err) {
1773
+ fills.push({ venue: leg.venue, venueMarketId: leg.venueMarketId, venueOutcomeId: leg.venueOutcomeId, shares: leg.shares, price: leg.price, status: 'failed', error: err.message });
1774
+ }
1775
+ }
1776
+ const submitRes = await this.fetchWithRetry(`${this.resolveBaseUrl()}/api/sor/submitOrder`, {
1777
+ method: 'POST',
1778
+ headers: { 'Content-Type': 'application/json', ...this.getAuthHeaders() },
1779
+ body: JSON.stringify({ args: [{ orderId, fills }] }),
1780
+ });
1781
+ if (!submitRes.ok)
1782
+ throw new errors_js_1.PmxtError(`submitOrder failed: ${await submitRes.text()}`);
1783
+ const submitJson = await submitRes.json();
1784
+ return convertOrder(submitJson.data || submitJson);
1785
+ }
1666
1786
  /**
1667
- * Create a new order.
1668
- *
1669
- * @param params - Order parameters
1670
- * @returns Created order
1671
- *
1672
1787
  * @example
1673
1788
  * ```typescript
1674
1789
  * const order = await exchange.createOrder({
@@ -1683,6 +1798,9 @@ class Exchange {
1683
1798
  */
1684
1799
  async createOrder(params) {
1685
1800
  if (this.isHosted) {
1801
+ if (this.exchangeName === 'sor' && this.privateKey) {
1802
+ return this._executeSorOrder(params);
1803
+ }
1686
1804
  throw new errors_js_1.PmxtError("Trade execution is not available through the hosted API. " +
1687
1805
  "Use the local PMXT SDK with your venue credentials instead. " +
1688
1806
  "See https://pmxt.dev/docs/quickstart for setup instructions.");
@@ -112,6 +112,17 @@ export interface OrderBook {
112
112
  /** Unix timestamp (milliseconds) */
113
113
  timestamp?: number;
114
114
  }
115
+ /**
116
+ * A single event from the firehose stream.
117
+ */
118
+ export interface FirehoseEvent {
119
+ /** The venue this event originated from (e.g. "polymarket", "limitless") */
120
+ source: string;
121
+ /** The outcome token id / asset id */
122
+ symbol: string;
123
+ /** The order book snapshot */
124
+ orderbook: OrderBook;
125
+ }
115
126
  /**
116
127
  * Result of an execution price calculation.
117
128
  */
@@ -16,6 +16,7 @@ export declare class SidecarWsClient {
16
16
  private ws;
17
17
  private host;
18
18
  private accessToken;
19
+ private authParamName;
19
20
  private closed;
20
21
  /** requestId -> latest data payload */
21
22
  private dataStore;
@@ -24,7 +25,7 @@ export declare class SidecarWsClient {
24
25
  /** (method:symbolKey) -> requestId -- avoids duplicate subscribes */
25
26
  private activeSubs;
26
27
  private connectPromise;
27
- constructor(host: string, accessToken?: string);
28
+ constructor(host: string, accessToken?: string, authParamName?: string);
28
29
  private ensureConnected;
29
30
  private connect;
30
31
  private getWebSocketConstructor;
@@ -20,6 +20,7 @@ class SidecarWsClient {
20
20
  ws = null;
21
21
  host;
22
22
  accessToken;
23
+ authParamName;
23
24
  closed = false;
24
25
  /** requestId -> latest data payload */
25
26
  dataStore = new Map();
@@ -28,9 +29,10 @@ class SidecarWsClient {
28
29
  /** (method:symbolKey) -> requestId -- avoids duplicate subscribes */
29
30
  activeSubs = new Map();
30
31
  connectPromise = null;
31
- constructor(host, accessToken) {
32
+ constructor(host, accessToken, authParamName = "token") {
32
33
  this.host = host;
33
34
  this.accessToken = accessToken;
35
+ this.authParamName = authParamName;
34
36
  }
35
37
  // ------------------------------------------------------------------
36
38
  // Connection lifecycle
@@ -61,7 +63,7 @@ class SidecarWsClient {
61
63
  }
62
64
  let url = `${scheme}://${hostPart}/ws`;
63
65
  if (this.accessToken) {
64
- url = `${url}?token=${this.accessToken}`;
66
+ url = `${url}?${this.authParamName}=${this.accessToken}`;
65
67
  }
66
68
  // Use the ws package in Node.js, native WebSocket in browsers
67
69
  const WsConstructor = this.getWebSocketConstructor();
@@ -80,22 +82,30 @@ class SidecarWsClient {
80
82
  // Connection failed during handshake
81
83
  reject(new errors_js_1.PmxtError(`WebSocket connection failed: ${err.message || err}`));
82
84
  }
85
+ else {
86
+ // Post-handshake error — propagate to all pending subscribers
87
+ const error = new errors_js_1.PmxtError(`WebSocket error: ${err.message || err}`);
88
+ for (const sub of this.subscriptions.values()) {
89
+ if (sub.reject) {
90
+ sub.reject(error);
91
+ sub.reject = null;
92
+ sub.resolve = null;
93
+ }
94
+ }
95
+ this.closed = true;
96
+ this.ws = null;
97
+ }
83
98
  };
84
99
  ws.onclose = () => {
85
100
  this.closed = true;
86
101
  this.ws = null;
87
102
  };
88
103
  ws.onmessage = (event) => {
89
- try {
90
- const data = typeof event.data === "string"
91
- ? event.data
92
- : event.data.toString();
93
- const msg = JSON.parse(data);
94
- this.dispatch(msg);
95
- }
96
- catch {
97
- // Ignore unparseable frames
98
- }
104
+ const raw = typeof event.data === "string"
105
+ ? event.data
106
+ : event.data.toString();
107
+ const msg = JSON.parse(raw);
108
+ this.dispatch(msg);
99
109
  };
100
110
  });
101
111
  }
@@ -104,14 +114,15 @@ class SidecarWsClient {
104
114
  if (typeof globalThis !== "undefined" && globalThis.WebSocket) {
105
115
  return globalThis.WebSocket;
106
116
  }
107
- // Node.js -- try to require ws
117
+ // Node.js -- require ws
108
118
  try {
109
119
  // Dynamic require to avoid bundler issues
110
120
  const wsModule = require("ws");
111
121
  return wsModule.default || wsModule;
112
122
  }
113
123
  catch {
114
- return null;
124
+ throw new errors_js_1.PmxtError("WebSocket support in Node.js requires the 'ws' package. " +
125
+ "Install it with: npm install ws");
115
126
  }
116
127
  }
117
128
  dispatch(msg) {
@@ -95,12 +95,9 @@ docs/UnwatchOrderBookRequest.md
95
95
  docs/UserTrade.md
96
96
  docs/WatchAddress200Response.md
97
97
  docs/WatchAddressRequest.md
98
- docs/WatchAddressRequestArgsInner.md
99
98
  docs/WatchOrderBookRequest.md
100
- docs/WatchOrderBookRequestArgsInner.md
101
99
  docs/WatchOrderBooks200Response.md
102
100
  docs/WatchOrderBooksRequest.md
103
- docs/WatchOrderBooksRequestArgsInner.md
104
101
  docs/WatchTradesRequest.md
105
102
  package.json
106
103
  src/apis/DefaultApi.ts
@@ -198,12 +195,9 @@ src/models/UnwatchOrderBookRequest.ts
198
195
  src/models/UserTrade.ts
199
196
  src/models/WatchAddress200Response.ts
200
197
  src/models/WatchAddressRequest.ts
201
- src/models/WatchAddressRequestArgsInner.ts
202
198
  src/models/WatchOrderBookRequest.ts
203
- src/models/WatchOrderBookRequestArgsInner.ts
204
199
  src/models/WatchOrderBooks200Response.ts
205
200
  src/models/WatchOrderBooksRequest.ts
206
- src/models/WatchOrderBooksRequestArgsInner.ts
207
201
  src/models/WatchTradesRequest.ts
208
202
  src/models/index.ts
209
203
  src/runtime.ts