@artblocks/abx-indexer 0.1.0-alpha.8 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +160 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer.d.ts +81 -10
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +120 -8
- package/dist/indexer.js.map +1 -1
- package/dist/store.d.ts +100 -10
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +291 -26
- package/dist/store.js.map +1 -1
- package/package.json +7 -6
package/dist/store.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export interface ProjectRegistration {
|
|
|
22
22
|
registeredAt: string;
|
|
23
23
|
}
|
|
24
24
|
/** One producer-published effect artifact — a row in the data plane's enumeration registry
|
|
25
|
-
* (`
|
|
25
|
+
* (`site/content/docs/protocol/data-plane.mdx`). The resolver lists a token's rows and keeps only those whose
|
|
26
26
|
* `key` matches the recomputed address at the CURRENT settled inputsHash, so stale rows go
|
|
27
27
|
* silently unlisted (self-invalidation). `locator === null` means the bytes live in custody
|
|
28
28
|
* (a co-located producer's bytes in the shared backend at `key`, or a bound output's `bytes` below).
|
|
@@ -40,7 +40,7 @@ export interface EffectArtifactRow {
|
|
|
40
40
|
contentType: string | null;
|
|
41
41
|
locator: string | null;
|
|
42
42
|
/**
|
|
43
|
-
* A **bound** output's content (`
|
|
43
|
+
* A **bound** output's content (`site/content/docs/protocol/effects.mdx#metadata-binding`): the bytes that
|
|
44
44
|
* stitch into the metadata JSON — `render/traits` today. Capped at
|
|
45
45
|
* {@link BOUND_ARTIFACT_MAX_BYTES}; `null` for every **referenced** output, whose bytes stay with
|
|
46
46
|
* the producer and reach us only as `locator`.
|
|
@@ -54,12 +54,12 @@ export interface EffectArtifactRow {
|
|
|
54
54
|
updatedAt?: string;
|
|
55
55
|
}
|
|
56
56
|
/** The cap a serving node MUST accept per bound output, and MUST refuse above
|
|
57
|
-
* (`
|
|
57
|
+
* (`site/content/docs/protocol/effects.mdx#metadata-binding`). ~100× a real
|
|
58
58
|
* traits payload: generous for what it is for, far too small to become blob storage. */
|
|
59
59
|
export declare const BOUND_ARTIFACT_MAX_BYTES: number;
|
|
60
60
|
/**
|
|
61
|
-
* Where one project sits in the indexing lifecycle (`
|
|
62
|
-
*
|
|
61
|
+
* Where one project sits in the indexing lifecycle (`site/content/docs/using-abx/remote-services.mdx`) —
|
|
62
|
+
* what the control plane's `status`/list routes report and what
|
|
63
63
|
* `abx status` prints, for a managed provider and for your own node in the same words.
|
|
64
64
|
*
|
|
65
65
|
* Deliberately its OWN table, not columns on `registrations`: `register()` is a full-column upsert,
|
|
@@ -140,7 +140,7 @@ export interface Store {
|
|
|
140
140
|
* Drop the **bound** content of every superseded row for (project, token, effectKey, outputKey) —
|
|
141
141
|
* everything whose `inputs_hash` isn't `currentHash`.
|
|
142
142
|
*
|
|
143
|
-
* The spec makes this a **MAY**, not a MUST (`
|
|
143
|
+
* The spec makes this a **MAY**, not a MUST (`site/content/docs/protocol/effects.mdx#metadata-binding`):
|
|
144
144
|
* what's normative is that superseded content is never *served* or stitched, which leaves it with
|
|
145
145
|
* no legal reader. Dropping it is therefore free of consequence, and this node drops eagerly — on
|
|
146
146
|
* each bound registration — because that is what turns "held bytes" into
|
|
@@ -165,7 +165,12 @@ export interface Store {
|
|
|
165
165
|
/** Clear one artifact key's status — the run finished; artifact presence takes over as truth. */
|
|
166
166
|
clearEffectStatus(key: string): void;
|
|
167
167
|
listEffectStatuses(address: string): EffectStatusRow[];
|
|
168
|
-
|
|
168
|
+
/** Persist a folded projection. `fullReplay: true` (the repair path — `abx index --full`) purges
|
|
169
|
+
* the project's append-only event log first, so a reorg-replaced event can't survive as a stale
|
|
170
|
+
* row; routine incremental writes leave the log append-only. */
|
|
171
|
+
putProject(state: ProjectState, opts?: {
|
|
172
|
+
fullReplay?: boolean;
|
|
173
|
+
}): void;
|
|
169
174
|
getProject(address: string): ProjectState | null;
|
|
170
175
|
listProjects(): ProjectState[];
|
|
171
176
|
/** Drop the rebuildable projection (keeps registrations). Proves replay. */
|
|
@@ -192,12 +197,30 @@ export declare class SqliteStore implements Store {
|
|
|
192
197
|
constructor(dataDir?: string);
|
|
193
198
|
/** Shape changes that must land BEFORE the schema exec (its indexes reference new columns).
|
|
194
199
|
* effect_artifacts pre-data-plane shape (key/address/locator only) → drop; the schema recreates
|
|
195
|
-
* it. Dropping is safe
|
|
196
|
-
*
|
|
200
|
+
* it. Dropping is safe: rows are producer-published and self-heal from a runner's next sweep
|
|
201
|
+
* (record-on-skip / republish) — no chain data is lost. */
|
|
197
202
|
private premigrate;
|
|
198
203
|
/** Idempotently add columns introduced after a DB was first created (CREATE IF NOT
|
|
199
204
|
* EXISTS won't backfill them). Keeps an existing projection working across upgrades. */
|
|
200
205
|
private migrate;
|
|
206
|
+
/**
|
|
207
|
+
* One-time data migration, gated on `PRAGMA user_version` (unused before this — starts at 0 on
|
|
208
|
+
* every existing store). `migrate()` above only ever ADDs columns; recomputing `seq` rewrites
|
|
209
|
+
* VALUES in an existing column, which a `PRAGMA table_info` presence check can't gate — hence a
|
|
210
|
+
* separate versioned step.
|
|
211
|
+
*
|
|
212
|
+
* `events.seq` used to be the array index at write time (positional — renumbers on every re-fold).
|
|
213
|
+
* This recomputes every existing row to the chain-derived value `(block_number << 32) | log_index`
|
|
214
|
+
* — the same formula {@link eventSeq} uses going forward — so an upgraded store's history becomes
|
|
215
|
+
* append-only-compatible without re-indexing from chain. No collisions are possible: `(block,
|
|
216
|
+
* logIndex)` is already unique per project (the table's own history proves it — it was a valid
|
|
217
|
+
* event log before this ran), and the shift preserves that uniqueness.
|
|
218
|
+
*
|
|
219
|
+
* A fresh install has no rows yet, so the `UPDATE` is a no-op — but `user_version` still advances,
|
|
220
|
+
* so this never re-scans an empty table on every open. Wrapped in a transaction: a crash mid-way
|
|
221
|
+
* leaves `user_version` at 0 and retries the whole thing next open, never a half-migrated table.
|
|
222
|
+
*/
|
|
223
|
+
private migrateSeq;
|
|
201
224
|
register(reg: ProjectRegistration): void;
|
|
202
225
|
listRegistrations(): ProjectRegistration[];
|
|
203
226
|
getRegistration(address: string): ProjectRegistration | null;
|
|
@@ -221,11 +244,78 @@ export declare class SqliteStore implements Store {
|
|
|
221
244
|
putEffectStatus(row: EffectStatusRow): void;
|
|
222
245
|
clearEffectStatus(key: string): void;
|
|
223
246
|
listEffectStatuses(address: string): EffectStatusRow[];
|
|
224
|
-
|
|
247
|
+
/**
|
|
248
|
+
* Persist a reconstructed `ProjectState`. O(delta), not O(history): the routine case — one new
|
|
249
|
+
* mint on an otherwise-unchanged project — writes one project row and one token row, appends
|
|
250
|
+
* whatever events are new, and touches nothing else. A delete-and-reinsert approach would rewrite
|
|
251
|
+
* the entire projection (every token, every event) on every call.
|
|
252
|
+
*
|
|
253
|
+
* `contract_uri`/`token_uri` are bound NULL unconditionally regardless of what `state` carries —
|
|
254
|
+
* see the schema comments on those columns. This is deliberate even when a caller passed populated
|
|
255
|
+
* values (e.g. a reconstruct run with `readUriDocuments: true`): the store's job is never to cache
|
|
256
|
+
* a value with no settled state, only to serve it live when asked.
|
|
257
|
+
*/
|
|
258
|
+
putProject(state: ProjectState, opts?: {
|
|
259
|
+
fullReplay?: boolean;
|
|
260
|
+
}): void;
|
|
225
261
|
getProject(address: string): ProjectState | null;
|
|
226
262
|
listProjects(): ProjectState[];
|
|
227
263
|
wipeProjections(): void;
|
|
228
264
|
destroy(): void;
|
|
265
|
+
/**
|
|
266
|
+
* This store's actual `PRAGMA auto_vacuum` mode, right now. A store opened from a file created
|
|
267
|
+
* before `SCHEMA` started setting `PRAGMA auto_vacuum = INCREMENTAL` BEFORE its first `CREATE
|
|
268
|
+
* TABLE` (see the comment on that pragma above) is permanently stuck at `'none'` — the pragma
|
|
269
|
+
* silently no-ops on a database that already has tables — until {@link vacuumConvert} runs. This
|
|
270
|
+
* is the detection half of the two-part approach: every other read/write path in this class is
|
|
271
|
+
* indifferent to the mode, so nothing breaks for a store still at `'none'`; only reclamation cares.
|
|
272
|
+
*/
|
|
273
|
+
autoVacuumMode(): 'none' | 'full' | 'incremental';
|
|
274
|
+
/** Diagnostics behind `abx vacuum status`: {@link autoVacuumMode} alongside the raw page/freelist
|
|
275
|
+
* counts a caller (or a test) can watch move as maintenance runs. */
|
|
276
|
+
vacuumStats(): {
|
|
277
|
+
mode: 'none' | 'full' | 'incremental';
|
|
278
|
+
freelistPages: number;
|
|
279
|
+
pageCount: number;
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* The one-time, EXPLICIT conversion for a store stuck at `auto_vacuum='none'`: sets the pragma —
|
|
283
|
+
* on its own a no-op here, same as it was at construction, since the database already has tables
|
|
284
|
+
* — and then runs a full `VACUUM`, the only operation that actually rebuilds the file under the
|
|
285
|
+
* new mode. This is deliberately not run automatically anywhere in this class or in
|
|
286
|
+
* {@link SelfHostIndexer}: a full `VACUUM` rewrites the ENTIRE database file and can briefly need
|
|
287
|
+
* up to ~2x its on-disk size while it runs, so it must be an operator's explicit choice, made with
|
|
288
|
+
* that cost understood — `abx vacuum convert` (and the docs it points at) is that explicit surface.
|
|
289
|
+
* A no-op, returning the mode unchanged, once the store is already `'full'` or `'incremental'`.
|
|
290
|
+
*/
|
|
291
|
+
vacuumConvert(): 'none' | 'full' | 'incremental';
|
|
292
|
+
/**
|
|
293
|
+
* Bounded `PRAGMA incremental_vacuum(N)`: reclaims at most `maxPages` freed pages THIS call, never
|
|
294
|
+
* the whole freelist at once. `node:sqlite`'s `DatabaseSync` is SYNCHRONOUS and shares this process
|
|
295
|
+
* with token-api reads on a co-located `abx serve` — an unbounded reclaim would block every request
|
|
296
|
+
* in flight for however long a large freelist takes to drain. Bounding it is what makes it safe to
|
|
297
|
+
* call automatically between watch-loop ticks (see {@link SelfHostIndexer.runIncrementalVacuum})
|
|
298
|
+
* rather than only from the explicit `abx vacuum convert` command above.
|
|
299
|
+
*
|
|
300
|
+
* A no-op (returns 0, touches nothing) before the store has been converted to `'incremental'` mode
|
|
301
|
+
* — `incremental_vacuum` only does anything in that mode, and running it blind on a `'none'` store
|
|
302
|
+
* would be silent maintenance with no effect, which is worse than an honest no-op.
|
|
303
|
+
*
|
|
304
|
+
* Returns the number of pages actually REQUESTED of SQLite this call (capped by the freelist's
|
|
305
|
+
* current size), not a guarantee it moved exactly that many — draining an already-small freelist
|
|
306
|
+
* legitimately returns fewer than `maxPages`.
|
|
307
|
+
*/
|
|
308
|
+
runIncrementalVacuum(maxPages: number): number;
|
|
309
|
+
/**
|
|
310
|
+
* Drop one project's projection — `extensions` / `tokens` / `projects` — but deliberately NOT
|
|
311
|
+
* `events`. The event log is append-only and chain-derived (`seq` is `(block << 32) | logIndex`,
|
|
312
|
+
* so a re-fold always lands on the same rows): a re-index after this re-derives the identical
|
|
313
|
+
* event set from chain and re-inserts it as a no-op (`ON CONFLICT DO NOTHING`), so nothing is lost
|
|
314
|
+
* by leaving the rows in place, and `abx demo`'s "drop + replay" proof doesn't depend on the log
|
|
315
|
+
* being gone. `deregister`/forget-the-project-entirely paths delete events explicitly — this
|
|
316
|
+
* helper is for `dropProjection`, which keeps the registration precisely so the next reindex can
|
|
317
|
+
* rebuild from it.
|
|
318
|
+
*/
|
|
229
319
|
private deleteProjection;
|
|
230
320
|
private hydrate;
|
|
231
321
|
}
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|