envio 3.0.0-alpha.21 → 3.0.0-alpha.23

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 (220) hide show
  1. package/README.md +3 -3
  2. package/bin.mjs +2 -48
  3. package/evm.schema.json +67 -0
  4. package/fuel.schema.json +67 -0
  5. package/index.d.ts +822 -38
  6. package/index.js +5 -3
  7. package/package.json +10 -8
  8. package/rescript.json +5 -9
  9. package/src/Address.res +4 -5
  10. package/src/Address.res.mjs +9 -12
  11. package/src/Api.res +15 -0
  12. package/src/Api.res.mjs +20 -0
  13. package/src/Batch.res +32 -34
  14. package/src/Batch.res.mjs +172 -187
  15. package/src/Bin.res +89 -0
  16. package/src/Bin.res.mjs +97 -0
  17. package/src/ChainFetcher.res +33 -57
  18. package/src/ChainFetcher.res.mjs +197 -227
  19. package/src/ChainManager.res +6 -14
  20. package/src/ChainManager.res.mjs +74 -85
  21. package/src/ChainMap.res +14 -16
  22. package/src/ChainMap.res.mjs +38 -38
  23. package/src/Config.res +193 -135
  24. package/src/Config.res.mjs +566 -592
  25. package/src/Core.res +182 -0
  26. package/src/Core.res.mjs +207 -0
  27. package/src/Ecosystem.res +25 -4
  28. package/src/Ecosystem.res.mjs +12 -13
  29. package/src/Env.res +20 -13
  30. package/src/Env.res.mjs +124 -113
  31. package/src/EnvSafe.res +269 -0
  32. package/src/EnvSafe.res.mjs +296 -0
  33. package/src/EnvSafe.resi +18 -0
  34. package/src/Envio.res +37 -26
  35. package/src/Envio.res.mjs +59 -60
  36. package/src/ErrorHandling.res +2 -2
  37. package/src/ErrorHandling.res.mjs +15 -15
  38. package/src/EventConfigBuilder.res +219 -81
  39. package/src/EventConfigBuilder.res.mjs +259 -202
  40. package/src/EventProcessing.res +27 -38
  41. package/src/EventProcessing.res.mjs +165 -183
  42. package/src/EventUtils.res +11 -11
  43. package/src/EventUtils.res.mjs +21 -22
  44. package/src/EvmTypes.res +0 -1
  45. package/src/EvmTypes.res.mjs +5 -5
  46. package/src/FetchState.res +360 -256
  47. package/src/FetchState.res.mjs +958 -914
  48. package/src/GlobalState.res +365 -351
  49. package/src/GlobalState.res.mjs +958 -992
  50. package/src/GlobalStateManager.res +1 -2
  51. package/src/GlobalStateManager.res.mjs +36 -44
  52. package/src/HandlerLoader.res +107 -23
  53. package/src/HandlerLoader.res.mjs +128 -38
  54. package/src/HandlerRegister.res +127 -103
  55. package/src/HandlerRegister.res.mjs +164 -164
  56. package/src/HandlerRegister.resi +12 -4
  57. package/src/Hasura.res +35 -22
  58. package/src/Hasura.res.mjs +158 -167
  59. package/src/InMemoryStore.res +20 -27
  60. package/src/InMemoryStore.res.mjs +64 -80
  61. package/src/InMemoryTable.res +34 -39
  62. package/src/InMemoryTable.res.mjs +165 -170
  63. package/src/Internal.res +52 -33
  64. package/src/Internal.res.mjs +84 -81
  65. package/src/LazyLoader.res.mjs +55 -61
  66. package/src/LoadLayer.res +77 -78
  67. package/src/LoadLayer.res.mjs +160 -189
  68. package/src/LoadManager.res +16 -21
  69. package/src/LoadManager.res.mjs +79 -84
  70. package/src/LogSelection.res +236 -68
  71. package/src/LogSelection.res.mjs +211 -141
  72. package/src/Logging.res +13 -9
  73. package/src/Logging.res.mjs +130 -143
  74. package/src/Main.res +430 -51
  75. package/src/Main.res.mjs +530 -271
  76. package/src/Persistence.res +80 -84
  77. package/src/Persistence.res.mjs +131 -132
  78. package/src/PgStorage.res +294 -167
  79. package/src/PgStorage.res.mjs +799 -817
  80. package/src/Prometheus.res +50 -58
  81. package/src/Prometheus.res.mjs +345 -373
  82. package/src/ReorgDetection.res +22 -24
  83. package/src/ReorgDetection.res.mjs +100 -106
  84. package/src/SafeCheckpointTracking.res +7 -7
  85. package/src/SafeCheckpointTracking.res.mjs +40 -43
  86. package/src/SimulateItems.res +41 -49
  87. package/src/SimulateItems.res.mjs +257 -272
  88. package/src/Sink.res +2 -2
  89. package/src/Sink.res.mjs +22 -26
  90. package/src/TableIndices.res +1 -2
  91. package/src/TableIndices.res.mjs +42 -48
  92. package/src/TestIndexer.res +196 -189
  93. package/src/TestIndexer.res.mjs +536 -536
  94. package/src/TestIndexerProxyStorage.res +16 -16
  95. package/src/TestIndexerProxyStorage.res.mjs +99 -122
  96. package/src/TestIndexerWorker.res +4 -0
  97. package/src/TestIndexerWorker.res.mjs +7 -0
  98. package/src/Throttler.res +3 -3
  99. package/src/Throttler.res.mjs +23 -24
  100. package/src/Time.res +1 -1
  101. package/src/Time.res.mjs +18 -21
  102. package/src/TopicFilter.res +3 -3
  103. package/src/TopicFilter.res.mjs +29 -30
  104. package/src/UserContext.res +93 -54
  105. package/src/UserContext.res.mjs +197 -182
  106. package/src/Utils.res +141 -86
  107. package/src/Utils.res.mjs +334 -295
  108. package/src/bindings/BigDecimal.res +0 -2
  109. package/src/bindings/BigDecimal.res.mjs +19 -23
  110. package/src/bindings/ClickHouse.res +28 -27
  111. package/src/bindings/ClickHouse.res.mjs +243 -240
  112. package/src/bindings/DateFns.res +11 -11
  113. package/src/bindings/DateFns.res.mjs +7 -7
  114. package/src/bindings/EventSource.res.mjs +2 -2
  115. package/src/bindings/Express.res +2 -5
  116. package/src/bindings/Hrtime.res +2 -2
  117. package/src/bindings/Hrtime.res.mjs +30 -32
  118. package/src/bindings/Lodash.res.mjs +1 -1
  119. package/src/bindings/NodeJs.res +14 -9
  120. package/src/bindings/NodeJs.res.mjs +20 -20
  121. package/src/bindings/Pino.res +8 -10
  122. package/src/bindings/Pino.res.mjs +40 -43
  123. package/src/bindings/Postgres.res +7 -5
  124. package/src/bindings/Postgres.res.mjs +9 -9
  125. package/src/bindings/PromClient.res +17 -2
  126. package/src/bindings/PromClient.res.mjs +30 -7
  127. package/src/bindings/SDSL.res.mjs +2 -2
  128. package/src/bindings/Viem.res +4 -4
  129. package/src/bindings/Viem.res.mjs +20 -22
  130. package/src/bindings/Vitest.res +1 -1
  131. package/src/bindings/Vitest.res.mjs +2 -2
  132. package/src/bindings/WebSocket.res +1 -1
  133. package/src/db/EntityHistory.res +9 -3
  134. package/src/db/EntityHistory.res.mjs +84 -59
  135. package/src/db/InternalTable.res +62 -60
  136. package/src/db/InternalTable.res.mjs +271 -203
  137. package/src/db/Schema.res +1 -2
  138. package/src/db/Schema.res.mjs +28 -32
  139. package/src/db/Table.res +28 -27
  140. package/src/db/Table.res.mjs +276 -292
  141. package/src/sources/EventRouter.res +21 -16
  142. package/src/sources/EventRouter.res.mjs +55 -57
  143. package/src/sources/Evm.res +17 -1
  144. package/src/sources/Evm.res.mjs +16 -8
  145. package/src/sources/EvmChain.res +15 -17
  146. package/src/sources/EvmChain.res.mjs +40 -42
  147. package/src/sources/Fuel.res +14 -1
  148. package/src/sources/Fuel.res.mjs +16 -8
  149. package/src/sources/FuelSDK.res +1 -1
  150. package/src/sources/FuelSDK.res.mjs +6 -8
  151. package/src/sources/HyperFuel.res +8 -10
  152. package/src/sources/HyperFuel.res.mjs +113 -123
  153. package/src/sources/HyperFuelClient.res.mjs +6 -7
  154. package/src/sources/HyperFuelSource.res +19 -20
  155. package/src/sources/HyperFuelSource.res.mjs +339 -356
  156. package/src/sources/HyperSync.res +11 -13
  157. package/src/sources/HyperSync.res.mjs +206 -220
  158. package/src/sources/HyperSyncClient.res +5 -7
  159. package/src/sources/HyperSyncClient.res.mjs +70 -75
  160. package/src/sources/HyperSyncHeightStream.res +8 -9
  161. package/src/sources/HyperSyncHeightStream.res.mjs +78 -86
  162. package/src/sources/HyperSyncJsonApi.res +18 -15
  163. package/src/sources/HyperSyncJsonApi.res.mjs +201 -231
  164. package/src/sources/HyperSyncSource.res +17 -21
  165. package/src/sources/HyperSyncSource.res.mjs +268 -290
  166. package/src/sources/Rpc.res +5 -5
  167. package/src/sources/Rpc.res.mjs +168 -192
  168. package/src/sources/RpcSource.res +166 -167
  169. package/src/sources/RpcSource.res.mjs +972 -1046
  170. package/src/sources/RpcWebSocketHeightStream.res +10 -11
  171. package/src/sources/RpcWebSocketHeightStream.res.mjs +131 -145
  172. package/src/sources/SimulateSource.res +1 -1
  173. package/src/sources/SimulateSource.res.mjs +35 -38
  174. package/src/sources/Source.res +1 -1
  175. package/src/sources/Source.res.mjs +3 -3
  176. package/src/sources/SourceManager.res +39 -20
  177. package/src/sources/SourceManager.res.mjs +340 -371
  178. package/src/sources/SourceManager.resi +2 -1
  179. package/src/sources/Svm.res +12 -5
  180. package/src/sources/Svm.res.mjs +44 -41
  181. package/src/tui/Tui.res +23 -12
  182. package/src/tui/Tui.res.mjs +292 -290
  183. package/src/tui/bindings/Ink.res +2 -4
  184. package/src/tui/bindings/Ink.res.mjs +35 -41
  185. package/src/tui/components/BufferedProgressBar.res +7 -7
  186. package/src/tui/components/BufferedProgressBar.res.mjs +46 -46
  187. package/src/tui/components/CustomHooks.res +1 -2
  188. package/src/tui/components/CustomHooks.res.mjs +102 -122
  189. package/src/tui/components/Messages.res +1 -2
  190. package/src/tui/components/Messages.res.mjs +38 -42
  191. package/src/tui/components/SyncETA.res +10 -11
  192. package/src/tui/components/SyncETA.res.mjs +178 -196
  193. package/src/tui/components/TuiData.res +1 -1
  194. package/src/tui/components/TuiData.res.mjs +7 -6
  195. package/src/vendored/Rest.res +52 -66
  196. package/src/vendored/Rest.res.mjs +324 -364
  197. package/svm.schema.json +67 -0
  198. package/src/Address.gen.ts +0 -8
  199. package/src/Config.gen.ts +0 -19
  200. package/src/Envio.gen.ts +0 -55
  201. package/src/EvmTypes.gen.ts +0 -6
  202. package/src/InMemoryStore.gen.ts +0 -6
  203. package/src/Internal.gen.ts +0 -64
  204. package/src/PgStorage.gen.ts +0 -10
  205. package/src/PgStorage.res.d.mts +0 -5
  206. package/src/Types.ts +0 -56
  207. package/src/bindings/BigDecimal.gen.ts +0 -14
  208. package/src/bindings/BigDecimal.res.d.mts +0 -5
  209. package/src/bindings/BigInt.gen.ts +0 -10
  210. package/src/bindings/BigInt.res +0 -70
  211. package/src/bindings/BigInt.res.d.mts +0 -5
  212. package/src/bindings/BigInt.res.mjs +0 -154
  213. package/src/bindings/Ethers.res.d.mts +0 -5
  214. package/src/bindings/Pino.gen.ts +0 -17
  215. package/src/bindings/Postgres.gen.ts +0 -8
  216. package/src/bindings/Postgres.res.d.mts +0 -5
  217. package/src/bindings/Promise.res +0 -67
  218. package/src/bindings/Promise.res.mjs +0 -26
  219. package/src/db/InternalTable.gen.ts +0 -36
  220. package/src/sources/HyperSyncClient.gen.ts +0 -19
@@ -1,4 +1,3 @@
1
- open Belt
2
1
  module type State = {
3
2
  type t
4
3
  type action
@@ -40,7 +39,7 @@ module MakeManager = (S: State) => {
40
39
  }
41
40
  and dispatchTask = (self, task: S.task) => {
42
41
  let stateId = self.state->S.getId
43
- Js.Global.setTimeout(() => {
42
+ setTimeout(() => {
44
43
  if stateId !== self.state->S.getId {
45
44
  Logging.info("Invalidated task discarded")
46
45
  } else {
@@ -1,60 +1,52 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
3
  import * as Logging from "./Logging.res.mjs";
4
- import * as $$Promise from "./bindings/Promise.res.mjs";
5
4
  import * as Process from "process";
6
- import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
7
5
  import * as GlobalState from "./GlobalState.res.mjs";
8
6
  import * as ErrorHandling from "./ErrorHandling.res.mjs";
9
- import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
7
+ import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
8
+ import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
10
9
 
11
10
  function make(state, onErrorOpt) {
12
- var onError = onErrorOpt !== undefined ? onErrorOpt : (function (e) {
13
- ErrorHandling.log(ErrorHandling.make(e, undefined, "Indexer has failed with an unexpected error"));
14
- Process.exit(1);
15
- });
11
+ let onError = onErrorOpt !== undefined ? onErrorOpt : e => {
12
+ ErrorHandling.log(ErrorHandling.make(e, undefined, "Indexer has failed with an unexpected error"));
13
+ Process.exit(1);
14
+ };
16
15
  return {
17
- state: state,
18
- onError: onError
19
- };
16
+ state: state,
17
+ onError: onError
18
+ };
20
19
  }
21
20
 
22
21
  function dispatchAction(stateIdOpt, self, action) {
23
- var stateId = stateIdOpt !== undefined ? stateIdOpt : 0;
22
+ let stateId = stateIdOpt !== undefined ? stateIdOpt : 0;
24
23
  try {
25
- var reducer = stateId === GlobalState.getId(self.state) ? GlobalState.actionReducer : GlobalState.invalidatedActionReducer;
26
- var match = reducer(self.state, action);
24
+ let reducer = stateId === GlobalState.getId(self.state) ? GlobalState.actionReducer : GlobalState.invalidatedActionReducer;
25
+ let match = reducer(self.state, action);
27
26
  self.state = match[0];
28
- return Belt_Array.forEach(match[1], (function (task) {
29
- dispatchTask(self, task);
30
- }));
31
- }
32
- catch (raw_e){
33
- var e = Caml_js_exceptions.internalToOCamlException(raw_e);
34
- return self.onError(e);
27
+ match[1].forEach(task => dispatchTask(self, task));
28
+ return;
29
+ } catch (raw_e) {
30
+ return self.onError(Primitive_exceptions.internalToException(raw_e));
35
31
  }
36
32
  }
37
33
 
38
34
  function dispatchTask(self, task) {
39
- var stateId = GlobalState.getId(self.state);
40
- setTimeout((function () {
41
- if (stateId !== GlobalState.getId(self.state)) {
42
- return Logging.info("Invalidated task discarded");
43
- }
44
- try {
45
- $$Promise.$$catch(GlobalState.taskReducer(self.state, task, (function (action) {
46
- dispatchAction(stateId, self, action);
47
- })), (function (e) {
48
- self.onError(e);
49
- return Promise.resolve();
50
- }));
51
- return ;
52
- }
53
- catch (raw_e){
54
- var e = Caml_js_exceptions.internalToOCamlException(raw_e);
55
- return self.onError(e);
56
- }
57
- }), 0);
35
+ let stateId = GlobalState.getId(self.state);
36
+ setTimeout(() => {
37
+ if (stateId !== GlobalState.getId(self.state)) {
38
+ return Logging.info("Invalidated task discarded");
39
+ }
40
+ try {
41
+ Stdlib_Promise.$$catch(GlobalState.taskReducer(self.state, task, action => dispatchAction(stateId, self, action)), e => {
42
+ self.onError(e);
43
+ return Promise.resolve();
44
+ });
45
+ return;
46
+ } catch (raw_e) {
47
+ return self.onError(Primitive_exceptions.internalToException(raw_e));
48
+ }
49
+ }, 0);
58
50
  }
59
51
 
60
52
  function getState(self) {
@@ -66,10 +58,10 @@ function setState(self, state) {
66
58
  }
67
59
 
68
60
  export {
69
- make ,
70
- dispatchAction ,
71
- dispatchTask ,
72
- getState ,
73
- setState ,
61
+ make,
62
+ dispatchAction,
63
+ dispatchTask,
64
+ getState,
65
+ setState,
74
66
  }
75
67
  /* Logging Not a pure module */
@@ -25,11 +25,14 @@ let registerContractHandlers = async (~contractName, ~handler: option<string>) =
25
25
  let _ = await Utils.importPath(toImportUrl(handlerPath))
26
26
  } catch {
27
27
  | exn =>
28
+ let cause = exn->Utils.prettifyExn->Obj.magic
28
29
  Logging.errorWithExn(
29
30
  exn,
30
31
  `Failed to load handler file for contract ${contractName}: ${handlerPath}`,
31
32
  )
32
- Js.Exn.raiseError(`Failed to load handler file for contract ${contractName}: ${handlerPath}`)
33
+ JsError.throwWithMessage(
34
+ `Failed to load handler file for contract ${contractName}: ${handlerPath}. Cause: ${cause}`,
35
+ )
33
36
  }
34
37
  }
35
38
  }
@@ -41,16 +44,16 @@ let autoLoadFromSrcHandlers = async (~handlers: string) => {
41
44
  let iterator = globIterator(srcPattern)
42
45
  let files = await iterator->Utils.Array.fromAsyncIterator
43
46
  // Filter out test and spec files
44
- files->Js.Array2.filter(file => {
47
+ files->Array.filter(file => {
45
48
  !(
46
- file->Js.String2.includes(".test.") ||
47
- file->Js.String2.includes(".spec.") ||
48
- file->Js.String2.includes("_test.")
49
+ file->String.includes(".test.") ||
50
+ file->String.includes(".spec.") ||
51
+ file->String.includes("_test.")
49
52
  )
50
53
  })
51
54
  } catch {
52
55
  | exn =>
53
- Js.Exn.raiseError(
56
+ JsError.throwWithMessage(
54
57
  `Failed to glob src/handlers directory for auto-loading handlers. Pattern: ${srcPattern}. Before continuing, check that you're using Node.js >=22 version. Error: ${exn
55
58
  ->Utils.prettifyExn
56
59
  ->Obj.magic}`,
@@ -58,19 +61,100 @@ let autoLoadFromSrcHandlers = async (~handlers: string) => {
58
61
  }
59
62
 
60
63
  // Import handler files using absolute file:// URLs resolved from cwd
61
- let _ =
62
- await handlerFiles
63
- ->Js.Array2.map(file => {
64
- Utils.importPath(toImportUrl(file))->Promise.catch(exn => {
65
- Logging.errorWithExn(exn, `Failed to auto-load handler file: ${file}`)
66
- Js.Exn.raiseError(`Failed to auto-load handler file: ${file}`)
67
- })
64
+ let _ = await handlerFiles
65
+ ->Array.map(file => {
66
+ Utils.importPath(toImportUrl(file))->Promise.catch(exn => {
67
+ let cause = exn->Utils.prettifyExn->Obj.magic
68
+ Logging.errorWithExn(exn, `Failed to auto-load handler file: ${file}`)
69
+ JsError.throwWithMessage(`Failed to auto-load handler file: ${file}. Cause: ${cause}`)
70
+ })
71
+ })
72
+ ->Promise.all
73
+ }
74
+
75
+ // EVM re-runs `parseEventFiltersOrThrow` with the registered `where:` JSON so
76
+ // per-event filters propagate into `getEventFiltersOrThrow` / `filterByAddresses`
77
+ // — which is why `evmEventConfig` has to retain `sighash` and `indexedParams`.
78
+ // `dependsOnAddresses` is routed through `Internal.dependsOnAddresses` so the
79
+ // formula stays in sync with `EventConfigBuilder.build{Evm,Fuel}EventConfig`.
80
+ let applyRegistrations = (~config: Config.t): Config.t => {
81
+ let newChainMap = config.chainMap->ChainMap.map(chain => {
82
+ let newContracts = chain.contracts->Array.map(contract => {
83
+ let newEvents = contract.events->Array.map(
84
+ ev => {
85
+ let isWildcard = HandlerRegister.isWildcard(
86
+ ~contractName=ev.contractName,
87
+ ~eventName=ev.name,
88
+ )
89
+ let handler = HandlerRegister.getHandler(
90
+ ~contractName=ev.contractName,
91
+ ~eventName=ev.name,
92
+ )
93
+ let contractRegister = HandlerRegister.getContractRegister(
94
+ ~contractName=ev.contractName,
95
+ ~eventName=ev.name,
96
+ )
97
+ switch config.ecosystem.name {
98
+ | Fuel =>
99
+ let fuelEv = ev->(Utils.magic: Internal.eventConfig => Internal.fuelEventConfig)
100
+
101
+ ({
102
+ ...fuelEv,
103
+ isWildcard,
104
+ handler,
105
+ contractRegister,
106
+ dependsOnAddresses: Internal.dependsOnAddresses(
107
+ ~isWildcard,
108
+ ~filterByAddresses=false,
109
+ ),
110
+ } :> Internal.eventConfig)
111
+ | Evm =>
112
+ let evmEv = ev->(Utils.magic: Internal.eventConfig => Internal.evmEventConfig)
113
+ let eventFilters = HandlerRegister.getOnEventWhere(
114
+ ~contractName=ev.contractName,
115
+ ~eventName=ev.name,
116
+ )
117
+ let {getEventFiltersOrThrow, filterByAddresses} = LogSelection.parseEventFiltersOrThrow(
118
+ ~eventFilters,
119
+ ~sighash=evmEv.sighash,
120
+ ~params=evmEv.indexedParams->Array.map(p => p.name),
121
+ ~contractName=ev.contractName,
122
+ ~probeChainId=chain.id,
123
+ ~onEventBlockFilterSchema=config.ecosystem.onEventBlockFilterSchema,
124
+ ~topic1=?evmEv.indexedParams
125
+ ->Array.get(0)
126
+ ->Option.map(EventConfigBuilder.buildTopicGetter),
127
+ ~topic2=?evmEv.indexedParams
128
+ ->Array.get(1)
129
+ ->Option.map(EventConfigBuilder.buildTopicGetter),
130
+ ~topic3=?evmEv.indexedParams
131
+ ->Array.get(2)
132
+ ->Option.map(EventConfigBuilder.buildTopicGetter),
133
+ )
134
+
135
+ ({
136
+ ...evmEv,
137
+ isWildcard,
138
+ handler,
139
+ contractRegister,
140
+ getEventFiltersOrThrow,
141
+ filterByAddresses,
142
+ dependsOnAddresses: Internal.dependsOnAddresses(~isWildcard, ~filterByAddresses),
143
+ } :> Internal.eventConfig)
144
+ | Svm =>
145
+ JsError.throwWithMessage(`SVM does not support indexer.onEvent or indexer.contractRegister. Use indexer.onSlot for per-slot handlers.`)
146
+ }
147
+ },
148
+ )
149
+ {...contract, events: newEvents}
68
150
  })
69
- ->Promise.all
151
+ {...chain, contracts: newContracts}
152
+ })
153
+ {...config, chainMap: newChainMap}
70
154
  }
71
155
 
72
- // Register all handlers - must be called BEFORE creating the final config
73
- // so that event registrations are captured in the config
156
+ // `Config` never reads `HandlerRegister`. The only way to get a config that
157
+ // reflects registration state is through the returned value here.
74
158
  let registerAllHandlers = async (~config: Config.t) => {
75
159
  HandlerRegister.startRegistration(~ecosystem=config.ecosystem, ~multichain=config.multichain)
76
160
 
@@ -78,12 +162,12 @@ let registerAllHandlers = async (~config: Config.t) => {
78
162
  await autoLoadFromSrcHandlers(~handlers=config.handlers)
79
163
 
80
164
  // Load contract-specific handlers
81
- let _ =
82
- await config.contractHandlers
83
- ->Js.Array2.map(({name, handler}) => {
84
- registerContractHandlers(~contractName=name, ~handler)
85
- })
86
- ->Promise.all
165
+ let _ = await config.contractHandlers
166
+ ->Array.map(({name, handler}) => {
167
+ registerContractHandlers(~contractName=name, ~handler)
168
+ })
169
+ ->Promise.all
87
170
 
88
- HandlerRegister.finishRegistration()
171
+ let registrations = HandlerRegister.finishRegistration()
172
+ (applyRegistrations(~config), registrations)
89
173
  }
@@ -3,77 +3,167 @@
3
3
  import * as Url from "url";
4
4
  import * as Path from "path";
5
5
  import * as Utils from "./Utils.res.mjs";
6
- import * as Js_exn from "rescript/lib/es6/js_exn.js";
7
6
  import * as Logging from "./Logging.res.mjs";
8
- import * as $$Promise from "./bindings/Promise.res.mjs";
9
7
  import * as Process from "process";
8
+ import * as ChainMap from "./ChainMap.res.mjs";
9
+ import * as Internal from "./Internal.res.mjs";
10
10
  import * as Nodemodule from "node:module";
11
+ import * as LogSelection from "./LogSelection.res.mjs";
12
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
13
+ import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
14
+ import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
11
15
  import * as HandlerRegister from "./HandlerRegister.res.mjs";
12
16
  import * as Promises from "node:fs/promises";
13
- import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
17
+ import * as EventConfigBuilder from "./EventConfigBuilder.res.mjs";
18
+ import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
14
19
 
15
20
  try {
16
21
  Nodemodule.register("tsx/esm", import.meta.url);
17
- }
18
- catch (exn){
22
+ } catch (exn) {
19
23
 
20
24
  }
21
25
 
22
26
  function toImportUrl(relativePath) {
23
- var absolutePath = Path.resolve(Process.cwd(), relativePath);
27
+ let absolutePath = Path.resolve(Process.cwd(), relativePath);
24
28
  return Url.pathToFileURL(absolutePath).toString();
25
29
  }
26
30
 
27
31
  async function registerContractHandlers(contractName, handler) {
28
32
  if (handler === undefined) {
29
- return ;
33
+ return;
30
34
  }
31
35
  try {
32
36
  await import(toImportUrl(handler));
33
- return ;
34
- }
35
- catch (raw_exn){
36
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
37
- Logging.errorWithExn(exn, "Failed to load handler file for contract " + contractName + ": " + handler);
38
- return Js_exn.raiseError("Failed to load handler file for contract " + contractName + ": " + handler);
37
+ return;
38
+ } catch (raw_exn) {
39
+ let exn = Primitive_exceptions.internalToException(raw_exn);
40
+ let cause = Utils.prettifyExn(exn);
41
+ Logging.errorWithExn(exn, `Failed to load handler file for contract ` + contractName + `: ` + handler);
42
+ return Stdlib_JsError.throwWithMessage(`Failed to load handler file for contract ` + contractName + `: ` + handler + `. Cause: ` + cause);
39
43
  }
40
44
  }
41
45
 
42
46
  async function autoLoadFromSrcHandlers(handlers) {
43
- var srcPattern = "./" + handlers + "/**/*.{js,mjs,ts}";
44
- var handlerFiles;
47
+ let srcPattern = `./` + handlers + `/**/*.{js,mjs,ts}`;
48
+ let handlerFiles;
45
49
  try {
46
- var iterator = Promises.glob(srcPattern);
47
- var files = await Utils.$$Array.fromAsyncIterator(iterator);
48
- handlerFiles = files.filter(function (file) {
49
- return !(file.includes(".test.") || file.includes(".spec.") || file.includes("_test."));
50
- });
51
- }
52
- catch (raw_exn){
53
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
54
- handlerFiles = Js_exn.raiseError("Failed to glob src/handlers directory for auto-loading handlers. Pattern: " + srcPattern + ". Before continuing, check that you're using Node.js >=22 version. Error: " + Utils.prettifyExn(exn));
50
+ let iterator = Promises.glob(srcPattern);
51
+ let files = await Utils.$$Array.fromAsyncIterator(iterator);
52
+ handlerFiles = files.filter(file => !(file.includes(".test.") || file.includes(".spec.") || file.includes("_test.")));
53
+ } catch (raw_exn) {
54
+ let exn = Primitive_exceptions.internalToException(raw_exn);
55
+ handlerFiles = Stdlib_JsError.throwWithMessage(`Failed to glob src/handlers directory for auto-loading handlers. Pattern: ` + srcPattern + `. Before continuing, check that you're using Node.js >=22 version. Error: ` + Utils.prettifyExn(exn));
55
56
  }
56
- await Promise.all(handlerFiles.map(function (file) {
57
- return $$Promise.$$catch(import(toImportUrl(file)), (function (exn) {
58
- Logging.errorWithExn(exn, "Failed to auto-load handler file: " + file);
59
- return Js_exn.raiseError("Failed to auto-load handler file: " + file);
60
- }));
61
- }));
57
+ await Promise.all(handlerFiles.map(file => Stdlib_Promise.$$catch(import(toImportUrl(file)), exn => {
58
+ let cause = Utils.prettifyExn(exn);
59
+ Logging.errorWithExn(exn, `Failed to auto-load handler file: ` + file);
60
+ return Stdlib_JsError.throwWithMessage(`Failed to auto-load handler file: ` + file + `. Cause: ` + cause);
61
+ })));
62
+ }
63
+
64
+ function applyRegistrations(config) {
65
+ let newChainMap = ChainMap.map(config.chainMap, chain => {
66
+ let newContracts = chain.contracts.map(contract => {
67
+ let newEvents = contract.events.map(ev => {
68
+ let isWildcard = HandlerRegister.isWildcard(ev.contractName, ev.name);
69
+ let handler = HandlerRegister.getHandler(ev.contractName, ev.name);
70
+ let contractRegister = HandlerRegister.getContractRegister(ev.contractName, ev.name);
71
+ let match = config.ecosystem.name;
72
+ switch (match) {
73
+ case "evm" :
74
+ let eventFilters = HandlerRegister.getOnEventWhere(ev.contractName, ev.name);
75
+ let match$1 = LogSelection.parseEventFiltersOrThrow(eventFilters, ev.sighash, ev.indexedParams.map(p => p.name), ev.contractName, chain.id, config.ecosystem.onEventBlockFilterSchema, Stdlib_Option.map(ev.indexedParams[0], EventConfigBuilder.buildTopicGetter), Stdlib_Option.map(ev.indexedParams[1], EventConfigBuilder.buildTopicGetter), Stdlib_Option.map(ev.indexedParams[2], EventConfigBuilder.buildTopicGetter));
76
+ let filterByAddresses = match$1.filterByAddresses;
77
+ return {
78
+ id: ev.id,
79
+ name: ev.name,
80
+ contractName: ev.contractName,
81
+ isWildcard: isWildcard,
82
+ filterByAddresses: filterByAddresses,
83
+ dependsOnAddresses: Internal.dependsOnAddresses(isWildcard, filterByAddresses),
84
+ handler: handler,
85
+ contractRegister: contractRegister,
86
+ paramsRawEventSchema: ev.paramsRawEventSchema,
87
+ simulateParamsSchema: ev.simulateParamsSchema,
88
+ startBlock: ev.startBlock,
89
+ getEventFiltersOrThrow: match$1.getEventFiltersOrThrow,
90
+ convertHyperSyncEventArgs: ev.convertHyperSyncEventArgs,
91
+ selectedBlockFields: ev.selectedBlockFields,
92
+ selectedTransactionFields: ev.selectedTransactionFields,
93
+ sighash: ev.sighash,
94
+ indexedParams: ev.indexedParams
95
+ };
96
+ case "fuel" :
97
+ return {
98
+ id: ev.id,
99
+ name: ev.name,
100
+ contractName: ev.contractName,
101
+ isWildcard: isWildcard,
102
+ filterByAddresses: ev.filterByAddresses,
103
+ dependsOnAddresses: Internal.dependsOnAddresses(isWildcard, false),
104
+ handler: handler,
105
+ contractRegister: contractRegister,
106
+ paramsRawEventSchema: ev.paramsRawEventSchema,
107
+ simulateParamsSchema: ev.simulateParamsSchema,
108
+ startBlock: ev.startBlock,
109
+ kind: ev.kind
110
+ };
111
+ case "svm" :
112
+ return Stdlib_JsError.throwWithMessage(`SVM does not support indexer.onEvent or indexer.contractRegister. Use indexer.onSlot for per-slot handlers.`);
113
+ }
114
+ });
115
+ return {
116
+ name: contract.name,
117
+ abi: contract.abi,
118
+ addresses: contract.addresses,
119
+ events: newEvents,
120
+ startBlock: contract.startBlock,
121
+ eventSignatures: contract.eventSignatures
122
+ };
123
+ });
124
+ let newrecord = {...chain};
125
+ newrecord.contracts = newContracts;
126
+ return newrecord;
127
+ });
128
+ return {
129
+ name: config.name,
130
+ description: config.description,
131
+ handlers: config.handlers,
132
+ contractHandlers: config.contractHandlers,
133
+ shouldRollbackOnReorg: config.shouldRollbackOnReorg,
134
+ shouldSaveFullHistory: config.shouldSaveFullHistory,
135
+ storage: config.storage,
136
+ multichain: config.multichain,
137
+ chainMap: newChainMap,
138
+ defaultChain: config.defaultChain,
139
+ ecosystem: config.ecosystem,
140
+ enableRawEvents: config.enableRawEvents,
141
+ maxAddrInPartition: config.maxAddrInPartition,
142
+ batchSize: config.batchSize,
143
+ lowercaseAddresses: config.lowercaseAddresses,
144
+ userEntitiesByName: config.userEntitiesByName,
145
+ userEntities: config.userEntities,
146
+ allEntities: config.allEntities,
147
+ allEnums: config.allEnums
148
+ };
62
149
  }
63
150
 
64
151
  async function registerAllHandlers(config) {
65
152
  HandlerRegister.startRegistration(config.ecosystem, config.multichain);
66
153
  await autoLoadFromSrcHandlers(config.handlers);
67
- await Promise.all(config.contractHandlers.map(function (param) {
68
- return registerContractHandlers(param.name, param.handler);
69
- }));
70
- return HandlerRegister.finishRegistration();
154
+ await Promise.all(config.contractHandlers.map(param => registerContractHandlers(param.name, param.handler)));
155
+ let registrations = HandlerRegister.finishRegistration();
156
+ return [
157
+ applyRegistrations(config),
158
+ registrations
159
+ ];
71
160
  }
72
161
 
73
162
  export {
74
- toImportUrl ,
75
- registerContractHandlers ,
76
- autoLoadFromSrcHandlers ,
77
- registerAllHandlers ,
163
+ toImportUrl,
164
+ registerContractHandlers,
165
+ autoLoadFromSrcHandlers,
166
+ applyRegistrations,
167
+ registerAllHandlers,
78
168
  }
79
169
  /* Not a pure module */