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
|
|
99
|
-
// We
|
|
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(
|
|
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(
|
|
141
|
+
return allMarkets.slice(offset, offset + limit);
|
|
137
142
|
}
|
|
138
143
|
catch (error) {
|
|
139
144
|
console.error("Error fetching Kalshi data:", error);
|
package/dist/server/app.d.ts
CHANGED
|
@@ -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>>;
|
package/dist/server/app.js
CHANGED
|
@@ -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) {
|
package/dist/server/index.js
CHANGED
|
@@ -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
|
+
"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.
|
|
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.
|
|
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
|
},
|