@catalyst-team/poly-sdk 0.1.0
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/.env +0 -0
- package/README.md +803 -0
- package/dist/__tests__/clob-api.test.d.ts +5 -0
- package/dist/__tests__/clob-api.test.d.ts.map +1 -0
- package/dist/__tests__/clob-api.test.js +240 -0
- package/dist/__tests__/clob-api.test.js.map +1 -0
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bridge-client.integration.test.js +260 -0
- package/dist/__tests__/integration/bridge-client.integration.test.js.map +1 -0
- package/dist/__tests__/integration/clob-api.integration.test.d.ts +13 -0
- package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/clob-api.integration.test.js +170 -0
- package/dist/__tests__/integration/clob-api.integration.test.js.map +1 -0
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/ctf-client.integration.test.js +234 -0
- package/dist/__tests__/integration/ctf-client.integration.test.js.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.d.ts +9 -0
- package/dist/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.js +161 -0
- package/dist/__tests__/integration/data-api.integration.test.js.map +1 -0
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/gamma-api.integration.test.js +170 -0
- package/dist/__tests__/integration/gamma-api.integration.test.js.map +1 -0
- package/dist/__tests__/test-utils.d.ts +92 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/__tests__/test-utils.js +143 -0
- package/dist/__tests__/test-utils.js.map +1 -0
- package/dist/clients/bridge-client.d.ts +388 -0
- package/dist/clients/bridge-client.d.ts.map +1 -0
- package/dist/clients/bridge-client.js +587 -0
- package/dist/clients/bridge-client.js.map +1 -0
- package/dist/clients/clob-api.d.ts +318 -0
- package/dist/clients/clob-api.d.ts.map +1 -0
- package/dist/clients/clob-api.js +388 -0
- package/dist/clients/clob-api.js.map +1 -0
- package/dist/clients/ctf-client.d.ts +473 -0
- package/dist/clients/ctf-client.d.ts.map +1 -0
- package/dist/clients/ctf-client.js +915 -0
- package/dist/clients/ctf-client.js.map +1 -0
- package/dist/clients/data-api.d.ts +134 -0
- package/dist/clients/data-api.d.ts.map +1 -0
- package/dist/clients/data-api.js +265 -0
- package/dist/clients/data-api.js.map +1 -0
- package/dist/clients/gamma-api.d.ts +401 -0
- package/dist/clients/gamma-api.d.ts.map +1 -0
- package/dist/clients/gamma-api.js +352 -0
- package/dist/clients/gamma-api.js.map +1 -0
- package/dist/clients/trading-client.d.ts +252 -0
- package/dist/clients/trading-client.d.ts.map +1 -0
- package/dist/clients/trading-client.js +543 -0
- package/dist/clients/trading-client.js.map +1 -0
- package/dist/clients/websocket-manager.d.ts +100 -0
- package/dist/clients/websocket-manager.d.ts.map +1 -0
- package/dist/clients/websocket-manager.js +193 -0
- package/dist/clients/websocket-manager.js.map +1 -0
- package/dist/core/cache-adapter-bridge.d.ts +36 -0
- package/dist/core/cache-adapter-bridge.d.ts.map +1 -0
- package/dist/core/cache-adapter-bridge.js +81 -0
- package/dist/core/cache-adapter-bridge.js.map +1 -0
- package/dist/core/cache.d.ts +40 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +71 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +38 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +84 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +31 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +70 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/core/types.d.ts +314 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +19 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/unified-cache.d.ts +63 -0
- package/dist/core/unified-cache.d.ts.map +1 -0
- package/dist/core/unified-cache.js +114 -0
- package/dist/core/unified-cache.js.map +1 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/errors.d.ts +33 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +86 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +62 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +173 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +155 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/guide.d.ts +12 -0
- package/dist/mcp/tools/guide.d.ts.map +1 -0
- package/dist/mcp/tools/guide.js +801 -0
- package/dist/mcp/tools/guide.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +11 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +27 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/market.d.ts +11 -0
- package/dist/mcp/tools/market.d.ts.map +1 -0
- package/dist/mcp/tools/market.js +314 -0
- package/dist/mcp/tools/market.js.map +1 -0
- package/dist/mcp/tools/order.d.ts +10 -0
- package/dist/mcp/tools/order.d.ts.map +1 -0
- package/dist/mcp/tools/order.js +258 -0
- package/dist/mcp/tools/order.js.map +1 -0
- package/dist/mcp/tools/trade.d.ts +38 -0
- package/dist/mcp/tools/trade.d.ts.map +1 -0
- package/dist/mcp/tools/trade.js +314 -0
- package/dist/mcp/tools/trade.js.map +1 -0
- package/dist/mcp/tools/trader.d.ts +11 -0
- package/dist/mcp/tools/trader.d.ts.map +1 -0
- package/dist/mcp/tools/trader.js +277 -0
- package/dist/mcp/tools/trader.js.map +1 -0
- package/dist/mcp/tools/wallet.d.ts +274 -0
- package/dist/mcp/tools/wallet.d.ts.map +1 -0
- package/dist/mcp/tools/wallet.js +579 -0
- package/dist/mcp/tools/wallet.js.map +1 -0
- package/dist/mcp/types.d.ts +413 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +5 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/services/authorization-service.d.ts +97 -0
- package/dist/services/authorization-service.d.ts.map +1 -0
- package/dist/services/authorization-service.js +279 -0
- package/dist/services/authorization-service.js.map +1 -0
- package/dist/services/market-service.d.ts +108 -0
- package/dist/services/market-service.d.ts.map +1 -0
- package/dist/services/market-service.js +458 -0
- package/dist/services/market-service.js.map +1 -0
- package/dist/services/realtime-service.d.ts +82 -0
- package/dist/services/realtime-service.d.ts.map +1 -0
- package/dist/services/realtime-service.js +150 -0
- package/dist/services/realtime-service.js.map +1 -0
- package/dist/services/swap-service.d.ts +217 -0
- package/dist/services/swap-service.d.ts.map +1 -0
- package/dist/services/swap-service.js +695 -0
- package/dist/services/swap-service.js.map +1 -0
- package/dist/services/wallet-service.d.ts +94 -0
- package/dist/services/wallet-service.d.ts.map +1 -0
- package/dist/services/wallet-service.js +173 -0
- package/dist/services/wallet-service.js.map +1 -0
- package/dist/utils/price-utils.d.ts +153 -0
- package/dist/utils/price-utils.d.ts.map +1 -0
- package/dist/utils/price-utils.js +236 -0
- package/dist/utils/price-utils.js.map +1 -0
- package/docs/00-design.md +760 -0
- package/docs/01-mcp.md +2041 -0
- package/docs/02-API.md +1148 -0
- package/docs/e2e/01-trader-tools.md +159 -0
- package/docs/e2e/02-market-tools.md +180 -0
- package/docs/e2e/03-order-tools.md +166 -0
- package/docs/e2e/04-wallet-tools.md +224 -0
- package/docs/e2e/05-trading-tools.md +327 -0
- package/docs/e2e/06-integration-scenarios.md +481 -0
- package/docs/e2e/coordinator.md +376 -0
- package/examples/01-basic-usage.ts +68 -0
- package/examples/02-smart-money.ts +95 -0
- package/examples/03-market-analysis.ts +108 -0
- package/examples/04-kline-aggregation.ts +158 -0
- package/examples/05-follow-wallet-strategy.ts +156 -0
- package/examples/06-services-demo.ts +124 -0
- package/examples/07-realtime-websocket.ts +117 -0
- package/examples/08-trading-orders.ts +278 -0
- package/examples/09-rewards-tracking.ts +187 -0
- package/examples/10-ctf-operations.ts +336 -0
- package/examples/11-live-arbitrage-scan.ts +221 -0
- package/examples/12-trending-arb-monitor.ts +406 -0
- package/examples/README.md +179 -0
- package/package.json +62 -0
- package/scripts/README.md +163 -0
- package/scripts/approvals/approve-erc1155.ts +129 -0
- package/scripts/approvals/approve-neg-risk-erc1155.ts +149 -0
- package/scripts/approvals/approve-neg-risk.ts +102 -0
- package/scripts/approvals/check-all-allowances.ts +150 -0
- package/scripts/approvals/check-allowance.ts +129 -0
- package/scripts/approvals/check-ctf-approval.ts +158 -0
- package/scripts/datas/001-report.md +486 -0
- package/scripts/datas/clone-modal-screenshot.png +0 -0
- package/scripts/deposit/deposit-native-usdc.ts +179 -0
- package/scripts/deposit/deposit-usdc.ts +155 -0
- package/scripts/deposit/swap-usdc-to-usdce.ts +375 -0
- package/scripts/research/research-markets.ts +166 -0
- package/scripts/trading/check-orders.ts +50 -0
- package/scripts/trading/sell-nvidia-positions.ts +206 -0
- package/scripts/trading/test-order.ts +172 -0
- package/scripts/truth.md +440 -0
- package/scripts/verify/test-approve-trading.ts +98 -0
- package/scripts/verify/test-provider-fix.ts +43 -0
- package/scripts/verify/test-search-mcp.ts +113 -0
- package/scripts/verify/verify-all-apis.ts +160 -0
- package/scripts/wallet/check-wallet-balances.ts +75 -0
- package/scripts/wallet/test-wallet-operations.ts +191 -0
- package/scripts/wallet/verify-wallet-tools.ts +124 -0
- package/src/__tests__/clob-api.test.ts +301 -0
- package/src/__tests__/integration/bridge-client.integration.test.ts +314 -0
- package/src/__tests__/integration/clob-api.integration.test.ts +218 -0
- package/src/__tests__/integration/ctf-client.integration.test.ts +331 -0
- package/src/__tests__/integration/data-api.integration.test.ts +194 -0
- package/src/__tests__/integration/gamma-api.integration.test.ts +206 -0
- package/src/__tests__/test-utils.ts +170 -0
- package/src/clients/bridge-client.ts +841 -0
- package/src/clients/clob-api.ts +629 -0
- package/src/clients/ctf-client.ts +1216 -0
- package/src/clients/data-api.ts +469 -0
- package/src/clients/gamma-api.ts +597 -0
- package/src/clients/trading-client.ts +749 -0
- package/src/clients/websocket-manager.ts +267 -0
- package/src/core/cache-adapter-bridge.ts +94 -0
- package/src/core/cache.ts +85 -0
- package/src/core/errors.ts +117 -0
- package/src/core/rate-limiter.ts +74 -0
- package/src/core/types.ts +360 -0
- package/src/core/unified-cache.ts +153 -0
- package/src/index.ts +455 -0
- package/src/mcp/README.md +380 -0
- package/src/mcp/errors.ts +124 -0
- package/src/mcp/index.ts +309 -0
- package/src/mcp/server.ts +183 -0
- package/src/mcp/tools/guide.ts +821 -0
- package/src/mcp/tools/index.ts +73 -0
- package/src/mcp/tools/market.ts +363 -0
- package/src/mcp/tools/order.ts +326 -0
- package/src/mcp/tools/trade.ts +417 -0
- package/src/mcp/tools/trader.ts +322 -0
- package/src/mcp/tools/wallet.ts +683 -0
- package/src/mcp/types.ts +472 -0
- package/src/services/authorization-service.ts +357 -0
- package/src/services/market-service.ts +544 -0
- package/src/services/realtime-service.ts +196 -0
- package/src/services/swap-service.ts +896 -0
- package/src/services/wallet-service.ts +259 -0
- package/src/utils/price-utils.ts +307 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +19 -0
- package/vitest.integration.config.ts +18 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter for Polymarket APIs
|
|
3
|
+
* - Data API: 100ms minimum interval
|
|
4
|
+
* - Gamma API: 10 req/s
|
|
5
|
+
* - CLOB API: 10 req/s
|
|
6
|
+
*/
|
|
7
|
+
import Bottleneck from 'bottleneck';
|
|
8
|
+
export var ApiType;
|
|
9
|
+
(function (ApiType) {
|
|
10
|
+
ApiType["DATA_API"] = "data-api";
|
|
11
|
+
ApiType["GAMMA_API"] = "gamma-api";
|
|
12
|
+
ApiType["CLOB_API"] = "clob-api";
|
|
13
|
+
})(ApiType || (ApiType = {}));
|
|
14
|
+
const API_LIMITS = {
|
|
15
|
+
[ApiType.DATA_API]: {
|
|
16
|
+
minTime: 100, // 100ms minimum interval
|
|
17
|
+
maxConcurrent: 5,
|
|
18
|
+
},
|
|
19
|
+
[ApiType.GAMMA_API]: {
|
|
20
|
+
reservoir: 10,
|
|
21
|
+
reservoirRefreshAmount: 10,
|
|
22
|
+
reservoirRefreshInterval: 1000,
|
|
23
|
+
},
|
|
24
|
+
[ApiType.CLOB_API]: {
|
|
25
|
+
reservoir: 10,
|
|
26
|
+
reservoirRefreshAmount: 10,
|
|
27
|
+
reservoirRefreshInterval: 1000,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
export class RateLimiter {
|
|
31
|
+
limiters = new Map();
|
|
32
|
+
constructor() {
|
|
33
|
+
for (const [type, config] of Object.entries(API_LIMITS)) {
|
|
34
|
+
this.limiters.set(type, new Bottleneck(config));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Execute a function with rate limiting
|
|
39
|
+
*/
|
|
40
|
+
async execute(api, fn) {
|
|
41
|
+
const limiter = this.limiters.get(api);
|
|
42
|
+
if (!limiter)
|
|
43
|
+
throw new Error(`Unknown API type: ${api}`);
|
|
44
|
+
return limiter.schedule(fn);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Execute multiple functions in order with rate limiting
|
|
48
|
+
*/
|
|
49
|
+
async executeBatch(api, fns) {
|
|
50
|
+
const results = [];
|
|
51
|
+
for (const fn of fns) {
|
|
52
|
+
results.push(await this.execute(api, fn));
|
|
53
|
+
}
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get current limiter statistics
|
|
58
|
+
*/
|
|
59
|
+
getStats(api) {
|
|
60
|
+
const limiter = this.limiters.get(api);
|
|
61
|
+
if (!limiter)
|
|
62
|
+
return null;
|
|
63
|
+
const counts = limiter.counts();
|
|
64
|
+
return {
|
|
65
|
+
running: counts.RUNNING,
|
|
66
|
+
queued: counts.QUEUED,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/core/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,CAAN,IAAY,OAIX;AAJD,WAAY,OAAO;IACjB,gCAAqB,CAAA;IACrB,kCAAuB,CAAA;IACvB,gCAAqB,CAAA;AACvB,CAAC,EAJW,OAAO,KAAP,OAAO,QAIlB;AAED,MAAM,UAAU,GAAmD;IACjE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAClB,OAAO,EAAE,GAAG,EAAE,yBAAyB;QACvC,aAAa,EAAE,CAAC;KACjB;IACD,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QACnB,SAAS,EAAE,EAAE;QACb,sBAAsB,EAAE,EAAE;QAC1B,wBAAwB,EAAE,IAAI;KAC/B;IACD,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAClB,SAAS,EAAE,EAAE;QACb,sBAAsB,EAAE,EAAE;QAC1B,wBAAwB,EAAE,IAAI;KAC/B;CACF,CAAC;AAEF,MAAM,OAAO,WAAW;IACd,QAAQ,GAA6B,IAAI,GAAG,EAAE,CAAC;IAEvD;QACE,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAe,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAI,GAAY,EAAE,EAAoB;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAI,GAAY,EAAE,GAAyB;QAC3D,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAY;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common types used across the SDK
|
|
3
|
+
*/
|
|
4
|
+
import type { CacheAdapter } from '@prediction-router/cache';
|
|
5
|
+
/**
|
|
6
|
+
* SDK Configuration Options
|
|
7
|
+
*
|
|
8
|
+
* Allows dependency injection of cache adapters for API response caching.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { createMemoryCache } from '@prediction-router/cache';
|
|
13
|
+
* import { PolymarketSDK } from '@prediction-router/poly-sdk';
|
|
14
|
+
*
|
|
15
|
+
* // Use external cache adapter
|
|
16
|
+
* const cache = createMemoryCache({ defaultTTL: 120 });
|
|
17
|
+
* const sdk = new PolymarketSDK({ cache });
|
|
18
|
+
*
|
|
19
|
+
* // Or use default internal cache
|
|
20
|
+
* const sdk2 = new PolymarketSDK();
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export interface PolySDKOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Optional external cache adapter for API response caching.
|
|
26
|
+
* If not provided, the SDK will use its internal memory cache.
|
|
27
|
+
*
|
|
28
|
+
* Benefits of external cache:
|
|
29
|
+
* - Can use Redis for multi-instance cache sharing
|
|
30
|
+
* - Can configure custom TTL settings
|
|
31
|
+
* - Can track cache hit/miss statistics
|
|
32
|
+
*/
|
|
33
|
+
cache?: CacheAdapter;
|
|
34
|
+
/**
|
|
35
|
+
* Blockchain chain ID (default: 137 for Polygon mainnet)
|
|
36
|
+
*/
|
|
37
|
+
chainId?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Ethereum signer for trading operations
|
|
40
|
+
*/
|
|
41
|
+
signer?: unknown;
|
|
42
|
+
/**
|
|
43
|
+
* API credentials for trading
|
|
44
|
+
*/
|
|
45
|
+
creds?: {
|
|
46
|
+
key: string;
|
|
47
|
+
secret: string;
|
|
48
|
+
passphrase: string;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export type KLineInterval = '30s' | '1m' | '5m' | '15m' | '30m' | '1h' | '4h' | '12h' | '1d';
|
|
52
|
+
export interface KLineCandle {
|
|
53
|
+
timestamp: number;
|
|
54
|
+
open: number;
|
|
55
|
+
high: number;
|
|
56
|
+
low: number;
|
|
57
|
+
close: number;
|
|
58
|
+
volume: number;
|
|
59
|
+
tradeCount: number;
|
|
60
|
+
buyVolume: number;
|
|
61
|
+
sellVolume: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* ============================================================================
|
|
65
|
+
* Spread Analysis Types - Two Different Approaches
|
|
66
|
+
* ============================================================================
|
|
67
|
+
*
|
|
68
|
+
* Polymarket 双代币模型:YES + NO = 1 USDC
|
|
69
|
+
* 理想状态下,YES_price + NO_price = 1.0
|
|
70
|
+
* 偏离 1.0 时可能存在套利机会
|
|
71
|
+
*
|
|
72
|
+
* 我们提供两种 Spread 分析方式,各有优劣:
|
|
73
|
+
*
|
|
74
|
+
* ┌─────────────────────────────────────────────────────────────────────────┐
|
|
75
|
+
* │ SpreadDataPoint (历史分析) │ RealtimeSpreadAnalysis (实时分析) │
|
|
76
|
+
* ├─────────────────────────────────────────────────────────────────────────┤
|
|
77
|
+
* │ 数据源: 成交记录的收盘价 │ 数据源: 订单簿的最优 bid/ask │
|
|
78
|
+
* │ YES_close + NO_close │ YES_ask + NO_ask (买入成本) │
|
|
79
|
+
* │ │ YES_bid + NO_bid (卖出收入) │
|
|
80
|
+
* ├─────────────────────────────────────────────────────────────────────────┤
|
|
81
|
+
* │ ✅ 可构建历史曲线 │ ❌ 无法构建历史曲线* │
|
|
82
|
+
* │ ✅ Polymarket 保留成交历史 │ ❌ Polymarket 不保留盘口历史 │
|
|
83
|
+
* │ ✅ 适合回测、模式识别 │ ✅ 适合实盘交易、套利执行 │
|
|
84
|
+
* │ ⚠️ 反映已成交价格,非当前可成交价 │ ✅ 反映当前可立即成交的价格 │
|
|
85
|
+
* │ ⚠️ 套利信号仅供参考 │ ✅ 套利利润计算准确 │
|
|
86
|
+
* └─────────────────────────────────────────────────────────────────────────┘
|
|
87
|
+
*
|
|
88
|
+
* * 如需构建实时 Spread 的历史曲线,必须自行存储盘口快照数据
|
|
89
|
+
* 参考: apps/api/src/services/spread-sampler.ts
|
|
90
|
+
*
|
|
91
|
+
* 核心区别说明:
|
|
92
|
+
*
|
|
93
|
+
* 1. 成交价 vs 盘口价
|
|
94
|
+
* - 成交价 (close): 过去某时刻实际成交的价格
|
|
95
|
+
* - 盘口价 (bid/ask): 当前市场上的最优挂单价格
|
|
96
|
+
* - 例: YES 最后成交 0.52,但当前 bid=0.50, ask=0.54
|
|
97
|
+
*
|
|
98
|
+
* 2. 为什么套利计算用盘口价更准确?
|
|
99
|
+
* - 套利需要同时买入 YES 和 NO
|
|
100
|
+
* - 必须用 ask 价(卖方挂单)计算买入成本
|
|
101
|
+
* - 成交价可能是 bid 方成交,不代表你能以该价买入
|
|
102
|
+
*
|
|
103
|
+
* 3. 为什么历史分析只能用成交价?
|
|
104
|
+
* - Polymarket CLOB API 不保存历史盘口数据
|
|
105
|
+
* - 只有成交记录 (trades) 有历史
|
|
106
|
+
* - 除非你自己运行 spread-sampler 持续采样盘口
|
|
107
|
+
*/
|
|
108
|
+
/**
|
|
109
|
+
* 历史 Spread 分析(基于成交收盘价)
|
|
110
|
+
*
|
|
111
|
+
* 用途:
|
|
112
|
+
* - 历史趋势分析、回测
|
|
113
|
+
* - 识别价格偏离模式
|
|
114
|
+
* - 当盘口数据不可用时的替代方案
|
|
115
|
+
*
|
|
116
|
+
* 局限:
|
|
117
|
+
* - priceSpread 仅反映成交价偏离,非实际可套利空间
|
|
118
|
+
* - arbOpportunity 仅为参考信号,实际套利需查看盘口
|
|
119
|
+
*
|
|
120
|
+
* 数据来源:Polymarket Data API /trades 历史成交记录
|
|
121
|
+
*/
|
|
122
|
+
export interface SpreadDataPoint {
|
|
123
|
+
timestamp: number;
|
|
124
|
+
yesPrice: number;
|
|
125
|
+
noPrice: number;
|
|
126
|
+
priceSum: number;
|
|
127
|
+
priceSpread: number;
|
|
128
|
+
arbOpportunity: 'LONG' | 'SHORT' | '';
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 实时 Spread 分析(基于订单簿 bid/ask)
|
|
132
|
+
*
|
|
133
|
+
* 用途:
|
|
134
|
+
* - 实盘套利决策
|
|
135
|
+
* - 精确计算套利利润
|
|
136
|
+
* - 监控当前市场状态
|
|
137
|
+
*
|
|
138
|
+
* 局限:
|
|
139
|
+
* - ❌ 无法构建历史曲线 - Polymarket 不保存盘口历史
|
|
140
|
+
* - 如需历史数据,必须自行运行采样服务持续存储盘口快照
|
|
141
|
+
* 参考实现: apps/api/src/services/spread-sampler.ts
|
|
142
|
+
*
|
|
143
|
+
* 数据来源:Polymarket CLOB API /book 实时订单簿
|
|
144
|
+
*
|
|
145
|
+
* 套利逻辑:
|
|
146
|
+
* - Long Arb (多头套利): askSum < 1 时,买入 YES + NO 成本 < 1 USDC
|
|
147
|
+
* 利润 = 1 - askSum,因为最终一方会 resolve 为 1 USDC
|
|
148
|
+
*
|
|
149
|
+
* - Short Arb (空头套利): bidSum > 1 时,卖出 YES + NO 收入 > 1 USDC
|
|
150
|
+
* 利润 = bidSum - 1,需要先铸造代币对(成本 1 USDC)
|
|
151
|
+
*/
|
|
152
|
+
export interface RealtimeSpreadAnalysis {
|
|
153
|
+
timestamp: number;
|
|
154
|
+
yesBid: number;
|
|
155
|
+
yesAsk: number;
|
|
156
|
+
noBid: number;
|
|
157
|
+
noAsk: number;
|
|
158
|
+
askSum: number;
|
|
159
|
+
bidSum: number;
|
|
160
|
+
askSpread: number;
|
|
161
|
+
bidSpread: number;
|
|
162
|
+
longArbProfit: number;
|
|
163
|
+
shortArbProfit: number;
|
|
164
|
+
arbOpportunity: 'LONG' | 'SHORT' | '';
|
|
165
|
+
arbProfitPercent: number;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 双代币 K 线数据(YES + NO)
|
|
169
|
+
*
|
|
170
|
+
* 包含两种 Spread 分析:
|
|
171
|
+
* - spreadAnalysis: 历史曲线(基于成交价),可回溯
|
|
172
|
+
* - realtimeSpread: 实时快照(基于盘口),仅当前时刻
|
|
173
|
+
*/
|
|
174
|
+
export interface DualKLineData {
|
|
175
|
+
conditionId: string;
|
|
176
|
+
interval: KLineInterval;
|
|
177
|
+
market?: UnifiedMarket;
|
|
178
|
+
yes: KLineCandle[];
|
|
179
|
+
no: KLineCandle[];
|
|
180
|
+
/**
|
|
181
|
+
* 历史 Spread 分析(SpreadDataPoint[])
|
|
182
|
+
*
|
|
183
|
+
* ✅ 可构建历史曲线 - 每个 K 线周期一个数据点
|
|
184
|
+
* ⚠️ 基于成交价,套利信号仅供参考
|
|
185
|
+
*
|
|
186
|
+
* 用于:图表展示、趋势分析、回测
|
|
187
|
+
*/
|
|
188
|
+
spreadAnalysis?: SpreadDataPoint[];
|
|
189
|
+
/**
|
|
190
|
+
* 实时 Spread 分析(RealtimeSpreadAnalysis)
|
|
191
|
+
*
|
|
192
|
+
* ✅ 套利计算准确 - 基于当前盘口 bid/ask
|
|
193
|
+
* ❌ 仅当前时刻快照,无法构建历史曲线
|
|
194
|
+
*
|
|
195
|
+
* 如需实时 Spread 历史曲线,必须:
|
|
196
|
+
* 1. 运行 spread-sampler 服务持续采样盘口
|
|
197
|
+
* 2. 将快照存储到数据库
|
|
198
|
+
* 3. 从数据库读取构建曲线
|
|
199
|
+
*
|
|
200
|
+
* 用于:实盘套利决策、当前市场状态展示
|
|
201
|
+
*/
|
|
202
|
+
realtimeSpread?: RealtimeSpreadAnalysis;
|
|
203
|
+
/** 完整订单簿数据(如需更多细节) */
|
|
204
|
+
currentOrderbook?: ProcessedOrderbook;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 有效价格(考虑镜像订单)
|
|
208
|
+
*
|
|
209
|
+
* Polymarket 的关键特性:买 YES @ P = 卖 NO @ (1-P)
|
|
210
|
+
* 因此同一订单会在两个订单簿中出现
|
|
211
|
+
*
|
|
212
|
+
* 有效价格是考虑镜像后的最优价格:
|
|
213
|
+
* - effectiveBuyYes = min(YES.ask, 1 - NO.bid)
|
|
214
|
+
* - effectiveBuyNo = min(NO.ask, 1 - YES.bid)
|
|
215
|
+
* - effectiveSellYes = max(YES.bid, 1 - NO.ask)
|
|
216
|
+
* - effectiveSellNo = max(NO.bid, 1 - YES.ask)
|
|
217
|
+
*/
|
|
218
|
+
export interface EffectivePrices {
|
|
219
|
+
effectiveBuyYes: number;
|
|
220
|
+
effectiveBuyNo: number;
|
|
221
|
+
effectiveSellYes: number;
|
|
222
|
+
effectiveSellNo: number;
|
|
223
|
+
}
|
|
224
|
+
export interface ProcessedOrderbook {
|
|
225
|
+
yes: {
|
|
226
|
+
bid: number;
|
|
227
|
+
ask: number;
|
|
228
|
+
bidSize: number;
|
|
229
|
+
askSize: number;
|
|
230
|
+
bidDepth: number;
|
|
231
|
+
askDepth: number;
|
|
232
|
+
spread: number;
|
|
233
|
+
tokenId?: string;
|
|
234
|
+
};
|
|
235
|
+
no: {
|
|
236
|
+
bid: number;
|
|
237
|
+
ask: number;
|
|
238
|
+
bidSize: number;
|
|
239
|
+
askSize: number;
|
|
240
|
+
bidDepth: number;
|
|
241
|
+
askDepth: number;
|
|
242
|
+
spread: number;
|
|
243
|
+
tokenId?: string;
|
|
244
|
+
};
|
|
245
|
+
summary: {
|
|
246
|
+
askSum: number;
|
|
247
|
+
bidSum: number;
|
|
248
|
+
effectivePrices: EffectivePrices;
|
|
249
|
+
effectiveLongCost: number;
|
|
250
|
+
effectiveShortRevenue: number;
|
|
251
|
+
longArbProfit: number;
|
|
252
|
+
shortArbProfit: number;
|
|
253
|
+
totalBidDepth: number;
|
|
254
|
+
totalAskDepth: number;
|
|
255
|
+
imbalanceRatio: number;
|
|
256
|
+
yesSpread: number;
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
export interface ArbitrageOpportunity {
|
|
260
|
+
type: 'long' | 'short';
|
|
261
|
+
profit: number;
|
|
262
|
+
action: string;
|
|
263
|
+
expectedProfit: number;
|
|
264
|
+
}
|
|
265
|
+
export interface PriceUpdate {
|
|
266
|
+
assetId: string;
|
|
267
|
+
price: number;
|
|
268
|
+
midpoint: number;
|
|
269
|
+
spread: number;
|
|
270
|
+
timestamp: number;
|
|
271
|
+
}
|
|
272
|
+
export interface BookUpdate {
|
|
273
|
+
assetId: string;
|
|
274
|
+
bids: Array<{
|
|
275
|
+
price: number;
|
|
276
|
+
size: number;
|
|
277
|
+
}>;
|
|
278
|
+
asks: Array<{
|
|
279
|
+
price: number;
|
|
280
|
+
size: number;
|
|
281
|
+
}>;
|
|
282
|
+
timestamp: number;
|
|
283
|
+
}
|
|
284
|
+
export interface UnifiedMarket {
|
|
285
|
+
conditionId: string;
|
|
286
|
+
slug: string;
|
|
287
|
+
question: string;
|
|
288
|
+
description?: string;
|
|
289
|
+
tokens: {
|
|
290
|
+
yes: {
|
|
291
|
+
tokenId: string;
|
|
292
|
+
price: number;
|
|
293
|
+
};
|
|
294
|
+
no: {
|
|
295
|
+
tokenId: string;
|
|
296
|
+
price: number;
|
|
297
|
+
};
|
|
298
|
+
};
|
|
299
|
+
volume: number;
|
|
300
|
+
volume24hr?: number;
|
|
301
|
+
liquidity: number;
|
|
302
|
+
spread?: number;
|
|
303
|
+
/** 1-day price change (from Gamma API) */
|
|
304
|
+
oneDayPriceChange?: number;
|
|
305
|
+
/** 1-week price change (from Gamma API) */
|
|
306
|
+
oneWeekPriceChange?: number;
|
|
307
|
+
active: boolean;
|
|
308
|
+
closed: boolean;
|
|
309
|
+
acceptingOrders: boolean;
|
|
310
|
+
endDate: Date;
|
|
311
|
+
source: 'gamma' | 'clob' | 'merged';
|
|
312
|
+
}
|
|
313
|
+
export declare function getIntervalMs(interval: KLineInterval): number;
|
|
314
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common types used across the SDK
|
|
3
|
+
*/
|
|
4
|
+
// Helper to convert interval to milliseconds
|
|
5
|
+
export function getIntervalMs(interval) {
|
|
6
|
+
const map = {
|
|
7
|
+
'30s': 30 * 1000,
|
|
8
|
+
'1m': 60 * 1000,
|
|
9
|
+
'5m': 5 * 60 * 1000,
|
|
10
|
+
'15m': 15 * 60 * 1000,
|
|
11
|
+
'30m': 30 * 60 * 1000,
|
|
12
|
+
'1h': 60 * 60 * 1000,
|
|
13
|
+
'4h': 4 * 60 * 60 * 1000,
|
|
14
|
+
'12h': 12 * 60 * 60 * 1000,
|
|
15
|
+
'1d': 24 * 60 * 60 * 1000,
|
|
16
|
+
};
|
|
17
|
+
return map[interval];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuVH,6CAA6C;AAC7C,MAAM,UAAU,aAAa,CAAC,QAAuB;IACnD,MAAM,GAAG,GAAkC;QACzC,KAAK,EAAE,EAAE,GAAG,IAAI;QAChB,IAAI,EAAE,EAAE,GAAG,IAAI;QACf,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;QACnB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACrB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACrB,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACpB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACxB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QAC1B,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;KAC1B,CAAC;IACF,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified cache interface for poly-sdk
|
|
3
|
+
*
|
|
4
|
+
* Bridges between:
|
|
5
|
+
* 1. Legacy internal Cache (synchronous get/set with millisecond TTL)
|
|
6
|
+
* 2. New CacheAdapter interface (async with second TTL)
|
|
7
|
+
*
|
|
8
|
+
* This allows the SDK to accept external cache adapters while maintaining
|
|
9
|
+
* backward compatibility with existing code.
|
|
10
|
+
*/
|
|
11
|
+
import type { CacheAdapter } from '@prediction-router/cache';
|
|
12
|
+
import { Cache, CACHE_TTL } from './cache.js';
|
|
13
|
+
/**
|
|
14
|
+
* Unified cache interface that works with both legacy Cache and CacheAdapter
|
|
15
|
+
*
|
|
16
|
+
* Key features:
|
|
17
|
+
* - Async API (compatible with CacheAdapter)
|
|
18
|
+
* - Millisecond TTL (compatible with existing SDK code)
|
|
19
|
+
* - getOrSet helper for cache-aside pattern
|
|
20
|
+
*/
|
|
21
|
+
export interface UnifiedCache {
|
|
22
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
23
|
+
set<T>(key: string, value: T, ttlMs: number): Promise<void>;
|
|
24
|
+
getOrSet<T>(key: string, ttlMs: number, factory: () => Promise<T>): Promise<T>;
|
|
25
|
+
invalidate(pattern: string): Promise<void>;
|
|
26
|
+
clear(): void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Wraps the legacy Cache class to provide async interface
|
|
30
|
+
*/
|
|
31
|
+
export declare class LegacyCacheWrapper implements UnifiedCache {
|
|
32
|
+
private cache;
|
|
33
|
+
constructor(cache: Cache);
|
|
34
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
35
|
+
set<T>(key: string, value: T, ttlMs: number): Promise<void>;
|
|
36
|
+
getOrSet<T>(key: string, ttlMs: number, factory: () => Promise<T>): Promise<T>;
|
|
37
|
+
invalidate(pattern: string): Promise<void>;
|
|
38
|
+
clear(): void;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Wraps a CacheAdapter to provide legacy-compatible interface
|
|
42
|
+
*
|
|
43
|
+
* Main differences:
|
|
44
|
+
* - Converts milliseconds to seconds for TTL
|
|
45
|
+
* - Returns undefined instead of null for missing keys
|
|
46
|
+
* - Implements getOrSet helper
|
|
47
|
+
* - Implements pattern-based invalidation (limited support)
|
|
48
|
+
*/
|
|
49
|
+
export declare class CacheAdapterWrapper implements UnifiedCache {
|
|
50
|
+
private adapter;
|
|
51
|
+
constructor(adapter: CacheAdapter);
|
|
52
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
53
|
+
set<T>(key: string, value: T, ttlMs: number): Promise<void>;
|
|
54
|
+
getOrSet<T>(key: string, ttlMs: number, factory: () => Promise<T>): Promise<T>;
|
|
55
|
+
invalidate(pattern: string): Promise<void>;
|
|
56
|
+
clear(): void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a UnifiedCache from either legacy Cache or CacheAdapter
|
|
60
|
+
*/
|
|
61
|
+
export declare function createUnifiedCache(cache?: CacheAdapter | Cache): UnifiedCache;
|
|
62
|
+
export { CACHE_TTL };
|
|
63
|
+
//# sourceMappingURL=unified-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-cache.d.ts","sourceRoot":"","sources":["../../src/core/unified-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/E,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACzC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAE1B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAI3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,QAAQ,CAAC,CAAC,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC;IAIP,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IAC1C,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,YAAY;IAEnC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAK3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3D,QAAQ,CAAC,CAAC,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC;IAkBP,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD,KAAK,IAAI,IAAI;CAGd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,EAAE,YAAY,GAAG,KAAK,GAC3B,YAAY,CAiBd;AAGD,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified cache interface for poly-sdk
|
|
3
|
+
*
|
|
4
|
+
* Bridges between:
|
|
5
|
+
* 1. Legacy internal Cache (synchronous get/set with millisecond TTL)
|
|
6
|
+
* 2. New CacheAdapter interface (async with second TTL)
|
|
7
|
+
*
|
|
8
|
+
* This allows the SDK to accept external cache adapters while maintaining
|
|
9
|
+
* backward compatibility with existing code.
|
|
10
|
+
*/
|
|
11
|
+
import { Cache, CACHE_TTL } from './cache.js';
|
|
12
|
+
/**
|
|
13
|
+
* Wraps the legacy Cache class to provide async interface
|
|
14
|
+
*/
|
|
15
|
+
export class LegacyCacheWrapper {
|
|
16
|
+
cache;
|
|
17
|
+
constructor(cache) {
|
|
18
|
+
this.cache = cache;
|
|
19
|
+
}
|
|
20
|
+
async get(key) {
|
|
21
|
+
return this.cache.get(key);
|
|
22
|
+
}
|
|
23
|
+
async set(key, value, ttlMs) {
|
|
24
|
+
this.cache.set(key, value, ttlMs);
|
|
25
|
+
}
|
|
26
|
+
async getOrSet(key, ttlMs, factory) {
|
|
27
|
+
return this.cache.getOrSet(key, ttlMs, factory);
|
|
28
|
+
}
|
|
29
|
+
async invalidate(pattern) {
|
|
30
|
+
this.cache.invalidate(pattern);
|
|
31
|
+
}
|
|
32
|
+
clear() {
|
|
33
|
+
this.cache.clear();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Wraps a CacheAdapter to provide legacy-compatible interface
|
|
38
|
+
*
|
|
39
|
+
* Main differences:
|
|
40
|
+
* - Converts milliseconds to seconds for TTL
|
|
41
|
+
* - Returns undefined instead of null for missing keys
|
|
42
|
+
* - Implements getOrSet helper
|
|
43
|
+
* - Implements pattern-based invalidation (limited support)
|
|
44
|
+
*/
|
|
45
|
+
export class CacheAdapterWrapper {
|
|
46
|
+
adapter;
|
|
47
|
+
constructor(adapter) {
|
|
48
|
+
this.adapter = adapter;
|
|
49
|
+
}
|
|
50
|
+
async get(key) {
|
|
51
|
+
const value = await this.adapter.get(key);
|
|
52
|
+
return value ?? undefined;
|
|
53
|
+
}
|
|
54
|
+
async set(key, value, ttlMs) {
|
|
55
|
+
// Convert milliseconds to seconds
|
|
56
|
+
const ttlSeconds = Math.ceil(ttlMs / 1000);
|
|
57
|
+
// Check if this is a CacheManager (has getStats method)
|
|
58
|
+
if ('getStats' in this.adapter) {
|
|
59
|
+
// This is a CacheManager - use CacheSetOptions signature
|
|
60
|
+
await this.adapter.set(key, value, { ttl: ttlSeconds });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// This is a regular CacheAdapter - use simple signature
|
|
64
|
+
await this.adapter.set(key, value, ttlSeconds);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async getOrSet(key, ttlMs, factory) {
|
|
68
|
+
const cached = await this.adapter.get(key);
|
|
69
|
+
if (cached !== null)
|
|
70
|
+
return cached;
|
|
71
|
+
const value = await factory();
|
|
72
|
+
const ttlSeconds = Math.ceil(ttlMs / 1000);
|
|
73
|
+
// Check if this is a CacheManager
|
|
74
|
+
if ('getStats' in this.adapter) {
|
|
75
|
+
// This is a CacheManager
|
|
76
|
+
await this.adapter.set(key, value, { ttl: ttlSeconds });
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// This is a regular CacheAdapter
|
|
80
|
+
await this.adapter.set(key, value, ttlSeconds);
|
|
81
|
+
}
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
async invalidate(pattern) {
|
|
85
|
+
// CacheAdapter doesn't have pattern matching
|
|
86
|
+
// Best we can do is warn - this is a limitation
|
|
87
|
+
console.warn(`invalidate(pattern="${pattern}") not fully supported with external cache adapter`);
|
|
88
|
+
}
|
|
89
|
+
clear() {
|
|
90
|
+
void this.adapter.clear?.();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a UnifiedCache from either legacy Cache or CacheAdapter
|
|
95
|
+
*/
|
|
96
|
+
export function createUnifiedCache(cache) {
|
|
97
|
+
if (!cache) {
|
|
98
|
+
// No cache provided, create default legacy cache
|
|
99
|
+
return new LegacyCacheWrapper(new Cache());
|
|
100
|
+
}
|
|
101
|
+
// Check if it's a CacheAdapter (has async get method)
|
|
102
|
+
if ('get' in cache && typeof cache.get === 'function') {
|
|
103
|
+
const testResult = cache.get('test');
|
|
104
|
+
if (testResult instanceof Promise) {
|
|
105
|
+
// It's a CacheAdapter
|
|
106
|
+
return new CacheAdapterWrapper(cache);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// It's a legacy Cache
|
|
110
|
+
return new LegacyCacheWrapper(cache);
|
|
111
|
+
}
|
|
112
|
+
// Re-export CACHE_TTL for convenience
|
|
113
|
+
export { CACHE_TTL };
|
|
114
|
+
//# sourceMappingURL=unified-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-cache.js","sourceRoot":"","sources":["../../src/core/unified-cache.ts"],"names":[],"mappings":"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"}
|