ponder 0.9.8 → 0.9.9
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 +6 -0
- package/dist/esm/bin/commands/list.js +25 -31
- package/dist/esm/bin/commands/list.js.map +1 -1
- package/dist/esm/bin/utils/run.js +111 -98
- package/dist/esm/bin/utils/run.js.map +1 -1
- package/dist/esm/database/index.js +335 -288
- package/dist/esm/database/index.js.map +1 -1
- package/dist/esm/drizzle/index.js +9 -16
- package/dist/esm/drizzle/index.js.map +1 -1
- package/dist/esm/drizzle/kit/index.js +17 -2
- package/dist/esm/drizzle/kit/index.js.map +1 -1
- package/dist/esm/graphql/index.js +1 -1
- package/dist/esm/graphql/index.js.map +1 -1
- package/dist/esm/graphql/middleware.js +5 -5
- package/dist/esm/graphql/middleware.js.map +1 -1
- package/dist/esm/indexing/index.js +285 -8
- package/dist/esm/indexing/index.js.map +1 -1
- package/dist/esm/indexing/ponderActions.js +2 -2
- package/dist/esm/indexing/ponderActions.js.map +1 -1
- package/dist/esm/indexing-store/cache.js +355 -0
- package/dist/esm/indexing-store/cache.js.map +1 -0
- package/dist/esm/indexing-store/historical.js +144 -466
- package/dist/esm/indexing-store/historical.js.map +1 -1
- package/dist/esm/indexing-store/index.js +13 -1
- package/dist/esm/indexing-store/index.js.map +1 -1
- package/dist/esm/indexing-store/realtime.js +9 -49
- package/dist/esm/indexing-store/realtime.js.map +1 -1
- package/dist/esm/internal/options.js +1 -1
- package/dist/esm/server/index.js +2 -5
- package/dist/esm/server/index.js.map +1 -1
- package/dist/esm/sync/index.js +2 -2
- package/dist/esm/utils/pg.js +17 -0
- package/dist/esm/utils/pg.js.map +1 -1
- package/dist/types/bin/commands/list.d.ts.map +1 -1
- package/dist/types/bin/utils/run.d.ts.map +1 -1
- package/dist/types/database/index.d.ts +246 -26
- package/dist/types/database/index.d.ts.map +1 -1
- package/dist/types/drizzle/index.d.ts +7 -9
- package/dist/types/drizzle/index.d.ts.map +1 -1
- package/dist/types/drizzle/kit/index.d.ts +117 -0
- package/dist/types/drizzle/kit/index.d.ts.map +1 -1
- package/dist/types/graphql/middleware.d.ts.map +1 -1
- package/dist/types/indexing/index.d.ts +32 -559
- package/dist/types/indexing/index.d.ts.map +1 -1
- package/dist/types/indexing/ponderActions.d.ts +1 -2
- package/dist/types/indexing/ponderActions.d.ts.map +1 -1
- package/dist/types/indexing-store/cache.d.ts +96 -0
- package/dist/types/indexing-store/cache.d.ts.map +1 -0
- package/dist/types/indexing-store/historical.d.ts +8 -13
- package/dist/types/indexing-store/historical.d.ts.map +1 -1
- package/dist/types/indexing-store/index.d.ts +6 -5
- package/dist/types/indexing-store/index.d.ts.map +1 -1
- package/dist/types/indexing-store/realtime.d.ts +1 -1
- package/dist/types/indexing-store/realtime.d.ts.map +1 -1
- package/dist/types/internal/options.d.ts +2 -2
- package/dist/types/server/index.d.ts.map +1 -1
- package/dist/types/utils/pg.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/bin/commands/list.ts +39 -50
- package/src/bin/utils/run.ts +137 -130
- package/src/database/index.ts +473 -357
- package/src/drizzle/index.ts +15 -19
- package/src/drizzle/kit/index.ts +23 -1
- package/src/graphql/index.ts +3 -3
- package/src/graphql/middleware.ts +5 -6
- package/src/indexing/index.ts +435 -16
- package/src/indexing/ponderActions.ts +2 -5
- package/src/indexing-store/cache.ts +548 -0
- package/src/indexing-store/historical.ts +175 -677
- package/src/indexing-store/index.ts +28 -9
- package/src/indexing-store/realtime.ts +16 -92
- package/src/internal/options.ts +2 -2
- package/src/server/index.ts +2 -7
- package/src/sync/index.ts +2 -2
- package/src/utils/pg.ts +21 -0
- package/dist/esm/indexing/service.js +0 -312
- package/dist/esm/indexing/service.js.map +0 -1
- package/dist/esm/indexing-store/metadata.js +0 -46
- package/dist/esm/indexing-store/metadata.js.map +0 -1
- package/dist/esm/utils/extend.js +0 -28
- package/dist/esm/utils/extend.js.map +0 -1
- package/dist/types/indexing/service.d.ts +0 -73
- package/dist/types/indexing/service.d.ts.map +0 -1
- package/dist/types/indexing-store/metadata.d.ts +0 -10
- package/dist/types/indexing-store/metadata.d.ts.map +0 -1
- package/dist/types/utils/extend.d.ts +0 -13
- package/dist/types/utils/extend.d.ts.map +0 -1
- package/src/indexing/service.ts +0 -501
- package/src/indexing-store/metadata.ts +0 -66
- package/src/utils/extend.ts +0 -55
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# ponder
|
|
2
2
|
|
|
3
|
+
## 0.9.9
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1499](https://github.com/ponder-sh/ponder/pull/1499) [`6afbd955c3bb00bf35729593164eb568354b72a1`](https://github.com/ponder-sh/ponder/commit/6afbd955c3bb00bf35729593164eb568354b72a1) Thanks [@kyscott18](https://github.com/kyscott18)! - Improve historical indexing performance.
|
|
8
|
+
|
|
3
9
|
## 0.9.8
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createBuild } from '../../build/index.js';
|
|
2
|
-
import { createDatabase, } from '../../database/index.js';
|
|
2
|
+
import { createDatabase, getPonderMeta } from '../../database/index.js';
|
|
3
3
|
import { createLogger } from '../../internal/logger.js';
|
|
4
4
|
import { MetricsService } from '../../internal/metrics.js';
|
|
5
5
|
import { buildOptions } from '../../internal/options.js';
|
|
@@ -7,7 +7,9 @@ import { createShutdown } from '../../internal/shutdown.js';
|
|
|
7
7
|
import { createTelemetry } from '../../internal/telemetry.js';
|
|
8
8
|
import { printTable } from '../../ui/Table.js';
|
|
9
9
|
import { formatEta } from '../../utils/format.js';
|
|
10
|
-
import { sql } from "
|
|
10
|
+
import { and, eq, inArray, sql } from "drizzle-orm";
|
|
11
|
+
import { unionAll } from "drizzle-orm/pg-core";
|
|
12
|
+
import { pgSchema } from "drizzle-orm/pg-core";
|
|
11
13
|
import { createExit } from "../utils/exit.js";
|
|
12
14
|
const emptySchemaBuild = {
|
|
13
15
|
schema: {},
|
|
@@ -46,36 +48,28 @@ export async function list({ cliOptions }) {
|
|
|
46
48
|
preBuild: buildResult.result,
|
|
47
49
|
schemaBuild: emptySchemaBuild,
|
|
48
50
|
});
|
|
49
|
-
const
|
|
50
|
-
.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
.
|
|
55
|
-
|
|
51
|
+
const SCHEMATA = pgSchema("information_schema").table("schemata", (t) => ({
|
|
52
|
+
schema_name: t.text().notNull(),
|
|
53
|
+
}));
|
|
54
|
+
const TABLES = pgSchema("information_schema").table("tables", (t) => ({
|
|
55
|
+
table_name: t.text().notNull(),
|
|
56
|
+
table_schema: t.text().notNull(),
|
|
57
|
+
}));
|
|
58
|
+
const ponderSchemas = await database.qb.drizzle
|
|
59
|
+
.select({ tableName: TABLES.table_name, tableSchema: TABLES.table_schema })
|
|
60
|
+
.from(TABLES)
|
|
61
|
+
.where(and(eq(TABLES.table_name, "_ponder_meta"), inArray(TABLES.table_schema, database.qb.drizzle
|
|
62
|
+
.select({ schemaName: SCHEMATA.schema_name })
|
|
63
|
+
.from(SCHEMATA))));
|
|
64
|
+
const queries = ponderSchemas.map((row) => database.qb.drizzle
|
|
65
|
+
.select({
|
|
66
|
+
value: getPonderMeta(row.tableSchema).value,
|
|
67
|
+
schema: sql `${row.tableSchema}`.as("schema"),
|
|
68
|
+
})
|
|
69
|
+
.from(getPonderMeta(row.tableSchema))
|
|
70
|
+
.where(eq(getPonderMeta(row.tableSchema).key, "app")));
|
|
56
71
|
// @ts-ignore
|
|
57
|
-
|
|
58
|
-
// @ts-ignore
|
|
59
|
-
.selectFrom("information_schema.schemata")
|
|
60
|
-
// @ts-ignore
|
|
61
|
-
.select("schema_name"))
|
|
62
|
-
.execute();
|
|
63
|
-
let union;
|
|
64
|
-
for (const row of ponderSchemas) {
|
|
65
|
-
// @ts-ignore
|
|
66
|
-
const query = database.qb.internal
|
|
67
|
-
.selectFrom(`${row.table_schema}._ponder_meta`)
|
|
68
|
-
.select(["value", sql `${row.table_schema}`.as("schema")])
|
|
69
|
-
// @ts-ignore
|
|
70
|
-
.where("key", "=", "app");
|
|
71
|
-
if (union === undefined) {
|
|
72
|
-
union = query;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
union = union.unionAll(query);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
const result = ponderSchemas.length === 0 ? [] : await union.execute();
|
|
72
|
+
const result = await unionAll(...queries);
|
|
79
73
|
printTable({
|
|
80
74
|
columns: [
|
|
81
75
|
{ title: "Schema", key: "table_schema", align: "left" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/bin/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/bin/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { runCodegen } from './codegen.js';
|
|
2
|
+
import { createIndexingCache } from '../../indexing-store/cache.js';
|
|
2
3
|
import { createHistoricalIndexingStore } from '../../indexing-store/historical.js';
|
|
3
|
-
import { getMetadataStore } from '../../indexing-store/metadata.js';
|
|
4
4
|
import { createRealtimeIndexingStore } from '../../indexing-store/realtime.js';
|
|
5
|
-
import {
|
|
5
|
+
import { createIndexing } from '../../indexing/index.js';
|
|
6
6
|
import { getAppProgress } from '../../internal/metrics.js';
|
|
7
7
|
import { createSyncStore } from '../../sync-store/index.js';
|
|
8
8
|
import { createSync, splitEvents } from '../../sync/index.js';
|
|
@@ -16,9 +16,9 @@ import { createRequestQueue } from '../../utils/requestQueue.js';
|
|
|
16
16
|
export async function run({ common, preBuild, schemaBuild, indexingBuild, database, onFatalError, onReloadableError, }) {
|
|
17
17
|
const initialCheckpoint = await database.recoverCheckpoint();
|
|
18
18
|
await database.migrateSync();
|
|
19
|
+
runCodegen({ common });
|
|
19
20
|
const requestQueues = indexingBuild.networks.map((network) => createRequestQueue({ network, common }));
|
|
20
21
|
const syncStore = createSyncStore({ common, database });
|
|
21
|
-
const metadataStore = getMetadataStore({ database });
|
|
22
22
|
const realtimeMutex = createMutex();
|
|
23
23
|
const sync = await createSync({
|
|
24
24
|
common,
|
|
@@ -35,21 +35,19 @@ export async function run({ common, preBuild, schemaBuild, indexingBuild, databa
|
|
|
35
35
|
initialCheckpoint,
|
|
36
36
|
ordering: preBuild.ordering,
|
|
37
37
|
});
|
|
38
|
-
const
|
|
38
|
+
const indexing = createIndexing({
|
|
39
39
|
common,
|
|
40
40
|
indexingBuild,
|
|
41
41
|
requestQueues,
|
|
42
42
|
syncStore,
|
|
43
43
|
});
|
|
44
|
-
const
|
|
44
|
+
const indexingCache = createIndexingCache({
|
|
45
45
|
common,
|
|
46
|
-
schemaBuild,
|
|
47
46
|
database,
|
|
48
|
-
|
|
47
|
+
schemaBuild,
|
|
48
|
+
checkpoint: initialCheckpoint,
|
|
49
49
|
});
|
|
50
|
-
|
|
51
|
-
runCodegen({ common });
|
|
52
|
-
await metadataStore.setStatus(sync.getStatus());
|
|
50
|
+
await database.setStatus(sync.getStatus());
|
|
53
51
|
for (const network of indexingBuild.networks) {
|
|
54
52
|
const label = { network: network.name };
|
|
55
53
|
common.metrics.ponder_historical_total_indexing_seconds.set(label, Math.max(sync.seconds[network.name].end - sync.seconds[network.name].start, 0));
|
|
@@ -62,92 +60,92 @@ export async function run({ common, preBuild, schemaBuild, indexingBuild, databa
|
|
|
62
60
|
common.metrics.start_timestamp = Date.now();
|
|
63
61
|
// If the initial checkpoint is zero, we need to run setup events.
|
|
64
62
|
if (initialCheckpoint === ZERO_CHECKPOINT_STRING) {
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
const historicalIndexingStore = createHistoricalIndexingStore({
|
|
64
|
+
common,
|
|
65
|
+
schemaBuild,
|
|
66
|
+
database,
|
|
67
|
+
indexingCache,
|
|
68
|
+
db: database.qb.drizzle,
|
|
69
|
+
});
|
|
70
|
+
const result = await indexing.processSetupEvents({
|
|
71
|
+
db: historicalIndexingStore,
|
|
68
72
|
});
|
|
69
73
|
if (result.status === "error") {
|
|
70
74
|
onReloadableError(result.error);
|
|
71
75
|
return;
|
|
72
76
|
}
|
|
73
77
|
}
|
|
74
|
-
let lastFlush = Date.now();
|
|
75
78
|
// Run historical indexing until complete.
|
|
76
79
|
for await (const events of sync.getEvents()) {
|
|
77
80
|
if (events.length > 0) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
81
|
+
await database.retry(async () => {
|
|
82
|
+
try {
|
|
83
|
+
await database.qb.drizzle.transaction(async (tx) => {
|
|
84
|
+
const historicalIndexingStore = createHistoricalIndexingStore({
|
|
85
|
+
common,
|
|
86
|
+
schemaBuild,
|
|
87
|
+
database,
|
|
88
|
+
indexingCache,
|
|
89
|
+
db: tx,
|
|
90
|
+
});
|
|
91
|
+
const eventChunks = chunk(events, 93);
|
|
92
|
+
for (const eventChunk of eventChunks) {
|
|
93
|
+
const result = await indexing.processEvents({
|
|
94
|
+
events: eventChunk,
|
|
95
|
+
db: historicalIndexingStore,
|
|
96
|
+
});
|
|
97
|
+
await historicalIndexingStore.queue.onIdle();
|
|
98
|
+
if (result.status === "error") {
|
|
99
|
+
onReloadableError(result.error);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const checkpoint = decodeCheckpoint(eventChunk[eventChunk.length - 1].checkpoint);
|
|
103
|
+
if (preBuild.ordering === "multichain") {
|
|
104
|
+
const network = indexingBuild.networks.find((network) => network.chainId === Number(checkpoint.chainId));
|
|
105
|
+
common.metrics.ponder_historical_completed_indexing_seconds.set({ network: network.name }, Math.max(checkpoint.blockTimestamp -
|
|
106
|
+
sync.seconds[network.name].start, 0));
|
|
107
|
+
common.metrics.ponder_indexing_timestamp.set({ network: network.name }, checkpoint.blockTimestamp);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
for (const network of indexingBuild.networks) {
|
|
111
|
+
common.metrics.ponder_historical_completed_indexing_seconds.set({ network: network.name }, Math.max(checkpoint.blockTimestamp -
|
|
112
|
+
sync.seconds[network.name].start, 0));
|
|
113
|
+
common.metrics.ponder_indexing_timestamp.set({ network: network.name }, checkpoint.blockTimestamp);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Note: allows for terminal and logs to be updated
|
|
117
|
+
await new Promise(setImmediate);
|
|
118
|
+
}
|
|
119
|
+
// underlying metrics collection is actually synchronous
|
|
120
|
+
// https://github.com/siimon/prom-client/blob/master/lib/histogram.js#L102-L125
|
|
121
|
+
const { eta, progress } = await getAppProgress(common.metrics);
|
|
122
|
+
if (eta === undefined || progress === undefined) {
|
|
123
|
+
common.logger.info({
|
|
124
|
+
service: "app",
|
|
125
|
+
msg: `Indexed ${events.length} events`,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
common.logger.info({
|
|
130
|
+
service: "app",
|
|
131
|
+
msg: `Indexed ${events.length} events with ${formatPercentage(progress)} complete and ${formatEta(eta * 1000)} remaining`,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
await indexingCache.flush({ db: tx });
|
|
135
|
+
await database.finalize({
|
|
136
|
+
checkpoint: events[events.length - 1].checkpoint,
|
|
137
|
+
db: tx,
|
|
138
|
+
});
|
|
129
139
|
});
|
|
140
|
+
indexingCache.commit();
|
|
130
141
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
msg: "Dev server periodic flush triggered, starting flush",
|
|
135
|
-
});
|
|
142
|
+
catch (error) {
|
|
143
|
+
indexingCache.rollback();
|
|
144
|
+
throw error;
|
|
136
145
|
}
|
|
137
|
-
|
|
138
|
-
await historicalIndexingStore.flush();
|
|
139
|
-
await database.complete({ checkpoint: ZERO_CHECKPOINT_STRING });
|
|
140
|
-
await database.finalize({
|
|
141
|
-
checkpoint: events[events.length - 1].checkpoint,
|
|
142
|
-
});
|
|
143
|
-
lastFlush = Date.now();
|
|
144
|
-
common.logger.debug({
|
|
145
|
-
service: "indexing",
|
|
146
|
-
msg: "Completed flush",
|
|
147
|
-
});
|
|
148
|
-
}
|
|
146
|
+
});
|
|
149
147
|
}
|
|
150
|
-
await
|
|
148
|
+
await database.setStatus(sync.getStatus());
|
|
151
149
|
}
|
|
152
150
|
// Persist the indexing store to the db. The `finalized`
|
|
153
151
|
// checkpoint is used as a mutex. Any rows in the reorg table that may
|
|
@@ -157,10 +155,17 @@ export async function run({ common, preBuild, schemaBuild, indexingBuild, databa
|
|
|
157
155
|
service: "indexing",
|
|
158
156
|
msg: "Completed all historical events, starting final flush",
|
|
159
157
|
});
|
|
160
|
-
await database.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
158
|
+
await database.retry(async () => {
|
|
159
|
+
await database.qb.drizzle.transaction(async (tx) => {
|
|
160
|
+
await indexingCache.flush({ db: tx });
|
|
161
|
+
indexingCache.clear();
|
|
162
|
+
await database.finalize({
|
|
163
|
+
checkpoint: sync.getFinalizedCheckpoint(),
|
|
164
|
+
db: tx,
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
indexingCache.clear();
|
|
164
169
|
// Manually update metrics to fix a UI bug that occurs when the end
|
|
165
170
|
// checkpoint is between the last processed event and the finalized
|
|
166
171
|
// checkpoint.
|
|
@@ -174,6 +179,11 @@ export async function run({ common, preBuild, schemaBuild, indexingBuild, databa
|
|
|
174
179
|
service: "indexing",
|
|
175
180
|
msg: "Completed historical indexing",
|
|
176
181
|
});
|
|
182
|
+
const realtimeIndexingStore = createRealtimeIndexingStore({
|
|
183
|
+
common,
|
|
184
|
+
schemaBuild,
|
|
185
|
+
database,
|
|
186
|
+
});
|
|
177
187
|
const onRealtimeEvent = realtimeMutex(async (event) => {
|
|
178
188
|
switch (event.type) {
|
|
179
189
|
case "block": {
|
|
@@ -192,8 +202,9 @@ export async function run({ common, preBuild, schemaBuild, indexingBuild, databa
|
|
|
192
202
|
service: "app",
|
|
193
203
|
msg: `Decoded ${events.length} '${network.name}' events for block ${Number(decodeCheckpoint(checkpoint).blockNumber)}`,
|
|
194
204
|
});
|
|
195
|
-
const result = await
|
|
205
|
+
const result = await indexing.processEvents({
|
|
196
206
|
events,
|
|
207
|
+
db: realtimeIndexingStore,
|
|
197
208
|
});
|
|
198
209
|
common.logger.info({
|
|
199
210
|
service: "app",
|
|
@@ -202,7 +213,7 @@ export async function run({ common, preBuild, schemaBuild, indexingBuild, databa
|
|
|
202
213
|
if (result.status === "error")
|
|
203
214
|
onReloadableError(result.error);
|
|
204
215
|
// Set reorg table `checkpoint` column for newly inserted rows.
|
|
205
|
-
await database.complete({ checkpoint });
|
|
216
|
+
await database.complete({ checkpoint, db: database.qb.drizzle });
|
|
206
217
|
if (preBuild.ordering === "multichain") {
|
|
207
218
|
const network = indexingBuild.networks.find((network) => network.chainId ===
|
|
208
219
|
Number(decodeCheckpoint(checkpoint).chainId));
|
|
@@ -215,16 +226,23 @@ export async function run({ common, preBuild, schemaBuild, indexingBuild, databa
|
|
|
215
226
|
}
|
|
216
227
|
}
|
|
217
228
|
}
|
|
218
|
-
await
|
|
229
|
+
await database.setStatus(event.status);
|
|
219
230
|
break;
|
|
220
231
|
}
|
|
221
232
|
case "reorg":
|
|
222
233
|
await database.removeTriggers();
|
|
223
|
-
await database.
|
|
234
|
+
await database.retry(async () => {
|
|
235
|
+
await database.qb.drizzle.transaction(async (tx) => {
|
|
236
|
+
await database.revert({ checkpoint: event.checkpoint, tx });
|
|
237
|
+
});
|
|
238
|
+
});
|
|
224
239
|
await database.createTriggers();
|
|
225
240
|
break;
|
|
226
241
|
case "finalize":
|
|
227
|
-
await database.finalize({
|
|
242
|
+
await database.finalize({
|
|
243
|
+
checkpoint: event.checkpoint,
|
|
244
|
+
db: database.qb.drizzle,
|
|
245
|
+
});
|
|
228
246
|
break;
|
|
229
247
|
default:
|
|
230
248
|
never(event);
|
|
@@ -232,13 +250,8 @@ export async function run({ common, preBuild, schemaBuild, indexingBuild, databa
|
|
|
232
250
|
});
|
|
233
251
|
await database.createIndexes();
|
|
234
252
|
await database.createTriggers();
|
|
235
|
-
indexingService.setIndexingStore(createRealtimeIndexingStore({
|
|
236
|
-
common,
|
|
237
|
-
schemaBuild,
|
|
238
|
-
database,
|
|
239
|
-
}));
|
|
240
253
|
await sync.startRealtime();
|
|
241
|
-
await
|
|
254
|
+
await database.setStatus(sync.getStatus());
|
|
242
255
|
common.logger.info({
|
|
243
256
|
service: "server",
|
|
244
257
|
msg: "Started returning 200 responses from /ready endpoint",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/bin/utils/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/bin/utils/run.ts"],"names":[],"mappings":"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"}
|