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.
Files changed (47) hide show
  1. package/dist/exchanges/kalshi/api.d.ts +1 -1
  2. package/dist/exchanges/kalshi/api.js +1 -1
  3. package/dist/exchanges/limitless/api.d.ts +1 -1
  4. package/dist/exchanges/limitless/api.js +1 -1
  5. package/dist/exchanges/myriad/api.d.ts +1 -1
  6. package/dist/exchanges/myriad/api.js +1 -1
  7. package/dist/exchanges/opinion/api.d.ts +1 -1
  8. package/dist/exchanges/opinion/api.js +1 -1
  9. package/dist/exchanges/polymarket/api-clob.d.ts +1 -1
  10. package/dist/exchanges/polymarket/api-clob.js +1 -1
  11. package/dist/exchanges/polymarket/api-data.d.ts +1 -1
  12. package/dist/exchanges/polymarket/api-data.js +1 -1
  13. package/dist/exchanges/polymarket/api-gamma.d.ts +1 -1
  14. package/dist/exchanges/polymarket/api-gamma.js +1 -1
  15. package/dist/exchanges/probable/api.d.ts +1 -1
  16. package/dist/exchanges/probable/api.js +1 -1
  17. package/dist/feeds/base-feed.d.ts +31 -0
  18. package/dist/feeds/base-feed.js +76 -0
  19. package/dist/feeds/binance/binance-feed.d.ts +29 -0
  20. package/dist/feeds/binance/binance-feed.js +189 -0
  21. package/dist/feeds/binance/index.d.ts +4 -0
  22. package/dist/feeds/binance/index.js +10 -0
  23. package/dist/feeds/binance/normalizer.d.ts +7 -0
  24. package/dist/feeds/binance/normalizer.js +51 -0
  25. package/dist/feeds/binance/types.d.ts +32 -0
  26. package/dist/feeds/binance/types.js +11 -0
  27. package/dist/feeds/chainlink/chainlink-feed.d.ts +38 -0
  28. package/dist/feeds/chainlink/chainlink-feed.js +241 -0
  29. package/dist/feeds/chainlink/index.d.ts +4 -0
  30. package/dist/feeds/chainlink/index.js +17 -0
  31. package/dist/feeds/chainlink/normalizer.d.ts +9 -0
  32. package/dist/feeds/chainlink/normalizer.js +99 -0
  33. package/dist/feeds/chainlink/types.d.ts +75 -0
  34. package/dist/feeds/chainlink/types.js +51 -0
  35. package/dist/feeds/index.d.ts +6 -0
  36. package/dist/feeds/index.js +21 -0
  37. package/dist/feeds/interfaces.d.ts +23 -0
  38. package/dist/feeds/interfaces.js +2 -0
  39. package/dist/feeds/types.d.ts +123 -0
  40. package/dist/feeds/types.js +7 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.js +1 -0
  43. package/dist/server/feed-factory.d.ts +6 -0
  44. package/dist/server/feed-factory.js +34 -0
  45. package/dist/server/feed-routes.d.ts +6 -0
  46. package/dist/server/feed-routes.js +166 -0
  47. 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,6 @@
1
+ import { IDataFeed } from '../feeds/interfaces';
2
+ /**
3
+ * Create or retrieve a singleton IDataFeed instance by name.
4
+ */
5
+ export declare function getFeed(name: string): IDataFeed;
6
+ export declare const AVAILABLE_FEEDS: readonly ["binance", "chainlink"];
@@ -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,6 @@
1
+ import { Router } from 'express';
2
+ /**
3
+ * Express router for data feed endpoints — CCXT-compatible method names.
4
+ * Mounts under `/api/feeds`.
5
+ */
6
+ export declare function createFeedRouter(): Router;
@@ -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.41.7",
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.41.7,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.41.7,supportsES6=true,typescriptThreePlus=true && node ../sdks/typescript/scripts/fix-generated.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.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",