ponder 0.14.13 → 0.15.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.
Files changed (237) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/esm/bin/commands/createViews.js +28 -11
  3. package/dist/esm/bin/commands/createViews.js.map +1 -1
  4. package/dist/esm/bin/commands/dev.js +42 -22
  5. package/dist/esm/bin/commands/dev.js.map +1 -1
  6. package/dist/esm/bin/commands/prune.js +3 -0
  7. package/dist/esm/bin/commands/prune.js.map +1 -1
  8. package/dist/esm/bin/commands/serve.js +4 -1
  9. package/dist/esm/bin/commands/serve.js.map +1 -1
  10. package/dist/esm/bin/commands/start.js +18 -6
  11. package/dist/esm/bin/commands/start.js.map +1 -1
  12. package/dist/esm/bin/isolatedController.js +200 -0
  13. package/dist/esm/bin/isolatedController.js.map +1 -0
  14. package/dist/esm/bin/isolatedWorker.js +146 -0
  15. package/dist/esm/bin/isolatedWorker.js.map +1 -0
  16. package/dist/esm/build/config.js +322 -402
  17. package/dist/esm/build/config.js.map +1 -1
  18. package/dist/esm/build/index.js +8 -11
  19. package/dist/esm/build/index.js.map +1 -1
  20. package/dist/esm/build/pre.js +1 -4
  21. package/dist/esm/build/pre.js.map +1 -1
  22. package/dist/esm/build/schema.js +25 -3
  23. package/dist/esm/build/schema.js.map +1 -1
  24. package/dist/esm/client/index.js +306 -42
  25. package/dist/esm/client/index.js.map +1 -1
  26. package/dist/esm/database/actions.js +264 -104
  27. package/dist/esm/database/actions.js.map +1 -1
  28. package/dist/esm/database/index.js +39 -33
  29. package/dist/esm/database/index.js.map +1 -1
  30. package/dist/esm/database/queryBuilder.js +1 -0
  31. package/dist/esm/database/queryBuilder.js.map +1 -1
  32. package/dist/esm/drizzle/index.js +11 -7
  33. package/dist/esm/drizzle/index.js.map +1 -1
  34. package/dist/esm/drizzle/onchain.js +18 -0
  35. package/dist/esm/drizzle/onchain.js.map +1 -1
  36. package/dist/esm/indexing/client.js +32 -25
  37. package/dist/esm/indexing/client.js.map +1 -1
  38. package/dist/esm/indexing/index.js +110 -178
  39. package/dist/esm/indexing/index.js.map +1 -1
  40. package/dist/esm/indexing/profile.js +1 -1
  41. package/dist/esm/indexing/profile.js.map +1 -1
  42. package/dist/esm/indexing-store/cache.js +196 -274
  43. package/dist/esm/indexing-store/cache.js.map +1 -1
  44. package/dist/esm/indexing-store/historical.js +17 -13
  45. package/dist/esm/indexing-store/historical.js.map +1 -1
  46. package/dist/esm/indexing-store/index.js +10 -1
  47. package/dist/esm/indexing-store/index.js.map +1 -1
  48. package/dist/esm/indexing-store/profile.js +3 -3
  49. package/dist/esm/indexing-store/profile.js.map +1 -1
  50. package/dist/esm/indexing-store/realtime.js +27 -2
  51. package/dist/esm/indexing-store/realtime.js.map +1 -1
  52. package/dist/esm/internal/errors.js +28 -0
  53. package/dist/esm/internal/errors.js.map +1 -1
  54. package/dist/esm/internal/metrics.js +279 -82
  55. package/dist/esm/internal/metrics.js.map +1 -1
  56. package/dist/esm/internal/options.js +1 -0
  57. package/dist/esm/internal/options.js.map +1 -1
  58. package/dist/esm/internal/telemetry.js +1 -1
  59. package/dist/esm/internal/telemetry.js.map +1 -1
  60. package/dist/esm/rpc/http.js +130 -0
  61. package/dist/esm/rpc/http.js.map +1 -0
  62. package/dist/esm/rpc/index.js +38 -7
  63. package/dist/esm/rpc/index.js.map +1 -1
  64. package/dist/esm/runtime/events.js +179 -212
  65. package/dist/esm/runtime/events.js.map +1 -1
  66. package/dist/esm/runtime/filter.js +71 -0
  67. package/dist/esm/runtime/filter.js.map +1 -1
  68. package/dist/esm/runtime/fragments.js +78 -73
  69. package/dist/esm/runtime/fragments.js.map +1 -1
  70. package/dist/esm/runtime/historical.js +306 -130
  71. package/dist/esm/runtime/historical.js.map +1 -1
  72. package/dist/esm/runtime/index.js +183 -58
  73. package/dist/esm/runtime/index.js.map +1 -1
  74. package/dist/esm/runtime/isolated.js +462 -0
  75. package/dist/esm/runtime/isolated.js.map +1 -0
  76. package/dist/esm/runtime/multichain.js +80 -73
  77. package/dist/esm/runtime/multichain.js.map +1 -1
  78. package/dist/esm/runtime/omnichain.js +82 -75
  79. package/dist/esm/runtime/omnichain.js.map +1 -1
  80. package/dist/esm/runtime/realtime.js +198 -66
  81. package/dist/esm/runtime/realtime.js.map +1 -1
  82. package/dist/esm/sync-historical/index.js +416 -457
  83. package/dist/esm/sync-historical/index.js.map +1 -1
  84. package/dist/esm/sync-realtime/bloom.js +3 -3
  85. package/dist/esm/sync-realtime/bloom.js.map +1 -1
  86. package/dist/esm/sync-realtime/index.js +27 -46
  87. package/dist/esm/sync-realtime/index.js.map +1 -1
  88. package/dist/esm/sync-store/index.js +112 -63
  89. package/dist/esm/sync-store/index.js.map +1 -1
  90. package/dist/esm/utils/abi.js +20 -32
  91. package/dist/esm/utils/abi.js.map +1 -1
  92. package/dist/esm/utils/chunk.js +8 -0
  93. package/dist/esm/utils/chunk.js.map +1 -0
  94. package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
  95. package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
  96. package/dist/esm/{client/parse.js → utils/sql-parse.js} +94 -80
  97. package/dist/esm/utils/sql-parse.js.map +1 -0
  98. package/dist/types/bin/commands/createViews.d.ts.map +1 -1
  99. package/dist/types/bin/commands/dev.d.ts.map +1 -1
  100. package/dist/types/bin/commands/prune.d.ts.map +1 -1
  101. package/dist/types/bin/commands/serve.d.ts.map +1 -1
  102. package/dist/types/bin/commands/start.d.ts.map +1 -1
  103. package/dist/types/bin/isolatedController.d.ts +13 -0
  104. package/dist/types/bin/isolatedController.d.ts.map +1 -0
  105. package/dist/types/bin/isolatedWorker.d.ts +9 -0
  106. package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
  107. package/dist/types/build/config.d.ts +29 -11
  108. package/dist/types/build/config.d.ts.map +1 -1
  109. package/dist/types/build/index.d.ts +3 -2
  110. package/dist/types/build/index.d.ts.map +1 -1
  111. package/dist/types/build/pre.d.ts +1 -1
  112. package/dist/types/build/pre.d.ts.map +1 -1
  113. package/dist/types/build/schema.d.ts +5 -3
  114. package/dist/types/build/schema.d.ts.map +1 -1
  115. package/dist/types/client/index.d.ts +1 -1
  116. package/dist/types/client/index.d.ts.map +1 -1
  117. package/dist/types/config/index.d.ts +3 -3
  118. package/dist/types/config/index.d.ts.map +1 -1
  119. package/dist/types/database/actions.d.ts +53 -7
  120. package/dist/types/database/actions.d.ts.map +1 -1
  121. package/dist/types/database/index.d.ts +21 -21
  122. package/dist/types/database/index.d.ts.map +1 -1
  123. package/dist/types/database/queryBuilder.d.ts.map +1 -1
  124. package/dist/types/drizzle/index.d.ts +4 -5
  125. package/dist/types/drizzle/index.d.ts.map +1 -1
  126. package/dist/types/drizzle/onchain.d.ts +6 -0
  127. package/dist/types/drizzle/onchain.d.ts.map +1 -1
  128. package/dist/types/indexing/client.d.ts.map +1 -1
  129. package/dist/types/indexing/index.d.ts +2 -5
  130. package/dist/types/indexing/index.d.ts.map +1 -1
  131. package/dist/types/indexing-store/cache.d.ts +3 -2
  132. package/dist/types/indexing-store/cache.d.ts.map +1 -1
  133. package/dist/types/indexing-store/historical.d.ts +2 -1
  134. package/dist/types/indexing-store/historical.d.ts.map +1 -1
  135. package/dist/types/indexing-store/index.d.ts +1 -0
  136. package/dist/types/indexing-store/index.d.ts.map +1 -1
  137. package/dist/types/indexing-store/realtime.d.ts +2 -1
  138. package/dist/types/indexing-store/realtime.d.ts.map +1 -1
  139. package/dist/types/internal/errors.d.ts +5 -0
  140. package/dist/types/internal/errors.d.ts.map +1 -1
  141. package/dist/types/internal/metrics.d.ts +21 -0
  142. package/dist/types/internal/metrics.d.ts.map +1 -1
  143. package/dist/types/internal/options.d.ts +2 -0
  144. package/dist/types/internal/options.d.ts.map +1 -1
  145. package/dist/types/internal/types.d.ts +66 -58
  146. package/dist/types/internal/types.d.ts.map +1 -1
  147. package/dist/types/rpc/http.d.ts +17 -0
  148. package/dist/types/rpc/http.d.ts.map +1 -0
  149. package/dist/types/rpc/index.d.ts.map +1 -1
  150. package/dist/types/runtime/events.d.ts +4 -4
  151. package/dist/types/runtime/events.d.ts.map +1 -1
  152. package/dist/types/runtime/filter.d.ts +5 -1
  153. package/dist/types/runtime/filter.d.ts.map +1 -1
  154. package/dist/types/runtime/fragments.d.ts +4 -3
  155. package/dist/types/runtime/fragments.d.ts.map +1 -1
  156. package/dist/types/runtime/historical.d.ts +29 -13
  157. package/dist/types/runtime/historical.d.ts.map +1 -1
  158. package/dist/types/runtime/index.d.ts +49 -6
  159. package/dist/types/runtime/index.d.ts.map +1 -1
  160. package/dist/types/runtime/init.d.ts +5 -5
  161. package/dist/types/runtime/init.d.ts.map +1 -1
  162. package/dist/types/runtime/isolated.d.ts +14 -0
  163. package/dist/types/runtime/isolated.d.ts.map +1 -0
  164. package/dist/types/runtime/multichain.d.ts.map +1 -1
  165. package/dist/types/runtime/omnichain.d.ts.map +1 -1
  166. package/dist/types/runtime/realtime.d.ts +21 -10
  167. package/dist/types/runtime/realtime.d.ts.map +1 -1
  168. package/dist/types/sync-historical/index.d.ts +18 -8
  169. package/dist/types/sync-historical/index.d.ts.map +1 -1
  170. package/dist/types/sync-realtime/bloom.d.ts.map +1 -1
  171. package/dist/types/sync-realtime/index.d.ts +2 -2
  172. package/dist/types/sync-realtime/index.d.ts.map +1 -1
  173. package/dist/types/sync-store/index.d.ts +9 -9
  174. package/dist/types/sync-store/index.d.ts.map +1 -1
  175. package/dist/types/utils/abi.d.ts +3 -34
  176. package/dist/types/utils/abi.d.ts.map +1 -1
  177. package/dist/types/utils/chunk.d.ts +2 -0
  178. package/dist/types/utils/chunk.d.ts.map +1 -0
  179. package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
  180. package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
  181. package/dist/types/utils/sql-parse.d.ts +21 -0
  182. package/dist/types/utils/sql-parse.d.ts.map +1 -0
  183. package/package.json +2 -2
  184. package/src/bin/commands/createViews.ts +35 -15
  185. package/src/bin/commands/dev.ts +43 -21
  186. package/src/bin/commands/prune.ts +6 -0
  187. package/src/bin/commands/serve.ts +4 -1
  188. package/src/bin/commands/start.ts +20 -5
  189. package/src/bin/isolatedController.ts +300 -0
  190. package/src/bin/isolatedWorker.ts +192 -0
  191. package/src/build/config.ts +570 -632
  192. package/src/build/index.ts +14 -14
  193. package/src/build/pre.ts +1 -4
  194. package/src/build/schema.ts +49 -4
  195. package/src/client/index.ts +386 -48
  196. package/src/config/index.ts +3 -3
  197. package/src/database/actions.ts +469 -120
  198. package/src/database/index.ts +85 -58
  199. package/src/database/queryBuilder.ts +1 -0
  200. package/src/drizzle/index.ts +15 -7
  201. package/src/drizzle/onchain.ts +19 -0
  202. package/src/indexing/client.ts +38 -25
  203. package/src/indexing/index.ts +137 -230
  204. package/src/indexing/profile.ts +1 -1
  205. package/src/indexing-store/cache.ts +285 -414
  206. package/src/indexing-store/historical.ts +20 -10
  207. package/src/indexing-store/index.ts +16 -0
  208. package/src/indexing-store/profile.ts +3 -3
  209. package/src/indexing-store/realtime.ts +28 -0
  210. package/src/internal/errors.ts +26 -0
  211. package/src/internal/metrics.ts +341 -111
  212. package/src/internal/options.ts +4 -0
  213. package/src/internal/telemetry.ts +1 -1
  214. package/src/internal/types.ts +70 -87
  215. package/src/rpc/http.ts +164 -0
  216. package/src/rpc/index.ts +39 -7
  217. package/src/runtime/events.ts +195 -240
  218. package/src/runtime/filter.ts +85 -1
  219. package/src/runtime/fragments.ts +109 -113
  220. package/src/runtime/historical.ts +467 -189
  221. package/src/runtime/index.ts +337 -69
  222. package/src/runtime/init.ts +5 -5
  223. package/src/runtime/isolated.ts +768 -0
  224. package/src/runtime/multichain.ts +137 -102
  225. package/src/runtime/omnichain.ts +138 -106
  226. package/src/runtime/realtime.ts +322 -123
  227. package/src/sync-historical/index.ts +556 -692
  228. package/src/sync-realtime/bloom.ts +7 -3
  229. package/src/sync-realtime/index.ts +31 -46
  230. package/src/sync-store/index.ts +189 -95
  231. package/src/utils/abi.ts +33 -90
  232. package/src/utils/chunk.ts +7 -0
  233. package/src/utils/promiseAllSettledWithThrow.ts +27 -0
  234. package/src/{client/parse.ts → utils/sql-parse.ts} +100 -90
  235. package/dist/esm/client/parse.js.map +0 -1
  236. package/dist/types/client/parse.d.ts +0 -14
  237. package/dist/types/client/parse.d.ts.map +0 -1
@@ -0,0 +1,462 @@
1
+ import { commitBlock, createLiveQueryTriggers, createTriggers, dropLiveQueryTriggers, dropTriggers, finalizeIsolated, revertIsolated, } from '../database/actions.js';
2
+ import { getPonderCheckpointTable } from '../database/index.js';
3
+ import { createIndexingCache } from '../indexing-store/cache.js';
4
+ import { createHistoricalIndexingStore } from '../indexing-store/historical.js';
5
+ import { createRealtimeIndexingStore } from '../indexing-store/realtime.js';
6
+ import { createCachedViemClient } from '../indexing/client.js';
7
+ import { createColumnAccessPattern, createIndexing, getEventCount, } from '../indexing/index.js';
8
+ import { InvalidEventAccessError, NonRetryableUserError, } from '../internal/errors.js';
9
+ import { splitEvents } from './events.js';
10
+ import { createSyncStore } from '../sync-store/index.js';
11
+ import { ZERO_CHECKPOINT_STRING, decodeCheckpoint, min, } from '../utils/checkpoint.js';
12
+ import { bufferAsyncGenerator, recordAsyncGenerator, } from '../utils/generators.js';
13
+ import { never } from '../utils/never.js';
14
+ import { startClock } from '../utils/timer.js';
15
+ import { eq, getTableName, isTable, sql } from "drizzle-orm";
16
+ import { getHistoricalEventsIsolated, refetchHistoricalEvents, } from "./historical.js";
17
+ import { getCachedIntervals, getChildAddresses } from "./index.js";
18
+ import { initSyncProgress } from "./init.js";
19
+ import { getRealtimeEventsIsolated } from "./realtime.js";
20
+ export async function runIsolated({ common, preBuild, namespaceBuild, schemaBuild, indexingBuild, crashRecoveryCheckpoint, database, onReady, }) {
21
+ const chain = indexingBuild.chains[0];
22
+ const columnAccessPattern = createColumnAccessPattern({
23
+ indexingBuild,
24
+ });
25
+ const syncStore = createSyncStore({ common, qb: database.syncQB });
26
+ const PONDER_CHECKPOINT = getPonderCheckpointTable(namespaceBuild.schema);
27
+ const eventCount = getEventCount(indexingBuild.indexingFunctions);
28
+ const cachedViemClient = createCachedViemClient({
29
+ common,
30
+ indexingBuild,
31
+ syncStore,
32
+ eventCount,
33
+ });
34
+ const indexingErrorHandler = {
35
+ getRetryableError: () => {
36
+ return indexingErrorHandler.error;
37
+ },
38
+ setRetryableError: (error) => {
39
+ indexingErrorHandler.error = error;
40
+ },
41
+ clearRetryableError: () => {
42
+ indexingErrorHandler.error = undefined;
43
+ },
44
+ error: undefined,
45
+ };
46
+ const indexing = createIndexing({
47
+ common,
48
+ indexingBuild,
49
+ client: cachedViemClient,
50
+ indexingErrorHandler,
51
+ columnAccessPattern,
52
+ });
53
+ const indexingCache = createIndexingCache({
54
+ common,
55
+ schemaBuild,
56
+ crashRecoveryCheckpoint,
57
+ eventCount,
58
+ chainId: chain.id,
59
+ });
60
+ const historicalIndexingStore = createHistoricalIndexingStore({
61
+ common,
62
+ schemaBuild,
63
+ indexingCache,
64
+ indexingErrorHandler,
65
+ chainId: chain.id,
66
+ });
67
+ const seconds = {};
68
+ const eventCallbacks = indexingBuild.eventCallbacks[indexingBuild.chains.indexOf(chain)];
69
+ const cachedIntervals = await getCachedIntervals({
70
+ chain,
71
+ filters: eventCallbacks.map(({ filter }) => filter),
72
+ syncStore,
73
+ });
74
+ const syncProgress = await initSyncProgress({
75
+ common,
76
+ filters: eventCallbacks.map(({ filter }) => filter),
77
+ chain,
78
+ rpc: indexingBuild.rpcs[0],
79
+ finalizedBlock: indexingBuild.finalizedBlocks[0],
80
+ cachedIntervals,
81
+ });
82
+ const childAddresses = await getChildAddresses({
83
+ filters: eventCallbacks.map(({ filter }) => filter),
84
+ syncStore,
85
+ });
86
+ const unfinalizedBlocks = [];
87
+ const start = Number(decodeCheckpoint(syncProgress.getCheckpoint({ tag: "start" }))
88
+ .blockTimestamp);
89
+ const end = Number(decodeCheckpoint(min(syncProgress.getCheckpoint({ tag: "end" }), syncProgress.getCheckpoint({ tag: "finalized" }))).blockTimestamp);
90
+ const _crashRecoveryCheckpoint = crashRecoveryCheckpoint?.find(({ chainId }) => chainId === chain.id)?.checkpoint;
91
+ const cached = Math.min(Number(decodeCheckpoint(_crashRecoveryCheckpoint ?? ZERO_CHECKPOINT_STRING)
92
+ .blockTimestamp), end);
93
+ seconds[chain.name] = { start, end, cached };
94
+ const label = { chain: chain.name };
95
+ common.metrics.ponder_historical_total_indexing_seconds.set(label, Math.max(seconds[chain.name].end - seconds[chain.name].start, 0));
96
+ common.metrics.ponder_historical_cached_indexing_seconds.set(label, Math.max(seconds[chain.name].cached - seconds[chain.name].start, 0));
97
+ common.metrics.ponder_historical_completed_indexing_seconds.set(label, 0);
98
+ common.metrics.ponder_indexing_timestamp.set(label, Math.max(seconds[chain.name].cached, seconds[chain.name].start));
99
+ const startTimestamp = Math.round(Date.now() / 1000);
100
+ common.metrics.ponder_historical_start_timestamp_seconds.set(label, startTimestamp);
101
+ // Reset the start timestamp so the eta estimate doesn't include
102
+ // the startup time.
103
+ common.metrics.start_timestamp = Date.now();
104
+ // If the initial checkpoint is zero, we need to run setup events.
105
+ if (crashRecoveryCheckpoint === undefined) {
106
+ await database.userQB.transaction(async (tx) => {
107
+ historicalIndexingStore.qb = tx;
108
+ historicalIndexingStore.isProcessingEvents = true;
109
+ indexingCache.qb = tx;
110
+ await indexing.processSetupEvents({
111
+ db: historicalIndexingStore,
112
+ });
113
+ historicalIndexingStore.isProcessingEvents = false;
114
+ await indexingCache.flush();
115
+ const initialCheckpoint = min(syncProgress.getCheckpoint({ tag: "start" }), syncProgress.getCheckpoint({ tag: "finalized" }));
116
+ await tx.wrap({ label: "update_checkpoints" }, (tx) => tx
117
+ .insert(PONDER_CHECKPOINT)
118
+ .values({
119
+ chainName: chain.name,
120
+ chainId: chain.id,
121
+ latestCheckpoint: initialCheckpoint,
122
+ safeCheckpoint: initialCheckpoint,
123
+ finalizedCheckpoint: initialCheckpoint,
124
+ })
125
+ .onConflictDoUpdate({
126
+ target: PONDER_CHECKPOINT.chainName,
127
+ set: {
128
+ finalizedCheckpoint: sql `excluded.finalized_checkpoint`,
129
+ safeCheckpoint: sql `excluded.safe_checkpoint`,
130
+ latestCheckpoint: sql `excluded.latest_checkpoint`,
131
+ },
132
+ }));
133
+ });
134
+ }
135
+ const backfillEndClock = startClock();
136
+ // Run historical indexing until complete.
137
+ for await (let { events, chainId, checkpoint, blockRange, } of recordAsyncGenerator(bufferAsyncGenerator(getHistoricalEventsIsolated({
138
+ common,
139
+ chain,
140
+ indexingBuild,
141
+ crashRecoveryCheckpoint,
142
+ syncProgress,
143
+ childAddresses,
144
+ cachedIntervals,
145
+ database,
146
+ }), 1), (params) => {
147
+ common.metrics.ponder_historical_concurrency_group_duration.inc({ group: "extract" }, params.await);
148
+ common.metrics.ponder_historical_concurrency_group_duration.inc({ group: "transform" }, params.yield);
149
+ })) {
150
+ const context = {
151
+ logger: common.logger.child({ action: "index_block_range" }),
152
+ };
153
+ const indexStartClock = startClock();
154
+ indexingCache.qb = database.userQB;
155
+ await Promise.all([
156
+ indexingCache.prefetch({ events }),
157
+ cachedViemClient.prefetch({ events }),
158
+ ]);
159
+ common.metrics.ponder_historical_transform_duration.inc({ step: "prefetch" }, indexStartClock());
160
+ let endClock = startClock();
161
+ await database.userQB.transaction(async (tx) => {
162
+ const initialCompletedEvents = structuredClone(await common.metrics.ponder_indexing_completed_events.get());
163
+ try {
164
+ historicalIndexingStore.qb = tx;
165
+ historicalIndexingStore.isProcessingEvents = true;
166
+ indexingCache.qb = tx;
167
+ common.metrics.ponder_historical_transform_duration.inc({ step: "begin" }, endClock());
168
+ endClock = startClock();
169
+ await indexing.processHistoricalEvents({
170
+ events,
171
+ db: historicalIndexingStore,
172
+ cache: indexingCache,
173
+ updateIndexingSeconds(event, chain) {
174
+ const checkpoint = decodeCheckpoint(event.checkpoint);
175
+ common.metrics.ponder_historical_completed_indexing_seconds.set({ chain: chain.name }, Math.max(Number(checkpoint.blockTimestamp) -
176
+ Math.max(seconds[chain.name].cached, seconds[chain.name].start), 0));
177
+ common.metrics.ponder_indexing_timestamp.set({ chain: chain.name }, Number(checkpoint.blockTimestamp));
178
+ },
179
+ });
180
+ historicalIndexingStore.isProcessingEvents = false;
181
+ common.metrics.ponder_historical_transform_duration.inc({ step: "index" }, endClock());
182
+ endClock = startClock();
183
+ // Note: at this point, the next events can be preloaded, as long as the are not indexed until
184
+ // the "flush" + "finalize" is complete.
185
+ await indexingCache.flush();
186
+ common.metrics.ponder_historical_transform_duration.inc({ step: "load" }, endClock());
187
+ endClock = startClock();
188
+ await tx.wrap({ label: "update_checkpoints" }, (tx) => tx
189
+ .insert(PONDER_CHECKPOINT)
190
+ .values({
191
+ chainName: chain.name,
192
+ chainId,
193
+ latestCheckpoint: checkpoint,
194
+ finalizedCheckpoint: checkpoint,
195
+ safeCheckpoint: checkpoint,
196
+ })
197
+ .onConflictDoUpdate({
198
+ target: PONDER_CHECKPOINT.chainName,
199
+ set: {
200
+ safeCheckpoint: sql `excluded.safe_checkpoint`,
201
+ finalizedCheckpoint: sql `excluded.finalized_checkpoint`,
202
+ latestCheckpoint: sql `excluded.latest_checkpoint`,
203
+ },
204
+ }), context);
205
+ common.metrics.ponder_historical_transform_duration.inc({ step: "finalize" }, endClock());
206
+ endClock = startClock();
207
+ }
208
+ catch (error) {
209
+ // Note: This can cause a bug with "dev" command, because there are multiple instances
210
+ // updating the same metric.
211
+ for (const value of initialCompletedEvents.values) {
212
+ common.metrics.ponder_indexing_completed_events.set(value.labels, value.value);
213
+ }
214
+ indexingCache.invalidate();
215
+ indexingCache.clear();
216
+ if (error instanceof InvalidEventAccessError) {
217
+ common.logger.debug({
218
+ msg: "Failed to index block range",
219
+ chain: chain.name,
220
+ chain_id: chain.id,
221
+ block_range: JSON.stringify(blockRange),
222
+ duration: indexStartClock(),
223
+ error,
224
+ });
225
+ events = await refetchHistoricalEvents({
226
+ common,
227
+ indexingBuild,
228
+ perChainSync: new Map([[chain, { childAddresses }]]),
229
+ syncStore,
230
+ events,
231
+ });
232
+ }
233
+ else if (error instanceof NonRetryableUserError === false) {
234
+ common.logger.warn({
235
+ msg: "Failed to index block range",
236
+ chain: chain.name,
237
+ chain_id: chain.id,
238
+ block_range: JSON.stringify(blockRange),
239
+ duration: indexStartClock(),
240
+ error: error,
241
+ });
242
+ }
243
+ throw error;
244
+ }
245
+ }, undefined, context);
246
+ cachedViemClient.clear();
247
+ common.metrics.ponder_historical_transform_duration.inc({ step: "commit" }, endClock());
248
+ await new Promise(setImmediate);
249
+ common.logger.info({
250
+ msg: "Indexed block range",
251
+ chain: chain.name,
252
+ chain_id: chain.id,
253
+ event_count: events.length,
254
+ block_range: JSON.stringify(blockRange),
255
+ duration: indexStartClock(),
256
+ });
257
+ }
258
+ indexingCache.clear();
259
+ // Manually update metrics to fix a UI bug that occurs when the end
260
+ // checkpoint is between the last processed event and the finalized
261
+ // checkpoint.
262
+ common.metrics.ponder_historical_completed_indexing_seconds.set(label, Math.max(seconds[chain.name].end -
263
+ Math.max(seconds[chain.name].cached, seconds[chain.name].start), 0));
264
+ common.metrics.ponder_indexing_timestamp.set({ chain: chain.name }, seconds[chain.name].end);
265
+ const endTimestamp = Math.round(Date.now() / 1000);
266
+ common.metrics.ponder_historical_end_timestamp_seconds.set({ chain: chain.name }, endTimestamp);
267
+ common.logger.info({
268
+ msg: "Completed backfill indexing",
269
+ chain: chain.name,
270
+ chain_id: chain.id,
271
+ duration: backfillEndClock(),
272
+ });
273
+ const tables = Object.values(schemaBuild.schema).filter(isTable);
274
+ const endClock = startClock();
275
+ await createTriggers(database.adminQB, { tables, chainId: chain.id });
276
+ await createLiveQueryTriggers(database.adminQB, {
277
+ namespaceBuild,
278
+ tables,
279
+ chainId: chain.id,
280
+ });
281
+ common.logger.debug({
282
+ msg: "Created database triggers",
283
+ chain: chain.name,
284
+ chain_id: chain.id,
285
+ count: tables.length,
286
+ duration: endClock(),
287
+ });
288
+ onReady();
289
+ const realtimeIndexingStore = createRealtimeIndexingStore({
290
+ common,
291
+ schemaBuild,
292
+ indexingErrorHandler,
293
+ chainId: chain.id,
294
+ });
295
+ const bufferCallback = (bufferSize) => {
296
+ // Note: Only log when the buffer size is greater than 1 because
297
+ // a buffer size of 1 is not backpressure.
298
+ if (bufferSize === 1)
299
+ return;
300
+ common.logger.trace({
301
+ msg: "Detected live indexing backpressure",
302
+ buffer_size: bufferSize,
303
+ indexing_step: "index block",
304
+ });
305
+ };
306
+ for await (const event of bufferAsyncGenerator(getRealtimeEventsIsolated({
307
+ common,
308
+ indexingBuild,
309
+ chain,
310
+ syncProgress,
311
+ childAddresses,
312
+ unfinalizedBlocks,
313
+ database,
314
+ }), 100, bufferCallback)) {
315
+ switch (event.type) {
316
+ case "block": {
317
+ const context = {
318
+ logger: common.logger.child({ action: "index_block" }),
319
+ };
320
+ const endClock = startClock();
321
+ await database.userQB.transaction(async (tx) => {
322
+ if (database.userQB.$dialect === "postgres") {
323
+ await tx.wrap((tx) => tx.execute("CREATE TEMP TABLE live_query_tables (table_name TEXT PRIMARY KEY) ON COMMIT DROP"), context);
324
+ }
325
+ else {
326
+ await tx.wrap((tx) => tx.execute("CREATE TEMP TABLE IF NOT EXISTS live_query_tables (table_name TEXT PRIMARY KEY)"), context);
327
+ }
328
+ // Events must be run block-by-block, so that `database.commitBlock` can accurately
329
+ // update the temporary `checkpoint` value set in the trigger.
330
+ for (const { checkpoint, events } of splitEvents(event.events)) {
331
+ try {
332
+ realtimeIndexingStore.qb = tx;
333
+ realtimeIndexingStore.isProcessingEvents = true;
334
+ common.logger.trace({
335
+ msg: "Processing block events",
336
+ chain: chain.name,
337
+ chain_id: chain.id,
338
+ number: Number(decodeCheckpoint(checkpoint).blockNumber),
339
+ event_count: events.length,
340
+ });
341
+ await indexing.processRealtimeEvents({
342
+ events,
343
+ db: realtimeIndexingStore,
344
+ });
345
+ common.logger.trace({
346
+ msg: "Processed block events",
347
+ chain: chain.name,
348
+ chain_id: chain.id,
349
+ number: Number(decodeCheckpoint(checkpoint).blockNumber),
350
+ event_count: events.length,
351
+ });
352
+ realtimeIndexingStore.isProcessingEvents = false;
353
+ await Promise.all(tables.map((table) => commitBlock(tx, { table, checkpoint, preBuild }, context)));
354
+ common.logger.trace({
355
+ msg: "Committed reorg data for block",
356
+ chain: chain.name,
357
+ chain_id: chain.id,
358
+ number: Number(decodeCheckpoint(checkpoint).blockNumber),
359
+ event_count: events.length,
360
+ checkpoint,
361
+ });
362
+ common.metrics.ponder_indexing_timestamp.set({ chain: chain.name }, Number(decodeCheckpoint(checkpoint).blockTimestamp));
363
+ }
364
+ catch (error) {
365
+ if (error instanceof NonRetryableUserError === false) {
366
+ common.logger.warn({
367
+ msg: "Failed to index block",
368
+ chain: chain.name,
369
+ chain_id: chain.id,
370
+ number: Number(decodeCheckpoint(checkpoint).blockNumber),
371
+ error: error,
372
+ });
373
+ }
374
+ throw error;
375
+ }
376
+ }
377
+ await tx.wrap({ label: "update_checkpoints" }, (db) => db
378
+ .update(PONDER_CHECKPOINT)
379
+ .set({ latestCheckpoint: event.checkpoint })
380
+ .where(eq(PONDER_CHECKPOINT.chainName, event.chain.name)), context);
381
+ if (event.events.length > 0 &&
382
+ database.userQB.$dialect === "pglite") {
383
+ await tx.wrap((tx) => tx.execute("TRUNCATE TABLE live_query_tables"), context);
384
+ }
385
+ }, undefined, context);
386
+ event.blockCallback?.(true);
387
+ common.logger.info({
388
+ msg: "Indexed block",
389
+ chain: event.chain.name,
390
+ chain_id: event.chain.id,
391
+ number: Number(decodeCheckpoint(event.checkpoint).blockNumber),
392
+ event_count: event.events.length,
393
+ duration: endClock(),
394
+ });
395
+ break;
396
+ }
397
+ case "reorg": {
398
+ const context = {
399
+ logger: common.logger.child({ action: "reorg_block" }),
400
+ };
401
+ const endClock = startClock();
402
+ // Note: `_ponder_checkpoint` is not called here, instead it is called
403
+ // in the `block` case.
404
+ await database.userQB.transaction(async (tx) => {
405
+ await dropTriggers(tx, { tables, chainId: chain.id }, context);
406
+ await dropLiveQueryTriggers(tx, { namespaceBuild, tables, chainId: chain.id }, context);
407
+ const counts = await revertIsolated(tx, {
408
+ checkpoint: event.checkpoint,
409
+ tables,
410
+ }, context);
411
+ for (const [index, table] of tables.entries()) {
412
+ common.logger.debug({
413
+ msg: "Reverted reorged database rows",
414
+ chain: chain.name,
415
+ chain_id: chain.id,
416
+ table: getTableName(table),
417
+ row_count: counts[index],
418
+ });
419
+ }
420
+ await createTriggers(tx, { tables, chainId: chain.id }, context);
421
+ await createLiveQueryTriggers(tx, { namespaceBuild, tables, chainId: chain.id }, context);
422
+ }, undefined, context);
423
+ common.logger.info({
424
+ msg: "Reorged block",
425
+ chain: event.chain.name,
426
+ chain_id: event.chain.id,
427
+ number: Number(decodeCheckpoint(event.checkpoint).blockNumber),
428
+ duration: endClock(),
429
+ });
430
+ break;
431
+ }
432
+ case "finalize": {
433
+ const context = {
434
+ logger: common.logger.child({ action: "finalize_block" }),
435
+ };
436
+ const endClock = startClock();
437
+ await finalizeIsolated(database.userQB, {
438
+ checkpoint: event.checkpoint,
439
+ tables,
440
+ namespaceBuild,
441
+ }, context);
442
+ common.logger.info({
443
+ msg: "Finalized block",
444
+ chain: event.chain.name,
445
+ chain_id: event.chain.id,
446
+ number: Number(decodeCheckpoint(event.checkpoint).blockNumber),
447
+ duration: endClock(),
448
+ });
449
+ break;
450
+ }
451
+ default:
452
+ never(event);
453
+ }
454
+ }
455
+ common.logger.info({
456
+ msg: "Completed indexing",
457
+ chain: chain.name,
458
+ chain_id: chain.id,
459
+ duration: backfillEndClock(),
460
+ });
461
+ }
462
+ //# sourceMappingURL=isolated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolated.js","sourceRoot":"","sources":["../../../src/runtime/isolated.ts"],"names":[],"mappings":"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"}