@the-situation/indexer 0.17.0 → 0.17.1
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/README.md +43 -4
- package/dist/api/app.d.ts +2 -2
- package/dist/api/routes/admin-subscriptions.d.ts +1 -1
- package/dist/api/routes/health.d.ts.map +1 -1
- package/dist/api/routes/health.js +2 -0
- package/dist/api/routes/health.js.map +1 -1
- package/dist/api/routes/lp-history.d.ts +1 -1
- package/dist/config.d.ts +8 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +37 -3
- package/dist/config.js.map +1 -1
- package/dist/etl/event-indexer.d.ts +1 -1
- package/dist/etl/position-refresher.d.ts +1 -1
- package/dist/etl/state-refresher.d.ts +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/layers/VoyagerClientLive.d.ts +2 -1
- package/dist/layers/VoyagerClientLive.d.ts.map +1 -1
- package/dist/layers/VoyagerClientLive.js +89 -55
- package/dist/layers/VoyagerClientLive.js.map +1 -1
- package/dist/services/VoyagerRateLimit.d.ts +11 -8
- package/dist/services/VoyagerRateLimit.d.ts.map +1 -1
- package/dist/services/VoyagerRateLimit.js +51 -26
- package/dist/services/VoyagerRateLimit.js.map +1 -1
- package/dist/types/api.d.ts +2 -0
- package/dist/types/api.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,15 +27,23 @@ Events will begin appearing within ~15 seconds.
|
|
|
27
27
|
|
|
28
28
|
| Variable | Required | Default | Description |
|
|
29
29
|
|----------|----------|---------|-------------|
|
|
30
|
-
| `VOYAGER_API_KEY` | Yes | — | Voyager explorer API key |
|
|
30
|
+
| `VOYAGER_API_KEY` | Yes* | — | Single Voyager explorer API key |
|
|
31
|
+
| `VOYAGER_API_KEYS` | Yes* | — | Comma/whitespace-separated Voyager API key pool for redundancy |
|
|
31
32
|
| `ADMIN_API_KEY` | Yes | — | Bearer token for `/admin/*` endpoints |
|
|
32
33
|
| `DB_PATH` | No | `./data/indexer.db` | SQLite database file path |
|
|
33
34
|
| `PORT` | No | `3000` | HTTP server port |
|
|
34
|
-
| `
|
|
35
|
+
| `STARKNET_NETWORK` | No | `sepolia` | Network default set (`sepolia` or `mainnet`) |
|
|
36
|
+
| `STARKNET_RPC_URL` | No | network default | Starknet RPC endpoint |
|
|
37
|
+
| `VOYAGER_API_BASE_URL` | No | network default | Voyager API base URL |
|
|
35
38
|
| `EVENT_POLL_INTERVAL_MS` | No | `15000` | Event polling interval (ms) |
|
|
36
39
|
| `STATE_POLL_INTERVAL_MS` | No | `30000` | Market state refresh interval (ms) |
|
|
37
40
|
| `POSITION_POLL_INTERVAL_MS` | No | `60000` | Position refresh interval (ms) |
|
|
38
41
|
|
|
42
|
+
`VOYAGER_API_KEY` or `VOYAGER_API_KEYS` must be set. When multiple keys are
|
|
43
|
+
configured, the indexer rotates across them. A key that receives a Voyager
|
|
44
|
+
429/503 response is cooled down independently, and requests continue through
|
|
45
|
+
the remaining keys until every key is cooling down.
|
|
46
|
+
|
|
39
47
|
## API Reference
|
|
40
48
|
|
|
41
49
|
### Public Endpoints
|
|
@@ -222,14 +230,14 @@ The indexer is configured for [Fly.io](https://fly.io) with a persistent volume
|
|
|
222
230
|
```bash
|
|
223
231
|
cd packages/indexer
|
|
224
232
|
|
|
225
|
-
# Create the app (first time only)
|
|
233
|
+
# Create the Sepolia app (first time only)
|
|
226
234
|
fly apps create situation-indexer
|
|
227
235
|
|
|
228
236
|
# Create a persistent volume for the database
|
|
229
237
|
fly volumes create indexer_data --region iad --size 1
|
|
230
238
|
|
|
231
239
|
# Set secrets
|
|
232
|
-
fly secrets set
|
|
240
|
+
fly secrets set VOYAGER_API_KEYS=key-1,key-2,key-3 ADMIN_API_KEY=your-key
|
|
233
241
|
|
|
234
242
|
# Deploy (uses Dockerfile.indexer at repo root)
|
|
235
243
|
fly deploy
|
|
@@ -238,6 +246,37 @@ fly deploy
|
|
|
238
246
|
curl https://situation-indexer.fly.dev/health
|
|
239
247
|
```
|
|
240
248
|
|
|
249
|
+
### Mainnet Deployment
|
|
250
|
+
|
|
251
|
+
Mainnet uses a separate Fly app and volume so the production database starts
|
|
252
|
+
fresh and cannot mix Sepolia cursor state with mainnet events.
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
cd packages/indexer
|
|
256
|
+
|
|
257
|
+
# Create the mainnet app (first time only)
|
|
258
|
+
fly apps create situation-indexer-mainnet
|
|
259
|
+
|
|
260
|
+
# Create the mainnet database volume
|
|
261
|
+
fly volumes create indexer_mainnet_data --app situation-indexer-mainnet --region iad --size 1
|
|
262
|
+
|
|
263
|
+
# Set secrets on the mainnet app
|
|
264
|
+
fly secrets set --app situation-indexer-mainnet VOYAGER_API_KEYS=key-1,key-2,key-3 ADMIN_API_KEY=your-key
|
|
265
|
+
|
|
266
|
+
# Deploy with mainnet RPC and Voyager API endpoints
|
|
267
|
+
fly deploy --config fly.mainnet.toml
|
|
268
|
+
|
|
269
|
+
# Verify
|
|
270
|
+
curl https://situation-indexer-mainnet.fly.dev/health
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
`fly.mainnet.toml` is configured with:
|
|
274
|
+
|
|
275
|
+
- `STARKNET_NETWORK=mainnet`
|
|
276
|
+
- `STARKNET_RPC_URL=https://api.cartridge.gg/x/starknet/mainnet`
|
|
277
|
+
- `VOYAGER_API_BASE_URL=https://api.voyager.online/beta`
|
|
278
|
+
- Persistent volume `indexer_mainnet_data` mounted at `/data`
|
|
279
|
+
|
|
241
280
|
The `fly.toml` is pre-configured with:
|
|
242
281
|
- `shared-cpu-1x` / 512MB RAM
|
|
243
282
|
- Persistent volume mounted at `/data`
|
package/dist/api/app.d.ts
CHANGED
|
@@ -228,8 +228,8 @@ export declare function createApp(config: AppConfig): Elysia<"", {
|
|
|
228
228
|
get: {
|
|
229
229
|
body: unknown;
|
|
230
230
|
params: {
|
|
231
|
-
address: string;
|
|
232
231
|
provider: string;
|
|
232
|
+
address: string;
|
|
233
233
|
} & {};
|
|
234
234
|
query: unknown;
|
|
235
235
|
headers: unknown;
|
|
@@ -608,8 +608,8 @@ export declare function createApp(config: AppConfig): Elysia<"", {
|
|
|
608
608
|
put: {
|
|
609
609
|
body: {
|
|
610
610
|
name?: string;
|
|
611
|
-
secret?: string;
|
|
612
611
|
webhook_url?: string;
|
|
612
|
+
secret?: string;
|
|
613
613
|
filters?: {
|
|
614
614
|
traders?: string[];
|
|
615
615
|
eventTypes?: ("settlement" | "trade_move" | "market_created")[];
|
|
@@ -109,8 +109,8 @@ export declare const adminSubscriptionRoutes: (db: DatabaseService, adminApiKey:
|
|
|
109
109
|
put: {
|
|
110
110
|
body: {
|
|
111
111
|
name?: string;
|
|
112
|
-
secret?: string;
|
|
113
112
|
webhook_url?: string;
|
|
113
|
+
secret?: string;
|
|
114
114
|
filters?: {
|
|
115
115
|
traders?: string[];
|
|
116
116
|
eventTypes?: ("settlement" | "trade_move" | "market_created")[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,eAAO,MAAM,YAAY,GAAI,IAAI,eAAe,EAAE,WAAW,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,eAAO,MAAM,YAAY,GAAI,IAAI,eAAe,EAAE,WAAW,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgC9E,CAAC"}
|
|
@@ -25,6 +25,8 @@ export const healthRoutes = (db, rateLimit) => new Elysia().get('/health', () =>
|
|
|
25
25
|
lastPollAt: null,
|
|
26
26
|
voyager: {
|
|
27
27
|
isLimited: voyagerStatus.isLimited,
|
|
28
|
+
activeKeyCount: voyagerStatus.activeKeyCount,
|
|
29
|
+
limitedKeyCount: voyagerStatus.limitedKeyCount,
|
|
28
30
|
retryInSeconds: voyagerStatus.retryInSeconds,
|
|
29
31
|
escalationLevel: voyagerStatus.escalationLevel,
|
|
30
32
|
message: voyagerStatus.message,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAmB,EAAE,SAAgC,EAAE,EAAE,CACpF,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,GAAmB,EAAE;IAC/C,IAAI,QAAQ,GAAiC,cAAc,CAAC;IAC5D,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,IAAI,CAAC;QACH,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACrC,QAAQ,GAAG,WAAW,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;IAE5C,OAAO;QACL,MAAM,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QACxF,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;QACnD,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE;YACP,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,cAAc,EAAE,aAAa,CAAC,cAAc;YAC5C,eAAe,EAAE,aAAa,CAAC,eAAe;YAC9C,OAAO,EAAE,aAAa,CAAC,OAAO;SAC/B;KACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAmB,EAAE,SAAgC,EAAE,EAAE,CACpF,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,GAAmB,EAAE;IAC/C,IAAI,QAAQ,GAAiC,cAAc,CAAC;IAC5D,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,IAAI,CAAC;QACH,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACrC,QAAQ,GAAG,WAAW,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;IAE5C,OAAO;QACL,MAAM,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QACxF,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;QACnD,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE;YACP,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,cAAc,EAAE,aAAa,CAAC,cAAc;YAC5C,eAAe,EAAE,aAAa,CAAC,eAAe;YAC9C,cAAc,EAAE,aAAa,CAAC,cAAc;YAC5C,eAAe,EAAE,aAAa,CAAC,eAAe;YAC9C,OAAO,EAAE,aAAa,CAAC,OAAO;SAC/B;KACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
* Typed configuration parsed from environment variables.
|
|
3
3
|
*/
|
|
4
4
|
export interface IndexerConfig {
|
|
5
|
-
readonly
|
|
5
|
+
readonly network: StarknetNetwork;
|
|
6
|
+
readonly voyagerApiKeys: readonly string[];
|
|
7
|
+
readonly voyagerApiBaseUrl: string;
|
|
6
8
|
readonly adminApiKey: string;
|
|
7
9
|
readonly dbPath: string;
|
|
8
10
|
readonly port: number;
|
|
@@ -14,5 +16,10 @@ export interface IndexerConfig {
|
|
|
14
16
|
readonly voyagerBaseDelayMs: number;
|
|
15
17
|
readonly voyagerMinRequestIntervalMs: number;
|
|
16
18
|
}
|
|
19
|
+
export type StarknetNetwork = 'mainnet' | 'sepolia';
|
|
20
|
+
export declare const NETWORK_DEFAULTS: Record<StarknetNetwork, {
|
|
21
|
+
readonly starknetRpcUrl: string;
|
|
22
|
+
readonly voyagerApiBaseUrl: string;
|
|
23
|
+
}>;
|
|
17
24
|
export declare function loadConfig(): IndexerConfig;
|
|
18
25
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;CAC9C;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACnC,eAAe,EACf;IAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAUxE,CAAC;AAEF,wBAAgB,UAAU,IAAI,aAAa,CA+B1C"}
|
package/dist/config.js
CHANGED
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Typed configuration parsed from environment variables.
|
|
3
3
|
*/
|
|
4
|
+
export const NETWORK_DEFAULTS = {
|
|
5
|
+
mainnet: {
|
|
6
|
+
starknetRpcUrl: 'https://api.cartridge.gg/x/starknet/mainnet',
|
|
7
|
+
voyagerApiBaseUrl: 'https://api.voyager.online/beta',
|
|
8
|
+
},
|
|
9
|
+
sepolia: {
|
|
10
|
+
starknetRpcUrl: 'https://api.cartridge.gg/x/starknet/sepolia',
|
|
11
|
+
voyagerApiBaseUrl: 'https://sepolia-api.voyager.online/beta',
|
|
12
|
+
},
|
|
13
|
+
};
|
|
4
14
|
export function loadConfig() {
|
|
5
|
-
const voyagerApiKey = requireEnv('VOYAGER_API_KEY');
|
|
6
15
|
const adminApiKey = requireEnv('ADMIN_API_KEY');
|
|
7
16
|
const env = process.env;
|
|
17
|
+
const network = parseNetwork(env.STARKNET_NETWORK);
|
|
18
|
+
const networkDefaults = NETWORK_DEFAULTS[network];
|
|
8
19
|
return {
|
|
9
|
-
|
|
20
|
+
network,
|
|
21
|
+
voyagerApiKeys: parseVoyagerApiKeys(env),
|
|
22
|
+
voyagerApiBaseUrl: env.VOYAGER_API_BASE_URL ?? networkDefaults.voyagerApiBaseUrl,
|
|
10
23
|
adminApiKey,
|
|
11
24
|
dbPath: env.DB_PATH ?? './data/indexer.db',
|
|
12
25
|
port: envInt('PORT', 3000),
|
|
13
|
-
starknetRpcUrl: env.STARKNET_RPC_URL ??
|
|
26
|
+
starknetRpcUrl: env.STARKNET_RPC_URL ?? networkDefaults.starknetRpcUrl,
|
|
14
27
|
eventPollIntervalMs: envInt('EVENT_POLL_INTERVAL_MS', 15000),
|
|
15
28
|
statePollIntervalMs: envInt('STATE_POLL_INTERVAL_MS', 30000),
|
|
16
29
|
positionPollIntervalMs: envInt('POSITION_POLL_INTERVAL_MS', 60000),
|
|
@@ -19,6 +32,27 @@ export function loadConfig() {
|
|
|
19
32
|
voyagerMinRequestIntervalMs: envInt('VOYAGER_MIN_REQUEST_INTERVAL_MS', 250),
|
|
20
33
|
};
|
|
21
34
|
}
|
|
35
|
+
function parseVoyagerApiKeys(env) {
|
|
36
|
+
const rawKeys = [
|
|
37
|
+
...(env.VOYAGER_API_KEYS?.split(/[,\s]+/) ?? []),
|
|
38
|
+
env.VOYAGER_API_KEY,
|
|
39
|
+
env.VOYAGER_API_KEY_1,
|
|
40
|
+
env.VOYAGER_API_KEY_2,
|
|
41
|
+
env.VOYAGER_API_KEY_3,
|
|
42
|
+
];
|
|
43
|
+
const keys = Array.from(new Set(rawKeys.map((key) => key?.trim()).filter(Boolean)));
|
|
44
|
+
if (keys.length === 0) {
|
|
45
|
+
throw new Error('Missing required environment variable: VOYAGER_API_KEY or VOYAGER_API_KEYS');
|
|
46
|
+
}
|
|
47
|
+
return keys;
|
|
48
|
+
}
|
|
49
|
+
function parseNetwork(raw) {
|
|
50
|
+
const value = raw ?? 'sepolia';
|
|
51
|
+
if (value === 'mainnet' || value === 'sepolia') {
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Invalid STARKNET_NETWORK: "${value}"`);
|
|
55
|
+
}
|
|
22
56
|
function requireEnv(name) {
|
|
23
57
|
const value = process.env[name];
|
|
24
58
|
if (!value) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,5 +12,5 @@ import { VoyagerClientTag } from '../services/VoyagerClient';
|
|
|
12
12
|
import type { MarketType } from '../types';
|
|
13
13
|
import type { IndexerCycleResult } from './types';
|
|
14
14
|
export declare const indexMarketEvents: (marketAddress: string, marketType?: MarketType) => Effect.Effect<IndexerCycleResult, never, DatabaseTag | VoyagerClientTag | ChainReaderTag | EventBusTag>;
|
|
15
|
-
export declare const indexAllMarkets: Effect.Effect<IndexerCycleResult[], never,
|
|
15
|
+
export declare const indexAllMarkets: Effect.Effect<IndexerCycleResult[], never, DatabaseTag | ChainReaderTag | VoyagerClientTag | EventBusTag>;
|
|
16
16
|
//# sourceMappingURL=event-indexer.d.ts.map
|
|
@@ -13,6 +13,6 @@ interface PositionRefreshContext {
|
|
|
13
13
|
readonly existingPositionsByKey?: ReadonlyMap<string, UserPositionRow>;
|
|
14
14
|
}
|
|
15
15
|
export declare const refreshPosition: (marketAddress: string, trader: string, marketType?: MarketType, context?: PositionRefreshContext) => Effect.Effect<PositionRefreshResult, never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
16
|
-
export declare const refreshAllPositions: Effect.Effect<PositionRefreshResult[], never, DatabaseTag |
|
|
16
|
+
export declare const refreshAllPositions: Effect.Effect<PositionRefreshResult[], never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
17
17
|
export {};
|
|
18
18
|
//# sourceMappingURL=position-refresher.d.ts.map
|
|
@@ -9,6 +9,6 @@ interface StateRefreshContext {
|
|
|
9
9
|
readonly multinoulliSnapshotCountByMarket?: ReadonlyMap<string, number>;
|
|
10
10
|
}
|
|
11
11
|
export declare const refreshMarketState: (marketAddress: string, marketType?: MarketType, context?: StateRefreshContext) => Effect.Effect<StateRefreshResult, never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
12
|
-
export declare const refreshAllMarketStates: Effect.Effect<StateRefreshResult[], never, DatabaseTag |
|
|
12
|
+
export declare const refreshAllMarketStates: Effect.Effect<StateRefreshResult[], never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
13
13
|
export {};
|
|
14
14
|
//# sourceMappingURL=state-refresher.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -24,16 +24,23 @@ import { createWebhookDispatcher } from './services/WebhookDispatcher';
|
|
|
24
24
|
import { VoyagerRateLimitState } from './services/VoyagerRateLimit';
|
|
25
25
|
import { log } from './logger';
|
|
26
26
|
const config = loadConfig();
|
|
27
|
-
log.info('indexer starting', {
|
|
27
|
+
log.info('indexer starting', {
|
|
28
|
+
dbPath: config.dbPath,
|
|
29
|
+
network: config.network,
|
|
30
|
+
rpcUrl: config.starknetRpcUrl,
|
|
31
|
+
voyagerApiBaseUrl: config.voyagerApiBaseUrl,
|
|
32
|
+
voyagerApiKeyCount: config.voyagerApiKeys.length,
|
|
33
|
+
});
|
|
28
34
|
// ── Database setup (open + migrate) ────────────────────────────────────────
|
|
29
35
|
const db = createDatabase(config.dbPath);
|
|
30
36
|
initializeSchema(db);
|
|
31
37
|
log.info('database initialized');
|
|
32
38
|
// ── Build service layers ──────────────────────────────────────────────────
|
|
33
|
-
const voyagerRateLimit = new VoyagerRateLimitState(config.voyagerMinRequestIntervalMs);
|
|
34
|
-
const appLayer = Layer.mergeAll(DatabaseLive(db), EventBusLive(), VoyagerClientLive(config.
|
|
39
|
+
const voyagerRateLimit = new VoyagerRateLimitState(config.voyagerMinRequestIntervalMs, config.voyagerApiKeys.length);
|
|
40
|
+
const appLayer = Layer.mergeAll(DatabaseLive(db), EventBusLive(), VoyagerClientLive(config.voyagerApiKeys, voyagerRateLimit, {
|
|
35
41
|
maxRetries: config.voyagerMaxRetries,
|
|
36
42
|
baseDelayMs: config.voyagerBaseDelayMs,
|
|
43
|
+
baseUrl: config.voyagerApiBaseUrl,
|
|
37
44
|
}), ChainReaderLive(config.starknetRpcUrl));
|
|
38
45
|
// ── Extract plain service instances for imperative consumers ──────────────
|
|
39
46
|
const databaseService = Effect.runSync(Effect.provide(DatabaseTag, appLayer));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import type { VoyagerRateLimitState } from '../services/VoyagerRateLimit';
|
|
|
4
4
|
export interface VoyagerClientConfig {
|
|
5
5
|
readonly maxRetries: number;
|
|
6
6
|
readonly baseDelayMs: number;
|
|
7
|
+
readonly baseUrl?: string;
|
|
7
8
|
}
|
|
8
|
-
export declare const VoyagerClientLive: (
|
|
9
|
+
export declare const VoyagerClientLive: (apiKeys: string | readonly string[], rateLimit: VoyagerRateLimitState, clientConfig?: VoyagerClientConfig) => Layer.Layer<VoyagerClientTag>;
|
|
9
10
|
//# sourceMappingURL=VoyagerClientLive.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoyagerClientLive.d.ts","sourceRoot":"","sources":["../../src/layers/VoyagerClientLive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAAY,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAGL,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"VoyagerClientLive.d.ts","sourceRoot":"","sources":["../../src/layers/VoyagerClientLive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAAY,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAGL,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAG1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AA6BD,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,GAAG,SAAS,MAAM,EAAE,EACnC,WAAW,qBAAqB,EAChC,eAAc,mBAAoC,KACjD,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAiH9B,CAAC"}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { Duration, Effect, Layer, Schedule } from 'effect';
|
|
2
2
|
import { isRetryableVoyagerError, VoyagerApiError, VoyagerClientTag, } from '../services/VoyagerClient';
|
|
3
|
-
const BASE_URL = 'https://sepolia-api.voyager.online/beta';
|
|
4
3
|
const DEFAULT_CONFIG = {
|
|
5
4
|
maxRetries: 3,
|
|
6
5
|
baseDelayMs: 3000,
|
|
7
6
|
};
|
|
7
|
+
function normalizeApiKeys(apiKeys) {
|
|
8
|
+
const keys = (Array.isArray(apiKeys) ? apiKeys : [apiKeys])
|
|
9
|
+
.map((key) => key.trim())
|
|
10
|
+
.filter(Boolean);
|
|
11
|
+
if (keys.length === 0) {
|
|
12
|
+
throw new Error('VoyagerClientLive requires at least one API key');
|
|
13
|
+
}
|
|
14
|
+
return keys;
|
|
15
|
+
}
|
|
8
16
|
function parseRetryAfterMs(response) {
|
|
9
17
|
const header = response.headers.get('Retry-After');
|
|
10
18
|
if (!header) {
|
|
@@ -16,60 +24,86 @@ function parseRetryAfterMs(response) {
|
|
|
16
24
|
}
|
|
17
25
|
return undefined;
|
|
18
26
|
}
|
|
19
|
-
export const VoyagerClientLive = (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
export const VoyagerClientLive = (apiKeys, rateLimit, clientConfig = DEFAULT_CONFIG) => {
|
|
28
|
+
const keys = normalizeApiKeys(apiKeys);
|
|
29
|
+
let nextKeyIndex = 0;
|
|
30
|
+
function nextAvailableKey(attempted) {
|
|
31
|
+
for (let offset = 0; offset < keys.length; offset++) {
|
|
32
|
+
const index = (nextKeyIndex + offset) % keys.length;
|
|
33
|
+
if (!attempted.has(index) && !rateLimit.isLimited(index)) {
|
|
34
|
+
nextKeyIndex = (index + 1) % keys.length;
|
|
35
|
+
return index;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return Layer.succeed(VoyagerClientTag, VoyagerClientTag.of({
|
|
41
|
+
fetchEvents: (contractAddress, page, pageSize) => {
|
|
42
|
+
const fetchOnce = Effect.tryPromise({
|
|
43
|
+
try: async () => {
|
|
44
|
+
const attempted = new Set();
|
|
45
|
+
let lastRetryableError;
|
|
46
|
+
while (attempted.size < keys.length) {
|
|
47
|
+
const keyIndex = nextAvailableKey(attempted);
|
|
48
|
+
if (keyIndex == null) {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
attempted.add(keyIndex);
|
|
52
|
+
// Inter-request throttle is tracked per key, so one cooling key
|
|
53
|
+
// does not slow down the healthy keys in the pool.
|
|
54
|
+
await rateLimit.throttle(keyIndex);
|
|
55
|
+
const baseUrl = (clientConfig.baseUrl ?? 'https://sepolia-api.voyager.online/beta').replace(/\/+$/, '');
|
|
56
|
+
const url = new URL(`${baseUrl}/events`);
|
|
57
|
+
url.searchParams.set('contract', contractAddress);
|
|
58
|
+
url.searchParams.set('p', page.toString());
|
|
59
|
+
url.searchParams.set('ps', pageSize.toString());
|
|
60
|
+
const response = await fetch(url.toString(), {
|
|
61
|
+
headers: {
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
'x-api-key': keys[keyIndex],
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const retryAfterMs = parseRetryAfterMs(response);
|
|
68
|
+
const error = new VoyagerApiError(`Voyager API ${response.status}: ${response.statusText}`, response.status, retryAfterMs);
|
|
69
|
+
if (response.status === 429 || response.status === 503) {
|
|
70
|
+
rateLimit.recordRateLimit(keyIndex);
|
|
71
|
+
lastRetryableError = error;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
rateLimit.recordSuccess(keyIndex);
|
|
77
|
+
const data = (await response.json());
|
|
78
|
+
return { events: data.items, lastPage: data.lastPage };
|
|
79
|
+
}
|
|
25
80
|
const status = rateLimit.getStatus();
|
|
26
|
-
throw
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
url.searchParams.set('p', page.toString());
|
|
33
|
-
url.searchParams.set('ps', pageSize.toString());
|
|
34
|
-
const response = await fetch(url.toString(), {
|
|
35
|
-
headers: {
|
|
36
|
-
'Content-Type': 'application/json',
|
|
37
|
-
'x-api-key': apiKey,
|
|
38
|
-
},
|
|
39
|
-
});
|
|
40
|
-
if (!response.ok) {
|
|
41
|
-
const retryAfterMs = parseRetryAfterMs(response);
|
|
42
|
-
if (response.status === 429 || response.status === 503) {
|
|
43
|
-
rateLimit.recordRateLimit();
|
|
81
|
+
throw (lastRetryableError ??
|
|
82
|
+
new VoyagerApiError(`Rate limited — ${status.message}`, 429));
|
|
83
|
+
},
|
|
84
|
+
catch: (e) => {
|
|
85
|
+
if (e instanceof VoyagerApiError) {
|
|
86
|
+
return e;
|
|
44
87
|
}
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const shouldRetry = isRetryableVoyagerError(error);
|
|
67
|
-
if (shouldRetry) {
|
|
68
|
-
// Retry continues according to configured schedule.
|
|
69
|
-
}
|
|
70
|
-
return shouldRetry;
|
|
71
|
-
},
|
|
72
|
-
}));
|
|
73
|
-
},
|
|
74
|
-
}));
|
|
88
|
+
return new VoyagerApiError(e instanceof Error ? e.message : 'Unknown Voyager API error');
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
const retrySchedule = Schedule.compose(Schedule.jittered(Schedule.exponential(Duration.millis(clientConfig.baseDelayMs))), Schedule.recurs(clientConfig.maxRetries));
|
|
92
|
+
return fetchOnce.pipe(Effect.retry({
|
|
93
|
+
schedule: retrySchedule,
|
|
94
|
+
while: (error) => {
|
|
95
|
+
// Don't retry if we've just opened the rate-limit cooldown
|
|
96
|
+
if (rateLimit.isLimited()) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
const shouldRetry = isRetryableVoyagerError(error);
|
|
100
|
+
if (shouldRetry) {
|
|
101
|
+
// Retry continues according to configured schedule.
|
|
102
|
+
}
|
|
103
|
+
return shouldRetry;
|
|
104
|
+
},
|
|
105
|
+
}));
|
|
106
|
+
},
|
|
107
|
+
}));
|
|
108
|
+
};
|
|
75
109
|
//# sourceMappingURL=VoyagerClientLive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoyagerClientLive.js","sourceRoot":"","sources":["../../src/layers/VoyagerClientLive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"VoyagerClientLive.js","sourceRoot":"","sources":["../../src/layers/VoyagerClientLive.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
export interface RateLimitStatus {
|
|
12
12
|
/** Whether Voyager requests are currently paused. */
|
|
13
13
|
readonly isLimited: boolean;
|
|
14
|
+
/** Number of configured Voyager API keys. */
|
|
15
|
+
readonly activeKeyCount: number;
|
|
16
|
+
/** Number of Voyager API keys currently cooling down. */
|
|
17
|
+
readonly limitedKeyCount: number;
|
|
14
18
|
/** Unix ms when the current cooldown expires (0 = not limited). */
|
|
15
19
|
readonly resumesAt: number;
|
|
16
20
|
/** Seconds remaining until resume (0 = not limited). */
|
|
@@ -21,15 +25,13 @@ export interface RateLimitStatus {
|
|
|
21
25
|
readonly message: string | null;
|
|
22
26
|
}
|
|
23
27
|
export declare class VoyagerRateLimitState {
|
|
24
|
-
private
|
|
25
|
-
private cooldownUntil;
|
|
28
|
+
private slots;
|
|
26
29
|
private minRequestIntervalMs;
|
|
27
|
-
|
|
28
|
-
constructor(minRequestIntervalMs?: number);
|
|
30
|
+
constructor(minRequestIntervalMs?: number, slotCount?: number);
|
|
29
31
|
/** Check if requests are currently paused. If cooldown has expired, auto-close. */
|
|
30
|
-
isLimited(): boolean;
|
|
32
|
+
isLimited(slotIndex?: number): boolean;
|
|
31
33
|
/** Record a successful Voyager response — resets escalation. */
|
|
32
|
-
recordSuccess(): void;
|
|
34
|
+
recordSuccess(slotIndex?: number): void;
|
|
33
35
|
/** Record a 429/503 — immediately opens the circuit with escalating cooldown.
|
|
34
36
|
*
|
|
35
37
|
* Two guards:
|
|
@@ -43,10 +45,11 @@ export declare class VoyagerRateLimitState {
|
|
|
43
45
|
* so further increments only make `/health` lie about how bad things are.
|
|
44
46
|
* Cap observed in prod at 76 with no diagnostic value.
|
|
45
47
|
*/
|
|
46
|
-
recordRateLimit(): void;
|
|
48
|
+
recordRateLimit(slotIndex?: number): void;
|
|
47
49
|
/** Inter-request throttle: sleep if needed to respect min interval. */
|
|
48
|
-
throttle(): Promise<void>;
|
|
50
|
+
throttle(slotIndex?: number): Promise<void>;
|
|
49
51
|
/** Observable status snapshot for the health API. */
|
|
50
52
|
getStatus(): RateLimitStatus;
|
|
53
|
+
private getSlot;
|
|
51
54
|
}
|
|
52
55
|
//# sourceMappingURL=VoyagerRateLimit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoyagerRateLimit.d.ts","sourceRoot":"","sources":["../../src/services/VoyagerRateLimit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;
|
|
1
|
+
{"version":3,"file":"VoyagerRateLimit.d.ts","sourceRoot":"","sources":["../../src/services/VoyagerRateLimit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAQD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,oBAAoB,SAAM,EAAE,SAAS,SAAI;IASrD,mFAAmF;IACnF,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAgBtC,gEAAgE;IAChE,aAAa,CAAC,SAAS,SAAI,GAAG,IAAI;IAMlC;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,SAAS,SAAI,GAAG,IAAI;IAcpC,uEAAuE;IACjE,QAAQ,CAAC,SAAS,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C,qDAAqD;IACrD,SAAS,IAAI,eAAe;IA8B5B,OAAO,CAAC,OAAO;CAOhB"}
|
|
@@ -18,28 +18,36 @@ const COOLDOWN_STEPS_MS = [
|
|
|
18
18
|
1_800_000, // 30m
|
|
19
19
|
];
|
|
20
20
|
export class VoyagerRateLimitState {
|
|
21
|
-
|
|
22
|
-
cooldownUntil = 0;
|
|
21
|
+
slots;
|
|
23
22
|
minRequestIntervalMs;
|
|
24
|
-
|
|
25
|
-
constructor(minRequestIntervalMs = 250) {
|
|
23
|
+
constructor(minRequestIntervalMs = 250, slotCount = 1) {
|
|
26
24
|
this.minRequestIntervalMs = minRequestIntervalMs;
|
|
25
|
+
this.slots = Array.from({ length: Math.max(1, slotCount) }, () => ({
|
|
26
|
+
escalationLevel: 0,
|
|
27
|
+
cooldownUntil: 0,
|
|
28
|
+
lastRequestTime: 0,
|
|
29
|
+
}));
|
|
27
30
|
}
|
|
28
31
|
/** Check if requests are currently paused. If cooldown has expired, auto-close. */
|
|
29
|
-
isLimited() {
|
|
30
|
-
if (
|
|
32
|
+
isLimited(slotIndex) {
|
|
33
|
+
if (slotIndex == null) {
|
|
34
|
+
return this.slots.every((_slot, index) => this.isLimited(index));
|
|
35
|
+
}
|
|
36
|
+
const slot = this.getSlot(slotIndex);
|
|
37
|
+
if (slot.cooldownUntil === 0) {
|
|
31
38
|
return false;
|
|
32
39
|
}
|
|
33
|
-
if (Date.now() >=
|
|
34
|
-
|
|
40
|
+
if (Date.now() >= slot.cooldownUntil) {
|
|
41
|
+
slot.cooldownUntil = 0;
|
|
35
42
|
return false;
|
|
36
43
|
}
|
|
37
44
|
return true;
|
|
38
45
|
}
|
|
39
46
|
/** Record a successful Voyager response — resets escalation. */
|
|
40
|
-
recordSuccess() {
|
|
41
|
-
|
|
42
|
-
|
|
47
|
+
recordSuccess(slotIndex = 0) {
|
|
48
|
+
const slot = this.getSlot(slotIndex);
|
|
49
|
+
slot.escalationLevel = 0;
|
|
50
|
+
slot.cooldownUntil = 0;
|
|
43
51
|
}
|
|
44
52
|
/** Record a 429/503 — immediately opens the circuit with escalating cooldown.
|
|
45
53
|
*
|
|
@@ -54,47 +62,64 @@ export class VoyagerRateLimitState {
|
|
|
54
62
|
* so further increments only make `/health` lie about how bad things are.
|
|
55
63
|
* Cap observed in prod at 76 with no diagnostic value.
|
|
56
64
|
*/
|
|
57
|
-
recordRateLimit() {
|
|
58
|
-
if (this.isLimited()) {
|
|
65
|
+
recordRateLimit(slotIndex = 0) {
|
|
66
|
+
if (this.isLimited(slotIndex)) {
|
|
59
67
|
// Already in a cooldown window — don't double-count concurrent failures.
|
|
60
68
|
return;
|
|
61
69
|
}
|
|
62
|
-
const
|
|
70
|
+
const slot = this.getSlot(slotIndex);
|
|
71
|
+
const step = Math.min(slot.escalationLevel, COOLDOWN_STEPS_MS.length - 1);
|
|
63
72
|
const cooldownMs = COOLDOWN_STEPS_MS[step];
|
|
64
|
-
|
|
65
|
-
if (
|
|
66
|
-
|
|
73
|
+
slot.cooldownUntil = Date.now() + cooldownMs;
|
|
74
|
+
if (slot.escalationLevel < COOLDOWN_STEPS_MS.length) {
|
|
75
|
+
slot.escalationLevel++;
|
|
67
76
|
}
|
|
68
77
|
}
|
|
69
78
|
/** Inter-request throttle: sleep if needed to respect min interval. */
|
|
70
|
-
async throttle() {
|
|
79
|
+
async throttle(slotIndex = 0) {
|
|
80
|
+
const slot = this.getSlot(slotIndex);
|
|
71
81
|
const now = Date.now();
|
|
72
|
-
const elapsed = now -
|
|
82
|
+
const elapsed = now - slot.lastRequestTime;
|
|
73
83
|
if (elapsed < this.minRequestIntervalMs) {
|
|
74
84
|
await new Promise((resolve) => setTimeout(resolve, this.minRequestIntervalMs - elapsed));
|
|
75
85
|
}
|
|
76
|
-
|
|
86
|
+
slot.lastRequestTime = Date.now();
|
|
77
87
|
}
|
|
78
88
|
/** Observable status snapshot for the health API. */
|
|
79
89
|
getStatus() {
|
|
80
90
|
const now = Date.now();
|
|
91
|
+
const limitedSlots = this.slots.filter((_slot, index) => this.isLimited(index));
|
|
81
92
|
const isLimited = this.isLimited();
|
|
82
|
-
const
|
|
83
|
-
?
|
|
84
|
-
:
|
|
93
|
+
const resumesAt = limitedSlots.length === 0
|
|
94
|
+
? 0
|
|
95
|
+
: Math.min(...limitedSlots.map((slot) => slot.cooldownUntil).filter((value) => value > now));
|
|
96
|
+
const retryInSeconds = isLimited && resumesAt > 0 ? Math.ceil((resumesAt - now) / 1000) : 0;
|
|
97
|
+
const escalationLevel = Math.max(0, ...this.slots.map((slot) => slot.escalationLevel));
|
|
85
98
|
let message = null;
|
|
86
99
|
if (isLimited) {
|
|
87
100
|
const label = formatDuration(retryInSeconds * 1000);
|
|
88
|
-
message = `Chain metrics delayed, rate
|
|
101
|
+
message = `Chain metrics delayed, all Voyager API keys rate limited, retrying in ${label}`;
|
|
102
|
+
}
|
|
103
|
+
else if (limitedSlots.length > 0) {
|
|
104
|
+
message = `Voyager API key redundancy active, ${limitedSlots.length}/${this.slots.length} keys cooling down`;
|
|
89
105
|
}
|
|
90
106
|
return {
|
|
91
107
|
isLimited,
|
|
92
|
-
|
|
108
|
+
activeKeyCount: this.slots.length,
|
|
109
|
+
limitedKeyCount: limitedSlots.length,
|
|
110
|
+
resumesAt: isLimited ? resumesAt : 0,
|
|
93
111
|
retryInSeconds,
|
|
94
|
-
escalationLevel
|
|
112
|
+
escalationLevel,
|
|
95
113
|
message,
|
|
96
114
|
};
|
|
97
115
|
}
|
|
116
|
+
getSlot(slotIndex) {
|
|
117
|
+
const slot = this.slots[slotIndex];
|
|
118
|
+
if (!slot) {
|
|
119
|
+
throw new Error(`Invalid Voyager rate-limit slot: ${slotIndex}`);
|
|
120
|
+
}
|
|
121
|
+
return slot;
|
|
122
|
+
}
|
|
98
123
|
}
|
|
99
124
|
function formatDuration(ms) {
|
|
100
125
|
const totalSeconds = Math.ceil(ms / 1000);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoyagerRateLimit.js","sourceRoot":"","sources":["../../src/services/VoyagerRateLimit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,qDAAqD;AACrD,MAAM,iBAAiB,GAAG;IACxB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,MAAM;CACT,CAAC;
|
|
1
|
+
{"version":3,"file":"VoyagerRateLimit.js","sourceRoot":"","sources":["../../src/services/VoyagerRateLimit.ts"],"names":[],"mappings":"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"}
|
package/dist/types/api.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ import type { MultinoulliMatrixConstraintMode } from '@the-situation/abi';
|
|
|
5
5
|
import type { MarketType } from './market';
|
|
6
6
|
export interface VoyagerRateLimitInfo {
|
|
7
7
|
readonly isLimited: boolean;
|
|
8
|
+
readonly activeKeyCount: number;
|
|
9
|
+
readonly limitedKeyCount: number;
|
|
8
10
|
readonly retryInSeconds: number;
|
|
9
11
|
readonly escalationLevel: number;
|
|
10
12
|
readonly message: string | null;
|
package/dist/types/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"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"}
|