envio 3.5.0-alpha.2 → 3.5.0-rc.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 (129) hide show
  1. package/package.json +6 -6
  2. package/src/Batch.res +8 -8
  3. package/src/Batch.res.mjs +4 -3
  4. package/src/BatchProcessing.res +24 -0
  5. package/src/BatchProcessing.res.mjs +12 -0
  6. package/src/ChainFetching.res +20 -19
  7. package/src/ChainFetching.res.mjs +14 -14
  8. package/src/ChainId.res +58 -0
  9. package/src/ChainId.res.mjs +49 -0
  10. package/src/ChainId.resi +27 -0
  11. package/src/ChainMap.res +12 -26
  12. package/src/ChainMap.res.mjs +5 -41
  13. package/src/ChainMap.resi +5 -20
  14. package/src/ChainMetadata.res +1 -1
  15. package/src/ChainMetadata.res.mjs +3 -2
  16. package/src/ChainState.res +45 -24
  17. package/src/ChainState.res.mjs +40 -16
  18. package/src/ChainState.resi +3 -1
  19. package/src/Config.res +43 -26
  20. package/src/Config.res.mjs +19 -16
  21. package/src/ContractRegisterContext.res +1 -1
  22. package/src/ContractRegisterContext.res.mjs +1 -1
  23. package/src/Core.res +1 -0
  24. package/src/CrossChainState.res +90 -22
  25. package/src/CrossChainState.res.mjs +55 -16
  26. package/src/CrossChainState.resi +5 -1
  27. package/src/Env.res +0 -3
  28. package/src/Env.res.mjs +0 -3
  29. package/src/EventConfigBuilder.res +1 -1
  30. package/src/EventProcessing.res +4 -4
  31. package/src/EventProcessing.res.mjs +5 -5
  32. package/src/FetchState.res +489 -153
  33. package/src/FetchState.res.mjs +399 -129
  34. package/src/FinalizeBackfill.res +61 -0
  35. package/src/FinalizeBackfill.res.mjs +44 -0
  36. package/src/HandlerRegister.res +8 -8
  37. package/src/HandlerRegister.res.mjs +5 -4
  38. package/src/HandlerRegister.resi +1 -1
  39. package/src/InMemoryStore.res +4 -0
  40. package/src/InMemoryStore.res.mjs +1 -1
  41. package/src/InMemoryTable.res +15 -15
  42. package/src/InMemoryTable.res.mjs +14 -14
  43. package/src/IndexerLoop.res +9 -2
  44. package/src/IndexerLoop.res.mjs +8 -1
  45. package/src/IndexerState.res +52 -23
  46. package/src/IndexerState.res.mjs +52 -14
  47. package/src/IndexerState.resi +11 -6
  48. package/src/Internal.res +19 -17
  49. package/src/Internal.res.mjs +18 -9
  50. package/src/LoadLayer.res +10 -2
  51. package/src/LoadLayer.res.mjs +3 -1
  52. package/src/LogSelection.res +2 -2
  53. package/src/Main.res +7 -11
  54. package/src/Main.res.mjs +4 -6
  55. package/src/Metrics.res +6 -6
  56. package/src/Metrics.res.mjs +4 -3
  57. package/src/Persistence.res +23 -4
  58. package/src/PgStorage.res +447 -100
  59. package/src/PgStorage.res.mjs +285 -99
  60. package/src/RawEvent.res +1 -2
  61. package/src/RawEvent.res.mjs +1 -1
  62. package/src/Rollback.res +18 -20
  63. package/src/Rollback.res.mjs +9 -9
  64. package/src/RollbackCommit.res +2 -2
  65. package/src/RollbackCommit.res.mjs +3 -3
  66. package/src/SafeCheckpointTracking.res +2 -2
  67. package/src/SimulateDeadInputTracker.res +17 -21
  68. package/src/SimulateDeadInputTracker.res.mjs +9 -8
  69. package/src/SimulateItems.res +8 -10
  70. package/src/SimulateItems.res.mjs +9 -10
  71. package/src/Sink.res +2 -2
  72. package/src/Sink.res.mjs +3 -2
  73. package/src/TestIndexer.res +14 -14
  74. package/src/TestIndexer.res.mjs +16 -10
  75. package/src/UserContext.res +2 -2
  76. package/src/UserContext.res.mjs +2 -1
  77. package/src/Utils.res +0 -4
  78. package/src/Utils.res.mjs +1 -6
  79. package/src/bindings/ClickHouse.res +20 -2
  80. package/src/bindings/ClickHouse.res.mjs +25 -14
  81. package/src/db/EntityFilter.res +0 -4
  82. package/src/db/EntityFilter.res.mjs +1 -8
  83. package/src/db/EntityHistory.res +1 -1
  84. package/src/db/IndexCatalog.res +248 -0
  85. package/src/db/IndexCatalog.res.mjs +222 -0
  86. package/src/db/IndexDefinition.res +131 -0
  87. package/src/db/IndexDefinition.res.mjs +138 -0
  88. package/src/db/IndexManager.res +145 -0
  89. package/src/db/IndexManager.res.mjs +130 -0
  90. package/src/db/InternalTable.res +54 -23
  91. package/src/db/InternalTable.res.mjs +38 -23
  92. package/src/db/Table.res +24 -14
  93. package/src/db/Table.res.mjs +21 -16
  94. package/src/sources/AddressSet.res +5 -4
  95. package/src/sources/AddressStore.res +25 -14
  96. package/src/sources/AddressStore.res.mjs +10 -12
  97. package/src/sources/Evm.res +2 -2
  98. package/src/sources/Evm.res.mjs +1 -1
  99. package/src/sources/EvmChain.res +3 -3
  100. package/src/sources/EvmChain.res.mjs +3 -3
  101. package/src/sources/EvmHyperSyncSource.res +7 -7
  102. package/src/sources/EvmHyperSyncSource.res.mjs +6 -6
  103. package/src/sources/Fuel.res +2 -2
  104. package/src/sources/Fuel.res.mjs +1 -1
  105. package/src/sources/FuelHyperSyncClient.res +3 -0
  106. package/src/sources/FuelHyperSyncClient.res.mjs +1 -0
  107. package/src/sources/FuelHyperSyncSource.res +5 -7
  108. package/src/sources/FuelHyperSyncSource.res.mjs +5 -5
  109. package/src/sources/HyperSync.resi +2 -2
  110. package/src/sources/HyperSyncClient.res +5 -0
  111. package/src/sources/HyperSyncClient.res.mjs +1 -0
  112. package/src/sources/RpcSource.res +13 -14
  113. package/src/sources/RpcSource.res.mjs +13 -12
  114. package/src/sources/SimulateSource.res +42 -15
  115. package/src/sources/SimulateSource.res.mjs +27 -9
  116. package/src/sources/Source.res +1 -5
  117. package/src/sources/SourceManager.res +12 -12
  118. package/src/sources/SourceManager.res.mjs +11 -10
  119. package/src/sources/SourceManager.resi +2 -2
  120. package/src/sources/Svm.res +4 -5
  121. package/src/sources/Svm.res.mjs +5 -4
  122. package/src/sources/SvmHyperSyncClient.res +3 -0
  123. package/src/sources/SvmHyperSyncClient.res.mjs +1 -0
  124. package/src/sources/SvmHyperSyncSource.res +4 -4
  125. package/src/sources/SvmHyperSyncSource.res.mjs +3 -3
  126. package/src/tui/Tui.res +1 -1
  127. package/src/tui/Tui.res.mjs +2 -1
  128. package/src/tui/components/CustomHooks.res +5 -4
  129. package/src/tui/components/CustomHooks.res.mjs +4 -2
@@ -4,7 +4,6 @@ import * as Env from "./Env.res.mjs";
4
4
  import * as Batch from "./Batch.res.mjs";
5
5
  import * as Utils from "./Utils.res.mjs";
6
6
  import * as Logging from "./Logging.res.mjs";
7
- import * as ChainMap from "./ChainMap.res.mjs";
8
7
  import * as ChainState from "./ChainState.res.mjs";
9
8
  import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
10
9
  import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
@@ -27,6 +26,7 @@ function make(chainStates, isInReorgThreshold, isRealtime, targetBufferSizeOpt)
27
26
  chainStates: chainStates,
28
27
  chainIds: Object.values(chainStates).map(cs => ChainState.chainConfig(cs).id),
29
28
  isRealtime: isRealtime,
29
+ isCaughtUp: isRealtime,
30
30
  isInReorgThreshold: isInReorgThreshold,
31
31
  targetBufferSize: targetBufferSize
32
32
  };
@@ -40,6 +40,10 @@ function isRealtime(crossChainState) {
40
40
  return crossChainState.isRealtime;
41
41
  }
42
42
 
43
+ function isCaughtUp(crossChainState) {
44
+ return crossChainState.isCaughtUp;
45
+ }
46
+
43
47
  function isInReorgThreshold(crossChainState) {
44
48
  return crossChainState.isInReorgThreshold;
45
49
  }
@@ -104,20 +108,58 @@ function applyBatchProgress(crossChainState, batch, blockTimestampName) {
104
108
  everyChainCaughtUp = false;
105
109
  }
106
110
  }
107
- let indexerCaughtUp = nextItemIsNone(crossChainState) && everyChainCaughtUp;
111
+ crossChainState.isCaughtUp = crossChainState.isCaughtUp || nextItemIsNone(crossChainState) && everyChainCaughtUp;
108
112
  let allChainsReady = true;
109
113
  for (let i$1 = 0, i_finish$1 = chainIds.length; i$1 < i_finish$1; ++i$1) {
110
- let cs$1 = crossChainState.chainStates[chainIds[i$1]];
111
- if (indexerCaughtUp) {
112
- ChainState.markReady(cs$1);
113
- }
114
- if (!ChainState.isReady(cs$1)) {
114
+ if (!ChainState.isReady(crossChainState.chainStates[chainIds[i$1]])) {
115
115
  allChainsReady = false;
116
116
  }
117
117
  }
118
118
  crossChainState.isRealtime = crossChainState.isRealtime || allChainsReady;
119
119
  }
120
120
 
121
+ function isSettledAtHead(crossChainState) {
122
+ let settled = nextItemIsNone(crossChainState);
123
+ for (let i = 0, i_finish = crossChainState.chainIds.length; i < i_finish; ++i) {
124
+ if (!ChainState.isFetchingAtHead(crossChainState.chainStates[crossChainState.chainIds[i]])) {
125
+ settled = false;
126
+ }
127
+ }
128
+ return settled;
129
+ }
130
+
131
+ function markCaughtUpIfSettled(crossChainState) {
132
+ if (isSettledAtHead(crossChainState)) {
133
+ crossChainState.isCaughtUp = true;
134
+ return;
135
+ }
136
+ }
137
+
138
+ function markCaughtUpOnResume(crossChainState) {
139
+ let everyChainCaughtUp = crossChainState.chainIds.length !== 0;
140
+ let everyChainReady = true;
141
+ for (let i = 0, i_finish = crossChainState.chainIds.length; i < i_finish; ++i) {
142
+ let cs = crossChainState.chainStates[crossChainState.chainIds[i]];
143
+ if (!ChainState.isDurablyCaughtUp(cs)) {
144
+ everyChainCaughtUp = false;
145
+ }
146
+ if (!ChainState.isReady(cs)) {
147
+ everyChainReady = false;
148
+ }
149
+ }
150
+ if (everyChainCaughtUp && !everyChainReady && nextItemIsNone(crossChainState)) {
151
+ crossChainState.isCaughtUp = true;
152
+ return;
153
+ }
154
+ }
155
+
156
+ function markReady(crossChainState, readyAt) {
157
+ for (let i = 0, i_finish = crossChainState.chainIds.length; i < i_finish; ++i) {
158
+ ChainState.markReady(crossChainState.chainStates[crossChainState.chainIds[i]], readyAt);
159
+ }
160
+ crossChainState.isRealtime = true;
161
+ }
162
+
121
163
  function priorityOrder(crossChainState) {
122
164
  return Object.values(crossChainState.chainStates).toSorted((a, b) => Primitive_float.compare(ChainState.frontierProgress(a), ChainState.frontierProgress(b)));
123
165
  }
@@ -203,15 +245,8 @@ async function checkAndFetch(crossChainState, dispatchChain) {
203
245
  for (let i = 0, i_finish = crossChainState.chainIds.length; i < i_finish; ++i) {
204
246
  let chainId = crossChainState.chainIds[i];
205
247
  let action = actionByChain[chainId];
206
- if (action !== undefined) {
207
- let exit = 0;
208
- if (typeof action === "object" || action === "WaitingForNewBlock") {
209
- exit = 1;
210
- }
211
- if (exit === 1) {
212
- let chain = ChainMap.Chain.makeUnsafe(chainId);
213
- promises.push(dispatchChain(chain, action));
214
- }
248
+ if (action !== undefined && (typeof action === "object" || action === "WaitingForNewBlock")) {
249
+ promises.push(dispatchChain(chainId, action));
215
250
  }
216
251
  }
217
252
  await Promise.all(promises);
@@ -222,6 +257,7 @@ export {
222
257
  make,
223
258
  chainStates,
224
259
  isRealtime,
260
+ isCaughtUp,
225
261
  isInReorgThreshold,
226
262
  targetBufferSize,
227
263
  nextItemIsNone,
@@ -229,6 +265,9 @@ export {
229
265
  createBatch,
230
266
  enterReorgThreshold,
231
267
  applyBatchProgress,
268
+ markCaughtUpIfSettled,
269
+ markCaughtUpOnResume,
270
+ markReady,
232
271
  priorityOrder,
233
272
  checkAndFetch,
234
273
  }
@@ -15,6 +15,7 @@ let make: (
15
15
  // Accessors.
16
16
  let chainStates: t => dict<ChainState.t>
17
17
  let isRealtime: t => bool
18
+ let isCaughtUp: t => bool
18
19
  let isInReorgThreshold: t => bool
19
20
  let targetBufferSize: t => int
20
21
 
@@ -31,10 +32,13 @@ let createBatch: (
31
32
  ) => Batch.t
32
33
  let enterReorgThreshold: t => unit
33
34
  let applyBatchProgress: (t, ~batch: Batch.t, ~blockTimestampName: string) => unit
35
+ let markCaughtUpIfSettled: t => unit
36
+ let markCaughtUpOnResume: t => unit
37
+ let markReady: (t, ~readyAt: Date.t) => unit
34
38
 
35
39
  // Fetch control.
36
40
  let priorityOrder: t => array<ChainState.t>
37
41
  let checkAndFetch: (
38
42
  t,
39
- ~dispatchChain: (~chain: ChainMap.Chain.t, ~action: FetchState.nextQuery) => promise<unit>,
43
+ ~dispatchChain: (~chainId: ChainId.t, ~action: FetchState.nextQuery) => promise<unit>,
40
44
  ) => promise<unit>
package/src/Env.res CHANGED
@@ -3,9 +3,6 @@
3
3
 
4
4
  %%private(let envSafe = EnvSafe.make())
5
5
 
6
- // resets the timestampCaughtUpToHeadOrEndblock after a restart when true
7
- let updateSyncTimeOnRestart =
8
- envSafe->EnvSafe.get("UPDATE_SYNC_TIME_ON_RESTART", S.bool, ~fallback=true)
9
6
  let targetBufferSize = envSafe->EnvSafe.get("ENVIO_INDEXING_MAX_BUFFER_SIZE", S.option(S.int))
10
7
  let maxAddrInPartition = envSafe->EnvSafe.get("MAX_PARTITION_SIZE", S.int, ~fallback=5_000)
11
8
 
package/src/Env.res.mjs CHANGED
@@ -13,8 +13,6 @@ import 'dotenv/config'
13
13
 
14
14
  let envSafe = EnvSafe.make(undefined);
15
15
 
16
- let updateSyncTimeOnRestart = EnvSafe.get(envSafe, "UPDATE_SYNC_TIME_ON_RESTART", S$RescriptSchema.bool, undefined, true, undefined, undefined);
17
-
18
16
  let targetBufferSize = EnvSafe.get(envSafe, "ENVIO_INDEXING_MAX_BUFFER_SIZE", S$RescriptSchema.option(S$RescriptSchema.int), undefined, undefined, undefined, undefined);
19
17
 
20
18
  let maxAddrInPartition = EnvSafe.get(envSafe, "MAX_PARTITION_SIZE", S$RescriptSchema.int, undefined, 5000, undefined, undefined);
@@ -221,7 +219,6 @@ EnvSafe.close(envSafe);
221
219
  let maxChainConcurrency = 100;
222
220
 
223
221
  export {
224
- updateSyncTimeOnRestart,
225
222
  targetBufferSize,
226
223
  maxAddrInPartition,
227
224
  maxChainConcurrency,
@@ -342,7 +342,7 @@ let buildEvmOnEventRegistration = (
342
342
  ~handler: option<Internal.handler>,
343
343
  ~contractRegister: option<Internal.contractRegister>,
344
344
  ~where: option<JSON.t>,
345
- ~chainId: int,
345
+ ~chainId: ChainId.t,
346
346
  ~onEventBlockFilterSchema: S.t<option<unknown>>,
347
347
  ~startBlock: option<int>=?,
348
348
  ): Internal.evmOnEventRegistration => {
@@ -13,7 +13,7 @@ let computeChainsState = (chainStates: dict<ChainState.t>): Internal.chains => {
13
13
  values->Array.forEach(cs => {
14
14
  let chainId = (cs->ChainState.chainConfig).id
15
15
  chains->Dict.set(
16
- chainId->Int.toString,
16
+ chainId->ChainId.toString,
17
17
  {
18
18
  Internal.id: chainId,
19
19
  isRealtime,
@@ -280,7 +280,7 @@ let registerProcessEventBatchMetrics = (
280
280
  batch.progressedChainsById->Dict.forEachWithKey((chainAfterBatch, chainId) => {
281
281
  logger->Logging.childTrace({
282
282
  "msg": "Finished processing",
283
- "chainId": chainId->Int.fromString->Option.getUnsafe,
283
+ "chainId": chainId,
284
284
  "batchSize": chainAfterBatch.batchSize,
285
285
  "progress": chainAfterBatch.progressBlockNumber,
286
286
  })
@@ -312,7 +312,7 @@ let materializeBatchEvents = async (
312
312
  | _ =>
313
313
  let itemsByChain: dict<array<Internal.item>> = Dict.make()
314
314
  batch.items->Array.forEach(item => {
315
- let chainId = item->Internal.getItemChainId->Int.toString
315
+ let chainId = item->Internal.getItemChainId->ChainId.toString
316
316
  switch itemsByChain->Utils.Dict.dangerouslyGetNonOption(chainId) {
317
317
  | Some(items) => items->Array.push(item)
318
318
  | None => itemsByChain->Dict.set(chainId, [item])
@@ -345,7 +345,7 @@ let processEventBatch = async (
345
345
  batch.progressedChainsById->Dict.forEachWithKey((chainAfterBatch, chainId) => {
346
346
  logger->Logging.childTrace({
347
347
  "msg": "Started processing",
348
- "chainId": chainId->Int.fromString->Option.getUnsafe,
348
+ "chainId": chainId,
349
349
  "batchSize": chainAfterBatch.batchSize,
350
350
  })
351
351
  })
@@ -1,12 +1,12 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
3
  import * as Utils from "./Utils.res.mjs";
4
+ import * as ChainId from "./ChainId.res.mjs";
4
5
  import * as Logging from "./Logging.res.mjs";
5
6
  import * as Writing from "./Writing.res.mjs";
6
7
  import * as Internal from "./Internal.res.mjs";
7
8
  import * as Ecosystem from "./Ecosystem.res.mjs";
8
9
  import * as ChainState from "./ChainState.res.mjs";
9
- import * as Stdlib_Int from "@rescript/runtime/lib/es6/Stdlib_Int.js";
10
10
  import * as Performance from "./bindings/Performance.res.mjs";
11
11
  import * as Persistence from "./Persistence.res.mjs";
12
12
  import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
@@ -25,7 +25,7 @@ function computeChainsState(chainStates) {
25
25
  let isRealtime = values.every(ChainState.isReady);
26
26
  values.forEach(cs => {
27
27
  let chainId = ChainState.chainConfig(cs).id;
28
- chains[chainId.toString()] = {
28
+ chains[ChainId.toString(chainId)] = {
29
29
  id: chainId,
30
30
  isRealtime: isRealtime
31
31
  };
@@ -179,7 +179,7 @@ async function runBatchHandlersOrThrow(batch, indexerState, loadManager, persist
179
179
  function registerProcessEventBatchMetrics(logger, batch, indexerState, loadDuration, handlerDuration) {
180
180
  Stdlib_Dict.forEachWithKey(batch.progressedChainsById, (chainAfterBatch, chainId) => Logging.childTrace(logger, {
181
181
  msg: "Finished processing",
182
- chainId: Stdlib_Int.fromString(chainId, undefined),
182
+ chainId: chainId,
183
183
  batchSize: chainAfterBatch.batchSize,
184
184
  progress: chainAfterBatch.progressBlockNumber
185
185
  }));
@@ -191,7 +191,7 @@ async function materializeBatchEvents(batch, chainStates, ecosystem) {
191
191
  if (match.length !== 1) {
192
192
  let itemsByChain = {};
193
193
  batch.items.forEach(item => {
194
- let chainId = Internal.getItemChainId(item).toString();
194
+ let chainId = ChainId.toString(Internal.getItemChainId(item));
195
195
  let items = itemsByChain[chainId];
196
196
  if (items !== undefined) {
197
197
  items.push(item);
@@ -214,7 +214,7 @@ async function processEventBatch(batch, indexerState, loadManager, persistence,
214
214
  let logger = Logging.getLogger();
215
215
  Stdlib_Dict.forEachWithKey(batch.progressedChainsById, (chainAfterBatch, chainId) => Logging.childTrace(logger, {
216
216
  msg: "Started processing",
217
- chainId: Stdlib_Int.fromString(chainId, undefined),
217
+ chainId: chainId,
218
218
  batchSize: chainAfterBatch.batchSize
219
219
  }));
220
220
  try {