pmxt-core 1.0.3 → 1.0.4

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.
@@ -86,23 +86,28 @@ function resetCache() {
86
86
  }
87
87
  async function fetchMarkets(params) {
88
88
  const limit = params?.limit || 50;
89
+ const offset = params?.offset || 0;
89
90
  const now = Date.now();
90
91
  try {
91
92
  let events;
92
93
  let seriesMap;
94
+ // Check if we have valid cached data
93
95
  if (cachedEvents && cachedSeriesMap && (now - lastCacheTime < CACHE_TTL)) {
94
96
  events = cachedEvents;
95
97
  seriesMap = cachedSeriesMap;
96
98
  }
97
99
  else {
98
- // Fetch active events with nested markets
99
- // We also fetch Series metadata to get tags (tags are on Series, not Event)
100
+ // Fetch ALL active markets to enable client-side pagination and sorting
101
+ // We set a high limit to capture the entire active market set
102
+ // Kalshi active markets are generally in the hundreds, manageable in memory
103
+ const fetchLimit = 1000;
100
104
  const [allEvents, fetchedSeriesMap] = await Promise.all([
101
- fetchActiveEvents(limit),
105
+ fetchActiveEvents(fetchLimit),
102
106
  fetchSeriesMap()
103
107
  ]);
104
108
  events = allEvents;
105
109
  seriesMap = fetchedSeriesMap;
110
+ // Cache the FULL dataset
106
111
  cachedEvents = allEvents;
107
112
  cachedSeriesMap = fetchedSeriesMap;
108
113
  lastCacheTime = now;
@@ -133,7 +138,7 @@ async function fetchMarkets(params) {
133
138
  else if (params?.sort === 'liquidity') {
134
139
  allMarkets.sort((a, b) => b.liquidity - a.liquidity);
135
140
  }
136
- return allMarkets.slice(0, limit);
141
+ return allMarkets.slice(offset, offset + limit);
137
142
  }
138
143
  catch (error) {
139
144
  console.error("Error fetching Kalshi data:", error);
@@ -1 +1 @@
1
- export declare function startServer(port: number): Promise<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
1
+ export declare function startServer(port: number, accessToken: string): Promise<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
@@ -13,14 +13,23 @@ const defaultExchanges = {
13
13
  polymarket: null,
14
14
  kalshi: null
15
15
  };
16
- async function startServer(port) {
16
+ async function startServer(port, accessToken) {
17
17
  const app = (0, express_1.default)();
18
18
  app.use((0, cors_1.default)());
19
19
  app.use(express_1.default.json());
20
- // Health check
20
+ // Health check (public)
21
21
  app.get('/health', (req, res) => {
22
22
  res.json({ status: 'ok', timestamp: Date.now() });
23
23
  });
24
+ // Auth Middleware
25
+ app.use((req, res, next) => {
26
+ const token = req.headers['x-pmxt-access-token'];
27
+ if (!token || token !== accessToken) {
28
+ res.status(401).json({ success: false, error: 'Unauthorized: Invalid or missing access token' });
29
+ return;
30
+ }
31
+ next();
32
+ });
24
33
  // API endpoint: POST /api/:exchange/:method
25
34
  // Body: { args: any[], credentials?: ExchangeCredentials }
26
35
  app.post('/api/:exchange/:method', async (req, res, next) => {
@@ -66,7 +75,7 @@ async function startServer(port) {
66
75
  }
67
76
  });
68
77
  });
69
- return app.listen(port);
78
+ return app.listen(port, '127.0.0.1');
70
79
  }
71
80
  function createExchange(name, credentials) {
72
81
  switch (name) {
@@ -5,13 +5,48 @@ require("dotenv/config");
5
5
  const app_1 = require("./app");
6
6
  const port_manager_1 = require("./utils/port-manager");
7
7
  const lock_file_1 = require("./utils/lock-file");
8
+ const crypto_1 = require("crypto");
9
+ const crypto_2 = require("crypto");
10
+ const fs_1 = require("fs");
11
+ const path_1 = require("path");
12
+ function getServerVersion() {
13
+ const packageCtx = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../package.json'), 'utf-8');
14
+ const packageJson = JSON.parse(packageCtx);
15
+ const baseVersion = packageJson.version;
16
+ // Check if we're in development mode or if generic forced restart is requested
17
+ const isDev = process.env.NODE_ENV === 'development' ||
18
+ process.env.PMXT_ALWAYS_RESTART === '1' ||
19
+ __dirname.includes('/core/src/') ||
20
+ __dirname.includes('/core/dist/');
21
+ if (!isDev) {
22
+ return baseVersion;
23
+ }
24
+ // Development: append code hash based on this file's stats
25
+ try {
26
+ const serverFile = __filename;
27
+ const stats = (0, fs_1.statSync)(serverFile);
28
+ const hash = (0, crypto_2.createHash)('md5')
29
+ .update(stats.mtime.toISOString())
30
+ .digest('hex')
31
+ .substring(0, 8);
32
+ return `${baseVersion}-dev.${hash}`;
33
+ }
34
+ catch {
35
+ return `${baseVersion}-dev.${Date.now()}`;
36
+ }
37
+ }
8
38
  async function main() {
9
39
  const portManager = new port_manager_1.PortManager();
10
40
  const port = await portManager.findAvailablePort(3847); // Default port
41
+ const accessToken = process.env.PMXT_ACCESS_TOKEN || (0, crypto_1.randomUUID)();
42
+ const version = getServerVersion();
11
43
  const lockFile = new lock_file_1.LockFile();
12
- await lockFile.create(port, process.pid);
13
- const server = await (0, app_1.startServer)(port);
14
- console.log(`PMXT Sidecar Server running on http://localhost:${port}`);
44
+ await lockFile.create(port, process.pid, accessToken, version);
45
+ const server = await (0, app_1.startServer)(port, accessToken);
46
+ console.log(`PMXT Sidecar Server v${version} running on http://localhost:${port}`);
47
+ if (version.includes('-dev.')) {
48
+ console.log('Running in Development Mode (auto-restart enabled)');
49
+ }
15
50
  console.log(`Lock file created at ${lockFile.lockPath}`);
16
51
  // Graceful shutdown
17
52
  const shutdown = async () => {
@@ -1,10 +1,12 @@
1
1
  export declare class LockFile {
2
2
  lockPath: string;
3
3
  constructor();
4
- create(port: number, pid: number): Promise<void>;
4
+ create(port: number, pid: number, accessToken: string, version: string): Promise<void>;
5
5
  read(): Promise<{
6
6
  port: number;
7
7
  pid: number;
8
+ accessToken?: string;
9
+ version?: string;
8
10
  timestamp: number;
9
11
  } | null>;
10
12
  remove(): Promise<void>;
@@ -41,9 +41,9 @@ class LockFile {
41
41
  constructor() {
42
42
  this.lockPath = path.join(os.homedir(), '.pmxt', 'server.lock');
43
43
  }
44
- async create(port, pid) {
44
+ async create(port, pid, accessToken, version) {
45
45
  await fs.mkdir(path.dirname(this.lockPath), { recursive: true });
46
- await fs.writeFile(this.lockPath, JSON.stringify({ port, pid, timestamp: Date.now() }, null, 2));
46
+ await fs.writeFile(this.lockPath, JSON.stringify({ port, pid, accessToken, version, timestamp: Date.now() }, null, 2));
47
47
  }
48
48
  async read() {
49
49
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmxt-core",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "pmxt is a unified prediction market data API. The ccxt for prediction markets.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,8 +29,8 @@
29
29
  "test": "jest -c jest.config.js",
30
30
  "server": "tsx watch src/server/index.ts",
31
31
  "server:prod": "node dist/server/index.js",
32
- "generate:sdk:python": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g python -o ../sdks/python/generated --package-name pmxt_internal --additional-properties=projectName=pmxt-internal,packageVersion=1.0.3,library=urllib3",
33
- "generate:sdk:typescript": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g typescript-fetch -o ../sdks/typescript/generated --additional-properties=npmName=pmxtjs,npmVersion=1.0.3,supportsES6=true,typescriptThreePlus=true",
32
+ "generate:sdk:python": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g python -o ../sdks/python/generated --package-name pmxt_internal --additional-properties=projectName=pmxt-internal,packageVersion=1.0.4,library=urllib3",
33
+ "generate:sdk:typescript": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g typescript-fetch -o ../sdks/typescript/generated --additional-properties=npmName=pmxtjs,npmVersion=1.0.4,supportsES6=true,typescriptThreePlus=true",
34
34
  "generate:docs": "node ../scripts/generate-api-docs.js",
35
35
  "generate:sdk:all": "npm run generate:sdk:python && npm run generate:sdk:typescript && npm run generate:docs"
36
36
  },