envio 3.2.1 → 3.3.0-alpha.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 (106) hide show
  1. package/package.json +6 -7
  2. package/src/Batch.res +12 -15
  3. package/src/Batch.res.mjs +4 -5
  4. package/src/BatchProcessing.res +199 -0
  5. package/src/BatchProcessing.res.mjs +125 -0
  6. package/src/ChainFetching.res +375 -0
  7. package/src/ChainFetching.res.mjs +206 -0
  8. package/src/ChainMetadata.res +27 -0
  9. package/src/ChainMetadata.res.mjs +27 -0
  10. package/src/ChainState.res +618 -0
  11. package/src/ChainState.res.mjs +461 -0
  12. package/src/ChainState.resi +85 -0
  13. package/src/Config.res +13 -4
  14. package/src/Config.res.mjs +8 -3
  15. package/src/ContractRegisterContext.res +106 -0
  16. package/src/ContractRegisterContext.res.mjs +76 -0
  17. package/src/Core.res +3 -0
  18. package/src/CrossChainState.res +269 -0
  19. package/src/CrossChainState.res.mjs +197 -0
  20. package/src/CrossChainState.resi +47 -0
  21. package/src/Ecosystem.res +58 -0
  22. package/src/Ecosystem.res.mjs +43 -1
  23. package/src/Env.res +7 -2
  24. package/src/Env.res.mjs +5 -2
  25. package/src/EventConfigBuilder.res +2 -2
  26. package/src/EventProcessing.res +60 -46
  27. package/src/EventProcessing.res.mjs +33 -32
  28. package/src/EventUtils.res +0 -4
  29. package/src/EventUtils.res.mjs +0 -4
  30. package/src/ExitOnCaughtUp.res +10 -0
  31. package/src/ExitOnCaughtUp.res.mjs +22 -0
  32. package/src/FetchState.res +124 -62
  33. package/src/FetchState.res.mjs +159 -93
  34. package/src/InMemoryStore.res +36 -451
  35. package/src/InMemoryStore.res.mjs +20 -369
  36. package/src/IndexerLoop.res +44 -0
  37. package/src/IndexerLoop.res.mjs +46 -0
  38. package/src/IndexerState.res +544 -0
  39. package/src/IndexerState.res.mjs +547 -0
  40. package/src/IndexerState.resi +132 -0
  41. package/src/Internal.res +29 -8
  42. package/src/LoadLayer.res +20 -18
  43. package/src/LoadLayer.res.mjs +14 -12
  44. package/src/LoadLayer.resi +6 -3
  45. package/src/Logging.res +11 -44
  46. package/src/Logging.res.mjs +10 -42
  47. package/src/Main.res +54 -79
  48. package/src/Main.res.mjs +44 -56
  49. package/src/PgStorage.res +8 -71
  50. package/src/PgStorage.res.mjs +3 -47
  51. package/src/Prometheus.res +7 -8
  52. package/src/Prometheus.res.mjs +7 -4
  53. package/src/PruneStaleHistory.res +45 -0
  54. package/src/PruneStaleHistory.res.mjs +46 -0
  55. package/src/RawEvent.res +73 -0
  56. package/src/RawEvent.res.mjs +51 -0
  57. package/src/Rollback.res +204 -0
  58. package/src/Rollback.res.mjs +118 -0
  59. package/src/SimulateItems.res +12 -10
  60. package/src/SimulateItems.res.mjs +1 -1
  61. package/src/UserContext.res +26 -114
  62. package/src/UserContext.res.mjs +15 -78
  63. package/src/Writing.res +242 -0
  64. package/src/Writing.res.mjs +215 -0
  65. package/src/db/InternalTable.res +14 -27
  66. package/src/sources/Evm.res +40 -1
  67. package/src/sources/Evm.res.mjs +94 -84
  68. package/src/sources/Fuel.res +40 -1
  69. package/src/sources/Fuel.res.mjs +36 -26
  70. package/src/sources/HyperFuel.res +41 -120
  71. package/src/sources/HyperFuel.res.mjs +42 -80
  72. package/src/sources/HyperFuel.resi +1 -24
  73. package/src/sources/HyperFuelClient.res +16 -297
  74. package/src/sources/HyperFuelClient.res.mjs +5 -4
  75. package/src/sources/HyperFuelSource.res +33 -8
  76. package/src/sources/HyperFuelSource.res.mjs +56 -10
  77. package/src/sources/HyperSyncSource.res +5 -3
  78. package/src/sources/HyperSyncSource.res.mjs +1 -1
  79. package/src/sources/RpcSource.res +2 -2
  80. package/src/sources/RpcSource.res.mjs +1 -1
  81. package/src/sources/SourceManager.res +8 -18
  82. package/src/sources/SourceManager.res.mjs +8 -5
  83. package/src/sources/SourceManager.resi +4 -1
  84. package/src/sources/Svm.res +18 -1
  85. package/src/sources/Svm.res.mjs +30 -22
  86. package/src/sources/SvmHyperSyncSource.res +1 -1
  87. package/src/sources/SvmHyperSyncSource.res.mjs +1 -1
  88. package/src/tui/Tui.res +38 -36
  89. package/src/tui/Tui.res.mjs +51 -51
  90. package/src/ChainFetcher.res +0 -519
  91. package/src/ChainFetcher.res.mjs +0 -314
  92. package/src/ChainManager.res +0 -358
  93. package/src/ChainManager.res.mjs +0 -291
  94. package/src/Ctx.res +0 -6
  95. package/src/Ctx.res.mjs +0 -2
  96. package/src/GlobalState.res +0 -1056
  97. package/src/GlobalState.res.mjs +0 -1086
  98. package/src/GlobalStateManager.res +0 -57
  99. package/src/GlobalStateManager.res.mjs +0 -68
  100. package/src/GlobalStateManager.resi +0 -7
  101. package/src/Ports.res +0 -5
  102. package/src/Ports.res.mjs +0 -9
  103. package/src/adapters/MarkBatchProcessedAdapter.res +0 -5
  104. package/src/adapters/MarkBatchProcessedAdapter.res.mjs +0 -14
  105. package/src/sources/EnvioApiClient.res +0 -15
  106. package/src/sources/EnvioApiClient.res.mjs +0 -24
@@ -1,1086 +0,0 @@
1
- // Generated by ReScript, PLEASE EDIT WITH CARE
2
-
3
- import * as Env from "./Env.res.mjs";
4
- import * as Utils from "./Utils.res.mjs";
5
- import * as Config from "./Config.res.mjs";
6
- import * as Hrtime from "./bindings/Hrtime.res.mjs";
7
- import * as Logging from "./Logging.res.mjs";
8
- import * as Process from "process";
9
- import * as ChainMap from "./ChainMap.res.mjs";
10
- import * as Throttler from "./Throttler.res.mjs";
11
- import * as FetchState from "./FetchState.res.mjs";
12
- import * as Prometheus from "./Prometheus.res.mjs";
13
- import * as LoadManager from "./LoadManager.res.mjs";
14
- import * as Stdlib_Null from "@rescript/runtime/lib/es6/Stdlib_Null.js";
15
- import * as ChainFetcher from "./ChainFetcher.res.mjs";
16
- import * as ChainManager from "./ChainManager.res.mjs";
17
- import * as Stdlib_Float from "@rescript/runtime/lib/es6/Stdlib_Float.js";
18
- import * as ErrorHandling from "./ErrorHandling.res.mjs";
19
- import * as InMemoryStore from "./InMemoryStore.res.mjs";
20
- import * as Primitive_int from "@rescript/runtime/lib/es6/Primitive_int.js";
21
- import * as SourceManager from "./sources/SourceManager.res.mjs";
22
- import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
23
- import * as ReorgDetection from "./ReorgDetection.res.mjs";
24
- import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
25
- import * as EventProcessing from "./EventProcessing.res.mjs";
26
- import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
27
- import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
28
- import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
29
- import * as SafeCheckpointTracking from "./SafeCheckpointTracking.res.mjs";
30
-
31
- function make() {
32
- let intervalMillis = Env.ThrottleWrites.pruneStaleDataIntervalMillis;
33
- let logger = Logging.createChild({
34
- context: "Throttler for pruning stale entity history data",
35
- intervalMillis: intervalMillis
36
- });
37
- let pruneStaleEntityHistory = Throttler.make(intervalMillis, logger);
38
- return {
39
- pruneStaleEntityHistory: pruneStaleEntityHistory
40
- };
41
- }
42
-
43
- let WriteThrottlers = {
44
- make: make
45
- };
46
-
47
- function make$1(ctx, chainManager, isDevelopmentModeOpt, shouldUseTuiOpt, exitAfterFirstEventBlockOpt, onError) {
48
- let isDevelopmentMode = isDevelopmentModeOpt !== undefined ? isDevelopmentModeOpt : false;
49
- let shouldUseTui = shouldUseTuiOpt !== undefined ? shouldUseTuiOpt : false;
50
- let exitAfterFirstEventBlock = exitAfterFirstEventBlockOpt !== undefined ? exitAfterFirstEventBlockOpt : false;
51
- return {
52
- ctx: ctx,
53
- chainManager: chainManager,
54
- rollbackState: "NoRollback",
55
- indexerStartTime: new Date(),
56
- writeThrottlers: make(),
57
- loadManager: LoadManager.make(),
58
- keepProcessAlive: isDevelopmentMode || shouldUseTui,
59
- exitAfterFirstEventBlock: exitAfterFirstEventBlock,
60
- onError: onError,
61
- id: 0
62
- };
63
- }
64
-
65
- function getId(self) {
66
- return self.id;
67
- }
68
-
69
- function setChainManager(self, chainManager) {
70
- return {
71
- ctx: self.ctx,
72
- chainManager: chainManager,
73
- rollbackState: self.rollbackState,
74
- indexerStartTime: self.indexerStartTime,
75
- writeThrottlers: self.writeThrottlers,
76
- loadManager: self.loadManager,
77
- keepProcessAlive: self.keepProcessAlive,
78
- exitAfterFirstEventBlock: self.exitAfterFirstEventBlock,
79
- onError: self.onError,
80
- id: self.id
81
- };
82
- }
83
-
84
- function isPreparingRollback(state) {
85
- let match = state.rollbackState;
86
- if (typeof match !== "object") {
87
- return match !== "NoRollback";
88
- } else {
89
- return match.TAG !== "RollbackReady";
90
- }
91
- }
92
-
93
- function updateChainMetadataTable(cm, inMemoryStore) {
94
- let chainsData = {};
95
- ChainMap.values(cm.chainFetchers).forEach(cf => {
96
- chainsData[cf.chainConfig.id.toString()] = {
97
- first_event_block: Stdlib_Null.fromOption(cf.fetchState.firstEventBlock),
98
- buffer_block: FetchState.bufferBlockNumber(cf.fetchState),
99
- ready_at: Stdlib_Null.fromOption(cf.timestampCaughtUpToHeadOrEndblock),
100
- _is_hyper_sync: SourceManager.getActiveSource(cf.sourceManager).poweredByHyperSync
101
- };
102
- });
103
- InMemoryStore.setChainMeta(inMemoryStore, chainsData);
104
- }
105
-
106
- function validatePartitionQueryResponse(state, partitionQueryResponse) {
107
- let response = partitionQueryResponse.response;
108
- let chain = partitionQueryResponse.chain;
109
- let chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
110
- let stats = response.stats;
111
- let knownHeight = response.knownHeight;
112
- if (knownHeight > chainFetcher.fetchState.knownHeight) {
113
- Prometheus.SourceHeight.set(SourceManager.getActiveSource(chainFetcher.sourceManager).name, chainFetcher.chainConfig.id, knownHeight);
114
- }
115
- Prometheus.FetchingBlockRange.increment(chain, stats["total time elapsed (s)"], Stdlib_Option.getOr(stats["parsing time (s)"], 0), response.parsedQueueItems.length, (response.latestFetchedBlockNumber - response.fromBlockQueried | 0) + 1 | 0);
116
- let match = ReorgDetection.registerReorgGuard(chainFetcher.reorgDetection, response.blockHashes, knownHeight);
117
- let reorgResult = match[1];
118
- let updatedChainFetcher_logger = chainFetcher.logger;
119
- let updatedChainFetcher_fetchState = chainFetcher.fetchState;
120
- let updatedChainFetcher_sourceManager = chainFetcher.sourceManager;
121
- let updatedChainFetcher_chainConfig = chainFetcher.chainConfig;
122
- let updatedChainFetcher_isProgressAtHead = chainFetcher.isProgressAtHead;
123
- let updatedChainFetcher_timestampCaughtUpToHeadOrEndblock = chainFetcher.timestampCaughtUpToHeadOrEndblock;
124
- let updatedChainFetcher_committedProgressBlockNumber = chainFetcher.committedProgressBlockNumber;
125
- let updatedChainFetcher_numEventsProcessed = chainFetcher.numEventsProcessed;
126
- let updatedChainFetcher_reorgDetection = match[0];
127
- let updatedChainFetcher_safeCheckpointTracking = chainFetcher.safeCheckpointTracking;
128
- let updatedChainFetcher = {
129
- logger: updatedChainFetcher_logger,
130
- fetchState: updatedChainFetcher_fetchState,
131
- sourceManager: updatedChainFetcher_sourceManager,
132
- chainConfig: updatedChainFetcher_chainConfig,
133
- isProgressAtHead: updatedChainFetcher_isProgressAtHead,
134
- timestampCaughtUpToHeadOrEndblock: updatedChainFetcher_timestampCaughtUpToHeadOrEndblock,
135
- committedProgressBlockNumber: updatedChainFetcher_committedProgressBlockNumber,
136
- numEventsProcessed: updatedChainFetcher_numEventsProcessed,
137
- reorgDetection: updatedChainFetcher_reorgDetection,
138
- safeCheckpointTracking: updatedChainFetcher_safeCheckpointTracking
139
- };
140
- let init = state.chainManager;
141
- let nextState_ctx = state.ctx;
142
- let nextState_chainManager = {
143
- chainFetchers: ChainMap.set(state.chainManager.chainFetchers, chain, updatedChainFetcher),
144
- isInReorgThreshold: init.isInReorgThreshold,
145
- isRealtime: init.isRealtime
146
- };
147
- let nextState_rollbackState = state.rollbackState;
148
- let nextState_indexerStartTime = state.indexerStartTime;
149
- let nextState_writeThrottlers = state.writeThrottlers;
150
- let nextState_loadManager = state.loadManager;
151
- let nextState_keepProcessAlive = state.keepProcessAlive;
152
- let nextState_exitAfterFirstEventBlock = state.exitAfterFirstEventBlock;
153
- let nextState_onError = state.onError;
154
- let nextState_id = state.id;
155
- let nextState = {
156
- ctx: nextState_ctx,
157
- chainManager: nextState_chainManager,
158
- rollbackState: nextState_rollbackState,
159
- indexerStartTime: nextState_indexerStartTime,
160
- writeThrottlers: nextState_writeThrottlers,
161
- loadManager: nextState_loadManager,
162
- keepProcessAlive: nextState_keepProcessAlive,
163
- exitAfterFirstEventBlock: nextState_exitAfterFirstEventBlock,
164
- onError: nextState_onError,
165
- id: nextState_id
166
- };
167
- let rollbackWithReorgDetectedBlockNumber;
168
- if (typeof reorgResult !== "object") {
169
- rollbackWithReorgDetectedBlockNumber = undefined;
170
- } else {
171
- let reorgDetected = reorgResult._0;
172
- Logging.childInfo(chainFetcher.logger, ReorgDetection.reorgDetectedToLogParams(reorgDetected, state.ctx.config.shouldRollbackOnReorg));
173
- Prometheus.ReorgCount.increment(chain);
174
- Prometheus.ReorgDetectionBlockNumber.set(reorgDetected.scannedBlock.blockNumber, chain);
175
- rollbackWithReorgDetectedBlockNumber = state.ctx.config.shouldRollbackOnReorg ? reorgDetected.scannedBlock.blockNumber : undefined;
176
- }
177
- if (rollbackWithReorgDetectedBlockNumber === undefined) {
178
- return [
179
- nextState,
180
- [{
181
- TAG: "ProcessPartitionQueryResponse",
182
- _0: partitionQueryResponse
183
- }]
184
- ];
185
- }
186
- let match$1 = state.rollbackState;
187
- let chainManager;
188
- if (typeof match$1 !== "object" || match$1.TAG !== "RollbackReady") {
189
- chainManager = state.chainManager;
190
- } else {
191
- let eventsProcessedDiffByChain = match$1.eventsProcessedDiffByChain;
192
- let init$1 = state.chainManager;
193
- chainManager = {
194
- chainFetchers: ChainMap.mapWithKey(state.chainManager.chainFetchers, (c, chainFetcher) => {
195
- let eventsProcessedDiff = eventsProcessedDiffByChain[c];
196
- if (eventsProcessedDiff !== undefined) {
197
- return {
198
- logger: chainFetcher.logger,
199
- fetchState: chainFetcher.fetchState,
200
- sourceManager: chainFetcher.sourceManager,
201
- chainConfig: chainFetcher.chainConfig,
202
- isProgressAtHead: chainFetcher.isProgressAtHead,
203
- timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
204
- committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
205
- numEventsProcessed: chainFetcher.numEventsProcessed + eventsProcessedDiff,
206
- reorgDetection: chainFetcher.reorgDetection,
207
- safeCheckpointTracking: chainFetcher.safeCheckpointTracking
208
- };
209
- } else {
210
- return chainFetcher;
211
- }
212
- }),
213
- isInReorgThreshold: init$1.isInReorgThreshold,
214
- isRealtime: init$1.isRealtime
215
- };
216
- }
217
- return [
218
- {
219
- ctx: nextState_ctx,
220
- chainManager: {
221
- chainFetchers: ChainMap.map(chainManager.chainFetchers, chainFetcher => ({
222
- logger: chainFetcher.logger,
223
- fetchState: FetchState.resetPendingQueries(chainFetcher.fetchState),
224
- sourceManager: chainFetcher.sourceManager,
225
- chainConfig: chainFetcher.chainConfig,
226
- isProgressAtHead: chainFetcher.isProgressAtHead,
227
- timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
228
- committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
229
- numEventsProcessed: chainFetcher.numEventsProcessed,
230
- reorgDetection: chainFetcher.reorgDetection,
231
- safeCheckpointTracking: chainFetcher.safeCheckpointTracking
232
- })),
233
- isInReorgThreshold: chainManager.isInReorgThreshold,
234
- isRealtime: chainManager.isRealtime
235
- },
236
- rollbackState: {
237
- TAG: "ReorgDetected",
238
- chain: chain,
239
- blockNumber: rollbackWithReorgDetectedBlockNumber
240
- },
241
- indexerStartTime: nextState_indexerStartTime,
242
- writeThrottlers: nextState_writeThrottlers,
243
- loadManager: nextState_loadManager,
244
- keepProcessAlive: nextState_keepProcessAlive,
245
- exitAfterFirstEventBlock: nextState_exitAfterFirstEventBlock,
246
- onError: nextState_onError,
247
- id: nextState_id + 1 | 0
248
- },
249
- ["Rollback"]
250
- ];
251
- }
252
-
253
- function submitPartitionQueryResponse(state, newItems, newItemsWithDcs, knownHeight, latestFetchedBlock, query, chain) {
254
- let chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
255
- let updatedChainFetcher = ChainFetcher.handleQueryResult(chainFetcher, query, newItems, newItemsWithDcs, latestFetchedBlock, knownHeight);
256
- let updatedChainFetcher$1;
257
- if (state.exitAfterFirstEventBlock && newItems.length !== 0) {
258
- let firstEventBlock = newItems[0].blockNumber;
259
- let currentEndBlock = updatedChainFetcher.fetchState.endBlock;
260
- if (currentEndBlock !== undefined) {
261
- if (firstEventBlock < currentEndBlock) {
262
- let init = updatedChainFetcher.fetchState;
263
- updatedChainFetcher$1 = {
264
- logger: updatedChainFetcher.logger,
265
- fetchState: {
266
- optimizedPartitions: init.optimizedPartitions,
267
- startBlock: init.startBlock,
268
- endBlock: firstEventBlock,
269
- normalSelection: init.normalSelection,
270
- indexingAddresses: init.indexingAddresses,
271
- contractConfigs: init.contractConfigs,
272
- chainId: init.chainId,
273
- latestOnBlockBlockNumber: init.latestOnBlockBlockNumber,
274
- blockLag: init.blockLag,
275
- buffer: init.buffer,
276
- targetBufferSize: init.targetBufferSize,
277
- onBlockConfigs: init.onBlockConfigs,
278
- knownHeight: init.knownHeight,
279
- firstEventBlock: init.firstEventBlock
280
- },
281
- sourceManager: updatedChainFetcher.sourceManager,
282
- chainConfig: updatedChainFetcher.chainConfig,
283
- isProgressAtHead: updatedChainFetcher.isProgressAtHead,
284
- timestampCaughtUpToHeadOrEndblock: updatedChainFetcher.timestampCaughtUpToHeadOrEndblock,
285
- committedProgressBlockNumber: updatedChainFetcher.committedProgressBlockNumber,
286
- numEventsProcessed: updatedChainFetcher.numEventsProcessed,
287
- reorgDetection: updatedChainFetcher.reorgDetection,
288
- safeCheckpointTracking: updatedChainFetcher.safeCheckpointTracking
289
- };
290
- } else {
291
- updatedChainFetcher$1 = updatedChainFetcher;
292
- }
293
- } else {
294
- let init$1 = updatedChainFetcher.fetchState;
295
- updatedChainFetcher$1 = {
296
- logger: updatedChainFetcher.logger,
297
- fetchState: {
298
- optimizedPartitions: init$1.optimizedPartitions,
299
- startBlock: init$1.startBlock,
300
- endBlock: firstEventBlock,
301
- normalSelection: init$1.normalSelection,
302
- indexingAddresses: init$1.indexingAddresses,
303
- contractConfigs: init$1.contractConfigs,
304
- chainId: init$1.chainId,
305
- latestOnBlockBlockNumber: init$1.latestOnBlockBlockNumber,
306
- blockLag: init$1.blockLag,
307
- buffer: init$1.buffer,
308
- targetBufferSize: init$1.targetBufferSize,
309
- onBlockConfigs: init$1.onBlockConfigs,
310
- knownHeight: init$1.knownHeight,
311
- firstEventBlock: init$1.firstEventBlock
312
- },
313
- sourceManager: updatedChainFetcher.sourceManager,
314
- chainConfig: updatedChainFetcher.chainConfig,
315
- isProgressAtHead: updatedChainFetcher.isProgressAtHead,
316
- timestampCaughtUpToHeadOrEndblock: updatedChainFetcher.timestampCaughtUpToHeadOrEndblock,
317
- committedProgressBlockNumber: updatedChainFetcher.committedProgressBlockNumber,
318
- numEventsProcessed: updatedChainFetcher.numEventsProcessed,
319
- reorgDetection: updatedChainFetcher.reorgDetection,
320
- safeCheckpointTracking: updatedChainFetcher.safeCheckpointTracking
321
- };
322
- }
323
- } else {
324
- updatedChainFetcher$1 = updatedChainFetcher;
325
- }
326
- if (!chainFetcher.isProgressAtHead && updatedChainFetcher$1.isProgressAtHead) {
327
- Logging.childInfo(updatedChainFetcher$1.logger, "All events have been fetched");
328
- }
329
- let init$2 = state.chainManager;
330
- let nextState_ctx = state.ctx;
331
- let nextState_chainManager = {
332
- chainFetchers: ChainMap.set(state.chainManager.chainFetchers, chain, updatedChainFetcher$1),
333
- isInReorgThreshold: init$2.isInReorgThreshold,
334
- isRealtime: init$2.isRealtime
335
- };
336
- let nextState_rollbackState = state.rollbackState;
337
- let nextState_indexerStartTime = state.indexerStartTime;
338
- let nextState_writeThrottlers = state.writeThrottlers;
339
- let nextState_loadManager = state.loadManager;
340
- let nextState_keepProcessAlive = state.keepProcessAlive;
341
- let nextState_exitAfterFirstEventBlock = state.exitAfterFirstEventBlock;
342
- let nextState_onError = state.onError;
343
- let nextState_id = state.id;
344
- let nextState = {
345
- ctx: nextState_ctx,
346
- chainManager: nextState_chainManager,
347
- rollbackState: nextState_rollbackState,
348
- indexerStartTime: nextState_indexerStartTime,
349
- writeThrottlers: nextState_writeThrottlers,
350
- loadManager: nextState_loadManager,
351
- keepProcessAlive: nextState_keepProcessAlive,
352
- exitAfterFirstEventBlock: nextState_exitAfterFirstEventBlock,
353
- onError: nextState_onError,
354
- id: nextState_id
355
- };
356
- return [
357
- nextState,
358
- [
359
- {
360
- TAG: "UpdateChainMetaDataAndCheckForExit",
361
- _0: "NoExit"
362
- },
363
- "ProcessEventBatch",
364
- {
365
- TAG: "NextQuery",
366
- _0: {
367
- TAG: "Chain",
368
- _0: chain
369
- }
370
- }
371
- ]
372
- ];
373
- }
374
-
375
- async function processPartitionQueryResponse(state, param, dispatchAction) {
376
- let response = param.response;
377
- let parsedQueueItems = response.parsedQueueItems;
378
- let itemsWithContractRegister = [];
379
- let newItems = [];
380
- for (let idx = 0, idx_finish = parsedQueueItems.length; idx < idx_finish; ++idx) {
381
- let item = parsedQueueItems[idx];
382
- if (item.eventConfig.contractRegister !== undefined) {
383
- itemsWithContractRegister.push(item);
384
- }
385
- newItems.push(item);
386
- }
387
- let newItemsWithDcs = itemsWithContractRegister.length !== 0 ? await ChainFetcher.runContractRegistersOrThrow(itemsWithContractRegister, state.ctx.config) : itemsWithContractRegister;
388
- return dispatchAction({
389
- TAG: "SubmitPartitionQueryResponse",
390
- newItems: newItems,
391
- newItemsWithDcs: newItemsWithDcs,
392
- knownHeight: response.knownHeight,
393
- latestFetchedBlock: {
394
- blockNumber: response.latestFetchedBlockNumber,
395
- blockTimestamp: response.latestFetchedBlockTimestamp
396
- },
397
- query: param.query,
398
- chain: param.chain
399
- });
400
- }
401
-
402
- function updateChainFetcher(chainFetcherUpdate, state, chain) {
403
- let init = state.chainManager;
404
- return [
405
- {
406
- ctx: state.ctx,
407
- chainManager: {
408
- chainFetchers: ChainMap.update(state.chainManager.chainFetchers, chain, chainFetcherUpdate),
409
- isInReorgThreshold: init.isInReorgThreshold,
410
- isRealtime: init.isRealtime
411
- },
412
- rollbackState: state.rollbackState,
413
- indexerStartTime: state.indexerStartTime,
414
- writeThrottlers: state.writeThrottlers,
415
- loadManager: state.loadManager,
416
- keepProcessAlive: state.keepProcessAlive,
417
- exitAfterFirstEventBlock: state.exitAfterFirstEventBlock,
418
- onError: state.onError,
419
- id: state.id
420
- },
421
- []
422
- ];
423
- }
424
-
425
- function onEnterReorgThreshold(state) {
426
- Logging.info("Reorg threshold reached");
427
- Prometheus.ReorgThreshold.set(true);
428
- let chainFetchers = ChainMap.map(state.chainManager.chainFetchers, chainFetcher => ({
429
- logger: chainFetcher.logger,
430
- fetchState: FetchState.updateInternal(chainFetcher.fetchState, undefined, undefined, undefined, chainFetcher.chainConfig.blockLag, undefined),
431
- sourceManager: chainFetcher.sourceManager,
432
- chainConfig: chainFetcher.chainConfig,
433
- isProgressAtHead: chainFetcher.isProgressAtHead,
434
- timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
435
- committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
436
- numEventsProcessed: chainFetcher.numEventsProcessed,
437
- reorgDetection: chainFetcher.reorgDetection,
438
- safeCheckpointTracking: chainFetcher.safeCheckpointTracking
439
- }));
440
- let init = state.chainManager;
441
- return {
442
- ctx: state.ctx,
443
- chainManager: {
444
- chainFetchers: chainFetchers,
445
- isInReorgThreshold: true,
446
- isRealtime: init.isRealtime
447
- },
448
- rollbackState: state.rollbackState,
449
- indexerStartTime: state.indexerStartTime,
450
- writeThrottlers: state.writeThrottlers,
451
- loadManager: state.loadManager,
452
- keepProcessAlive: state.keepProcessAlive,
453
- exitAfterFirstEventBlock: state.exitAfterFirstEventBlock,
454
- onError: state.onError,
455
- id: state.id
456
- };
457
- }
458
-
459
- function injectedActionReducer(markBatchProcessed) {
460
- return (state, action) => {
461
- if (typeof action !== "object") {
462
- switch (action) {
463
- case "StartFindingReorgDepth" :
464
- return [
465
- {
466
- ctx: state.ctx,
467
- chainManager: state.chainManager,
468
- rollbackState: "FindingReorgDepth",
469
- indexerStartTime: state.indexerStartTime,
470
- writeThrottlers: state.writeThrottlers,
471
- loadManager: state.loadManager,
472
- keepProcessAlive: state.keepProcessAlive,
473
- exitAfterFirstEventBlock: state.exitAfterFirstEventBlock,
474
- onError: state.onError,
475
- id: state.id
476
- },
477
- []
478
- ];
479
- case "EnterReorgThreshold" :
480
- return [
481
- onEnterReorgThreshold(state),
482
- [{
483
- TAG: "NextQuery",
484
- _0: "CheckAllChains"
485
- }]
486
- ];
487
- case "SuccessExit" :
488
- Logging.info("Exiting with success");
489
- Process.exit(0);
490
- return [
491
- state,
492
- []
493
- ];
494
- }
495
- } else {
496
- switch (action.TAG) {
497
- case "ValidatePartitionQueryResponse" :
498
- return validatePartitionQueryResponse(state, action._0);
499
- case "SubmitPartitionQueryResponse" :
500
- return submitPartitionQueryResponse(state, action.newItems, action.newItemsWithDcs, action.knownHeight, action.latestFetchedBlock, action.query, action.chain);
501
- case "FinishWaitingForNewBlock" :
502
- let knownHeight = action.knownHeight;
503
- let chain = action.chain;
504
- let updatedChainFetchers = ChainMap.update(state.chainManager.chainFetchers, chain, chainFetcher => {
505
- let updatedFetchState = FetchState.updateKnownHeight(chainFetcher.fetchState, knownHeight);
506
- if (updatedFetchState !== chainFetcher.fetchState) {
507
- return {
508
- logger: chainFetcher.logger,
509
- fetchState: updatedFetchState,
510
- sourceManager: chainFetcher.sourceManager,
511
- chainConfig: chainFetcher.chainConfig,
512
- isProgressAtHead: chainFetcher.isProgressAtHead,
513
- timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
514
- committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
515
- numEventsProcessed: chainFetcher.numEventsProcessed,
516
- reorgDetection: chainFetcher.reorgDetection,
517
- safeCheckpointTracking: chainFetcher.safeCheckpointTracking
518
- };
519
- } else {
520
- return chainFetcher;
521
- }
522
- });
523
- let isBelowReorgThreshold = !state.chainManager.isInReorgThreshold && state.ctx.config.shouldRollbackOnReorg;
524
- let shouldEnterReorgThreshold = isBelowReorgThreshold && ChainMap.values(updatedChainFetchers).every(chainFetcher => FetchState.isReadyToEnterReorgThreshold(chainFetcher.fetchState));
525
- let init = state.chainManager;
526
- let state_ctx = state.ctx;
527
- let state_chainManager = {
528
- chainFetchers: updatedChainFetchers,
529
- isInReorgThreshold: init.isInReorgThreshold,
530
- isRealtime: init.isRealtime
531
- };
532
- let state_rollbackState = state.rollbackState;
533
- let state_indexerStartTime = state.indexerStartTime;
534
- let state_writeThrottlers = state.writeThrottlers;
535
- let state_loadManager = state.loadManager;
536
- let state_keepProcessAlive = state.keepProcessAlive;
537
- let state_exitAfterFirstEventBlock = state.exitAfterFirstEventBlock;
538
- let state_onError = state.onError;
539
- let state_id = state.id;
540
- let state$1 = {
541
- ctx: state_ctx,
542
- chainManager: state_chainManager,
543
- rollbackState: state_rollbackState,
544
- indexerStartTime: state_indexerStartTime,
545
- writeThrottlers: state_writeThrottlers,
546
- loadManager: state_loadManager,
547
- keepProcessAlive: state_keepProcessAlive,
548
- exitAfterFirstEventBlock: state_exitAfterFirstEventBlock,
549
- onError: state_onError,
550
- id: state_id
551
- };
552
- if (shouldEnterReorgThreshold) {
553
- return [
554
- onEnterReorgThreshold(state$1),
555
- [
556
- {
557
- TAG: "NextQuery",
558
- _0: "CheckAllChains"
559
- },
560
- "ProcessEventBatch"
561
- ]
562
- ];
563
- } else {
564
- return [
565
- state$1,
566
- [
567
- {
568
- TAG: "NextQuery",
569
- _0: {
570
- TAG: "Chain",
571
- _0: chain
572
- }
573
- },
574
- "ProcessEventBatch"
575
- ]
576
- ];
577
- }
578
- case "EventBatchProcessed" :
579
- let maybePruneEntityHistory = Config.shouldPruneHistory(state.ctx.config, state.chainManager.isInReorgThreshold) ? ["PruneStaleEntityHistory"] : [];
580
- markBatchProcessed();
581
- let state_ctx$1 = state.ctx;
582
- let state_chainManager$1 = ChainManager.updateProgressedChains(state.chainManager, action.batch);
583
- let state_indexerStartTime$1 = state.indexerStartTime;
584
- let state_writeThrottlers$1 = state.writeThrottlers;
585
- let state_loadManager$1 = state.loadManager;
586
- let state_keepProcessAlive$1 = state.keepProcessAlive;
587
- let state_exitAfterFirstEventBlock$1 = state.exitAfterFirstEventBlock;
588
- let state_onError$1 = state.onError;
589
- let state_id$1 = state.id;
590
- let state$2 = {
591
- ctx: state_ctx$1,
592
- chainManager: state_chainManager$1,
593
- rollbackState: "NoRollback",
594
- indexerStartTime: state_indexerStartTime$1,
595
- writeThrottlers: state_writeThrottlers$1,
596
- loadManager: state_loadManager$1,
597
- keepProcessAlive: state_keepProcessAlive$1,
598
- exitAfterFirstEventBlock: state_exitAfterFirstEventBlock$1,
599
- onError: state_onError$1,
600
- id: state_id$1
601
- };
602
- let shouldExit = EventProcessing.allChainsEventsProcessedToEndblock(state_chainManager$1.chainFetchers) ? (Logging.info("All chains are caught up to end blocks."), state_keepProcessAlive$1 ? "NoExit" : "ExitWithSuccess") : (
603
- state_exitAfterFirstEventBlock$1 && ChainMap.values(state_chainManager$1.chainFetchers).every(cf => {
604
- if (cf.isProgressAtHead) {
605
- return Stdlib_Option.isNone(cf.fetchState.endBlock);
606
- } else {
607
- return false;
608
- }
609
- }) ? ({
610
- TAG: "ExitWithError",
611
- _0: "No events found between startBlock and chain head. Cannot auto-detect endBlock."
612
- }) : "NoExit"
613
- );
614
- let tasks;
615
- tasks = typeof shouldExit !== "object" ? (
616
- shouldExit === "ExitWithSuccess" ? [{
617
- TAG: "UpdateChainMetaDataAndCheckForExit",
618
- _0: shouldExit
619
- }] : [
620
- {
621
- TAG: "UpdateChainMetaDataAndCheckForExit",
622
- _0: shouldExit
623
- },
624
- "ProcessEventBatch"
625
- ].concat(maybePruneEntityHistory)
626
- ) : [{
627
- TAG: "UpdateChainMetaDataAndCheckForExit",
628
- _0: shouldExit
629
- }];
630
- return [
631
- state$2,
632
- tasks
633
- ];
634
- case "FindReorgDepth" :
635
- return [
636
- {
637
- ctx: state.ctx,
638
- chainManager: state.chainManager,
639
- rollbackState: {
640
- TAG: "FoundReorgDepth",
641
- chain: action.chain,
642
- rollbackTargetBlockNumber: action.rollbackTargetBlockNumber
643
- },
644
- indexerStartTime: state.indexerStartTime,
645
- writeThrottlers: state.writeThrottlers,
646
- loadManager: state.loadManager,
647
- keepProcessAlive: state.keepProcessAlive,
648
- exitAfterFirstEventBlock: state.exitAfterFirstEventBlock,
649
- onError: state.onError,
650
- id: state.id
651
- },
652
- ["Rollback"]
653
- ];
654
- case "UpdateQueues" :
655
- let shouldEnterReorgThreshold$1 = action.shouldEnterReorgThreshold;
656
- let progressedChainsById = action.progressedChainsById;
657
- let chainFetchers = ChainMap.mapWithKey(state.chainManager.chainFetchers, (chain, cf) => {
658
- let chainAfterBatch = progressedChainsById[chain];
659
- let fs = chainAfterBatch !== undefined ? chainAfterBatch.fetchState : cf.fetchState;
660
- return {
661
- logger: cf.logger,
662
- fetchState: shouldEnterReorgThreshold$1 ? FetchState.updateInternal(fs, undefined, undefined, undefined, cf.chainConfig.blockLag, undefined) : fs,
663
- sourceManager: cf.sourceManager,
664
- chainConfig: cf.chainConfig,
665
- isProgressAtHead: cf.isProgressAtHead,
666
- timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
667
- committedProgressBlockNumber: cf.committedProgressBlockNumber,
668
- numEventsProcessed: cf.numEventsProcessed,
669
- reorgDetection: cf.reorgDetection,
670
- safeCheckpointTracking: cf.safeCheckpointTracking
671
- };
672
- });
673
- let init$1 = state.chainManager;
674
- let chainManager_isInReorgThreshold = init$1.isInReorgThreshold;
675
- let chainManager_isRealtime = init$1.isRealtime;
676
- let chainManager = {
677
- chainFetchers: chainFetchers,
678
- isInReorgThreshold: chainManager_isInReorgThreshold,
679
- isRealtime: chainManager_isRealtime
680
- };
681
- return [
682
- {
683
- ctx: state.ctx,
684
- chainManager: chainManager,
685
- rollbackState: state.rollbackState,
686
- indexerStartTime: state.indexerStartTime,
687
- writeThrottlers: state.writeThrottlers,
688
- loadManager: state.loadManager,
689
- keepProcessAlive: state.keepProcessAlive,
690
- exitAfterFirstEventBlock: state.exitAfterFirstEventBlock,
691
- onError: state.onError,
692
- id: state.id
693
- },
694
- [{
695
- TAG: "NextQuery",
696
- _0: "CheckAllChains"
697
- }]
698
- ];
699
- case "ErrorExit" :
700
- state.onError(action._0);
701
- return [
702
- state,
703
- []
704
- ];
705
- case "SetRollbackState" :
706
- return [
707
- {
708
- ctx: state.ctx,
709
- chainManager: action.rollbackedChainManager,
710
- rollbackState: {
711
- TAG: "RollbackReady",
712
- eventsProcessedDiffByChain: action.eventsProcessedDiffByChain
713
- },
714
- indexerStartTime: state.indexerStartTime,
715
- writeThrottlers: state.writeThrottlers,
716
- loadManager: state.loadManager,
717
- keepProcessAlive: state.keepProcessAlive,
718
- exitAfterFirstEventBlock: state.exitAfterFirstEventBlock,
719
- onError: state.onError,
720
- id: state.id
721
- },
722
- [
723
- {
724
- TAG: "NextQuery",
725
- _0: "CheckAllChains"
726
- },
727
- "ProcessEventBatch"
728
- ]
729
- ];
730
- }
731
- }
732
- };
733
- }
734
-
735
- function injectedInvalidatedActionReducer(markBatchProcessed, actionReducer) {
736
- return (state, action) => {
737
- if (typeof action === "object") {
738
- switch (action.TAG) {
739
- case "EventBatchProcessed" :
740
- if (isPreparingRollback(state)) {
741
- Logging.info("Finished processing batch before rollback, actioning rollback");
742
- markBatchProcessed();
743
- return [
744
- {
745
- ctx: state.ctx,
746
- chainManager: ChainManager.updateProgressedChains(state.chainManager, action.batch),
747
- rollbackState: state.rollbackState,
748
- indexerStartTime: state.indexerStartTime,
749
- writeThrottlers: state.writeThrottlers,
750
- loadManager: state.loadManager,
751
- keepProcessAlive: state.keepProcessAlive,
752
- exitAfterFirstEventBlock: state.exitAfterFirstEventBlock,
753
- onError: state.onError,
754
- id: state.id
755
- },
756
- ["Rollback"]
757
- ];
758
- }
759
- break;
760
- case "ErrorExit" :
761
- return actionReducer(state, action);
762
- }
763
- }
764
- Logging.trace({
765
- msg: "Invalidated action discarded",
766
- action: S$RescriptSchema.convertOrThrow(action, Utils.Schema.variantTag)
767
- });
768
- return [
769
- state,
770
- []
771
- ];
772
- };
773
- }
774
-
775
- function checkAndFetchForChain(waitForNewBlock, executeQuery, state, dispatchAction) {
776
- return async chain => {
777
- let chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
778
- if (isPreparingRollback(state)) {
779
- return;
780
- }
781
- let fetchState = chainFetcher.fetchState;
782
- let isRealtime = state.chainManager.isRealtime;
783
- let reducedPolling = !isRealtime;
784
- return await SourceManager.fetchNext(chainFetcher.sourceManager, fetchState, async query => {
785
- try {
786
- let response = await executeQuery(chainFetcher.sourceManager, query, fetchState.knownHeight, isRealtime);
787
- return dispatchAction({
788
- TAG: "ValidatePartitionQueryResponse",
789
- _0: {
790
- chain: chain,
791
- response: response,
792
- query: query
793
- }
794
- });
795
- } catch (raw_exn) {
796
- let exn = Primitive_exceptions.internalToException(raw_exn);
797
- return dispatchAction({
798
- TAG: "ErrorExit",
799
- _0: ErrorHandling.make(exn, undefined, undefined)
800
- });
801
- }
802
- }, knownHeight => waitForNewBlock(chainFetcher.sourceManager, knownHeight, isRealtime, reducedPolling), knownHeight => dispatchAction({
803
- TAG: "FinishWaitingForNewBlock",
804
- chain: chain,
805
- knownHeight: knownHeight
806
- }), state.id);
807
- };
808
- }
809
-
810
- function injectedTaskReducer(waitForNewBlock, executeQuery, getLastKnownValidBlock) {
811
- return async (state, task, dispatchAction) => {
812
- if (typeof task !== "object") {
813
- switch (task) {
814
- case "ProcessEventBatch" :
815
- if (state.ctx.inMemoryStore.isProcessing || isPreparingRollback(state)) {
816
- return;
817
- }
818
- let match = state.rollbackState;
819
- let isRollbackBatch;
820
- isRollbackBatch = typeof match !== "object" ? false : match.TAG === "RollbackReady";
821
- let batch = ChainManager.createBatch(state.chainManager, state.ctx.inMemoryStore.processedCheckpointId, state.ctx.config.batchSize, isRollbackBatch);
822
- let progressedChainsById = batch.progressedChainsById;
823
- let isBelowReorgThreshold = !state.chainManager.isInReorgThreshold && state.ctx.config.shouldRollbackOnReorg;
824
- let shouldEnterReorgThreshold = isBelowReorgThreshold && ChainMap.values(state.chainManager.chainFetchers).every(chainFetcher => {
825
- let chainAfterBatch = progressedChainsById[chainFetcher.fetchState.chainId];
826
- return FetchState.isReadyToEnterReorgThreshold(chainAfterBatch !== undefined ? chainAfterBatch.fetchState : chainFetcher.fetchState);
827
- });
828
- if (shouldEnterReorgThreshold) {
829
- dispatchAction("EnterReorgThreshold");
830
- }
831
- if (Utils.Dict.isEmpty(progressedChainsById)) {
832
- if (EventProcessing.allChainsEventsProcessedToEndblock(state.chainManager.chainFetchers)) {
833
- Logging.info("All chains are caught up to end blocks.");
834
- if (!state.keepProcessAlive) {
835
- updateChainMetadataTable(state.chainManager, state.ctx.inMemoryStore);
836
- await InMemoryStore.flush(state.ctx.inMemoryStore);
837
- return dispatchAction("SuccessExit");
838
- } else {
839
- return;
840
- }
841
- } else {
842
- return;
843
- }
844
- }
845
- let inMemoryStore = state.ctx.inMemoryStore;
846
- inMemoryStore.isProcessing = true;
847
- dispatchAction({
848
- TAG: "UpdateQueues",
849
- progressedChainsById: progressedChainsById,
850
- shouldEnterReorgThreshold: shouldEnterReorgThreshold
851
- });
852
- InMemoryStore.setBatchDcs(inMemoryStore, batch);
853
- let res;
854
- try {
855
- res = await EventProcessing.processEventBatch(batch, inMemoryStore, state.loadManager, state.ctx, state.chainManager.chainFetchers);
856
- } catch (raw_exn) {
857
- let exn = Primitive_exceptions.internalToException(raw_exn);
858
- let errHandler = ErrorHandling.make(exn, undefined, "A top level unexpected error occurred during processing");
859
- return dispatchAction({
860
- TAG: "ErrorExit",
861
- _0: errHandler
862
- });
863
- }
864
- if (res.TAG === "Ok") {
865
- return dispatchAction({
866
- TAG: "EventBatchProcessed",
867
- batch: batch
868
- });
869
- } else {
870
- return dispatchAction({
871
- TAG: "ErrorExit",
872
- _0: res._0
873
- });
874
- }
875
- break;
876
- case "Rollback" :
877
- let match$1 = state.rollbackState;
878
- if (typeof match$1 !== "object") {
879
- if (match$1 === "NoRollback") {
880
- return Stdlib_JsError.throwWithMessage("Internal error: Rollback initiated with invalid state");
881
- } else {
882
- return;
883
- }
884
- }
885
- switch (match$1.TAG) {
886
- case "ReorgDetected" :
887
- let chain = match$1.chain;
888
- let chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
889
- dispatchAction("StartFindingReorgDepth");
890
- let rollbackTargetBlockNumber = await getLastKnownValidBlock(chainFetcher, match$1.blockNumber, state.chainManager.isRealtime);
891
- SourceManager.onReorg(chainFetcher.sourceManager, rollbackTargetBlockNumber);
892
- return dispatchAction({
893
- TAG: "FindReorgDepth",
894
- chain: chain,
895
- rollbackTargetBlockNumber: rollbackTargetBlockNumber
896
- });
897
- case "FoundReorgDepth" :
898
- let rollbackTargetBlockNumber$1 = match$1.rollbackTargetBlockNumber;
899
- let reorgChain = match$1.chain;
900
- if (state.ctx.inMemoryStore.isProcessing) {
901
- return Logging.info("Waiting for batch to finish processing before executing rollback");
902
- }
903
- let startTime = Hrtime.makeTimer();
904
- let chainFetcher$1 = ChainMap.get(state.chainManager.chainFetchers, reorgChain);
905
- let logger = Logging.createChildFrom(chainFetcher$1.logger, {
906
- action: "Rollback",
907
- reorgChain: reorgChain,
908
- targetBlockNumber: rollbackTargetBlockNumber$1
909
- });
910
- Logging.childInfo(logger, "Started rollback on reorg");
911
- Prometheus.RollbackTargetBlockNumber.set(rollbackTargetBlockNumber$1, reorgChain);
912
- await InMemoryStore.flush(state.ctx.inMemoryStore);
913
- let checkpointId = await state.ctx.persistence.storage.getRollbackTargetCheckpoint(reorgChain, rollbackTargetBlockNumber$1);
914
- let rollbackTargetCheckpointId = checkpointId !== undefined ? checkpointId : 0n;
915
- let eventsProcessedDiffByChain = {};
916
- let newProgressBlockNumberPerChain = {};
917
- let rollbackedProcessedEvents = 0;
918
- let rollbackProgressDiff = await state.ctx.persistence.storage.getRollbackProgressDiff(rollbackTargetCheckpointId);
919
- for (let idx = 0, idx_finish = rollbackProgressDiff.length; idx < idx_finish; ++idx) {
920
- let diff = rollbackProgressDiff[idx];
921
- let eventsProcessedDiff = Stdlib_Option.getOrThrow(Stdlib_Float.fromString(diff.events_processed_diff), undefined);
922
- rollbackedProcessedEvents = rollbackedProcessedEvents + eventsProcessedDiff;
923
- eventsProcessedDiffByChain[diff.chain_id] = eventsProcessedDiff;
924
- newProgressBlockNumberPerChain[diff.chain_id] = rollbackTargetCheckpointId === 0n && diff.chain_id === reorgChain ? Primitive_int.min(diff.new_progress_block_number, rollbackTargetBlockNumber$1) : diff.new_progress_block_number;
925
- }
926
- let chainFetchers = ChainMap.mapWithKey(state.chainManager.chainFetchers, (chain, cf) => {
927
- let newProgressBlockNumber = newProgressBlockNumberPerChain[chain];
928
- if (newProgressBlockNumber === undefined) {
929
- if (Primitive_object.equal(chain, reorgChain)) {
930
- return {
931
- logger: cf.logger,
932
- fetchState: FetchState.rollback(cf.fetchState, rollbackTargetBlockNumber$1),
933
- sourceManager: cf.sourceManager,
934
- chainConfig: cf.chainConfig,
935
- isProgressAtHead: cf.isProgressAtHead,
936
- timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
937
- committedProgressBlockNumber: Primitive_int.min(cf.committedProgressBlockNumber, rollbackTargetBlockNumber$1),
938
- numEventsProcessed: cf.numEventsProcessed,
939
- reorgDetection: ReorgDetection.rollbackToValidBlockNumber(cf.reorgDetection, rollbackTargetBlockNumber$1),
940
- safeCheckpointTracking: cf.safeCheckpointTracking
941
- };
942
- } else {
943
- return cf;
944
- }
945
- }
946
- let fetchState = FetchState.rollback(cf.fetchState, newProgressBlockNumber);
947
- let newTotalEventsProcessed = cf.numEventsProcessed - eventsProcessedDiffByChain[chain];
948
- if (cf.committedProgressBlockNumber !== newProgressBlockNumber) {
949
- Prometheus.ProgressBlockNumber.set(newProgressBlockNumber, chain);
950
- }
951
- if (cf.numEventsProcessed !== newTotalEventsProcessed) {
952
- Prometheus.ProgressEventsCount.set(newTotalEventsProcessed, chain);
953
- }
954
- let safeCheckpointTracking = cf.safeCheckpointTracking;
955
- return {
956
- logger: cf.logger,
957
- fetchState: fetchState,
958
- sourceManager: cf.sourceManager,
959
- chainConfig: cf.chainConfig,
960
- isProgressAtHead: cf.isProgressAtHead,
961
- timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
962
- committedProgressBlockNumber: newProgressBlockNumber,
963
- numEventsProcessed: newTotalEventsProcessed,
964
- reorgDetection: Primitive_object.equal(chain, reorgChain) ? ReorgDetection.rollbackToValidBlockNumber(cf.reorgDetection, rollbackTargetBlockNumber$1) : cf.reorgDetection,
965
- safeCheckpointTracking: safeCheckpointTracking !== undefined ? SafeCheckpointTracking.rollback(safeCheckpointTracking, newProgressBlockNumber) : undefined
966
- };
967
- });
968
- let diff$1 = await InMemoryStore.prepareRollbackDiff(state.ctx.inMemoryStore, state.ctx.persistence, rollbackTargetCheckpointId, state.ctx.inMemoryStore.committedCheckpointId + 1n, newProgressBlockNumberPerChain);
969
- let init = state.chainManager;
970
- let chainManager_isInReorgThreshold = init.isInReorgThreshold;
971
- let chainManager_isRealtime = init.isRealtime;
972
- let chainManager = {
973
- chainFetchers: chainFetchers,
974
- isInReorgThreshold: chainManager_isInReorgThreshold,
975
- isRealtime: chainManager_isRealtime
976
- };
977
- Logging.childTrace(logger, {
978
- msg: "Finished rollback on reorg",
979
- entityChanges: {
980
- deleted: diff$1.deletedEntities,
981
- upserted: diff$1.setEntities
982
- },
983
- rollbackedEvents: rollbackedProcessedEvents,
984
- beforeCheckpointId: state.ctx.inMemoryStore.committedCheckpointId,
985
- targetCheckpointId: rollbackTargetCheckpointId
986
- });
987
- Prometheus.RollbackSuccess.increment(Hrtime.toSecondsFloat(Hrtime.timeSince(startTime)), rollbackedProcessedEvents);
988
- return dispatchAction({
989
- TAG: "SetRollbackState",
990
- rollbackedChainManager: chainManager,
991
- eventsProcessedDiffByChain: eventsProcessedDiffByChain
992
- });
993
- case "RollbackReady" :
994
- return Stdlib_JsError.throwWithMessage("Internal error: Rollback initiated with invalid state");
995
- }
996
- case "PruneStaleEntityHistory" :
997
- let runPrune = async () => {
998
- let safeCheckpointId = ChainManager.getSafeCheckpointId(state.chainManager);
999
- if (safeCheckpointId === undefined) {
1000
- return;
1001
- }
1002
- await state.ctx.persistence.storage.pruneStaleCheckpoints(safeCheckpointId);
1003
- for (let idx = 0, idx_finish = state.ctx.persistence.allEntities.length; idx < idx_finish; ++idx) {
1004
- if (idx !== 0) {
1005
- await Utils.delay(1000);
1006
- }
1007
- let entityConfig = state.ctx.persistence.allEntities[idx];
1008
- let timeRef = Hrtime.makeTimer();
1009
- try {
1010
- await state.ctx.persistence.storage.pruneStaleEntityHistory(entityConfig.name, entityConfig.index, safeCheckpointId);
1011
- } catch (raw_exn) {
1012
- let exn = Primitive_exceptions.internalToException(raw_exn);
1013
- ErrorHandling.mkLogAndRaise(Logging.createChild({
1014
- entityName: entityConfig.name,
1015
- safeCheckpointId: safeCheckpointId
1016
- }), `Failed to prune stale entity history`, exn);
1017
- }
1018
- Prometheus.RollbackHistoryPrune.increment(Hrtime.toSecondsFloat(Hrtime.timeSince(timeRef)), entityConfig.name);
1019
- }
1020
- };
1021
- return Throttler.schedule(state.writeThrottlers.pruneStaleEntityHistory, runPrune);
1022
- }
1023
- } else {
1024
- switch (task.TAG) {
1025
- case "NextQuery" :
1026
- let chainCheck = task._0;
1027
- let fetchForChain = checkAndFetchForChain(waitForNewBlock, executeQuery, state, dispatchAction);
1028
- if (typeof chainCheck === "object") {
1029
- return await fetchForChain(chainCheck._0);
1030
- }
1031
- await Promise.all(ChainMap.keys(state.chainManager.chainFetchers).map(__x => fetchForChain(__x)));
1032
- return;
1033
- case "ProcessPartitionQueryResponse" :
1034
- processPartitionQueryResponse(state, task._0, dispatchAction);
1035
- return;
1036
- case "UpdateChainMetaDataAndCheckForExit" :
1037
- let chainManager$1 = state.chainManager;
1038
- let shouldExit = task._0;
1039
- if (typeof shouldExit === "object") {
1040
- return dispatchAction({
1041
- TAG: "ErrorExit",
1042
- _0: ErrorHandling.make(Stdlib_JsError.throwWithMessage(shouldExit._0), undefined, undefined)
1043
- });
1044
- }
1045
- if (shouldExit !== "ExitWithSuccess") {
1046
- return updateChainMetadataTable(chainManager$1, state.ctx.inMemoryStore);
1047
- }
1048
- updateChainMetadataTable(chainManager$1, state.ctx.inMemoryStore);
1049
- await InMemoryStore.flush(state.ctx.inMemoryStore);
1050
- return dispatchAction("SuccessExit");
1051
- }
1052
- }
1053
- };
1054
- }
1055
-
1056
- function makeReducers(waitForNewBlockOpt, executeQueryOpt, getLastKnownValidBlockOpt, markBatchProcessed) {
1057
- let waitForNewBlock = waitForNewBlockOpt !== undefined ? waitForNewBlockOpt : SourceManager.waitForNewBlock;
1058
- let executeQuery = executeQueryOpt !== undefined ? executeQueryOpt : SourceManager.executeQuery;
1059
- let getLastKnownValidBlock = getLastKnownValidBlockOpt !== undefined ? getLastKnownValidBlockOpt : ChainFetcher.getLastKnownValidBlock;
1060
- let actionReducer = injectedActionReducer(markBatchProcessed);
1061
- return {
1062
- actionReducer: actionReducer,
1063
- invalidatedActionReducer: injectedInvalidatedActionReducer(markBatchProcessed, actionReducer),
1064
- taskReducer: injectedTaskReducer(waitForNewBlock, executeQuery, getLastKnownValidBlock)
1065
- };
1066
- }
1067
-
1068
- export {
1069
- WriteThrottlers,
1070
- make$1 as make,
1071
- getId,
1072
- setChainManager,
1073
- isPreparingRollback,
1074
- updateChainMetadataTable,
1075
- validatePartitionQueryResponse,
1076
- submitPartitionQueryResponse,
1077
- processPartitionQueryResponse,
1078
- updateChainFetcher,
1079
- onEnterReorgThreshold,
1080
- injectedActionReducer,
1081
- injectedInvalidatedActionReducer,
1082
- checkAndFetchForChain,
1083
- injectedTaskReducer,
1084
- makeReducers,
1085
- }
1086
- /* Env Not a pure module */