@notuslabs/yail 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -3
- package/dist/cache/cached.d.ts +30 -0
- package/dist/cache/cached.d.ts.map +1 -0
- package/dist/cache/cached.js +42 -0
- package/dist/cache/cached.js.map +1 -0
- package/dist/cache/stores.d.ts +9 -0
- package/dist/cache/stores.d.ts.map +1 -0
- package/dist/cache/stores.js +20 -0
- package/dist/cache/stores.js.map +1 -0
- package/dist/config/types.d.ts +9 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/db/migrate.d.ts +8 -4
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +33 -4
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/sql.d.ts +2 -1
- package/dist/db/sql.d.ts.map +1 -1
- package/dist/db/sql.js +2 -1
- package/dist/db/sql.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer/context.d.ts +6 -1
- package/dist/indexer/context.d.ts.map +1 -1
- package/dist/indexer/context.js +4 -0
- package/dist/indexer/context.js.map +1 -1
- package/dist/indexer/events.d.ts +10 -2
- package/dist/indexer/events.d.ts.map +1 -1
- package/dist/indexer/events.js +14 -0
- package/dist/indexer/events.js.map +1 -1
- package/dist/indexer/plan.d.ts +1 -0
- package/dist/indexer/plan.d.ts.map +1 -1
- package/dist/indexer/plan.js +11 -2
- package/dist/indexer/plan.js.map +1 -1
- package/dist/indexer/runtime.d.ts +3 -0
- package/dist/indexer/runtime.d.ts.map +1 -1
- package/dist/indexer/runtime.js +84 -43
- package/dist/indexer/runtime.js.map +1 -1
- package/dist/observability/metrics.d.ts +3 -1
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +2 -1
- package/dist/observability/metrics.js.map +1 -1
- package/dist/schema/ddl.d.ts +4 -1
- package/dist/schema/ddl.d.ts.map +1 -1
- package/dist/schema/ddl.js +12 -2
- package/dist/schema/ddl.js.map +1 -1
- package/dist/schema/index.d.ts +3 -3
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +2 -2
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/view.d.ts +23 -1
- package/dist/schema/view.d.ts.map +1 -1
- package/dist/schema/view.js +9 -0
- package/dist/schema/view.js.map +1 -1
- package/dist/sources/cached.js +1 -1
- package/dist/sources/cached.js.map +1 -1
- package/dist/sources/fixture.d.ts +2 -1
- package/dist/sources/fixture.d.ts.map +1 -1
- package/dist/sources/fixture.js +16 -5
- package/dist/sources/fixture.js.map +1 -1
- package/dist/sources/hypersync.d.ts +10 -1
- package/dist/sources/hypersync.d.ts.map +1 -1
- package/dist/sources/hypersync.js +121 -28
- package/dist/sources/hypersync.js.map +1 -1
- package/dist/sources/rpc.d.ts.map +1 -1
- package/dist/sources/rpc.js +2 -0
- package/dist/sources/rpc.js.map +1 -1
- package/dist/sources/types.d.ts +31 -0
- package/dist/sources/types.d.ts.map +1 -1
- package/dist/sources/types.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -76,7 +76,7 @@ A source is one interface: `getHeight()` + `fetch(query)` yielding ordered batch
|
|
|
76
76
|
|
|
77
77
|
| source | use |
|
|
78
78
|
|---|---|
|
|
79
|
-
| `hypersync({ url, apiToken })` | production EVM. Token from `ENVIO_API_TOKEN` if omitted. |
|
|
79
|
+
| `hypersync({ url, apiToken, traces? })` | production EVM. Token from `ENVIO_API_TOKEN` if omitted. `traces: { url, fromBlock? }` names the trace-enabled endpoint for the queries that ask for traces, from the first block it holds (`base-traces` starts at 24,000,000: before that, those queries go to `url` without traces). |
|
|
80
80
|
| `rpc({ url })` | any JSON-RPC node; slower, no token, used to record fixtures |
|
|
81
81
|
| `esplora({ url })` | Bitcoin address history through mempool.space / blockstream / electrs |
|
|
82
82
|
| `cached(source, { db, chain })` | ClickHouse page cache in front of any source; `cache: { source: true }` in the config does this for every chain |
|
|
@@ -114,6 +114,13 @@ export const dailyMv = materializedView("wallet_daily_mv", {
|
|
|
114
114
|
- Every table gets three hidden columns (`_yail_chain`, `_yail_block`, `_yail_version`). They make re-indexing and versioned dedup work. Opt out with `indexMeta: false` for aggregate targets.
|
|
115
115
|
- Default engine is `ReplacingMergeTree(_yail_version)`: re-inserting a row with the same key (re-run, backfill overlap, crash replay) never double counts. Read with `FINAL` (`db.rows()` does) or let merges settle.
|
|
116
116
|
- Materialized views are first class: created by `yail migrate`, backfilled over existing data with `yail migrate --populate`.
|
|
117
|
+
They sum rows as they are inserted, before dedup, so a re-insert (replay, re-index) counts twice.
|
|
118
|
+
- Refreshable materialized views (`materializedView(name, { to, from, query, refresh: { schedule: "EVERY 1 HOUR", append: true, populate } })`)
|
|
119
|
+
re-run their SELECT on a schedule into a real table, so they can join across rows and tables, which an insert-time
|
|
120
|
+
view cannot. With `append` the query covers a recent window and the target's ReplacingMergeTree key dedups it;
|
|
121
|
+
`populate` is the unwindowed query `yail migrate --populate` runs once for the history. ClickHouse >= 24.
|
|
122
|
+
- Plain views (``view("balances", sql`SELECT … FROM ${ledger} FINAL …`)``) hold no data: they run on every read, so they
|
|
123
|
+
always agree with their tables. `yail migrate` creates or replaces them, each after the views it reads.
|
|
117
124
|
|
|
118
125
|
### Handlers
|
|
119
126
|
|
|
@@ -125,10 +132,11 @@ indexer.on("Pool:Swap", async ({ event, context }) => {
|
|
|
125
132
|
context.db // insert (buffered), find (buffer-aware), rows, query, command
|
|
126
133
|
context.client // viem readContract with a ClickHouse cache keyed by block (needs `rpc` on the chain)
|
|
127
134
|
context.http // fetch with optional ClickHouse cache: http.get(url, { cache: true })
|
|
135
|
+
context.cache // an answer computed once per chain and key: context.cache({ key: ["tokenMetadata", address], handler: async () => … })
|
|
128
136
|
context.addresses // has/register/list for address sets
|
|
129
137
|
context.log // evlog wide event of the current batch: log.set({ ... })
|
|
130
138
|
});
|
|
131
|
-
indexer.on("Wallets:transaction", ...) // EVM: { transaction, block, address, direction
|
|
139
|
+
indexer.on("Wallets:transaction", ...) // EVM: { transaction, block, address, direction, logs, traces }
|
|
132
140
|
// Bitcoin: { tx, block, address, received, sent, net, fee, isSender }
|
|
133
141
|
indexer.on("setup", ...) // once per chain before indexing starts
|
|
134
142
|
```
|
|
@@ -137,6 +145,53 @@ Writes are buffered per source batch and flushed as one INSERT per table before
|
|
|
137
145
|
|
|
138
146
|
`context.db.find(table, key)` looks at the current batch's buffer first, then ClickHouse. It is fine for last-value state (a pool's current tick), but the ClickHouse way is to write immutable facts and let `SummingMergeTree`/`AggregatingMergeTree` materialized views maintain aggregates.
|
|
139
147
|
|
|
148
|
+
### Wallet activity
|
|
149
|
+
|
|
150
|
+
An account normally matches the transactions an address sends or receives. With `activity: true` it matches every
|
|
151
|
+
transaction that mentions the address: in any indexed log topic (token transfers, user operations, approvals…) or as the
|
|
152
|
+
sender or recipient of a call trace. The event then carries the whole transaction: `event.logs` (all of its logs) and
|
|
153
|
+
`event.traces` (all of its call frames), one event per transaction and address.
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
accounts: { Wallets: { chain: "base", address: addressSet("wallets"), activity: true } },
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Traces come only from trace-enabled HyperSync endpoints (e.g. `https://eth-traces.hypersync.xyz`,
|
|
160
|
+
`https://base-traces.hypersync.xyz`, a paid add-on), named in `hypersync({ traces })`; elsewhere `event.traces` is
|
|
161
|
+
empty. Needs HyperSync (`rpc()` refuses whole-transaction queries). The whole-transaction query only carries the
|
|
162
|
+
account's own filters: a contract's logs on the same chain are fetched apart and merged by block, so a DEX's every
|
|
163
|
+
swap does not come back with its transaction and traces.
|
|
164
|
+
|
|
165
|
+
### Cache
|
|
166
|
+
|
|
167
|
+
`context.cache({ key, handler })` (after useQuery) computes an answer once per chain and key and keeps it in the store: a token's metadata over
|
|
168
|
+
RPC, a price from an API, a request through a provider. Later calls read the store, concurrent calls share one run.
|
|
169
|
+
The store is `cache.store` in the config: `memory()` (default, lives with the process) or `redis({ url })` (optional
|
|
170
|
+
peer dependency `redis`), so re-indexes and restarts never ask again. What the indexer needs from the answer it writes
|
|
171
|
+
to its own tables, like any other data.
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
indexer.on("Factory:PoolCreated", async ({ event, context }) => {
|
|
175
|
+
const address = event.args.token0.toLowerCase();
|
|
176
|
+
const metadata = await context.cache({
|
|
177
|
+
key: ["tokenMetadata", address],
|
|
178
|
+
handler: async () => {
|
|
179
|
+
const read = (functionName: "name" | "symbol" | "decimals") => context.client!.readContract({ address, abi: erc20Abi, functionName, noCache: true }).catch(() => null);
|
|
180
|
+
const [name, symbol, decimals] = await Promise.all([read("name"), read("symbol"), read("decimals")]);
|
|
181
|
+
return { name, symbol, decimals };
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
context.db.insert(tokens).values({ chain: context.chain.name, address, ...metadata });
|
|
185
|
+
});
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
```ts
|
|
189
|
+
// yail.config.ts
|
|
190
|
+
cache: { store: redis({ url: process.env.REDIS_URL }) },
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
In tests, `seedCache(store, chain, key, output)` from `@notuslabs/yail/testing` fixes an answer so its function never runs.
|
|
194
|
+
|
|
140
195
|
### Dynamic addresses and backfill
|
|
141
196
|
|
|
142
197
|
`addressSet("wallets")` can be used as a contract's `address`, in an event `filter`, or as an account's `address`. Members live in `_yail_addresses` and can be added at any time:
|
|
@@ -221,6 +276,6 @@ yail status --url http://localhost:42069
|
|
|
221
276
|
## Limits and notes
|
|
222
277
|
|
|
223
278
|
- Bitcoin is scanned per address through Esplora (HyperSync has no Bitcoin, Bitcoin Core has no address index). Fine for wallet sets in the thousands; for more, point `esplora({ url })` at your own electrs.
|
|
224
|
-
-
|
|
279
|
+
- Internal ETH transfers are only visible through traces, which HyperSync serves on a few chains as a paid add-on (see Wallet activity).
|
|
225
280
|
- ClickHouse has no transactions: a crash between a table flush and the checkpoint is repaired by the ReplacingMergeTree key on the next run, so give every table a real identity key.
|
|
226
281
|
- Cross-chain ordering is not enforced (chains are independent loops).
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Where cached answers live. Keys are `${chain}:${key}`; values are JSON. */
|
|
2
|
+
export interface CacheStore {
|
|
3
|
+
get(key: string): Promise<string | undefined>;
|
|
4
|
+
set(key: string, value: string): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
/** A cache key: a string, or a tuple such as `["tokenMetadata", address]`. */
|
|
7
|
+
export type CacheKey = string | readonly unknown[];
|
|
8
|
+
/** What `context.cache` takes, after useQuery: the key the answer is kept under, and the handler that computes it. */
|
|
9
|
+
export interface CacheQuery<O> {
|
|
10
|
+
key: CacheKey;
|
|
11
|
+
handler: () => Promise<O>;
|
|
12
|
+
}
|
|
13
|
+
/** JSON with object keys sorted, so equal values make equal keys. */
|
|
14
|
+
export declare function canonical(value: unknown): string;
|
|
15
|
+
export declare const cacheKey: (chain: string, key: CacheKey) => string;
|
|
16
|
+
/**
|
|
17
|
+
* `context.cache({ key, handler })` for one chain: the answer for `key` is computed once by `handler` and kept in the store, so
|
|
18
|
+
* re-runs and re-indexes never compute it again; concurrent calls with the same key share one run.
|
|
19
|
+
*/
|
|
20
|
+
export declare class CacheRunner {
|
|
21
|
+
private readonly store;
|
|
22
|
+
private readonly chain;
|
|
23
|
+
private readonly onCache?;
|
|
24
|
+
private inflight;
|
|
25
|
+
constructor(store: CacheStore, chain: string, onCache?: ((hit: boolean) => void) | undefined);
|
|
26
|
+
run<O>({ key, handler }: CacheQuery<O>): Promise<O>;
|
|
27
|
+
}
|
|
28
|
+
/** Fix a cached answer, e.g. in tests, so its function never runs. */
|
|
29
|
+
export declare function seedCache(store: CacheStore, chain: string, key: CacheKey, output: unknown): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=cached.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cached.d.ts","sourceRoot":"","sources":["../../src/cache/cached.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,8EAA8E;AAC9E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,OAAO,EAAE,CAAC;AAEnD,sHAAsH;AACtH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,GAAG,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;CAC3B;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED,eAAO,MAAM,QAAQ,UAAW,MAAM,OAAO,QAAQ,WAAiE,CAAC;AAEvH;;;GAGG;AACH,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAc,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAU,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAFzG,OAAO,CAAC,QAAQ,CAAuC;IAEvD,YAA6B,KAAK,EAAE,UAAU,EAAmB,KAAK,EAAE,MAAM,EAAmB,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,aAAA,EAAI;IAE/H,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAexD;CACF;AAED,sEAAsE;AACtE,wBAAsB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/G"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** JSON with object keys sorted, so equal values make equal keys. */
|
|
2
|
+
export function canonical(value) {
|
|
3
|
+
return JSON.stringify(value, (_key, v) => (v && typeof v === "object" && !Array.isArray(v) ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : 1))) : typeof v === "bigint" ? v.toString() : v));
|
|
4
|
+
}
|
|
5
|
+
export const cacheKey = (chain, key) => `${chain}:${typeof key === "string" ? key : canonical(key)}`;
|
|
6
|
+
/**
|
|
7
|
+
* `context.cache({ key, handler })` for one chain: the answer for `key` is computed once by `handler` and kept in the store, so
|
|
8
|
+
* re-runs and re-indexes never compute it again; concurrent calls with the same key share one run.
|
|
9
|
+
*/
|
|
10
|
+
export class CacheRunner {
|
|
11
|
+
store;
|
|
12
|
+
chain;
|
|
13
|
+
onCache;
|
|
14
|
+
inflight = new Map();
|
|
15
|
+
constructor(store, chain, onCache) {
|
|
16
|
+
this.store = store;
|
|
17
|
+
this.chain = chain;
|
|
18
|
+
this.onCache = onCache;
|
|
19
|
+
}
|
|
20
|
+
async run({ key, handler }) {
|
|
21
|
+
const full = cacheKey(this.chain, key);
|
|
22
|
+
const cached = await this.store.get(full);
|
|
23
|
+
this.onCache?.(cached !== undefined);
|
|
24
|
+
if (cached !== undefined)
|
|
25
|
+
return JSON.parse(cached);
|
|
26
|
+
let pending = this.inflight.get(full);
|
|
27
|
+
if (!pending) {
|
|
28
|
+
pending = handler().then(async (result) => {
|
|
29
|
+
await this.store.set(full, canonical(result));
|
|
30
|
+
return result;
|
|
31
|
+
});
|
|
32
|
+
this.inflight.set(full, pending);
|
|
33
|
+
pending.finally(() => this.inflight.delete(full));
|
|
34
|
+
}
|
|
35
|
+
return pending;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Fix a cached answer, e.g. in tests, so its function never runs. */
|
|
39
|
+
export async function seedCache(store, chain, key, output) {
|
|
40
|
+
await store.set(cacheKey(chain, key), canonical(output));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=cached.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cached.js","sourceRoot":"","sources":["../../src/cache/cached.ts"],"names":[],"mappings":"AAeA,qEAAqE;AACrE,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvN,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,GAAa,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AAEvH;;;GAGG;AACH,MAAM,OAAO,WAAW;IAGO,KAAK;IAA+B,KAAK;IAA2B,OAAO;IAFhG,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEvD,YAA6B,KAAiB,EAAmB,KAAa,EAAmB,OAAgC;qBAApG,KAAK;qBAA+B,KAAK;uBAA2B,OAAO;IAA4B,CAAC;IAErI,KAAK,CAAC,GAAG,CAAI,EAAE,GAAG,EAAE,OAAO,EAAiB;QAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,CAAC;QACzD,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAA2B,CAAC;QAChE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC9C,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAiB,EAAE,KAAa,EAAE,GAAa,EAAE,MAAe;IAC9F,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CacheStore } from "./cached.js";
|
|
2
|
+
/** The default: answers live for the process. */
|
|
3
|
+
export declare function memory(): CacheStore;
|
|
4
|
+
/** Answers in Redis, under `prefix` (default `yail:cache:`), forever. Needs the optional peer dependency `redis`. */
|
|
5
|
+
export declare function redis(options: {
|
|
6
|
+
url: string;
|
|
7
|
+
prefix?: string;
|
|
8
|
+
}): CacheStore;
|
|
9
|
+
//# sourceMappingURL=stores.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stores.d.ts","sourceRoot":"","sources":["../../src/cache/stores.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,iDAAiD;AACjD,wBAAgB,MAAM,IAAI,UAAU,CAGnC;AAED,qHAAqH;AACrH,wBAAgB,KAAK,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAa3E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** The default: answers live for the process. */
|
|
2
|
+
export function memory() {
|
|
3
|
+
const map = new Map();
|
|
4
|
+
return { get: async (key) => map.get(key), set: async (key, value) => void map.set(key, value) };
|
|
5
|
+
}
|
|
6
|
+
/** Answers in Redis, under `prefix` (default `yail:cache:`), forever. Needs the optional peer dependency `redis`. */
|
|
7
|
+
export function redis(options) {
|
|
8
|
+
const prefix = options.prefix ?? "yail:cache:";
|
|
9
|
+
let client;
|
|
10
|
+
const connect = () => (client ??= import("redis")
|
|
11
|
+
.catch(() => {
|
|
12
|
+
throw new Error("redis(): install the optional peer dependency `redis`.");
|
|
13
|
+
})
|
|
14
|
+
.then(({ createClient }) => createClient({ url: options.url }).connect()));
|
|
15
|
+
return {
|
|
16
|
+
get: async (key) => (await (await connect()).get(prefix + key)) ?? undefined,
|
|
17
|
+
set: async (key, value) => void (await (await connect()).set(prefix + key, value)),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=stores.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stores.js","sourceRoot":"","sources":["../../src/cache/stores.ts"],"names":[],"mappings":"AAEA,iDAAiD;AACjD,MAAM,UAAU,MAAM;IACpB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;AACnG,CAAC;AAED,qHAAqH;AACrH,MAAM,UAAU,KAAK,CAAC,OAAyC;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAC/C,IAAI,MAA4H,CAAC;IACjI,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC;SACxB,KAAK,CAAC,GAAG,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,OAAO;QACL,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,SAAS;QAC5E,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;KACnF,CAAC;AACJ,CAAC"}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Abi } from "viem";
|
|
|
2
2
|
import type { DatabaseConfig } from "../db/client.js";
|
|
3
3
|
import type { Source } from "../sources/types.js";
|
|
4
4
|
import type { AddressSetRef, FactoryRef } from "./address.js";
|
|
5
|
+
import type { CacheStore } from "../cache/cached.js";
|
|
5
6
|
export type AddressSpec = string | readonly string[] | AddressSetRef | FactoryRef;
|
|
6
7
|
export interface ChainConfig<S extends Source = Source> {
|
|
7
8
|
/** Chain id (EVM) or a string id such as "bitcoin". */
|
|
@@ -55,6 +56,12 @@ export interface AccountConfig {
|
|
|
55
56
|
address: AddressSpec;
|
|
56
57
|
startBlock?: BlockRef;
|
|
57
58
|
endBlock?: number;
|
|
59
|
+
/**
|
|
60
|
+
* Also match transactions that only mention the address: in an indexed log topic or as a call trace's
|
|
61
|
+
* sender or recipient (traces need a trace-enabled source). Events then carry every log and trace of the
|
|
62
|
+
* transaction. EVM only; needs HyperSync.
|
|
63
|
+
*/
|
|
64
|
+
activity?: boolean;
|
|
58
65
|
}
|
|
59
66
|
export interface AddressSetConfig {
|
|
60
67
|
/** Addresses to seed the set with (registered on first start, per chain that uses the set). */
|
|
@@ -65,6 +72,8 @@ export interface AddressSetConfig {
|
|
|
65
72
|
}>;
|
|
66
73
|
}
|
|
67
74
|
export interface CacheConfig {
|
|
75
|
+
/** Where `context.cache` answers live: `memory()` (default, the process) or `redis({ url })`. */
|
|
76
|
+
store?: CacheStore;
|
|
68
77
|
/** Cache raw source batches in ClickHouse (`_yail_source_cache`). Same effect as wrapping sources in `cached()`. */
|
|
69
78
|
source?: boolean;
|
|
70
79
|
/** Persist `context.http` responses in ClickHouse. Default true. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,aAAa,GAAG,UAAU,CAAC;AAElF,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACpD,uDAAuD;IACvD,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,8FAA8F;IAC9F,MAAM,EAAE,CAAC,CAAC;IACV,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8FAA8F;IAC9F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzC,MAAM,WAAW,eAAe;IAC9B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,aAAa,CAAC;CACzH;AAED,MAAM,WAAW,WAAW,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM;IAC5D,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc,CAAC,GAAG,SAAS,GAAG,GAAG,GAAG;IACnD,GAAG,EAAE,GAAG,CAAC;IACT,kEAAkE;IAClE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC9D,6FAA6F;IAC7F,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uHAAuH;IACvH,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAC;IAC9C,6FAA6F;IAC7F,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,yGAAyG;AACzG,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC7D,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3F;AAED,MAAM,WAAW,WAAW;IAC1B,iGAAiG;IACjG,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,oHAAoH;IACpH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iFAAiF;IACjF,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,8HAA8H;IAC9H,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,MAAM,CACrB,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACxE,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,EAC3F,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAE9E,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B"}
|
package/dist/db/migrate.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { type MaterializedView, type Table } from "../schema/index.js";
|
|
1
|
+
import { type MaterializedView, type Table, type View } from "../schema/index.js";
|
|
2
2
|
import type { Db } from "./client.js";
|
|
3
3
|
export type SchemaModule = Record<string, unknown>;
|
|
4
|
-
|
|
4
|
+
type SchemaItem = Table<any> | MaterializedView | View;
|
|
5
|
+
export declare function collectSchema(schema: SchemaModule | ReadonlyArray<SchemaItem>): {
|
|
5
6
|
tables: Table<any>[];
|
|
6
7
|
views: MaterializedView[];
|
|
8
|
+
/** Plain views, each after the views it reads. */
|
|
9
|
+
plainViews: View[];
|
|
7
10
|
};
|
|
8
11
|
export interface MigrateOptions {
|
|
9
12
|
/** Re-run each materialized view's SELECT as INSERT into its target (backfills MVs over existing data). */
|
|
@@ -16,7 +19,8 @@ export interface MigrateOptions {
|
|
|
16
19
|
* Create the database, internal bookkeeping tables, user tables and
|
|
17
20
|
* materialized views. Idempotent (`CREATE ... IF NOT EXISTS`).
|
|
18
21
|
*/
|
|
19
|
-
export declare function migrate(db: Db, schema: SchemaModule | ReadonlyArray<
|
|
22
|
+
export declare function migrate(db: Db, schema: SchemaModule | ReadonlyArray<SchemaItem>, options?: MigrateOptions): Promise<void>;
|
|
20
23
|
/** Ordered DDL statements, useful for review or applying with another tool. */
|
|
21
|
-
export declare function schemaDdl(schema: SchemaModule | ReadonlyArray<
|
|
24
|
+
export declare function schemaDdl(schema: SchemaModule | ReadonlyArray<SchemaItem>, database?: string): string[];
|
|
25
|
+
export {};
|
|
22
26
|
//# sourceMappingURL=migrate.d.ts.map
|
package/dist/db/migrate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4G,KAAK,gBAAgB,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC5L,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAItC,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,KAAK,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAAC;AAEvD,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG;IAC/E,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,kDAAkD;IAClD,UAAU,EAAE,IAAI,EAAE,CAAC;CACpB,CAqBA;AAmBD,MAAM,WAAW,cAAc;IAC7B,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CnI;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQvG"}
|
package/dist/db/migrate.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { isMaterializedView, isTable, materializedViewDdl, materializedViewPopulateSql, tableDdl } from "../schema/index.js";
|
|
1
|
+
import { isMaterializedView, isTable, isView, materializedViewDdl, materializedViewPopulateSql, tableDdl, viewDdl } from "../schema/index.js";
|
|
2
2
|
import { INTERNAL_TABLES } from "./internal.js";
|
|
3
|
+
import { isSqlFragment } from "./sql.js";
|
|
3
4
|
export function collectSchema(schema) {
|
|
4
5
|
let values;
|
|
5
6
|
if (Array.isArray(schema))
|
|
@@ -8,6 +9,7 @@ export function collectSchema(schema) {
|
|
|
8
9
|
values = Object.values(schema);
|
|
9
10
|
const tables = [];
|
|
10
11
|
const views = [];
|
|
12
|
+
const plainViews = inCreationOrder(values.filter(isView));
|
|
11
13
|
const seen = new Set();
|
|
12
14
|
for (const v of values) {
|
|
13
15
|
if (isTable(v) && !seen.has(v.name)) {
|
|
@@ -22,7 +24,23 @@ export function collectSchema(schema) {
|
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
|
-
return { tables, views };
|
|
27
|
+
return { tables, views, plainViews };
|
|
28
|
+
}
|
|
29
|
+
/** Views a query interpolates, directly or through nested fragments. */
|
|
30
|
+
function viewsIn(fragment) {
|
|
31
|
+
return [...fragment.values.filter(isView), ...fragment.values.filter(isSqlFragment).flatMap(viewsIn)];
|
|
32
|
+
}
|
|
33
|
+
/** Dependencies first, whatever the export order (`import * as schema` sorts names). */
|
|
34
|
+
function inCreationOrder(views) {
|
|
35
|
+
const ordered = new Set();
|
|
36
|
+
const visit = (view) => {
|
|
37
|
+
if (ordered.has(view))
|
|
38
|
+
return;
|
|
39
|
+
viewsIn(view.query).forEach(visit);
|
|
40
|
+
ordered.add(view);
|
|
41
|
+
};
|
|
42
|
+
views.forEach(visit);
|
|
43
|
+
return [...ordered];
|
|
26
44
|
}
|
|
27
45
|
/**
|
|
28
46
|
* Create the database, internal bookkeeping tables, user tables and
|
|
@@ -30,12 +48,16 @@ export function collectSchema(schema) {
|
|
|
30
48
|
*/
|
|
31
49
|
export async function migrate(db, schema, options = {}) {
|
|
32
50
|
const log = options.log ?? (() => { });
|
|
33
|
-
const { tables, views } = collectSchema(schema);
|
|
51
|
+
const { tables, views, plainViews } = collectSchema(schema);
|
|
34
52
|
await db.createDatabase();
|
|
35
53
|
for (const t of INTERNAL_TABLES) {
|
|
36
54
|
await db.command(tableDdl(t, db.database));
|
|
37
55
|
}
|
|
38
56
|
if (options.reset) {
|
|
57
|
+
for (const v of [...plainViews].reverse()) {
|
|
58
|
+
log(`drop view ${v.name}`);
|
|
59
|
+
await db.command(`DROP VIEW IF EXISTS \`${db.database}\`.\`${v.name}\``);
|
|
60
|
+
}
|
|
39
61
|
for (const v of views) {
|
|
40
62
|
log(`drop view ${v.name}`);
|
|
41
63
|
await db.command(`DROP VIEW IF EXISTS \`${db.database}\`.\`${v.name}\``);
|
|
@@ -51,8 +73,14 @@ export async function migrate(db, schema, options = {}) {
|
|
|
51
73
|
}
|
|
52
74
|
for (const v of views) {
|
|
53
75
|
log(`create materialized view ${v.name}`);
|
|
76
|
+
if (v.refresh)
|
|
77
|
+
await db.command(`DROP VIEW IF EXISTS \`${db.database}\`.\`${v.name}\``);
|
|
54
78
|
await db.command(materializedViewDdl(v, db.database));
|
|
55
79
|
}
|
|
80
|
+
for (const v of plainViews) {
|
|
81
|
+
log(`create view ${v.name}`);
|
|
82
|
+
await db.command(viewDdl(v, db.database));
|
|
83
|
+
}
|
|
56
84
|
if (options.populate) {
|
|
57
85
|
for (const v of views) {
|
|
58
86
|
log(`populate ${v.name} -> ${v.to.name}`);
|
|
@@ -62,11 +90,12 @@ export async function migrate(db, schema, options = {}) {
|
|
|
62
90
|
}
|
|
63
91
|
/** Ordered DDL statements, useful for review or applying with another tool. */
|
|
64
92
|
export function schemaDdl(schema, database) {
|
|
65
|
-
const { tables, views } = collectSchema(schema);
|
|
93
|
+
const { tables, views, plainViews } = collectSchema(schema);
|
|
66
94
|
return [
|
|
67
95
|
...INTERNAL_TABLES.map((t) => tableDdl(t, database)),
|
|
68
96
|
...tables.map((t) => tableDdl(t, database)),
|
|
69
97
|
...views.map((v) => materializedViewDdl(v, database)),
|
|
98
|
+
...plainViews.map((v) => viewDdl(v, database)),
|
|
70
99
|
];
|
|
71
100
|
}
|
|
72
101
|
//# sourceMappingURL=migrate.js.map
|
package/dist/db/migrate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,QAAQ,EAAE,OAAO,EAAgD,MAAM,oBAAoB,CAAC;AAE5L,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAC;AAM3D,MAAM,UAAU,aAAa,CAAC,MAAgD;IAM5E,IAAI,MAAiB,CAAC;IACtB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;;QAC3C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAsB,CAAC,CAAC;IACpD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAED,wEAAwE;AACxE,SAAS,OAAO,CAAC,QAAqB;IACpC,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACxG,CAAC;AAED,wFAAwF;AACxF,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,IAAU,EAAE,EAAE;QAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QAC9B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAUD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAM,EAAE,MAAgD,EAAE,OAAO,GAAmB,EAAE;IAClH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAE5D,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC;IAE1B,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3B,MAAM,EAAE,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,QAAQ,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3B,MAAM,EAAE,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,QAAQ,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5B,MAAM,EAAE,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,QAAQ,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9B,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,GAAG,CAAC,4BAA4B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,OAAO;YAAE,MAAM,EAAE,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,QAAQ,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QACxF,MAAM,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,MAAM,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,SAAS,CAAC,MAAgD,EAAE,QAAiB;IAC3F,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5D,OAAO;QACL,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACpD,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3C,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACrD,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;KAC/C,CAAC;AACJ,CAAC"}
|
package/dist/db/sql.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type Table } from "../schema/table.js";
|
|
2
|
+
import { type View } from "../schema/view.js";
|
|
2
3
|
export type SqlValue = string | number | bigint | boolean | Date | null | undefined | SqlValue[];
|
|
3
4
|
export interface SqlFragment {
|
|
4
5
|
readonly __brand: "yail.sql";
|
|
5
6
|
readonly strings: ReadonlyArray<string>;
|
|
6
|
-
readonly values: ReadonlyArray<SqlValue | SqlFragment | Table<any> | SqlRaw>;
|
|
7
|
+
readonly values: ReadonlyArray<SqlValue | SqlFragment | Table<any> | View | SqlRaw>;
|
|
7
8
|
}
|
|
8
9
|
export interface SqlRaw {
|
|
9
10
|
readonly __brand: "yail.sqlRaw";
|
package/dist/db/sql.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/db/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/db/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAU,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAEjG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAE1D;AAKD;;;;;;;;GAQG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,WAAW,CAE1G;yBAFe,GAAG;oBAKF,MAAM,KAAG,MAAM;2BAGR,MAAM,KAAG,MAAM;0BAGhB,aAAa,CAAC,WAAW,GAAG,MAAM,CAAC,yBAAqB,WAAW;qBAW1E,WAAW;;AAE3B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,uGAAuG;IACvG,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,WAAW,CA2B/F;AAqBD,wBAAgB,OAAO,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAY3C;AAED,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAEhD"}
|
package/dist/db/sql.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isTable } from "../schema/table.js";
|
|
2
|
+
import { isView } from "../schema/view.js";
|
|
2
3
|
export function isSqlFragment(v) {
|
|
3
4
|
return typeof v === "object" && v !== null && v.__brand === "yail.sql";
|
|
4
5
|
}
|
|
@@ -54,7 +55,7 @@ export function renderSql(input, options = {}) {
|
|
|
54
55
|
return render(v);
|
|
55
56
|
if (isRaw(v))
|
|
56
57
|
return v.text;
|
|
57
|
-
if (isTable(v))
|
|
58
|
+
if (isTable(v) || isView(v))
|
|
58
59
|
return qualify(v.name, options.database);
|
|
59
60
|
if (options.inline)
|
|
60
61
|
return literal(v);
|
package/dist/db/sql.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/db/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAc,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/db/sql.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
export { createConfig, addressSet, factory } from "./config/index.js";
|
|
2
2
|
export type { Config, ChainConfig, ContractConfig, AccountConfig, EventFilter, AddressSpec, AddressSetRef, FactoryRef, CacheConfig, ObservabilityConfig, ServerConfig, IndexingConfig, AddressSetConfig } from "./config/index.js";
|
|
3
|
-
export { t, table, materializedView, tableDdl, materializedViewDdl } from "./schema/index.js";
|
|
4
|
-
export type { Table, TableOptions, TableEngine, Column, InsertRow, InferRow, MaterializedView } from "./schema/index.js";
|
|
3
|
+
export { t, table, materializedView, view, tableDdl, materializedViewDdl, viewDdl } from "./schema/index.js";
|
|
4
|
+
export type { Table, TableOptions, TableEngine, Column, InsertRow, InferRow, MaterializedView, Refresh, View } from "./schema/index.js";
|
|
5
5
|
export { createDb, sql, migrate, schemaDdl, BatchWriter, internalTables } from "./db/index.js";
|
|
6
6
|
export type { Db, DatabaseConfig, SqlFragment, MigrateOptions } from "./db/index.js";
|
|
7
7
|
export { hypersync, rpc, cached, esplora, fixtureSource } from "./sources/index.js";
|
|
8
|
-
export type { Source, EvmSource, BitcoinSource, EvmQuery, EvmBatch, EvmLog, EvmBlock, EvmTransaction, BitcoinQuery, BitcoinBatch, BitcoinTransaction, HypersyncOptions, RpcSourceOptions, EsploraOptions, CachedSourceOptions } from "./sources/index.js";
|
|
8
|
+
export type { Source, EvmSource, BitcoinSource, EvmQuery, EvmBatch, EvmLog, EvmBlock, EvmTransaction, EvmTrace, EvmTraceFilter, BitcoinQuery, BitcoinBatch, BitcoinTransaction, HypersyncOptions, RpcSourceOptions, EsploraOptions, CachedSourceOptions } from "./sources/index.js";
|
|
9
9
|
export { createIndexer } from "./indexer/indexer.js";
|
|
10
|
+
export type { CacheStore, CacheKey, CacheQuery } from "./cache/cached.js";
|
|
11
|
+
export { memory, redis } from "./cache/stores.js";
|
|
10
12
|
export type { Indexer, IndexerOptions, StatusSnapshot, ReindexRequest } from "./indexer/indexer.js";
|
|
11
13
|
export type { HandlerContext, HandlerDb, AddressesApi } from "./indexer/context.js";
|
|
12
14
|
export type { ContractEvent, EvmAccountEvent, BitcoinAccountEvent, SetupEvent, EventNames, EventOf } from "./indexer/events.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGnO,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGnO,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC7G,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACxI,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/F,YAAY,EAAE,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGrF,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpF,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGpR,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpG,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpF,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAChI,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpG,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAC9F,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
// Config
|
|
2
2
|
export { createConfig, addressSet, factory } from "./config/index.js";
|
|
3
3
|
// Schema + database
|
|
4
|
-
export { t, table, materializedView, tableDdl, materializedViewDdl } from "./schema/index.js";
|
|
4
|
+
export { t, table, materializedView, view, tableDdl, materializedViewDdl, viewDdl } from "./schema/index.js";
|
|
5
5
|
export { createDb, sql, migrate, schemaDdl, BatchWriter, internalTables } from "./db/index.js";
|
|
6
6
|
// Sources
|
|
7
7
|
export { hypersync, rpc, cached, esplora, fixtureSource } from "./sources/index.js";
|
|
8
8
|
// Indexer
|
|
9
9
|
export { createIndexer } from "./indexer/indexer.js";
|
|
10
|
+
export { memory, redis } from "./cache/stores.js";
|
|
10
11
|
// Observability
|
|
11
12
|
export { createError } from "./observability/logger.js";
|
|
12
13
|
export { createApp } from "./server/api.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGtE,oBAAoB;AACpB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGtE,oBAAoB;AACpB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE7G,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/F,UAAU;AACV,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGpF,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAQlD,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,mBAAmB;AACnB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC"}
|
|
@@ -5,6 +5,7 @@ import { BatchWriter } from "../db/batch.js";
|
|
|
5
5
|
import type { RowMeta } from "../db/serialize.js";
|
|
6
6
|
import type { HttpClient } from "../http/client.js";
|
|
7
7
|
import type { CachedClient } from "../rpc/cached-client.js";
|
|
8
|
+
import { CacheRunner, type CacheQuery } from "../cache/cached.js";
|
|
8
9
|
import type { InferRow, InsertRow, Table } from "../schema/table.js";
|
|
9
10
|
import type { WideLogger } from "../observability/logger.js";
|
|
10
11
|
import type { Config } from "../config/types.js";
|
|
@@ -14,7 +15,7 @@ export interface HandlerDb extends Omit<Db, "insert"> {
|
|
|
14
15
|
insert<T extends Table<any>>(table: T): {
|
|
15
16
|
values(rows: InsertRow<T> | InsertRow<T>[]): void;
|
|
16
17
|
};
|
|
17
|
-
/** Buffer-aware
|
|
18
|
+
/** Buffer-aware cached: returns the latest row written in this batch for the key, else reads ClickHouse (FINAL). */
|
|
18
19
|
find<T extends Table<any>>(table: T, key: Partial<InferRow<T>>): Promise<InferRow<T> | null>;
|
|
19
20
|
/** Force a flush now (rarely needed). */
|
|
20
21
|
flush(): Promise<void>;
|
|
@@ -40,6 +41,8 @@ export interface HandlerContext<C extends Config<any, any, any> = Config<any, an
|
|
|
40
41
|
/** Cached contract reads; only defined for EVM chains with `rpc` configured. */
|
|
41
42
|
client: CachedClient | undefined;
|
|
42
43
|
http: HttpClient;
|
|
44
|
+
/** The answer for `key` on this chain, computed once by `handler` and kept in the configured store (`cache.store`). */
|
|
45
|
+
cache<O>(query: CacheQuery<O>): Promise<O>;
|
|
43
46
|
addresses: AddressesApi;
|
|
44
47
|
/** ABIs and static addresses from the config, for `client.readContract`. */
|
|
45
48
|
contracts: {
|
|
@@ -75,6 +78,8 @@ export interface ContextDeps {
|
|
|
75
78
|
meta: {
|
|
76
79
|
current: RowMeta;
|
|
77
80
|
};
|
|
81
|
+
/** Shared per chain (one cache, one in-flight map); a process-local one otherwise. */
|
|
82
|
+
cache?: CacheRunner;
|
|
78
83
|
}
|
|
79
84
|
export declare function createHandlerDb(db: Db, writer: BatchWriter, meta: {
|
|
80
85
|
current: RowMeta;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/indexer/context.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/indexer/context.ts"],"names":[],"mappings":"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"}
|
package/dist/indexer/context.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { BatchWriter } from "../db/batch.js";
|
|
2
|
+
import { CacheRunner } from "../cache/cached.js";
|
|
3
|
+
import { memory } from "../cache/stores.js";
|
|
2
4
|
import { toArray } from "../util.js";
|
|
3
5
|
export function createHandlerDb(db, writer, meta) {
|
|
4
6
|
const handlerDb = {
|
|
@@ -24,11 +26,13 @@ export function createHandlerDb(db, writer, meta) {
|
|
|
24
26
|
return handlerDb;
|
|
25
27
|
}
|
|
26
28
|
export function createContext(deps) {
|
|
29
|
+
const cache = deps.cache ?? new CacheRunner(memory(), deps.chain.name);
|
|
27
30
|
return {
|
|
28
31
|
chain: deps.chain,
|
|
29
32
|
db: createHandlerDb(deps.db, deps.writer, deps.meta),
|
|
30
33
|
client: deps.client,
|
|
31
34
|
http: deps.http,
|
|
35
|
+
cache: (query) => cache.run(query),
|
|
32
36
|
addresses: {
|
|
33
37
|
has: (set, address, chain) => deps.registry.has(set, chain ?? deps.chain.name, address),
|
|
34
38
|
register: (set, address, options) => deps.registry
|