pmxt 1.1.0b3__py3-none-any.whl → 1.1.1__py3-none-any.whl

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.
pmxt/__init__.py CHANGED
@@ -33,7 +33,7 @@ from .models import (
33
33
  CreateOrderParams,
34
34
  )
35
35
 
36
- __version__ = "1.1.0b3"
36
+ __version__ = "1.1.1"
37
37
  __all__ = [
38
38
  # Exchanges
39
39
  "Polymarket",
@@ -104733,6 +104733,7 @@ var require_polymarket = __commonJS({
104733
104733
  timestamp: o.created_at * 1e3
104734
104734
  }));
104735
104735
  } catch (error) {
104736
+ console.error("Error fetching Polymarket open orders:", error);
104736
104737
  return [];
104737
104738
  }
104738
104739
  }
@@ -105366,6 +105367,290 @@ var require_auth2 = __commonJS({
105366
105367
  }
105367
105368
  });
105368
105369
 
105370
+ // dist/exchanges/kalshi/websocket.js
105371
+ var require_websocket4 = __commonJS({
105372
+ "dist/exchanges/kalshi/websocket.js"(exports2) {
105373
+ "use strict";
105374
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
105375
+ return mod && mod.__esModule ? mod : { "default": mod };
105376
+ };
105377
+ Object.defineProperty(exports2, "__esModule", { value: true });
105378
+ exports2.KalshiWebSocket = void 0;
105379
+ var ws_1 = __importDefault(require_ws());
105380
+ var KalshiWebSocket = class {
105381
+ constructor(auth, config = {}) {
105382
+ this.orderBookResolvers = /* @__PURE__ */ new Map();
105383
+ this.tradeResolvers = /* @__PURE__ */ new Map();
105384
+ this.orderBooks = /* @__PURE__ */ new Map();
105385
+ this.subscribedTickers = /* @__PURE__ */ new Set();
105386
+ this.messageIdCounter = 1;
105387
+ this.isConnecting = false;
105388
+ this.isConnected = false;
105389
+ this.auth = auth;
105390
+ this.config = {
105391
+ wsUrl: config.wsUrl || "wss://api.elections.kalshi.com/trade-api/ws/v2",
105392
+ reconnectIntervalMs: config.reconnectIntervalMs || 5e3
105393
+ };
105394
+ }
105395
+ async connect() {
105396
+ if (this.isConnected || this.isConnecting) {
105397
+ return;
105398
+ }
105399
+ this.isConnecting = true;
105400
+ return new Promise((resolve, reject) => {
105401
+ try {
105402
+ const url2 = new URL(this.config.wsUrl);
105403
+ const path = url2.pathname;
105404
+ console.log(`Kalshi WS: Connecting to ${this.config.wsUrl} (using path ${path} for signature)`);
105405
+ const headers = this.auth.getHeaders("GET", path);
105406
+ this.ws = new ws_1.default(this.config.wsUrl, { headers });
105407
+ this.ws.on("open", () => {
105408
+ this.isConnected = true;
105409
+ this.isConnecting = false;
105410
+ console.log("Kalshi WebSocket connected");
105411
+ if (this.subscribedTickers.size > 0) {
105412
+ this.subscribeToOrderbook(Array.from(this.subscribedTickers));
105413
+ }
105414
+ resolve();
105415
+ });
105416
+ this.ws.on("message", (data) => {
105417
+ try {
105418
+ const message = JSON.parse(data.toString());
105419
+ this.handleMessage(message);
105420
+ } catch (error) {
105421
+ console.error("Error parsing Kalshi WebSocket message:", error);
105422
+ }
105423
+ });
105424
+ this.ws.on("error", (error) => {
105425
+ console.error("Kalshi WebSocket error:", error);
105426
+ this.isConnecting = false;
105427
+ reject(error);
105428
+ });
105429
+ this.ws.on("close", () => {
105430
+ console.log("Kalshi WebSocket closed");
105431
+ this.isConnected = false;
105432
+ this.isConnecting = false;
105433
+ this.scheduleReconnect();
105434
+ });
105435
+ } catch (error) {
105436
+ this.isConnecting = false;
105437
+ reject(error);
105438
+ }
105439
+ });
105440
+ }
105441
+ scheduleReconnect() {
105442
+ if (this.reconnectTimer) {
105443
+ clearTimeout(this.reconnectTimer);
105444
+ }
105445
+ this.reconnectTimer = setTimeout(() => {
105446
+ console.log("Attempting to reconnect Kalshi WebSocket...");
105447
+ this.connect().catch(console.error);
105448
+ }, this.config.reconnectIntervalMs);
105449
+ }
105450
+ subscribeToOrderbook(marketTickers) {
105451
+ if (!this.ws || !this.isConnected) {
105452
+ return;
105453
+ }
105454
+ const subscription = {
105455
+ id: this.messageIdCounter++,
105456
+ cmd: "subscribe",
105457
+ params: {
105458
+ channels: ["orderbook_delta"],
105459
+ market_tickers: marketTickers
105460
+ }
105461
+ };
105462
+ this.ws.send(JSON.stringify(subscription));
105463
+ }
105464
+ subscribeToTrades(marketTickers) {
105465
+ if (!this.ws || !this.isConnected) {
105466
+ return;
105467
+ }
105468
+ const subscription = {
105469
+ id: this.messageIdCounter++,
105470
+ cmd: "subscribe",
105471
+ params: {
105472
+ channels: ["trade"],
105473
+ market_tickers: marketTickers
105474
+ }
105475
+ };
105476
+ this.ws.send(JSON.stringify(subscription));
105477
+ }
105478
+ handleMessage(message) {
105479
+ const msgType = message.type;
105480
+ const data = message.data || message.msg;
105481
+ if (!data && msgType !== "subscribed" && msgType !== "pong") {
105482
+ return;
105483
+ }
105484
+ if (data && typeof data === "object" && !data.ts && !data.created_time) {
105485
+ data.message_ts = message.ts || message.time;
105486
+ }
105487
+ switch (msgType) {
105488
+ case "orderbook_snapshot":
105489
+ this.handleOrderbookSnapshot(data);
105490
+ break;
105491
+ case "orderbook_delta":
105492
+ case "orderbook_update":
105493
+ this.handleOrderbookDelta(data);
105494
+ break;
105495
+ case "trade":
105496
+ this.handleTrade(data);
105497
+ break;
105498
+ case "error":
105499
+ console.error("Kalshi WebSocket error:", message.msg || message.error || message.data);
105500
+ break;
105501
+ case "subscribed":
105502
+ console.log("Kalshi subscription confirmed:", JSON.stringify(message));
105503
+ break;
105504
+ case "pong":
105505
+ break;
105506
+ default:
105507
+ break;
105508
+ }
105509
+ }
105510
+ handleOrderbookSnapshot(data) {
105511
+ const ticker = data.market_ticker;
105512
+ const bids = (data.yes || []).map((level) => {
105513
+ const price = (level.price || level[0]) / 100;
105514
+ const size2 = (level.quantity !== void 0 ? level.quantity : level.size !== void 0 ? level.size : level[1]) || 0;
105515
+ return { price, size: size2 };
105516
+ }).sort((a, b) => b.price - a.price);
105517
+ const asks = (data.no || []).map((level) => {
105518
+ const price = (100 - (level.price || level[0])) / 100;
105519
+ const size2 = (level.quantity !== void 0 ? level.quantity : level.size !== void 0 ? level.size : level[1]) || 0;
105520
+ return { price, size: size2 };
105521
+ }).sort((a, b) => a.price - b.price);
105522
+ const orderBook = {
105523
+ bids,
105524
+ asks,
105525
+ timestamp: Date.now()
105526
+ };
105527
+ this.orderBooks.set(ticker, orderBook);
105528
+ this.resolveOrderBook(ticker, orderBook);
105529
+ }
105530
+ handleOrderbookDelta(data) {
105531
+ const ticker = data.market_ticker;
105532
+ const existing = this.orderBooks.get(ticker);
105533
+ if (!existing) {
105534
+ return;
105535
+ }
105536
+ const price = data.price / 100;
105537
+ const delta = data.delta !== void 0 ? data.delta : data.quantity !== void 0 ? data.quantity : 0;
105538
+ const side = data.side;
105539
+ if (side === "yes") {
105540
+ this.applyDelta(existing.bids, price, delta, "desc");
105541
+ } else {
105542
+ const yesPrice = (100 - data.price) / 100;
105543
+ this.applyDelta(existing.asks, yesPrice, delta, "asc");
105544
+ }
105545
+ existing.timestamp = Date.now();
105546
+ this.resolveOrderBook(ticker, existing);
105547
+ }
105548
+ applyDelta(levels, price, delta, sortOrder) {
105549
+ const existingIndex = levels.findIndex((l) => Math.abs(l.price - price) < 1e-3);
105550
+ if (delta === 0) {
105551
+ if (existingIndex !== -1) {
105552
+ levels.splice(existingIndex, 1);
105553
+ }
105554
+ } else {
105555
+ if (existingIndex !== -1) {
105556
+ levels[existingIndex].size += delta;
105557
+ if (levels[existingIndex].size <= 0) {
105558
+ levels.splice(existingIndex, 1);
105559
+ }
105560
+ } else {
105561
+ levels.push({ price, size: delta });
105562
+ if (sortOrder === "desc") {
105563
+ levels.sort((a, b) => b.price - a.price);
105564
+ } else {
105565
+ levels.sort((a, b) => a.price - b.price);
105566
+ }
105567
+ }
105568
+ }
105569
+ }
105570
+ handleTrade(data) {
105571
+ const ticker = data.market_ticker;
105572
+ let timestamp = Date.now();
105573
+ const rawTime = data.created_time || data.created_at || data.ts || data.time || data.message_ts;
105574
+ if (rawTime) {
105575
+ const parsed = new Date(rawTime).getTime();
105576
+ if (!isNaN(parsed)) {
105577
+ timestamp = parsed;
105578
+ if (timestamp < 1e10) {
105579
+ timestamp *= 1e3;
105580
+ }
105581
+ } else if (typeof rawTime === "number") {
105582
+ timestamp = rawTime;
105583
+ if (timestamp < 1e10) {
105584
+ timestamp *= 1e3;
105585
+ }
105586
+ }
105587
+ }
105588
+ const trade = {
105589
+ id: data.trade_id || `${timestamp}-${Math.random()}`,
105590
+ timestamp,
105591
+ price: data.yes_price || data.price ? (data.yes_price || data.price) / 100 : 0.5,
105592
+ amount: data.count || data.size || 0,
105593
+ side: data.taker_side === "yes" || data.side === "buy" ? "buy" : data.taker_side === "no" || data.side === "sell" ? "sell" : "unknown"
105594
+ };
105595
+ const resolvers = this.tradeResolvers.get(ticker);
105596
+ if (resolvers && resolvers.length > 0) {
105597
+ resolvers.forEach((r) => r.resolve([trade]));
105598
+ this.tradeResolvers.set(ticker, []);
105599
+ }
105600
+ }
105601
+ resolveOrderBook(ticker, orderBook) {
105602
+ const resolvers = this.orderBookResolvers.get(ticker);
105603
+ if (resolvers && resolvers.length > 0) {
105604
+ resolvers.forEach((r) => r.resolve(orderBook));
105605
+ this.orderBookResolvers.set(ticker, []);
105606
+ }
105607
+ }
105608
+ async watchOrderBook(ticker) {
105609
+ if (!this.isConnected) {
105610
+ await this.connect();
105611
+ }
105612
+ if (!this.subscribedTickers.has(ticker)) {
105613
+ this.subscribedTickers.add(ticker);
105614
+ this.subscribeToOrderbook([ticker]);
105615
+ }
105616
+ return new Promise((resolve, reject) => {
105617
+ if (!this.orderBookResolvers.has(ticker)) {
105618
+ this.orderBookResolvers.set(ticker, []);
105619
+ }
105620
+ this.orderBookResolvers.get(ticker).push({ resolve, reject });
105621
+ });
105622
+ }
105623
+ async watchTrades(ticker) {
105624
+ if (!this.isConnected) {
105625
+ await this.connect();
105626
+ }
105627
+ if (!this.subscribedTickers.has(ticker)) {
105628
+ this.subscribedTickers.add(ticker);
105629
+ this.subscribeToTrades([ticker]);
105630
+ }
105631
+ return new Promise((resolve, reject) => {
105632
+ if (!this.tradeResolvers.has(ticker)) {
105633
+ this.tradeResolvers.set(ticker, []);
105634
+ }
105635
+ this.tradeResolvers.get(ticker).push({ resolve, reject });
105636
+ });
105637
+ }
105638
+ async close() {
105639
+ if (this.reconnectTimer) {
105640
+ clearTimeout(this.reconnectTimer);
105641
+ }
105642
+ if (this.ws) {
105643
+ this.ws.close();
105644
+ this.ws = void 0;
105645
+ }
105646
+ this.isConnected = false;
105647
+ this.isConnecting = false;
105648
+ }
105649
+ };
105650
+ exports2.KalshiWebSocket = KalshiWebSocket;
105651
+ }
105652
+ });
105653
+
105369
105654
  // dist/exchanges/kalshi/index.js
105370
105655
  var require_kalshi = __commonJS({
105371
105656
  "dist/exchanges/kalshi/index.js"(exports2) {
@@ -105384,9 +105669,19 @@ var require_kalshi = __commonJS({
105384
105669
  var fetchOrderBook_1 = require_fetchOrderBook2();
105385
105670
  var fetchTrades_1 = require_fetchTrades2();
105386
105671
  var auth_1 = require_auth2();
105672
+ var websocket_1 = require_websocket4();
105387
105673
  var KalshiExchange = class extends BaseExchange_1.PredictionMarketExchange {
105388
- constructor(credentials) {
105674
+ constructor(options) {
105675
+ let credentials;
105676
+ let wsConfig;
105677
+ if (options && "credentials" in options) {
105678
+ credentials = options.credentials;
105679
+ wsConfig = options.websocket;
105680
+ } else {
105681
+ credentials = options;
105682
+ }
105389
105683
  super(credentials);
105684
+ this.wsConfig = wsConfig;
105390
105685
  if (credentials?.apiKey && credentials?.privateKey) {
105391
105686
  this.auth = new auth_1.KalshiAuth(credentials);
105392
105687
  }
@@ -105620,6 +105915,26 @@ var require_kalshi = __commonJS({
105620
105915
  return "open";
105621
105916
  }
105622
105917
  }
105918
+ async watchOrderBook(id, limit) {
105919
+ const auth = this.ensureAuth();
105920
+ if (!this.ws) {
105921
+ this.ws = new websocket_1.KalshiWebSocket(auth, this.wsConfig);
105922
+ }
105923
+ return this.ws.watchOrderBook(id);
105924
+ }
105925
+ async watchTrades(id, since, limit) {
105926
+ const auth = this.ensureAuth();
105927
+ if (!this.ws) {
105928
+ this.ws = new websocket_1.KalshiWebSocket(auth, this.wsConfig);
105929
+ }
105930
+ return this.ws.watchTrades(id);
105931
+ }
105932
+ async close() {
105933
+ if (this.ws) {
105934
+ await this.ws.close();
105935
+ this.ws = void 0;
105936
+ }
105937
+ }
105623
105938
  };
105624
105939
  exports2.KalshiExchange = KalshiExchange;
105625
105940
  }
@@ -105888,10 +106203,16 @@ var crypto_2 = require("crypto");
105888
106203
  var fs_1 = require("fs");
105889
106204
  var path_1 = require("path");
105890
106205
  function getServerVersion() {
105891
- const packageCtx = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "../../package.json"), "utf-8");
105892
- const packageJson = JSON.parse(packageCtx);
105893
- const baseVersion = packageJson.version;
105894
- const isDev = process.env.NODE_ENV === "development" || process.env.PMXT_ALWAYS_RESTART === "1" || __dirname.includes("/core/src/") || __dirname.includes("/core/dist/");
106206
+ let baseVersion = "1.0.0";
106207
+ let packageJson;
106208
+ try {
106209
+ const packageCtx = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "../../package.json"), "utf-8");
106210
+ packageJson = JSON.parse(packageCtx);
106211
+ baseVersion = packageJson.version;
106212
+ } catch (e) {
106213
+ baseVersion = "1.0.0";
106214
+ }
106215
+ const isDev = process.env.NODE_ENV === "development" || process.env.PMXT_ALWAYS_RESTART === "1" || __dirname.includes("/core/src/") && !!packageJson || __dirname.includes("/core/dist/") && !!packageJson;
105895
106216
  if (!isDev) {
105896
106217
  return baseVersion;
105897
106218
  }
pmxt/server_manager.py CHANGED
@@ -106,8 +106,25 @@ class ServerManager:
106
106
  if pkg_path.exists():
107
107
  data = json.loads(pkg_path.read_text())
108
108
  expected_version = data.get('version')
109
- if expected_version and not server_info['version'].startswith(expected_version):
110
- return True
109
+ server_version = server_info['version']
110
+
111
+ if expected_version:
112
+ # Extract major.minor.patch (ignore prerelease/dev suffixes)
113
+ def normalize_version(v: str) -> str:
114
+ """Extract major.minor.patch, ignoring -dev, -b4, etc."""
115
+ # Remove -dev.xxx or -b4 suffixes
116
+ base = v.split('-')[0]
117
+ # Get major.minor.patch
118
+ parts = base.split('.')[:3]
119
+ return '.'.join(parts)
120
+
121
+ expected_base = normalize_version(expected_version)
122
+ server_base = normalize_version(server_version)
123
+
124
+ # Only restart if major.minor.patch differs
125
+ # This allows 1.0.0 and 1.0.0-b4 to coexist in dev
126
+ if expected_base != server_base:
127
+ return True
111
128
  except:
112
129
  pass
113
130
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pmxt
3
- Version: 1.1.0b3
3
+ Version: 1.1.1
4
4
  Summary: Unified prediction market data API - The ccxt for prediction markets
5
5
  Author: PMXT Contributors
6
6
  License: MIT
@@ -1,14 +1,14 @@
1
- pmxt/__init__.py,sha256=cRd12oU7qiph2roermKAyANsWpvyAtYX_Mu7CWtMxvQ,1152
1
+ pmxt/__init__.py,sha256=oC3V-64mrTjHzRPTbKwdxf_yXeogcO0lFhajSTIcUYU,1150
2
2
  pmxt/client.py,sha256=2qlCJsxkQiHYrYvZYX4p-APvYq0rF_yicNfUPgcE3ZU,27368
3
3
  pmxt/models.py,sha256=Mu0hLVjQU3PM5m68poK61VQcJtPQ8ZdLdLU7pq1lqjQ,6004
4
- pmxt/server_manager.py,sha256=wmHcGBM3oMNLSajCZ0xnANNSmqBYt9vWxQzeYmfo0-Y,10635
4
+ pmxt/server_manager.py,sha256=-G97dYEdKl7F3HK9bAOKYl-SGWP6HsvzZIx2QxiZm24,11494
5
5
  pmxt/_server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  pmxt/_server/bin/pmxt-ensure-server,sha256=kXIond0UbxS52FAVQD7kHmSBaL_s6cbIyapLRr4KZJw,4544
7
- pmxt/_server/server/bundled.js,sha256=TXtX8YZlSnrIoN_ZmxMA25WqQw6j-eZXMi4YNr32p58,4175627
8
- pmxt_internal/__init__.py,sha256=hLo16IXoN2-p2BsWLhDJYJQwJOE8GYeDWBiXOWygt60,6402
9
- pmxt_internal/api_client.py,sha256=m9QUfY0jZXZHZv2nXoO1iMXdzsJrK592Km06ka3Mzy4,27891
7
+ pmxt/_server/server/bundled.js,sha256=bgJSNnbYAsY2opHDoF-EfnJZgD03Ws2FmKpWGGKcGYg,4187137
8
+ pmxt_internal/__init__.py,sha256=a97YaMsu1ntU_7slo9f95xL5giaVGFT9RRH80wf8wbI,6400
9
+ pmxt_internal/api_client.py,sha256=sP-gP9rDauf5QEq_1VmqAcZ233AcLrdHpCO82jh_I6s,27889
10
10
  pmxt_internal/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
11
- pmxt_internal/configuration.py,sha256=VHt377shApQvdfeD_UaDInr0ddLCUv-3cyoDLdITH5Y,18322
11
+ pmxt_internal/configuration.py,sha256=kI70vRzd_DKVSeDLYqsQL6frn6Ob4o-3fz4_GJ6pQW0,18320
12
12
  pmxt_internal/exceptions.py,sha256=txF8A7vlan57JS69kFPs-IZF-Qhp7IZobBTJVa4fOaM,6644
13
13
  pmxt_internal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  pmxt_internal/rest.py,sha256=FMj4yaV6XLr842u_ScWHSzQsTFdk0jaUeuWLJoRbogQ,9760
@@ -56,7 +56,7 @@ pmxt_internal/models/unified_market.py,sha256=mNyUrGKWxvI2f2KCa2uhGwq22cBdDia2hD
56
56
  pmxt_internal/models/watch_order_book_request.py,sha256=kavGUI-SLz2-Kam_jcJ_h0GDe0-9UkxqCmVsAi6Uios,3726
57
57
  pmxt_internal/models/watch_order_book_request_args_inner.py,sha256=ZHrjmFDGxRG5MXbuz4mUp9KFfo3XS7zuXWTyMNgi4xI,5464
58
58
  pmxt_internal/models/watch_trades_request.py,sha256=brrg8JbEe-aeg7mIe_Y2HzRPogp-IfRhkXChrxzqoLU,3722
59
- pmxt-1.1.0b3.dist-info/METADATA,sha256=WO2btv7I0cpZ3qevrK7MUULNDWQHe7xZyexG91z5z6Y,6290
60
- pmxt-1.1.0b3.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
61
- pmxt-1.1.0b3.dist-info/top_level.txt,sha256=J_jrcouJ-x-5lpcXMxeW0GOSi1HsBVR5_PdSfvigVrw,19
62
- pmxt-1.1.0b3.dist-info/RECORD,,
59
+ pmxt-1.1.1.dist-info/METADATA,sha256=YHfyvkeNC3WJxsyAArgpmpeEeJrElWodY1aeebaKSRw,6288
60
+ pmxt-1.1.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
61
+ pmxt-1.1.1.dist-info/top_level.txt,sha256=J_jrcouJ-x-5lpcXMxeW0GOSi1HsBVR5_PdSfvigVrw,19
62
+ pmxt-1.1.1.dist-info/RECORD,,
pmxt_internal/__init__.py CHANGED
@@ -14,7 +14,7 @@
14
14
  """ # noqa: E501
15
15
 
16
16
 
17
- __version__ = "1.1.0b3"
17
+ __version__ = "1.1.1"
18
18
 
19
19
  # Define package exports
20
20
  __all__ = [
@@ -91,7 +91,7 @@ class ApiClient:
91
91
  self.default_headers[header_name] = header_value
92
92
  self.cookie = cookie
93
93
  # Set default User-Agent.
94
- self.user_agent = 'OpenAPI-Generator/1.1.0b3/python'
94
+ self.user_agent = 'OpenAPI-Generator/1.1.1/python'
95
95
  self.client_side_validation = configuration.client_side_validation
96
96
 
97
97
  def __enter__(self):
@@ -506,7 +506,7 @@ class Configuration:
506
506
  "OS: {env}\n"\
507
507
  "Python Version: {pyversion}\n"\
508
508
  "Version of the API: 0.4.4\n"\
509
- "SDK Package Version: 1.1.0b3".\
509
+ "SDK Package Version: 1.1.1".\
510
510
  format(env=sys.platform, pyversion=sys.version)
511
511
 
512
512
  def get_host_settings(self) -> List[HostSetting]:
File without changes