@saga-sync/producer 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +448 -0
- package/dist/chunk-builder/cli.js +2 -0
- package/dist/chunk-builder/cli.js.map +1 -1
- package/dist/orchestrator/cli.d.ts +3 -1
- package/dist/orchestrator/cli.d.ts.map +1 -1
- package/dist/orchestrator/cli.js +63 -20
- package/dist/orchestrator/cli.js.map +1 -1
- package/dist/scraper/cli.d.ts +1 -0
- package/dist/scraper/cli.d.ts.map +1 -1
- package/dist/scraper/cli.js +10 -1
- package/dist/scraper/cli.js.map +1 -1
- package/dist/scraper/config.d.ts +4 -0
- package/dist/scraper/config.d.ts.map +1 -1
- package/dist/scraper/config.js +18 -1
- package/dist/scraper/config.js.map +1 -1
- package/dist/scraper/scrape.d.ts.map +1 -1
- package/dist/scraper/scrape.js +39 -6
- package/dist/scraper/scrape.js.map +1 -1
- package/dist/storage/gcs-store.d.ts +1 -0
- package/dist/storage/gcs-store.d.ts.map +1 -1
- package/dist/storage/gcs-store.js +30 -2
- package/dist/storage/gcs-store.js.map +1 -1
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
# @saga-sync/producer
|
|
2
|
+
|
|
3
|
+
The producer side of **saga-sync** — the reference implementation of
|
|
4
|
+
[privacy-protocol-state-distribution](../../README.md). It scrapes a privacy
|
|
5
|
+
protocol's on-chain events, packages them into immutable compressed chunks with
|
|
6
|
+
integrity digests, and publishes an `index.json` manifest that any number of
|
|
7
|
+
[`@saga-sync/client`](../client) consumers can download and verify.
|
|
8
|
+
|
|
9
|
+
Three stages, each **both a standalone CLI and an importable library**:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
RPC ──▶ scraper ──NDJSON──▶ chunk-builder ──▶ Store (disk | gs://…)
|
|
13
|
+
▲ ▲ │ index.json + *.jsonl.gz
|
|
14
|
+
└──────── orchestrator (cron entry) ────────┘
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- **scraper** — connects to an Ethereum JSON-RPC, fetches event logs for a
|
|
18
|
+
protocol over a block range, normalizes them, emits them as NDJSON.
|
|
19
|
+
- **chunk-builder** — consumes that NDJSON, partitions it into size-bounded
|
|
20
|
+
immutable chunks (gzip + sha256), and maintains the append-only manifest. The
|
|
21
|
+
trailing partial chunk is kept as a mutable **hot head**.
|
|
22
|
+
- **orchestrator** — the cron entry point. Loops every protocol in the config,
|
|
23
|
+
runs `scrape → chunk` for each **in-process** in block-range batches, and owns
|
|
24
|
+
the hot-head lifecycle. This is the normal path; the two lower CLIs are for
|
|
25
|
+
backfills, debugging, or composing by hand.
|
|
26
|
+
|
|
27
|
+
Depends on [`@saga-sync/core`](../core) (schema, crypto, `Store`), `viem` (RPC),
|
|
28
|
+
`zod` (config validation), and optionally `@google-cloud/storage` (lazy-loaded,
|
|
29
|
+
only for `gs://` targets).
|
|
30
|
+
|
|
31
|
+
## Install & build
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pnpm install
|
|
35
|
+
pnpm build # tsc -b, builds core first
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The examples below run the built JS from the repo root (`packages/producer/dist/…`).
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Orchestrator CLI — the normal path
|
|
43
|
+
|
|
44
|
+
Loads every protocol from the config, computes each one's next-from-block from the
|
|
45
|
+
manifest (sealed chunks + mutable hot head), and loops `scrape → chunk` in
|
|
46
|
+
**batches** of `--batch-size` blocks (default 100K). Within a tick protocols run
|
|
47
|
+
sequentially, a lockfile prevents overlapping runs, and the trailing partial after
|
|
48
|
+
each batch is persisted as the protocol's **hot head** — subsequent ticks fold new
|
|
49
|
+
events into it until it reaches the size limit and is promoted into the immutable
|
|
50
|
+
list.
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
node packages/producer/dist/orchestrator/cli.js \
|
|
54
|
+
--config ./example-config.json \
|
|
55
|
+
--rpc https://ethereum-rpc.publicnode.com \
|
|
56
|
+
--output-dir ./chunks
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
stderr summary on a cold start with a forced-promotion size limit:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
orchestrator: tornado-cash-1-eth-0.1 ran 3 batch(es), sealed 14 chunk(s) + hot head [0x17f76ce, 0x17f7803)
|
|
63
|
+
orchestrator: 1 ran, 0 skipped, 0 failed [tip 0x17f7802]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
What gets created:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
./chunks/
|
|
70
|
+
tornado-cash-1-eth-0.1-[0x17f7000,0x17f71f3).jsonl.gz # immutable sealed chunks
|
|
71
|
+
...
|
|
72
|
+
tornado-cash-1-eth-0.1-[0x17f76ce,0x17f7803).hot.jsonl.gz # mutable hot head (one per protocol)
|
|
73
|
+
index.json
|
|
74
|
+
.orchestrator.lock # only present during a run
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Re-running with no chain advance is a no-op: the start block is derived from
|
|
78
|
+
`max(hotHead.toBlock, lastSealed.toBlock)` and the protocol is skipped when
|
|
79
|
+
there's nothing new. The previous hot-head file is deleted after the manifest is
|
|
80
|
+
updated (its URL changes each time the range advances, so every URL stays
|
|
81
|
+
immutable and CDN-cacheable).
|
|
82
|
+
|
|
83
|
+
### Cron entry (daily)
|
|
84
|
+
|
|
85
|
+
One entry handles every protocol; a still-running tick makes the next exit quietly
|
|
86
|
+
via the lockfile.
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
0 2 * * * cd /path/to/repo && node packages/producer/dist/orchestrator/cli.js \
|
|
90
|
+
--config ./example-config.json --rpc https://ethereum-rpc.publicnode.com \
|
|
91
|
+
--output-dir ./chunks >> /var/log/orchestrator.log 2>&1
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
For the cloud deployment (Cloud Run Job + Cloud Scheduler + Cloud CDN) see the
|
|
95
|
+
repo-root [DEPLOY.md](../../DEPLOY.md).
|
|
96
|
+
|
|
97
|
+
### Flags
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
--config <path> required config JSON (all protocols)
|
|
101
|
+
--rpc <url> required Ethereum JSON-RPC URL (one chain per run)
|
|
102
|
+
--output-dir <path> required chunks + index.json directory, or gs://bucket[/prefix]
|
|
103
|
+
--lock-dir <path> optional directory for .orchestrator.lock (default = output-dir)
|
|
104
|
+
--protocol-id <id> optional restrict to one protocol (backfills / reruns)
|
|
105
|
+
--batch-size <n> optional blocks per batch (default 100000)
|
|
106
|
+
--concurrency <n> optional protocols scraped in parallel (default 4)
|
|
107
|
+
--confirmations <n> optional fallback reorg buffer (default 12)
|
|
108
|
+
--window <n> optional scraper window (default 2000)
|
|
109
|
+
--size-limit <n> optional chunk cap if config has none (default 10 MiB)
|
|
110
|
+
--dry-run optional report what would run, touch nothing
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
- **`--protocol-id`** still derives the from-block from the manifest, so it
|
|
114
|
+
catches one protocol up to tip without affecting the others.
|
|
115
|
+
- **`--batch-size`** bounds the crash blast radius (in-flight events lost on crash
|
|
116
|
+
≤ one batch); larger batches reduce hot-head rewrite overhead during cold-start
|
|
117
|
+
backfills. Daily steady-state usually fits in one batch.
|
|
118
|
+
- **Chunk size** comes from each protocol's `chunkSettings.maxSizeBytes` in the
|
|
119
|
+
config, falling back to `--size-limit`.
|
|
120
|
+
- **`--dry-run`** prints per-protocol ranges without acquiring the lockfile — safe
|
|
121
|
+
alongside a live cron.
|
|
122
|
+
|
|
123
|
+
### Exit codes
|
|
124
|
+
|
|
125
|
+
- `0` — clean run (zero or more protocols ran, or another orchestrator held the lock)
|
|
126
|
+
- `1` — config error, missing flags, or unknown `--protocol-id`
|
|
127
|
+
- `2` — at least one protocol threw mid-run (others may still have succeeded)
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Scraper CLI
|
|
132
|
+
|
|
133
|
+
Pure "input range → output events": connects to an RPC, fetches + normalizes logs,
|
|
134
|
+
writes NDJSON to **stdout** and a one-line summary to **stderr**. Writes no chunks
|
|
135
|
+
or manifest.
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
node packages/producer/dist/scraper/cli.js \
|
|
139
|
+
--config ./example-config.json \
|
|
140
|
+
--protocol-id tornado-cash-1-eth-0.1 \
|
|
141
|
+
--rpc https://ethereum-rpc.publicnode.com \
|
|
142
|
+
--from-block 0xC50101 --to-block 0xC50200 \
|
|
143
|
+
--dry-run
|
|
144
|
+
# → NDJSON on stdout; stderr:
|
|
145
|
+
# scraper: 2 event(s) for tornado-cash-1-eth-0.1 [0xc50101, 0xc50200] (dry-run: cursor not updated)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Useful variations:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# Persist a cursor (drop --dry-run) — next run with no --from-block resumes from cursor+1
|
|
152
|
+
node .../scraper/cli.js --config ./example-config.json --protocol-id tornado-cash-1-eth-0.1 \
|
|
153
|
+
--rpc <url> --from-block 0xC50000 --to-block 0xC50100
|
|
154
|
+
cat cursor.json # → { "tornado-cash-1-eth-0.1": { "lastScrapedBlock": "0xc50100" } }
|
|
155
|
+
|
|
156
|
+
# Scrape up to the chain's finalized block (omit --to-block)
|
|
157
|
+
node .../scraper/cli.js --config ./example-config.json --protocol-id tornado-cash-1-eth-0.1 \
|
|
158
|
+
--rpc <url> --from-block 0xC50101 --dry-run
|
|
159
|
+
|
|
160
|
+
# Inspect with jq
|
|
161
|
+
node .../scraper/cli.js ... --dry-run | jq -c '{block: .blockNumber, topic: .eventTopic}'
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Flags
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
--config <path> required config JSON
|
|
168
|
+
--protocol-id <id> required protocol key to scrape
|
|
169
|
+
--rpc <url> required Ethereum JSON-RPC URL
|
|
170
|
+
--from-block <hex> optional override cursor / config fromBlock
|
|
171
|
+
--to-block <hex> optional override the resolved finalized block
|
|
172
|
+
--confirmations <n> optional fallback reorg buffer (default 12)
|
|
173
|
+
--window <n> optional blocks per eth_getLogs call (default 2000)
|
|
174
|
+
--cursor-dir <path> optional directory for cursor.json (default = config dir)
|
|
175
|
+
--dry-run optional do not persist the cursor
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Exit 0 on success, 1 on error.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Chunk-builder CLI
|
|
183
|
+
|
|
184
|
+
Reads `CanonicalEvent` NDJSON on **stdin** (scraper output), partitions the scanned
|
|
185
|
+
range into immutable `.jsonl.gz` chunks, and appends to a local `index.json`.
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
node packages/producer/dist/scraper/cli.js --config ./example-config.json \
|
|
189
|
+
--protocol-id tornado-cash-1-eth-0.1 --rpc <url> \
|
|
190
|
+
--from-block 0xC50101 --to-block 0xC50200 --dry-run \
|
|
191
|
+
| node packages/producer/dist/chunk-builder/cli.js \
|
|
192
|
+
--protocol-id tornado-cash-1-eth-0.1 \
|
|
193
|
+
--from-block 0xC50101 --to-block 0xC50201 \
|
|
194
|
+
--output-dir ./chunks
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Mind the upper bound.** The scraper's `--to-block` is **inclusive**
|
|
198
|
+
(`[from, to]`); the chunk-builder's is **exclusive** (`[from, to)`). To cover the
|
|
199
|
+
same range, pass `scraper.to_block + 1` to the chunk-builder.
|
|
200
|
+
|
|
201
|
+
The standalone CLI always **seals** the trailing partial (no hot heads — that path
|
|
202
|
+
is orchestrator-only). An empty range still emits one zero-byte chunk covering the
|
|
203
|
+
full `[from, to)`, so the manifest asserts the range was scanned.
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
# Force multiple chunks with a small size limit
|
|
207
|
+
node .../scraper/cli.js ... | node .../chunk-builder/cli.js \
|
|
208
|
+
--protocol-id tornado-cash-1-eth-0.1 --from-block 0xC50000 --to-block 0xC50501 \
|
|
209
|
+
--output-dir ./chunks --size-limit 800
|
|
210
|
+
|
|
211
|
+
# Inspect a chunk
|
|
212
|
+
gunzip -c './chunks/tornado-cash-1-eth-0.1-[0xc50101,0xc50201).jsonl.gz' | jq -c .
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Flags
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
--protocol-id <id> required manifest key + filename prefix
|
|
219
|
+
--from-block <hex> required inclusive start of the scanned range
|
|
220
|
+
--to-block <hex> required exclusive end of the scanned range
|
|
221
|
+
--output-dir <path> required chunks + index.json directory
|
|
222
|
+
--size-limit <n> optional max uncompressed bytes per chunk (default 10 MiB)
|
|
223
|
+
--dry-run optional compute metadata, write nothing
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Module internals
|
|
229
|
+
|
|
230
|
+
**`scraper/`** — pure "range → events"; writes no chunks or manifest.
|
|
231
|
+
|
|
232
|
+
- **`config.ts`** — reads the config JSON, zod-validates **only** the fields the
|
|
233
|
+
pipeline uses. `loadConfig(path, id)` returns one `ScraperTarget`;
|
|
234
|
+
`loadAllProtocols(path)` returns all. Validated: `chainId`, `fromBlock`,
|
|
235
|
+
`events[]`; optional `chunkSettings.maxSizeBytes`, `protocol`, `protocolMetadata`.
|
|
236
|
+
Derives `trackedAddresses`/`trackedEventTopics` from the unique
|
|
237
|
+
`events[].contractAddress`/`.eventTopic` in first-seen order.
|
|
238
|
+
- **`normalize.ts`** — `normalize(rpcLog)` → `CanonicalEvent`: lowercases every hex
|
|
239
|
+
field, sets `eventTopic = topics[0]`, keeps the full `topics` array (indexed args
|
|
240
|
+
like commitments/nullifiers), rejects pending logs, and drops only
|
|
241
|
+
`transactionHash`/`blockHash`.
|
|
242
|
+
- **`scrape.ts`** — `scrape(client, opts)`, an async generator yielding raw RPC
|
|
243
|
+
logs. Slices `[fromBlock, toBlock]` into `window`-sized sub-ranges, issuing one
|
|
244
|
+
`eth_getLogs` per event filter; on a range/result-size error it **halves the
|
|
245
|
+
window and retries**. Each window is fully buffered and sorted by
|
|
246
|
+
`(blockNumber, logIndex)` before any log is yielded, so a retry never double-emits.
|
|
247
|
+
- **`cursor.ts`** — `Cursor` over a `Store`, recording `lastScrapedBlock` per
|
|
248
|
+
protocol. **Only** the standalone scraper CLI uses it; the orchestrator derives
|
|
249
|
+
resume points from the manifest.
|
|
250
|
+
- **`cli.ts`** — the scraper entry point. Also exports `finalizedBlock(client)`
|
|
251
|
+
and `assertChainId(client, expected)`, reused by the orchestrator.
|
|
252
|
+
|
|
253
|
+
**`chunk-builder/`** — `CanonicalEvent` NDJSON → chunk files + drives core's `Manifest`.
|
|
254
|
+
|
|
255
|
+
- **`accumulator.ts`** — `ChunkAccumulator`, a **pure** block-aligned partition
|
|
256
|
+
state machine. Buffers the in-progress block separately and commits it only once
|
|
257
|
+
the next block arrives — a chunk boundary always falls *between* blocks (a
|
|
258
|
+
multi-event block is never split). `add(event)` returns a completed chunk on a
|
|
259
|
+
size boundary; `finish()` returns the trailing accumulator.
|
|
260
|
+
- **`archive.ts`** — `ChunkArchive` over a `Store`. `seal()` / `writeHotHead()`
|
|
261
|
+
build the JSONL, compute the sha256 of the **uncompressed** bytes, gzip, and
|
|
262
|
+
`put` under a range-derived filename. `readEvents()` is the inverse.
|
|
263
|
+
`buildJsonl()` is exported (the client's integration tests use it as a fixture
|
|
264
|
+
builder).
|
|
265
|
+
- **`cli.ts`** — `processStream(lines, args)` drives the accumulator: optional seed
|
|
266
|
+
events (a prior hot head) → stream events, sealing each completed chunk → the
|
|
267
|
+
trailing accumulator, either **sealed** (`trailingMode: "seal"`, standalone
|
|
268
|
+
default) or **returned** (`trailingMode: "suspend"`, the orchestrator's hot-head
|
|
269
|
+
carry-over).
|
|
270
|
+
|
|
271
|
+
**`orchestrator/`** — the cron entry point; composes the other two in-process.
|
|
272
|
+
|
|
273
|
+
- **`pipeline.ts`** — `runProtocolOnce(opts)` builds the scrape → normalize →
|
|
274
|
+
NDJSON generator and hands it to `processStream`. No subprocess, no stdio: errors
|
|
275
|
+
propagate as plain exceptions.
|
|
276
|
+
- **`cli.ts`** — per tick: acquire the lockfile, load config + manifest, query the
|
|
277
|
+
chain tip, then for each protocol run `processProtocol` (resolve start block,
|
|
278
|
+
load any prior hot head, loop `[start, tip]` in `--batch-size` steps, persist the
|
|
279
|
+
final trailing accumulator as the new hot head). Also exports `acquireLock(path)`.
|
|
280
|
+
|
|
281
|
+
**`storage/`** — the producer-only stores + the factory.
|
|
282
|
+
|
|
283
|
+
- **`GcsStore`** — write-side, backed by a GCS bucket (optional `prefix`). GCS
|
|
284
|
+
writes are atomic + strongly consistent (no temp-file+rename). Sets per-key
|
|
285
|
+
`Content-Type` + `Cache-Control` (sealed chunks immutable/long-lived; `index.json`
|
|
286
|
+
/ hot head short TTL). The `@google-cloud/storage` SDK is lazy-loaded behind an
|
|
287
|
+
injectable provider, so the module compiles + unit-tests without the dependency.
|
|
288
|
+
- **`DryRunStore`** — decorates another `Store`; `put`/`delete` become no-ops,
|
|
289
|
+
`get`/`list` pass through. How `--dry-run` is implemented without every other
|
|
290
|
+
class knowing about it.
|
|
291
|
+
- **`createStore(cfg)`** / **`parseStoreTarget(target)`** — the factory mapping
|
|
292
|
+
`disk`→core's `DiskStore`, `http`→core's `HttpStore`, `gcs`→`GcsStore`
|
|
293
|
+
(`s3`/`ftp` throw until added); a `gs://bucket[/prefix]` `--output-dir` selects
|
|
294
|
+
`GcsStore`, anything else is a local disk path.
|
|
295
|
+
|
|
296
|
+
**`keygen.ts`** — CLI that mints an Ed25519 manifest-signing keypair (over core's
|
|
297
|
+
`signing`). Set `MANIFEST_SIGNING_KEY` (a 32-byte hex seed) on the orchestrator /
|
|
298
|
+
chunk-builder to publish a signed `index.json.sig`; consumers pin the matching
|
|
299
|
+
public key via the client's `--public-key`.
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Data formats
|
|
304
|
+
|
|
305
|
+
### Config JSON (`--config`)
|
|
306
|
+
|
|
307
|
+
*What* to scrape, not *where/when*. The store target is a per-run CLI argument and
|
|
308
|
+
the schedule is external — all protocols in one config share one store + manifest.
|
|
309
|
+
|
|
310
|
+
```json
|
|
311
|
+
{
|
|
312
|
+
"protocols": {
|
|
313
|
+
"tornado-cash-1-eth-0.1": {
|
|
314
|
+
"chainId": "0x1",
|
|
315
|
+
"fromBlock": "0x8b1d26",
|
|
316
|
+
"chunkSettings": { "maxSizeBytes": 10485760 },
|
|
317
|
+
"protocol": "tornado-cash",
|
|
318
|
+
"protocolMetadata": { "denomination": "100000000000000000", "asset": "ETH" },
|
|
319
|
+
"events": [
|
|
320
|
+
{ "contractAddress": "0x12d66f87…", "eventTopic": "0xa945e51e…" },
|
|
321
|
+
{ "contractAddress": "0x12d66f87…", "eventTopic": "0xe9e508ba…",
|
|
322
|
+
"filter": ["0x000…indexed-arg-match"] }
|
|
323
|
+
]
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
| Field | Required | Meaning |
|
|
330
|
+
|---|---|---|
|
|
331
|
+
| `chainId` | yes | `0x`-hex chain id; verified against the RPC at startup |
|
|
332
|
+
| `fromBlock` | yes | contract deploy block; the cold-start scrape origin |
|
|
333
|
+
| `events[]` | yes | one entry per `(contractAddress, eventTopic)` to scrape |
|
|
334
|
+
| `events[].filter` | no | extra indexed-topic matchers appended after `eventTopic` |
|
|
335
|
+
| `chunkSettings.maxSizeBytes` | no | per-protocol chunk cap (number or `0x`-hex) |
|
|
336
|
+
| `protocol` | no | family name copied into the manifest (e.g. `tornado-cash`) |
|
|
337
|
+
| `protocolMetadata` | no | free-form passthrough; **immutable per stream** once first published |
|
|
338
|
+
|
|
339
|
+
The protocol key `${protocol}-${chainId}-${instanceId}` is treated as an opaque id
|
|
340
|
+
(chain identity comes from the explicit `chainId`, since the key itself isn't
|
|
341
|
+
safely parseable — protocol names contain hyphens).
|
|
342
|
+
|
|
343
|
+
### NDJSON (scraper stdout → chunk-builder stdin)
|
|
344
|
+
|
|
345
|
+
One `CanonicalEvent` per line, all-lowercase `0x`-hex, globally ordered by
|
|
346
|
+
`(blockNumber, logIndex)`:
|
|
347
|
+
|
|
348
|
+
```json
|
|
349
|
+
{"contractAddress":"0x12d6…","eventTopic":"0xa945…","topics":["0xa945…","0x1e8f…"],"data":"0x…","blockNumber":"0xc501f5","logIndex":"0x68"}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Chunk file `${protocolId}-[${fromBlock},${toBlock}).jsonl.gz`
|
|
353
|
+
|
|
354
|
+
Gzip-compressed JSONL of the NDJSON above, for the block range in the filename.
|
|
355
|
+
Immutable once written. An empty chunk is a zero-byte payload. The **hot-head file**
|
|
356
|
+
(`…hot.jsonl.gz`) is byte-identical in format — the only differences are the `.hot.`
|
|
357
|
+
infix and that the manifest tracks it in the entry's `hotHead` field, not `chunks`.
|
|
358
|
+
At most one hot head per protocol.
|
|
359
|
+
|
|
360
|
+
### Manifest `index.json`
|
|
361
|
+
|
|
362
|
+
Format **v1** — see the root [SPEC.md §3.1](../../SPEC.md) for the normative schema
|
|
363
|
+
and the root [README.md](../../README.md) for the protocol-level walkthrough. The
|
|
364
|
+
`Manifest` class that reads/writes it lives in [`@saga-sync/core`](../core).
|
|
365
|
+
`digest.data` is the sha256 of the **uncompressed** JSONL (`gunzip -c <file> |
|
|
366
|
+
shasum -a 256`); `size` is the compressed byte length. With a signing key set, a
|
|
367
|
+
sibling `index.json.sig` holds a detached Ed25519 signature over the exact bytes.
|
|
368
|
+
|
|
369
|
+
### State files
|
|
370
|
+
|
|
371
|
+
- **`cursor.json`** — the standalone scraper's resume pointer
|
|
372
|
+
(`{ "<id>": { "lastScrapedBlock": "0x…" } }`). The orchestrator does not use it.
|
|
373
|
+
- **`.orchestrator.lock`** — plain text pid, created `O_EXCL` at tick start, removed
|
|
374
|
+
on exit; a stale lock (dead pid) is reclaimed automatically.
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Invariants a replica must honor
|
|
379
|
+
|
|
380
|
+
These are what make two independent scrapers produce byte-identical chunks (see
|
|
381
|
+
[SPEC.md](../../SPEC.md) for the normative statements):
|
|
382
|
+
|
|
383
|
+
1. **Windowed `eth_getLogs` with adaptive split** — slice the range; on a
|
|
384
|
+
"range too large" / "too many results" error, halve the window and retry.
|
|
385
|
+
Buffer + sort each window before yielding.
|
|
386
|
+
2. **Normalization keeps the whole log** — lowercase all hex; `eventTopic` =
|
|
387
|
+
`topics[0]`; keep `topics[1..]`; drop only `transactionHash`/`blockHash`.
|
|
388
|
+
3. **Block-aligned chunking** — a chunk covers a half-open `[from, to)`; boundaries
|
|
389
|
+
fall between blocks, so all events of a block land in exactly one chunk.
|
|
390
|
+
4. **Size-bounded sealing** — seal when accumulated **uncompressed** bytes would
|
|
391
|
+
exceed the limit; the digest is sha256 of that uncompressed JSONL; `size` in the
|
|
392
|
+
manifest is the **compressed** count.
|
|
393
|
+
5. **Hot heads** — the trailing partial is written mutable (`*.hot.jsonl.gz`,
|
|
394
|
+
tracked in the entry's `hotHead`). The next run loads it, appends, re-writes; on
|
|
395
|
+
crossing the size limit it is **promoted** (overflow sealed, fresh hot head holds
|
|
396
|
+
the remainder).
|
|
397
|
+
6. **Batching** — process `[start, tip]` in `--batch-size` steps; each batch's
|
|
398
|
+
trailing accumulator seeds the next. The manifest advances only on a completed
|
|
399
|
+
seal, so a re-run is idempotent (`(blockNumber, logIndex)` is the dedup key).
|
|
400
|
+
7. **Reorg safety** — `toBlock` defaults to the chain's own **finalized** block;
|
|
401
|
+
fallback for RPCs without the tag is `head − confirmations` (default 12).
|
|
402
|
+
8. **Start-block resolution** — `hotHead.toBlock` → last sealed chunk's `toBlock` →
|
|
403
|
+
`config.fromBlock` (first run only). The manifest self-bootstraps after the first
|
|
404
|
+
chunk.
|
|
405
|
+
9. **Range-derived, immutable URLs** — every chunk/hot-head file is named
|
|
406
|
+
`${protocolId}-[${fromBlock},${toBlock})…`, so a URL's bytes never change. When a
|
|
407
|
+
hot head advances, a new file is written and the old one deleted; only the
|
|
408
|
+
manifest pointer is mutable.
|
|
409
|
+
10. **Single-writer lock** — the orchestrator holds `.orchestrator.lock` (`O_EXCL` +
|
|
410
|
+
pid, stale-pid recovery). A second instance exits quietly.
|
|
411
|
+
|
|
412
|
+
### Block-range conventions
|
|
413
|
+
|
|
414
|
+
- The **scraper** works in **inclusive** ranges `[fromBlock, toBlock]` (what
|
|
415
|
+
`eth_getLogs` takes).
|
|
416
|
+
- **Chunks and the manifest** use **half-open** ranges `[fromBlock, toBlock)`, so
|
|
417
|
+
consecutive chunks compose with no gap or overlap.
|
|
418
|
+
- The orchestrator bridges them: a scraper batch over inclusive `[X, Y]` becomes a
|
|
419
|
+
chunk-builder range of half-open `[X, Y+1)`.
|
|
420
|
+
|
|
421
|
+
Invariant: a protocol's sealed chunks + its hot head partition
|
|
422
|
+
`[firstSealed.fromBlock, hotHead.toBlock)` contiguously.
|
|
423
|
+
|
|
424
|
+
---
|
|
425
|
+
|
|
426
|
+
## Publishing to Google Cloud Storage
|
|
427
|
+
|
|
428
|
+
Publishing to GCS is entirely a `Store`-seam concern — the scrape/chunk logic, the
|
|
429
|
+
manifest/chunk format, and the client are all unchanged. Point `--output-dir` at a
|
|
430
|
+
bucket; consumers read the same objects over plain HTTP.
|
|
431
|
+
|
|
432
|
+
- **Producer write** — `--output-dir gs://bucket[/prefix]` routes through
|
|
433
|
+
`parseStoreTarget` → `GcsStore`, writing chunks + `index.json` with per-object
|
|
434
|
+
`Cache-Control` (sealed chunks `max-age=31536000, immutable`; `index.json` / hot
|
|
435
|
+
head `max-age=30`).
|
|
436
|
+
- **Consumer read** — point the client's manifest URL at a CDN in front of the
|
|
437
|
+
bucket, or at the bucket directly. `HttpStore` does plain GETs; nothing in the
|
|
438
|
+
client changes.
|
|
439
|
+
|
|
440
|
+
Operational notes: the lockfile is filesystem-only — for a `gs://` target it
|
|
441
|
+
defaults to the cwd (`--lock-dir` to override), and in a stateless container
|
|
442
|
+
single-execution scheduling is the real single-writer guard. Hot-head objects
|
|
443
|
+
orphan as their range advances; a GCS Object Lifecycle rule (delete
|
|
444
|
+
`*.hot.jsonl.gz` after N days) cleans them up. The bucket is public-read —
|
|
445
|
+
integrity comes from the sha256 digests, not access control.
|
|
446
|
+
|
|
447
|
+
The full cloud runbook (Cloud Run Job, Cloud Scheduler, Secret Manager, Cloud CDN)
|
|
448
|
+
is in the repo-root **[DEPLOY.md](../../DEPLOY.md)**.
|
|
@@ -147,6 +147,8 @@ async function main() {
|
|
|
147
147
|
archive,
|
|
148
148
|
manifest,
|
|
149
149
|
});
|
|
150
|
+
// Manifest mutations only schedule throttled writes; flush to make them durable.
|
|
151
|
+
await manifest.flush();
|
|
150
152
|
process.stderr.write(`chunk-builder: ${sealed.length} chunk(s) for ${args.protocolId} ` +
|
|
151
153
|
`[${numberToHex(args.fromBlock)}, ${numberToHex(args.toBlock)})` +
|
|
152
154
|
(args.dryRun ? " (dry-run: no files or manifest written)\n" : "\n"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/chunk-builder/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/chunk-builder/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,SAAS;AAEtD,MAAM,KAAK,GAAG;;;;;;;;;;;;qEAYuD,kBAAkB;;;CAGtF,CAAC;AAEF,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,OAAO,EAAE;YACP,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACjC,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;YAC9C,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;SAC1C;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,IAA8D,EAAU,EAAE;QACtF,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,CAAC;YAAE,IAAI,CAAC,sBAAsB,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACzC,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,iBAAiB,WAAW,CAAC,SAAS,CAAC,2BAA2B,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC3F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,gDAAgD,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;QAC/B,SAAS;QACT,OAAO;QACP,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,6CAA6C;QACzE,SAAS;QACT,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK;KACnC,CAAC;AACJ,CAAC;AAyBD,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAC3E,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAA4B,EAC5B,IAAiB;IAEjB,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEpE,MAAM,aAAa,GAAG,KAAK,EAAE,CAAiB,EAAiB,EAAE;QAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5F,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,gFAAgF;IAChF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,SAAS;gBAAE,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAE1B,IAAI,KAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CACb,kBAAkB,KAAK,CAAC,WAAW,yBAAyB;gBAC1D,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CACnE,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,SAAS;YAAE,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IACrD,IAAI,SAAS;QAAE,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;QAC7C,2EAA2E;QAC3E,iEAAiE;QACjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE;YACrE,IAAI,EAAE,QAAQ,CAAC,SAAS;YACxB,EAAE,EAAE,IAAI,CAAC,OAAO;SACjB,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,OAAO;QACL,MAAM;QACN,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;KAC5F,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IAEpF,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE;QACzC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO;QACP,QAAQ;KACT,CAAC,CAAC;IACH,iFAAiF;IACjF,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kBAAkB,MAAM,CAAC,MAAM,iBAAiB,IAAI,CAAC,UAAU,GAAG;QAChE,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG;QAChE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,IAAI,CAAC,CACtE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,YAAY,EAAE,EAAE,CAAC;IACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC5B,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -12,6 +12,7 @@ declare function parseCliArgs(): {
|
|
|
12
12
|
protocolId: string | undefined;
|
|
13
13
|
batchSize: bigint;
|
|
14
14
|
confirmations: bigint;
|
|
15
|
+
concurrency: number;
|
|
15
16
|
window: number;
|
|
16
17
|
sizeLimit: number;
|
|
17
18
|
dryRun: boolean;
|
|
@@ -32,6 +33,7 @@ declare function processProtocol(args: {
|
|
|
32
33
|
sealedChunks: number;
|
|
33
34
|
finalHotHead: ChunkMeta | null;
|
|
34
35
|
}>;
|
|
36
|
+
declare function runPool<T>(items: T[], concurrency: number, worker: (item: T) => Promise<void>): Promise<void>;
|
|
35
37
|
declare function main(): Promise<void>;
|
|
36
|
-
export { main, parseCliArgs, processProtocol };
|
|
38
|
+
export { main, parseCliArgs, processProtocol, runPool };
|
|
37
39
|
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/orchestrator/cli.ts"],"names":[],"mappings":";AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/orchestrator/cli.ts"],"names":[],"mappings":";AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAyC3D,iBAAS,YAAY;;;;;;;;;;;;EAkDpB;AAKD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA2DjD;AAID,iBAAe,eAAe,CAAC,IAAI,EAAE;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,CAAC,CA6FxF;AAKD,iBAAe,OAAO,CAAC,CAAC,EACtB,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CASf;AAED,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqHnC;AAgBD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/orchestrator/cli.js
CHANGED
|
@@ -3,8 +3,8 @@ import { parseArgs } from "node:util";
|
|
|
3
3
|
import { mkdirSync, openSync, writeFileSync, closeSync, unlinkSync, readFileSync, realpathSync, } from "node:fs";
|
|
4
4
|
import { resolve, join } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
-
import {
|
|
7
|
-
import { finalizedBlock, assertChainId } from "../scraper/cli.js";
|
|
6
|
+
import { numberToHex } from "viem";
|
|
7
|
+
import { finalizedBlock, assertChainId, createRpcClient } from "../scraper/cli.js";
|
|
8
8
|
import { loadAllProtocols } from "../scraper/config.js";
|
|
9
9
|
import { createStore, parseStoreTarget } from "../storage/index.js";
|
|
10
10
|
import { Manifest } from "@saga-sync/core";
|
|
@@ -15,6 +15,7 @@ const DEFAULT_WINDOW = 2000;
|
|
|
15
15
|
const DEFAULT_CONFIRMATIONS = 12n;
|
|
16
16
|
const DEFAULT_SIZE_LIMIT = 10 * 1024 * 1024;
|
|
17
17
|
const DEFAULT_BATCH_SIZE = 100000n;
|
|
18
|
+
const DEFAULT_CONCURRENCY = 4;
|
|
18
19
|
const USAGE = `orchestrator — run scrape→chunk in batches for every protocol
|
|
19
20
|
|
|
20
21
|
Usage:
|
|
@@ -33,6 +34,8 @@ Options:
|
|
|
33
34
|
hot-head rewrite overhead.
|
|
34
35
|
--confirmations <n> fallback reorg buffer when "finalized" tag is unsupported
|
|
35
36
|
(default 12)
|
|
37
|
+
--concurrency <n> protocols scraped in parallel (default 4). Raise together
|
|
38
|
+
with Cloud Run --memory; mind the RPC provider's rate limit.
|
|
36
39
|
--window <n> scraper window size in blocks (default 2000)
|
|
37
40
|
--size-limit <n> chunk size cap in bytes if config does not specify it
|
|
38
41
|
(default 10485760 = 10 MiB)
|
|
@@ -53,6 +56,7 @@ function parseCliArgs() {
|
|
|
53
56
|
"protocol-id": { type: "string" },
|
|
54
57
|
"batch-size": { type: "string" },
|
|
55
58
|
confirmations: { type: "string" },
|
|
59
|
+
concurrency: { type: "string" },
|
|
56
60
|
window: { type: "string" },
|
|
57
61
|
"size-limit": { type: "string" },
|
|
58
62
|
"dry-run": { type: "boolean", default: false },
|
|
@@ -72,6 +76,10 @@ function parseCliArgs() {
|
|
|
72
76
|
const batchSize = values["batch-size"] ? BigInt(values["batch-size"]) : DEFAULT_BATCH_SIZE;
|
|
73
77
|
if (batchSize <= 0n)
|
|
74
78
|
fail(`--batch-size must be positive; got ${values["batch-size"]}`);
|
|
79
|
+
const concurrency = values.concurrency ? Number(values.concurrency) : DEFAULT_CONCURRENCY;
|
|
80
|
+
if (!Number.isInteger(concurrency) || concurrency < 1) {
|
|
81
|
+
fail(`--concurrency must be a positive integer; got ${values.concurrency}`);
|
|
82
|
+
}
|
|
75
83
|
return {
|
|
76
84
|
configPath: resolve(need("config")),
|
|
77
85
|
rpc: need("rpc"),
|
|
@@ -80,6 +88,7 @@ function parseCliArgs() {
|
|
|
80
88
|
protocolId: values["protocol-id"],
|
|
81
89
|
batchSize,
|
|
82
90
|
confirmations: values.confirmations ? BigInt(values.confirmations) : DEFAULT_CONFIRMATIONS,
|
|
91
|
+
concurrency,
|
|
83
92
|
window: values.window ? Number(values.window) : DEFAULT_WINDOW,
|
|
84
93
|
sizeLimit: values["size-limit"] ? Number(values["size-limit"]) : DEFAULT_SIZE_LIMIT,
|
|
85
94
|
dryRun: values["dry-run"] ?? false,
|
|
@@ -236,6 +245,19 @@ async function processProtocol(args) {
|
|
|
236
245
|
}
|
|
237
246
|
return { ranBatches, sealedChunks: totalSealed, finalHotHead };
|
|
238
247
|
}
|
|
248
|
+
// Bounded worker pool: run `worker` over `items` with at most `concurrency`
|
|
249
|
+
// in flight. `concurrency` workers pull from a shared cursor until it drains,
|
|
250
|
+
// so a slow protocol never blocks others and no more than N run at once.
|
|
251
|
+
async function runPool(items, concurrency, worker) {
|
|
252
|
+
let cursor = 0;
|
|
253
|
+
const runners = Array.from({ length: Math.min(concurrency, items.length) }, async () => {
|
|
254
|
+
while (cursor < items.length) {
|
|
255
|
+
const item = items[cursor++];
|
|
256
|
+
await worker(item);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
await Promise.all(runners);
|
|
260
|
+
}
|
|
239
261
|
async function main() {
|
|
240
262
|
const args = parseCliArgs();
|
|
241
263
|
const storeConfig = parseStoreTarget(args.output);
|
|
@@ -256,41 +278,45 @@ async function main() {
|
|
|
256
278
|
const store = createStore({ ...storeConfig, dryRun: args.dryRun });
|
|
257
279
|
const archive = new ChunkArchive(store);
|
|
258
280
|
const manifest = await Manifest.load(store, undefined, { signer: signerFromEnv() });
|
|
259
|
-
const client =
|
|
281
|
+
const client = createRpcClient(args.rpc);
|
|
260
282
|
const tip = (await finalizedBlock(client)) ?? (await client.getBlockNumber()) - args.confirmations;
|
|
261
283
|
const ids = args.protocolId
|
|
262
284
|
? args.protocolId in protocols
|
|
263
285
|
? [args.protocolId]
|
|
264
286
|
: fail(`unknown --protocol-id "${args.protocolId}". Known: ${Object.keys(protocols).join(", ")}`)
|
|
265
287
|
: Object.keys(protocols);
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
288
|
+
// Process one protocol end-to-end, returning its outcome. Protocols are
|
|
289
|
+
// independent (disjoint manifest keys + content-addressed chunk files) and the
|
|
290
|
+
// manifest serializes its own writes, so these run concurrently. Failures are
|
|
291
|
+
// isolated per protocol — one throw never aborts the others.
|
|
292
|
+
const runOne = async (protocolId) => {
|
|
270
293
|
const protocol = protocols[protocolId];
|
|
271
294
|
if (!protocol)
|
|
272
|
-
|
|
295
|
+
return "skipped";
|
|
273
296
|
try {
|
|
274
297
|
await assertChainId(client, protocol.chainId);
|
|
275
298
|
}
|
|
276
299
|
catch (err) {
|
|
277
300
|
process.stderr.write(`orchestrator: skipping ${protocolId} — ${err.message}\n`);
|
|
278
|
-
skipped
|
|
279
|
-
continue;
|
|
301
|
+
return "skipped";
|
|
280
302
|
}
|
|
281
303
|
const startFrom = manifest.lastCoveredBlock(protocolId) ?? BigInt(protocol.fromBlock);
|
|
282
|
-
if (startFrom > tip)
|
|
283
|
-
skipped
|
|
284
|
-
continue;
|
|
285
|
-
}
|
|
304
|
+
if (startFrom > tip)
|
|
305
|
+
return "skipped";
|
|
286
306
|
if (args.dryRun) {
|
|
287
307
|
const batches = Math.ceil(Number((tip - startFrom + 1n) / args.batchSize)) || 1;
|
|
288
308
|
process.stderr.write(`orchestrator: [dry-run] ${protocolId} would scan ` +
|
|
289
309
|
`[${numberToHex(startFrom)}, ${numberToHex(tip)}] in ${batches} batch(es)\n`);
|
|
290
|
-
ran
|
|
291
|
-
continue;
|
|
310
|
+
return "ran";
|
|
292
311
|
}
|
|
293
312
|
try {
|
|
313
|
+
await manifest.setProtocolMeta(protocolId, {
|
|
314
|
+
protocol: protocol.protocol,
|
|
315
|
+
protocolMetadata: protocol.protocolMetadata,
|
|
316
|
+
chainId: protocol.chainId,
|
|
317
|
+
trackedAddresses: protocol.trackedAddresses,
|
|
318
|
+
trackedEventTopics: protocol.trackedEventTopics,
|
|
319
|
+
});
|
|
294
320
|
const result = await processProtocol({
|
|
295
321
|
client,
|
|
296
322
|
protocolId,
|
|
@@ -307,13 +333,30 @@ async function main() {
|
|
|
307
333
|
: "";
|
|
308
334
|
process.stderr.write(`orchestrator: ${protocolId} ran ${result.ranBatches} batch(es), ` +
|
|
309
335
|
`sealed ${result.sealedChunks} chunk(s)${hot}\n`);
|
|
310
|
-
ran
|
|
336
|
+
return "ran";
|
|
311
337
|
}
|
|
312
338
|
catch (err) {
|
|
313
339
|
process.stderr.write(`orchestrator: ${protocolId} failed — ${err.message}\n`);
|
|
314
|
-
failed
|
|
340
|
+
return "failed";
|
|
315
341
|
}
|
|
316
|
-
}
|
|
342
|
+
};
|
|
343
|
+
// Counter writes run in async continuations on a single thread, so the
|
|
344
|
+
// increments never race even though the protocols run in parallel.
|
|
345
|
+
let ran = 0;
|
|
346
|
+
let skipped = 0;
|
|
347
|
+
let failed = 0;
|
|
348
|
+
await runPool(ids, args.concurrency, async (protocolId) => {
|
|
349
|
+
const outcome = await runOne(protocolId);
|
|
350
|
+
if (outcome === "ran")
|
|
351
|
+
ran += 1;
|
|
352
|
+
else if (outcome === "skipped")
|
|
353
|
+
skipped += 1;
|
|
354
|
+
else
|
|
355
|
+
failed += 1;
|
|
356
|
+
});
|
|
357
|
+
// Flush the coalesced manifest writer: mutations only scheduled throttled
|
|
358
|
+
// writes, so this guarantees the final state is durable before we exit.
|
|
359
|
+
await manifest.flush();
|
|
317
360
|
process.stderr.write(`orchestrator: ${ran} ran, ${skipped} skipped, ${failed} failed [tip ${numberToHex(tip)}]` +
|
|
318
361
|
(args.dryRun ? " (dry-run)\n" : "\n"));
|
|
319
362
|
if (failed > 0)
|
|
@@ -332,5 +375,5 @@ if (isMainModule()) {
|
|
|
332
375
|
fail(err instanceof Error ? err.message : String(err));
|
|
333
376
|
});
|
|
334
377
|
}
|
|
335
|
-
export { main, parseCliArgs, processProtocol };
|
|
378
|
+
export { main, parseCliArgs, processProtocol, runPool };
|
|
336
379
|
//# sourceMappingURL=cli.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/orchestrator/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/orchestrator/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,SAAS,EACT,QAAQ,EACR,aAAa,EACb,SAAS,EACT,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,MAAM,kBAAkB,GAAG,OAAQ,CAAC;AACpC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb,CAAC;AAEF,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,OAAO,EAAE;YACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACjC,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACjC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;YAC9C,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;SAC1C;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,IAAqC,EAAU,EAAE;QAC7D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,CAAC;YAAE,IAAI,CAAC,sBAAsB,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC3F,IAAI,SAAS,IAAI,EAAE;QAAE,IAAI,CAAC,sCAAsC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAExF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC1F,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,iDAAiD,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;QAChB,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,6CAA6C;QACzE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC;QACjC,SAAS;QACT,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,qBAAqB;QAC1F,WAAW;QACX,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc;QAC9D,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB;QACnF,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK;KACnC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,iFAAiF;AACjF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAChC,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/C,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,GAAS,EAAE;gBACzB,IAAI,CAAC;oBACH,UAAU,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBAAC,MAAM,CAAC;oBACP,kBAAkB;gBACpB,CAAC;YACH,CAAC,CAAC;YACF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACxB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACzB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;YACjD,IAAI,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAEjC,IAAI,QAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC;oBACH,UAAU,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC1B,OAAO,KAAK,CAAC,CAAC,cAAc;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,EAAE,GAAI,CAA2B,CAAC,IAAI,CAAC;gBAC7C,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;oBACnB,IAAI,CAAC;wBACH,UAAU,CAAC,IAAI,CAAC,CAAC;oBACnB,CAAC;oBAAC,MAAM,CAAC;wBACP,UAAU;oBACZ,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,OAAO,KAAK,CAAC,CAAC,kDAAkD;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,kDAAkD;AAClD,KAAK,UAAU,eAAe,CAAC,IAU9B;IACC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAEzE,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpG,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE5E,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvE,wEAAwE;IACxE,wEAAwE;IACxE,IAAI,QAAQ,GAAG,WAAW,CAAC;IAC3B,IAAI,WAAW,IAAI,UAAU,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;QAChG,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iBAAiB,UAAU,8BAA8B,WAAW,CAAC,OAAO,cAAc,WAAW,CAAC,UAAU,CAAC,kBAAkB,CACpI,CAAC;QACF,MAAM,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;IAED,MAAM,UAAU,GACd,QAAQ,IAAI,aAAa,KAAK,IAAI;QAChC,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,UAAU,KAAK,IAAI;YACnB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEnC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QACrB,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAChE,CAAC;IAED,sEAAsE;IACtE,IAAI,QAAoG,CAAC;IACzG,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,GAAG;YACT,MAAM,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC1C,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;SACtC,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC;IAE1D,0EAA0E;IAC1E,IAAI,UAAU,GAAG,UAAU,CAAC;IAC5B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,UAAU,IAAI,GAAG,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU;YACV,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;YACP,QAAQ;YACR,GAAG,CAAC,QAAQ,IAAI;gBACd,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE;aACpE,CAAC;YACF,YAAY,EAAE,SAAS;SACxB,CAAC,CAAC;QACH,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACpC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3B,UAAU,GAAG,QAAQ,GAAG,EAAE,CAAC;QAC3B,UAAU,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,2EAA2E;IAC3E,uEAAuE;IACvE,IAAI,YAAY,GAAqB,IAAI,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,aAAa,GAAG,QAAQ,CAAC;QAC/B,YAAY,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,EAAE;YAC1E,IAAI,EAAE,aAAa,CAAC,SAAS;YAC7B,EAAE,EAAE,GAAG,GAAG,EAAE;SACb,CAAC,CAAC;QACH,MAAM,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAEpD,sEAAsE;QACtE,6EAA6E;QAC7E,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;YACpD,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACjE,CAAC;AAED,4EAA4E;AAC5E,8EAA8E;AAC9E,yEAAyE;AACzE,KAAK,UAAU,OAAO,CACpB,KAAU,EACV,WAAmB,EACnB,MAAkC;IAElC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;QACrF,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAE,CAAC;YAC9B,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,gFAAgF;IAChF,2EAA2E;IAC3E,8EAA8E;IAC9E,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,OAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAE1F,4DAA4D;IAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mDAAmD,QAAQ,cAAc,CAC1E,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAiB,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,GAAG,GACP,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;IAEzF,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU;QACzB,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS;YAC5B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,UAAU,aAAa,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE3B,wEAAwE;IACxE,+EAA+E;IAC/E,8EAA8E;IAC9E,6DAA6D;IAC7D,MAAM,MAAM,GAAG,KAAK,EAAE,UAAkB,EAAyC,EAAE;QACjF,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,UAAU,MAAO,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;YAC3F,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtF,IAAI,SAAS,GAAG,GAAG;YAAE,OAAO,SAAS,CAAC;QAEtC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,SAAS,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;YAChF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2BAA2B,UAAU,cAAc;gBACjD,IAAI,WAAW,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC,GAAG,CAAC,QAAQ,OAAO,cAAc,CAC/E,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,eAAe,CAAC,UAAU,EAAE;gBACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;gBAC3C,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;gBAC3C,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;aAChD,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;gBACnC,MAAM;gBACN,UAAU;gBACV,QAAQ;gBACR,OAAO;gBACP,QAAQ;gBACR,GAAG;gBACH,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY;gBAC7B,CAAC,CAAC,gBAAgB,MAAM,CAAC,YAAY,CAAC,SAAS,KAAK,MAAM,CAAC,YAAY,CAAC,OAAO,GAAG;gBAClF,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iBAAiB,UAAU,QAAQ,MAAM,CAAC,UAAU,cAAc;gBAChE,UAAU,MAAM,CAAC,YAAY,YAAY,GAAG,IAAI,CACnD,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,UAAU,aAAc,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;YACzF,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,uEAAuE;IACvE,mEAAmE;IACnE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;QACxD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,OAAO,KAAK,KAAK;YAAE,GAAG,IAAI,CAAC,CAAC;aAC3B,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,CAAC;;YACxC,MAAM,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iBAAiB,GAAG,SAAS,OAAO,aAAa,MAAM,gBAAgB,WAAW,CAAC,GAAG,CAAC,GAAG;QACxF,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CACxC,CAAC;IACF,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,YAAY,EAAE,EAAE,CAAC;IACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC5B,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/scraper/cli.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import type { Hex, PublicClient } from "viem";
|
|
3
|
+
export declare function createRpcClient(rpc: string): PublicClient;
|
|
3
4
|
export declare function finalizedBlock(client: PublicClient): Promise<bigint | null>;
|
|
4
5
|
export declare function assertChainId(client: PublicClient, expected: Hex): Promise<void>;
|
|
5
6
|
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/scraper/cli.ts"],"names":[],"mappings":";AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/scraper/cli.ts"],"names":[],"mappings":";AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAkF9C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAIzD;AAKD,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOjF;AAID,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtF"}
|
package/dist/scraper/cli.js
CHANGED
|
@@ -73,6 +73,15 @@ function parseCliArgs() {
|
|
|
73
73
|
dryRun: values["dry-run"] ?? false,
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
|
+
// Build the JSON-RPC client used for scraping. `batch` coalesces the many
|
|
77
|
+
// concurrent eth_getLogs (multiple protocols and event filters in flight under
|
|
78
|
+
// --concurrency) into batched HTTP calls, and viem's transport retries transient
|
|
79
|
+
// failures — including provider rate-limit (429) and 5xx — with backoff.
|
|
80
|
+
export function createRpcClient(rpc) {
|
|
81
|
+
return createPublicClient({
|
|
82
|
+
transport: http(rpc, { batch: true, retryCount: 5, retryDelay: 250 }),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
76
85
|
// The chain's own finalized block — reorg-proof, no per-chain table needed.
|
|
77
86
|
// Returns null if the RPC/chain does not support the "finalized" tag, which
|
|
78
87
|
// triggers the --confirmations fallback in step 2.
|
|
@@ -103,7 +112,7 @@ async function main() {
|
|
|
103
112
|
});
|
|
104
113
|
const cursor = await Cursor.load(cursorStore);
|
|
105
114
|
// 1. Connect to the RPC (and verify it is on the chain the config declares)
|
|
106
|
-
const client =
|
|
115
|
+
const client = createRpcClient(args.rpc);
|
|
107
116
|
await assertChainId(client, config.chainId);
|
|
108
117
|
// 2. Resolve the block range to scan
|
|
109
118
|
const toBlock = args.toBlock ??
|
package/dist/scraper/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/scraper/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/scraper/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/scraper/config.d.ts
CHANGED
|
@@ -9,6 +9,10 @@ export type ScraperTarget = {
|
|
|
9
9
|
fromBlock: Hex;
|
|
10
10
|
events: EventFilter[];
|
|
11
11
|
maxSizeBytes?: number;
|
|
12
|
+
protocol?: string;
|
|
13
|
+
protocolMetadata?: Record<string, unknown>;
|
|
14
|
+
trackedAddresses: Hex[];
|
|
15
|
+
trackedEventTopics: Hex[];
|
|
12
16
|
};
|
|
13
17
|
export declare function loadConfig(path: string, protocolId: string): ScraperTarget;
|
|
14
18
|
export declare function loadAllProtocols(path: string): Record<string, ScraperTarget>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/scraper/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/scraper/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAyChC,MAAM,MAAM,WAAW,GAAG;IACxB,eAAe,EAAE,GAAG,CAAC;IACrB,UAAU,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,GAAG,CAAC;IACb,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,WAAW,EAAE,CAAC;IAGtB,YAAY,CAAC,EAAE,MAAM,CAAC;IAItB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,gBAAgB,EAAE,GAAG,EAAE,CAAC;IACxB,kBAAkB,EAAE,GAAG,EAAE,CAAC;CAC3B,CAAC;AAkDF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAO1E;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAO5E"}
|
package/dist/scraper/config.js
CHANGED
|
@@ -28,6 +28,12 @@ const targetSchema = z.object({
|
|
|
28
28
|
fromBlock: quantity,
|
|
29
29
|
events: z.array(eventFilterSchema).min(1, "at least one event filter is required"),
|
|
30
30
|
chunkSettings: chunkSettingsSchema,
|
|
31
|
+
// Descriptive metadata surfaced in the manifest (all optional). `protocol` is
|
|
32
|
+
// the family name (e.g. "tornado-cash"); `protocolMetadata` is a free-form
|
|
33
|
+
// passthrough copied verbatim into the manifest — a blank slate for
|
|
34
|
+
// protocol-specific fields. See the manifest's write-once immutability note.
|
|
35
|
+
protocol: z.string().optional(),
|
|
36
|
+
protocolMetadata: z.record(z.unknown()).optional(),
|
|
31
37
|
});
|
|
32
38
|
function readAndParse(path) {
|
|
33
39
|
let raw;
|
|
@@ -57,13 +63,24 @@ function parseTarget(path, protocolId, raw) {
|
|
|
57
63
|
: typeof maxSizeRaw === "number"
|
|
58
64
|
? maxSizeRaw
|
|
59
65
|
: Number(BigInt(maxSizeRaw));
|
|
66
|
+
const events = parsed.data.events;
|
|
67
|
+
// Unique tracked contract addresses / event topics, in config (first-seen) order.
|
|
68
|
+
const trackedAddresses = [...new Set(events.map((e) => e.contractAddress))];
|
|
69
|
+
const trackedEventTopics = [...new Set(events.map((e) => e.eventTopic))];
|
|
60
70
|
const target = {
|
|
61
71
|
chainId: parsed.data.chainId,
|
|
62
72
|
fromBlock: parsed.data.fromBlock,
|
|
63
|
-
events
|
|
73
|
+
events,
|
|
74
|
+
trackedAddresses,
|
|
75
|
+
trackedEventTopics,
|
|
64
76
|
};
|
|
65
77
|
if (maxSizeBytes !== undefined)
|
|
66
78
|
target.maxSizeBytes = maxSizeBytes;
|
|
79
|
+
if (parsed.data.protocol !== undefined)
|
|
80
|
+
target.protocol = parsed.data.protocol;
|
|
81
|
+
if (parsed.data.protocolMetadata !== undefined) {
|
|
82
|
+
target.protocolMetadata = parsed.data.protocolMetadata;
|
|
83
|
+
}
|
|
67
84
|
return target;
|
|
68
85
|
}
|
|
69
86
|
export function loadConfig(path, protocolId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/scraper/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,OAAO,GAAG,CAAC;KACd,MAAM,EAAE;KACR,KAAK,CAAC,qBAAqB,EAAE,0CAA0C,CAAC,CAAC;AAC5E,MAAM,KAAK,GAAG,CAAC;KACZ,MAAM,EAAE;KACR,KAAK,CAAC,qBAAqB,EAAE,wCAAwC,CAAC,CAAC;AAC1E,MAAM,QAAQ,GAAG,CAAC;KACf,MAAM,EAAE;KACR,KAAK,CAAC,kBAAkB,EAAE,qCAAqC,CAAC,CAAC;AAEpE,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,eAAe,EAAE,OAAO;IACxB,UAAU,EAAE,KAAK;IACjB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,sEAAsE;AACtE,4EAA4E;AAC5E,uEAAuE;AACvE,MAAM,mBAAmB,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC1E,CAAC;KACD,WAAW,EAAE;KACb,QAAQ,EAAE,CAAC;AAEd,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,QAAQ;IACjB,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,uCAAuC,CAAC;IAClF,aAAa,EAAE,mBAAmB;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/scraper/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/scraper/scrape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAO,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;
|
|
1
|
+
{"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/scraper/scrape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAO,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAsBF,wBAAuB,MAAM,CAC3B,MAAM,EAAE,YAAY,EACpB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,GACpD,cAAc,CAAC,MAAM,CAAC,CA4BxB"}
|
package/dist/scraper/scrape.js
CHANGED
|
@@ -4,9 +4,22 @@ import { numberToHex } from "viem";
|
|
|
4
4
|
// than a provider will accept. On a range/result-size error the window is halved
|
|
5
5
|
// and the same sub-range retried — that adaptive split is what makes this work
|
|
6
6
|
// against real RPCs whose limits vary.
|
|
7
|
+
// Sustained provider rate-limiting is retried with exponential backoff on top of
|
|
8
|
+
// viem's own transport retries; cap the attempts so a persistent outage still
|
|
9
|
+
// surfaces rather than hanging the run.
|
|
10
|
+
const MAX_RATE_LIMIT_RETRIES = 8;
|
|
11
|
+
const RATE_LIMIT_BASE_MS = 250;
|
|
12
|
+
const RATE_LIMIT_CAP_MS = 30_000;
|
|
13
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
14
|
+
// Exponential backoff with full jitter, capped.
|
|
15
|
+
function backoffMs(attempt) {
|
|
16
|
+
const exp = Math.min(RATE_LIMIT_CAP_MS, RATE_LIMIT_BASE_MS * 2 ** attempt);
|
|
17
|
+
return Math.round(Math.random() * exp);
|
|
18
|
+
}
|
|
7
19
|
export async function* scrape(client, { fromBlock, toBlock, events, window }) {
|
|
8
20
|
let windowSize = BigInt(Math.max(1, Math.floor(window)));
|
|
9
21
|
let start = fromBlock;
|
|
22
|
+
let rateLimitRetries = 0;
|
|
10
23
|
while (start <= toBlock) {
|
|
11
24
|
let end = start + windowSize - 1n;
|
|
12
25
|
if (end > toBlock)
|
|
@@ -20,18 +33,26 @@ export async function* scrape(client, { fromBlock, toBlock, events, window }) {
|
|
|
20
33
|
windowSize = windowSize / 2n;
|
|
21
34
|
continue; // retry the same `start` with a smaller window
|
|
22
35
|
}
|
|
36
|
+
if (isRateLimitError(err) && rateLimitRetries < MAX_RATE_LIMIT_RETRIES) {
|
|
37
|
+
await sleep(backoffMs(rateLimitRetries++));
|
|
38
|
+
continue; // back off and retry the same window (don't shrink it)
|
|
39
|
+
}
|
|
23
40
|
throw err;
|
|
24
41
|
}
|
|
25
42
|
for (const log of logs)
|
|
26
43
|
yield log;
|
|
27
44
|
start = end + 1n;
|
|
45
|
+
rateLimitRetries = 0; // a successful window resets the backoff counter
|
|
28
46
|
}
|
|
29
47
|
}
|
|
30
48
|
async function getLogsForWindow(client, fromBlock, toBlock, events) {
|
|
31
|
-
|
|
32
|
-
|
|
49
|
+
// Fetch every event filter's logs for this window concurrently; with the
|
|
50
|
+
// client's batch transport these coalesce into a single batched HTTP call.
|
|
51
|
+
// If any filter hits a range error the whole window rejects and scrape()
|
|
52
|
+
// halves it and retries — idempotent, so re-fetching the others is fine.
|
|
53
|
+
const perFilter = await Promise.all(events.map((filter) => {
|
|
33
54
|
const topics = [filter.eventTopic, ...(filter.filter ?? [])];
|
|
34
|
-
|
|
55
|
+
return client.request({
|
|
35
56
|
method: "eth_getLogs",
|
|
36
57
|
params: [
|
|
37
58
|
{
|
|
@@ -41,9 +62,9 @@ async function getLogsForWindow(client, fromBlock, toBlock, events) {
|
|
|
41
62
|
toBlock: numberToHex(toBlock),
|
|
42
63
|
},
|
|
43
64
|
],
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
|
|
65
|
+
});
|
|
66
|
+
}));
|
|
67
|
+
const out = perFilter.flat();
|
|
47
68
|
// Windows are scanned in ascending order; sorting within the window makes the
|
|
48
69
|
// whole NDJSON stream globally ordered by (blockNumber, logIndex).
|
|
49
70
|
out.sort((a, b) => {
|
|
@@ -67,4 +88,16 @@ function isRangeError(err) {
|
|
|
67
88
|
msg.includes("response size") ||
|
|
68
89
|
msg.includes("query timeout"));
|
|
69
90
|
}
|
|
91
|
+
// Provider throttling (e.g. Alchemy "compute units per second capacity"). Kept
|
|
92
|
+
// disjoint from isRangeError's terms so a rate limit backs off rather than
|
|
93
|
+
// pointlessly shrinking the window. Checked after isRangeError.
|
|
94
|
+
function isRateLimitError(err) {
|
|
95
|
+
const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
|
96
|
+
return (msg.includes("429") ||
|
|
97
|
+
msg.includes("rate limit") ||
|
|
98
|
+
msg.includes("too many requests") ||
|
|
99
|
+
msg.includes("capacity") ||
|
|
100
|
+
msg.includes("compute unit") ||
|
|
101
|
+
msg.includes("throughput"));
|
|
102
|
+
}
|
|
70
103
|
//# sourceMappingURL=scrape.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/scraper/scrape.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAUnC,0EAA0E;AAC1E,iFAAiF;AACjF,iFAAiF;AACjF,+EAA+E;AAC/E,uCAAuC;AACvC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,MAAM,CAC3B,MAAoB,EACpB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAiB;IAErD,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,KAAK,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/scraper/scrape.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcs-store.d.ts","sourceRoot":"","sources":["../../src/storage/gcs-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAO7C,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AACF,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,QAAQ,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,IAAI,EAAE;QAAE,cAAc,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AACD,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC,CAAC;CACxE;AACD,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAUpE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIlD;AAkBD,MAAM,MAAM,eAAe,GAAG;IAG5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAKF,qBAAa,QAAS,YAAW,KAAK;IAMlC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,YAAY,CAAC,CAAqB;gBAGvB,UAAU,EAAE,MAAM,EACnC,IAAI,GAAE,eAAoB;IAM5B,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,GAAG;IAIL,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"gcs-store.d.ts","sourceRoot":"","sources":["../../src/storage/gcs-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAO7C,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AACF,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,QAAQ,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,IAAI,EAAE;QAAE,cAAc,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AACD,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC,CAAC;CACxE;AACD,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAUpE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIlD;AAkBD,MAAM,MAAM,eAAe,GAAG;IAG5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAKF,qBAAa,QAAS,YAAW,KAAK;IAMlC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,YAAY,CAAC,CAAqB;gBAGvB,UAAU,EAAE,MAAM,EACnC,IAAI,GAAE,eAAoB;IAM5B,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,GAAG;IAIL,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAW5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAI9C;AAkBD,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAUnE"}
|
|
@@ -52,11 +52,14 @@ export class GcsStore {
|
|
|
52
52
|
}
|
|
53
53
|
async put(key, data) {
|
|
54
54
|
const file = (await this.bucket()).file(this.obj(key));
|
|
55
|
-
|
|
55
|
+
// GCS caps mutations to a single object at ~1/sec; the manifest coalesces
|
|
56
|
+
// writes to stay under it, but retry 429s with backoff as a safety net so a
|
|
57
|
+
// transient burst never fails a run.
|
|
58
|
+
await withRetry(() => file.save(data, {
|
|
56
59
|
contentType: contentTypeFor(key),
|
|
57
60
|
metadata: { cacheControl: cacheControlFor(key) },
|
|
58
61
|
resumable: false,
|
|
59
|
-
});
|
|
62
|
+
}));
|
|
60
63
|
}
|
|
61
64
|
async get(key) {
|
|
62
65
|
const file = (await this.bucket()).file(this.obj(key));
|
|
@@ -82,4 +85,29 @@ export class GcsStore {
|
|
|
82
85
|
function isNotFound(err) {
|
|
83
86
|
return typeof err === "object" && err !== null && err.code === 404;
|
|
84
87
|
}
|
|
88
|
+
function isRateLimit(err) {
|
|
89
|
+
if (typeof err !== "object" || err === null)
|
|
90
|
+
return false;
|
|
91
|
+
if (err.code === 429)
|
|
92
|
+
return true;
|
|
93
|
+
const msg = String(err.message ?? "").toLowerCase();
|
|
94
|
+
return msg.includes("429") || msg.includes("rate limit");
|
|
95
|
+
}
|
|
96
|
+
const RETRY_ATTEMPTS = 6;
|
|
97
|
+
const RETRY_BASE_MS = 500;
|
|
98
|
+
// Retry a put on GCS 429 (object mutation rate limit) with exponential backoff +
|
|
99
|
+
// full jitter; other errors propagate immediately. Exported for tests.
|
|
100
|
+
export async function withRetry(fn) {
|
|
101
|
+
for (let attempt = 0;; attempt++) {
|
|
102
|
+
try {
|
|
103
|
+
return await fn();
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
if (!isRateLimit(err) || attempt >= RETRY_ATTEMPTS)
|
|
107
|
+
throw err;
|
|
108
|
+
const cap = Math.min(15_000, RETRY_BASE_MS * 2 ** attempt);
|
|
109
|
+
await new Promise((r) => setTimeout(r, Math.round(Math.random() * cap)));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
85
113
|
//# sourceMappingURL=gcs-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcs-store.js","sourceRoot":"","sources":["../../src/storage/gcs-store.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,GAAG,cAAc,CAAC;AAC9B,MAAM,GAAG,GAAG,mBAAmB,CAAC;AAEhC,iFAAiF;AACjF,iFAAiF;AACjF,kFAAkF;AAClF,kFAAkF;AAClF,sEAAsE;AACtE,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,qCAAqC,CAAC;IACrF,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACnD,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACrD,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAED,kFAAkF;AAClF,+EAA+E;AAC/E,yCAAyC;AACzC,MAAM,qBAAqB,GAAmB,KAAK,EAAE,MAAM,EAAE,EAAE;IAC7D,MAAM,IAAI,GAAG,uBAAuB,CAAC;IACrC,IAAI,GAA+D,CAAC;IACpE,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAA0B,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC;AAUF,gFAAgF;AAChF,8EAA8E;AAC9E,0EAA0E;AAC1E,MAAM,OAAO,QAAQ;IAMA;IALF,MAAM,CAAS;IACf,QAAQ,CAAiB;IAClC,YAAY,CAAsB;IAE1C,YACmB,UAAkB,EACnC,OAAwB,EAAE;QADT,eAAU,GAAV,UAAU,CAAQ;QAGnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,IAAI,qBAAqB,CAAC;IAC/D,CAAC;IAEO,MAAM;QACZ,OAAO,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,GAAG,CAAC,GAAW;QACrB,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAgB;QACrC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"gcs-store.js","sourceRoot":"","sources":["../../src/storage/gcs-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@saga-sync/producer",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Producer side of saga-sync: scraper, chunk-builder, orchestrator, and cloud stores",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"repository": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"viem": "^2.21.0",
|
|
37
37
|
"zod": "^3.23.8",
|
|
38
|
-
"@saga-sync/core": "0.1.
|
|
38
|
+
"@saga-sync/core": "0.1.4"
|
|
39
39
|
},
|
|
40
40
|
"optionalDependencies": {
|
|
41
41
|
"@google-cloud/storage": "^7.19.0"
|