pmxt-core 2.41.7 → 2.42.2
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.
- package/dist/exchanges/kalshi/api.d.ts +1 -1
- package/dist/exchanges/kalshi/api.js +1 -1
- package/dist/exchanges/limitless/api.d.ts +1 -1
- package/dist/exchanges/limitless/api.js +1 -1
- package/dist/exchanges/myriad/api.d.ts +1 -1
- package/dist/exchanges/myriad/api.js +1 -1
- package/dist/exchanges/opinion/api.d.ts +1 -1
- package/dist/exchanges/opinion/api.js +1 -1
- package/dist/exchanges/polymarket/api-clob.d.ts +1 -1
- package/dist/exchanges/polymarket/api-clob.js +1 -1
- package/dist/exchanges/polymarket/api-data.d.ts +1 -1
- package/dist/exchanges/polymarket/api-data.js +1 -1
- package/dist/exchanges/polymarket/api-gamma.d.ts +1 -1
- package/dist/exchanges/polymarket/api-gamma.js +1 -1
- package/dist/exchanges/probable/api.d.ts +1 -1
- package/dist/exchanges/probable/api.js +1 -1
- package/dist/feeds/base-feed.d.ts +31 -0
- package/dist/feeds/base-feed.js +76 -0
- package/dist/feeds/binance/binance-feed.d.ts +29 -0
- package/dist/feeds/binance/binance-feed.js +189 -0
- package/dist/feeds/binance/index.d.ts +4 -0
- package/dist/feeds/binance/index.js +10 -0
- package/dist/feeds/binance/normalizer.d.ts +7 -0
- package/dist/feeds/binance/normalizer.js +51 -0
- package/dist/feeds/binance/types.d.ts +32 -0
- package/dist/feeds/binance/types.js +11 -0
- package/dist/feeds/chainlink/chainlink-feed.d.ts +38 -0
- package/dist/feeds/chainlink/chainlink-feed.js +241 -0
- package/dist/feeds/chainlink/index.d.ts +4 -0
- package/dist/feeds/chainlink/index.js +17 -0
- package/dist/feeds/chainlink/normalizer.d.ts +9 -0
- package/dist/feeds/chainlink/normalizer.js +99 -0
- package/dist/feeds/chainlink/types.d.ts +75 -0
- package/dist/feeds/chainlink/types.js +51 -0
- package/dist/feeds/index.d.ts +6 -0
- package/dist/feeds/index.js +21 -0
- package/dist/feeds/interfaces.d.ts +23 -0
- package/dist/feeds/interfaces.js +2 -0
- package/dist/feeds/types.d.ts +123 -0
- package/dist/feeds/types.js +7 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/server/feed-factory.d.ts +6 -0
- package/dist/server/feed-factory.js +34 -0
- package/dist/server/feed-routes.d.ts +6 -0
- package/dist/server/feed-routes.js +166 -0
- package/package.json +3 -3
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ----------------------------------------------------------------------------
|
|
3
|
+
// Data Feed Types — CCXT-compatible unified types for auxiliary data feeds.
|
|
4
|
+
// These match CCXT's unified API structures exactly so users don't need to
|
|
5
|
+
// learn a parallel vocabulary.
|
|
6
|
+
// ----------------------------------------------------------------------------
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './exchanges/polymarket_us';
|
|
|
18
18
|
export * from './exchanges/hyperliquid';
|
|
19
19
|
export * from './exchanges/gemini-titan';
|
|
20
20
|
export * from './router';
|
|
21
|
+
export * from './feeds';
|
|
21
22
|
export * from './server/app';
|
|
22
23
|
export * from './server/utils/port-manager';
|
|
23
24
|
export * from './server/utils/lock-file';
|
package/dist/index.js
CHANGED
|
@@ -36,6 +36,7 @@ __exportStar(require("./exchanges/polymarket_us"), exports);
|
|
|
36
36
|
__exportStar(require("./exchanges/hyperliquid"), exports);
|
|
37
37
|
__exportStar(require("./exchanges/gemini-titan"), exports);
|
|
38
38
|
__exportStar(require("./router"), exports);
|
|
39
|
+
__exportStar(require("./feeds"), exports);
|
|
39
40
|
__exportStar(require("./server/app"), exports);
|
|
40
41
|
__exportStar(require("./server/utils/port-manager"), exports);
|
|
41
42
|
__exportStar(require("./server/utils/lock-file"), exports);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AVAILABLE_FEEDS = void 0;
|
|
4
|
+
exports.getFeed = getFeed;
|
|
5
|
+
const binance_1 = require("../feeds/binance");
|
|
6
|
+
const chainlink_feed_1 = require("../feeds/chainlink/chainlink-feed");
|
|
7
|
+
const feedInstances = new Map();
|
|
8
|
+
/**
|
|
9
|
+
* Create or retrieve a singleton IDataFeed instance by name.
|
|
10
|
+
*/
|
|
11
|
+
function getFeed(name) {
|
|
12
|
+
const key = name.toLowerCase();
|
|
13
|
+
const cached = feedInstances.get(key);
|
|
14
|
+
if (cached)
|
|
15
|
+
return cached;
|
|
16
|
+
let feed;
|
|
17
|
+
switch (key) {
|
|
18
|
+
case 'binance':
|
|
19
|
+
feed = new binance_1.BinanceFeed({
|
|
20
|
+
apiKey: process.env.OBDATA_API_KEY,
|
|
21
|
+
});
|
|
22
|
+
break;
|
|
23
|
+
case 'chainlink':
|
|
24
|
+
feed = new chainlink_feed_1.ChainlinkFeed({
|
|
25
|
+
apiKey: process.env.OBDATA_API_KEY || '',
|
|
26
|
+
});
|
|
27
|
+
break;
|
|
28
|
+
default:
|
|
29
|
+
throw new Error(`Unknown feed: ${name}. Available: binance, chainlink`);
|
|
30
|
+
}
|
|
31
|
+
feedInstances.set(key, feed);
|
|
32
|
+
return feed;
|
|
33
|
+
}
|
|
34
|
+
exports.AVAILABLE_FEEDS = ['binance', 'chainlink'];
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createFeedRouter = createFeedRouter;
|
|
4
|
+
const express_1 = require("express");
|
|
5
|
+
const feed_factory_1 = require("./feed-factory");
|
|
6
|
+
/**
|
|
7
|
+
* Express router for data feed endpoints — CCXT-compatible method names.
|
|
8
|
+
* Mounts under `/api/feeds`.
|
|
9
|
+
*/
|
|
10
|
+
function createFeedRouter() {
|
|
11
|
+
const router = (0, express_1.Router)();
|
|
12
|
+
router.get('/', (_req, res) => {
|
|
13
|
+
res.json({ success: true, data: feed_factory_1.AVAILABLE_FEEDS });
|
|
14
|
+
});
|
|
15
|
+
router.use('/:feed', (req, _res, next) => {
|
|
16
|
+
try {
|
|
17
|
+
const feed = (0, feed_factory_1.getFeed)(req.params.feed);
|
|
18
|
+
req._feed = feed;
|
|
19
|
+
next();
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
next(error);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
// GET /api/feeds/:feed/loadMarkets
|
|
26
|
+
router.get('/:feed/loadMarkets', async (req, res, next) => {
|
|
27
|
+
try {
|
|
28
|
+
const data = await req._feed.loadMarkets();
|
|
29
|
+
res.json({ success: true, data });
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
next(error);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
// GET /api/feeds/:feed/fetchTicker?symbol=BTC/USD
|
|
36
|
+
router.get('/:feed/fetchTicker', async (req, res, next) => {
|
|
37
|
+
try {
|
|
38
|
+
const symbol = req.query.symbol;
|
|
39
|
+
if (!symbol) {
|
|
40
|
+
res.status(400).json({ success: false, error: 'Missing required parameter: symbol' });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const data = await req._feed.fetchTicker(symbol);
|
|
44
|
+
res.json({ success: true, data });
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
next(error);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// GET /api/feeds/:feed/fetchTickers?symbols=BTC/USD,ETH/USD
|
|
51
|
+
router.get('/:feed/fetchTickers', async (req, res, next) => {
|
|
52
|
+
try {
|
|
53
|
+
const symbolsRaw = req.query.symbols;
|
|
54
|
+
const symbols = symbolsRaw ? symbolsRaw.split(',').map((s) => s.trim()) : undefined;
|
|
55
|
+
const data = await req._feed.fetchTickers(symbols);
|
|
56
|
+
res.json({ success: true, data });
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
next(error);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// GET /api/feeds/:feed/fetchOHLCV?symbol=BTC/USDT&timeframe=1h&since=...&limit=...
|
|
63
|
+
router.get('/:feed/fetchOHLCV', async (req, res, next) => {
|
|
64
|
+
try {
|
|
65
|
+
const symbol = req.query.symbol;
|
|
66
|
+
if (!symbol) {
|
|
67
|
+
res.status(400).json({ success: false, error: 'Missing required parameter: symbol' });
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const data = await req._feed.fetchOHLCV(symbol, req.query.timeframe || '1h', req.query.since ? Number(req.query.since) : undefined, req.query.limit ? Number(req.query.limit) : undefined);
|
|
71
|
+
res.json({ success: true, data });
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
next(error);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// GET /api/feeds/:feed/fetchOrderBook?symbol=BTC/USDT&limit=20
|
|
78
|
+
router.get('/:feed/fetchOrderBook', async (req, res, next) => {
|
|
79
|
+
try {
|
|
80
|
+
const feed = req._feed;
|
|
81
|
+
if (typeof feed.fetchOrderBook !== 'function') {
|
|
82
|
+
res.status(501).json({ success: false, error: `Feed '${req.params.feed}' does not support fetchOrderBook` });
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const symbol = req.query.symbol;
|
|
86
|
+
if (!symbol) {
|
|
87
|
+
res.status(400).json({ success: false, error: 'Missing required parameter: symbol' });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const data = await feed.fetchOrderBook(symbol, req.query.limit ? Number(req.query.limit) : undefined);
|
|
91
|
+
res.json({ success: true, data });
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
next(error);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
// GET /api/feeds/:feed/fetchOracleRound?feed=BTC/USD
|
|
98
|
+
router.get('/:feed/fetchOracleRound', async (req, res, next) => {
|
|
99
|
+
try {
|
|
100
|
+
const feed = req._feed;
|
|
101
|
+
if (typeof feed.fetchOracleRound !== 'function') {
|
|
102
|
+
res.status(501).json({ success: false, error: `Feed '${req.params.feed}' does not support fetchOracleRound` });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const feedName = req.query.feed;
|
|
106
|
+
if (!feedName) {
|
|
107
|
+
res.status(400).json({ success: false, error: 'Missing required parameter: feed' });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const data = await feed.fetchOracleRound({ feed: feedName });
|
|
111
|
+
res.json({ success: true, data });
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
next(error);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
// GET /api/feeds/:feed/fetchOracleHistory?feed=BTC/USD&limit=50
|
|
118
|
+
router.get('/:feed/fetchOracleHistory', async (req, res, next) => {
|
|
119
|
+
try {
|
|
120
|
+
const feed = req._feed;
|
|
121
|
+
if (typeof feed.fetchOracleHistory !== 'function') {
|
|
122
|
+
res.status(501).json({ success: false, error: `Feed '${req.params.feed}' does not support fetchOracleHistory` });
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const feedName = req.query.feed;
|
|
126
|
+
if (!feedName) {
|
|
127
|
+
res.status(400).json({ success: false, error: 'Missing required parameter: feed' });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const data = await feed.fetchOracleHistory({
|
|
131
|
+
feed: feedName,
|
|
132
|
+
limit: req.query.limit ? Number(req.query.limit) : undefined,
|
|
133
|
+
});
|
|
134
|
+
res.json({ success: true, data });
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
next(error);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// GET /api/feeds/:feed/fetchHistoricalPrices?symbol=BTC/USD&maxSize=10&order=desc
|
|
141
|
+
router.get('/:feed/fetchHistoricalPrices', async (req, res, next) => {
|
|
142
|
+
try {
|
|
143
|
+
const feed = req._feed;
|
|
144
|
+
if (typeof feed.fetchHistoricalPrices !== 'function') {
|
|
145
|
+
res.status(501).json({ success: false, error: `Feed '${req.params.feed}' does not support fetchHistoricalPrices` });
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const symbol = req.query.symbol;
|
|
149
|
+
if (!symbol) {
|
|
150
|
+
res.status(400).json({ success: false, error: 'Missing required parameter: symbol' });
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const data = await feed.fetchHistoricalPrices(symbol, {
|
|
154
|
+
fromTimestamp: req.query.fromTimestamp ? Number(req.query.fromTimestamp) : undefined,
|
|
155
|
+
untilTimestamp: req.query.untilTimestamp ? Number(req.query.untilTimestamp) : undefined,
|
|
156
|
+
maxSize: req.query.maxSize ? Number(req.query.maxSize) : undefined,
|
|
157
|
+
order: req.query.order,
|
|
158
|
+
});
|
|
159
|
+
res.json({ success: true, data });
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
next(error);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
return router;
|
|
166
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmxt-core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.42.2",
|
|
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=2.
|
|
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=2.
|
|
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=2.42.2,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=2.42.2,supportsES6=true,typescriptThreePlus=true && node ../sdks/typescript/scripts/fix-generated.js",
|
|
34
34
|
"fetch:openapi": "node scripts/fetch-openapi-specs.js",
|
|
35
35
|
"extract:jsdoc": "node ../scripts/extract-jsdoc.js",
|
|
36
36
|
"generate:docs": "npm run extract:jsdoc && node ../scripts/generate-api-docs.js",
|