envio 3.0.0-alpha.2 → 3.0.0-alpha.20

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 (175) hide show
  1. package/README.md +164 -30
  2. package/bin.mjs +49 -0
  3. package/evm.schema.json +79 -169
  4. package/fuel.schema.json +50 -21
  5. package/index.d.ts +497 -1
  6. package/index.js +4 -0
  7. package/package.json +42 -31
  8. package/rescript.json +4 -1
  9. package/src/Batch.res +11 -8
  10. package/src/Batch.res.mjs +11 -9
  11. package/src/ChainFetcher.res +531 -0
  12. package/src/ChainFetcher.res.mjs +339 -0
  13. package/src/ChainManager.res +190 -0
  14. package/src/ChainManager.res.mjs +166 -0
  15. package/src/Change.res +3 -3
  16. package/src/Config.gen.ts +19 -0
  17. package/src/Config.res +737 -22
  18. package/src/Config.res.mjs +703 -26
  19. package/src/{Indexer.res → Ctx.res} +1 -1
  20. package/src/Ecosystem.res +9 -124
  21. package/src/Ecosystem.res.mjs +19 -160
  22. package/src/Env.res +30 -74
  23. package/src/Env.res.mjs +25 -87
  24. package/src/Envio.gen.ts +3 -1
  25. package/src/Envio.res +20 -9
  26. package/src/EventProcessing.res +469 -0
  27. package/src/EventProcessing.res.mjs +337 -0
  28. package/src/EvmTypes.gen.ts +6 -0
  29. package/src/EvmTypes.res +1 -0
  30. package/src/FetchState.res +1256 -639
  31. package/src/FetchState.res.mjs +1135 -612
  32. package/src/GlobalState.res +1190 -0
  33. package/src/GlobalState.res.mjs +1183 -0
  34. package/src/GlobalStateManager.res +68 -0
  35. package/src/GlobalStateManager.res.mjs +75 -0
  36. package/src/GlobalStateManager.resi +7 -0
  37. package/src/HandlerLoader.res +89 -0
  38. package/src/HandlerLoader.res.mjs +79 -0
  39. package/src/HandlerRegister.res +357 -0
  40. package/src/HandlerRegister.res.mjs +299 -0
  41. package/src/{EventRegister.resi → HandlerRegister.resi} +13 -13
  42. package/src/Hasura.res +111 -175
  43. package/src/Hasura.res.mjs +88 -150
  44. package/src/InMemoryStore.res +1 -1
  45. package/src/InMemoryStore.res.mjs +3 -3
  46. package/src/InMemoryTable.res +1 -1
  47. package/src/InMemoryTable.res.mjs +1 -1
  48. package/src/Internal.gen.ts +4 -0
  49. package/src/Internal.res +230 -12
  50. package/src/Internal.res.mjs +115 -1
  51. package/src/LoadLayer.res +444 -0
  52. package/src/LoadLayer.res.mjs +296 -0
  53. package/src/LoadLayer.resi +32 -0
  54. package/src/LogSelection.res +33 -27
  55. package/src/LogSelection.res.mjs +6 -0
  56. package/src/Logging.res +21 -7
  57. package/src/Logging.res.mjs +16 -8
  58. package/src/Main.res +377 -0
  59. package/src/Main.res.mjs +339 -0
  60. package/src/Persistence.res +7 -21
  61. package/src/Persistence.res.mjs +3 -3
  62. package/src/PgStorage.gen.ts +10 -0
  63. package/src/PgStorage.res +116 -69
  64. package/src/PgStorage.res.d.mts +5 -0
  65. package/src/PgStorage.res.mjs +93 -50
  66. package/src/Prometheus.res +294 -224
  67. package/src/Prometheus.res.mjs +353 -340
  68. package/src/ReorgDetection.res +6 -10
  69. package/src/ReorgDetection.res.mjs +6 -6
  70. package/src/SafeCheckpointTracking.res +4 -4
  71. package/src/SafeCheckpointTracking.res.mjs +2 -2
  72. package/src/Sink.res +4 -2
  73. package/src/Sink.res.mjs +2 -1
  74. package/src/TableIndices.res +0 -1
  75. package/src/TestIndexer.res +692 -0
  76. package/src/TestIndexer.res.mjs +527 -0
  77. package/src/TestIndexerProxyStorage.res +205 -0
  78. package/src/TestIndexerProxyStorage.res.mjs +151 -0
  79. package/src/TopicFilter.res +1 -1
  80. package/src/Types.ts +1 -1
  81. package/src/UserContext.res +424 -0
  82. package/src/UserContext.res.mjs +279 -0
  83. package/src/Utils.res +97 -26
  84. package/src/Utils.res.mjs +91 -44
  85. package/src/bindings/BigInt.res +10 -0
  86. package/src/bindings/BigInt.res.mjs +15 -0
  87. package/src/bindings/ClickHouse.res +120 -23
  88. package/src/bindings/ClickHouse.res.mjs +118 -28
  89. package/src/bindings/DateFns.res +74 -0
  90. package/src/bindings/DateFns.res.mjs +22 -0
  91. package/src/bindings/EventSource.res +8 -1
  92. package/src/bindings/EventSource.res.mjs +8 -1
  93. package/src/bindings/Express.res +1 -0
  94. package/src/bindings/Hrtime.res +14 -1
  95. package/src/bindings/Hrtime.res.mjs +22 -2
  96. package/src/bindings/Hrtime.resi +4 -0
  97. package/src/bindings/Lodash.res +0 -1
  98. package/src/bindings/NodeJs.res +49 -3
  99. package/src/bindings/NodeJs.res.mjs +11 -3
  100. package/src/bindings/Pino.res +24 -10
  101. package/src/bindings/Pino.res.mjs +14 -8
  102. package/src/bindings/Postgres.gen.ts +8 -0
  103. package/src/bindings/Postgres.res +5 -1
  104. package/src/bindings/Postgres.res.d.mts +5 -0
  105. package/src/bindings/PromClient.res +0 -10
  106. package/src/bindings/PromClient.res.mjs +0 -3
  107. package/src/bindings/Vitest.res +142 -0
  108. package/src/bindings/Vitest.res.mjs +9 -0
  109. package/src/bindings/WebSocket.res +27 -0
  110. package/src/bindings/WebSocket.res.mjs +2 -0
  111. package/src/bindings/Yargs.res +8 -0
  112. package/src/bindings/Yargs.res.mjs +2 -0
  113. package/src/db/EntityHistory.res +7 -7
  114. package/src/db/EntityHistory.res.mjs +9 -9
  115. package/src/db/InternalTable.res +59 -111
  116. package/src/db/InternalTable.res.mjs +73 -104
  117. package/src/db/Table.res +27 -8
  118. package/src/db/Table.res.mjs +25 -14
  119. package/src/sources/Evm.res +84 -0
  120. package/src/sources/Evm.res.mjs +105 -0
  121. package/src/sources/EvmChain.res +94 -0
  122. package/src/sources/EvmChain.res.mjs +60 -0
  123. package/src/sources/Fuel.res +19 -34
  124. package/src/sources/Fuel.res.mjs +34 -16
  125. package/src/sources/FuelSDK.res +38 -0
  126. package/src/sources/FuelSDK.res.mjs +29 -0
  127. package/src/sources/HyperFuel.res +2 -2
  128. package/src/sources/HyperFuel.resi +1 -1
  129. package/src/sources/HyperFuelClient.res +2 -2
  130. package/src/sources/HyperFuelSource.res +33 -13
  131. package/src/sources/HyperFuelSource.res.mjs +24 -16
  132. package/src/sources/HyperSync.res +36 -6
  133. package/src/sources/HyperSync.res.mjs +9 -7
  134. package/src/sources/HyperSync.resi +4 -0
  135. package/src/sources/HyperSyncClient.res +1 -1
  136. package/src/sources/HyperSyncHeightStream.res +47 -116
  137. package/src/sources/HyperSyncHeightStream.res.mjs +46 -73
  138. package/src/sources/HyperSyncSource.res +118 -139
  139. package/src/sources/HyperSyncSource.res.mjs +104 -121
  140. package/src/sources/Rpc.res +86 -14
  141. package/src/sources/Rpc.res.mjs +101 -9
  142. package/src/sources/RpcSource.res +621 -364
  143. package/src/sources/RpcSource.res.mjs +843 -410
  144. package/src/sources/RpcWebSocketHeightStream.res +181 -0
  145. package/src/sources/RpcWebSocketHeightStream.res.mjs +196 -0
  146. package/src/sources/Source.res +7 -5
  147. package/src/sources/SourceManager.res +325 -225
  148. package/src/sources/SourceManager.res.mjs +314 -171
  149. package/src/sources/SourceManager.resi +17 -6
  150. package/src/sources/Svm.res +81 -0
  151. package/src/sources/Svm.res.mjs +90 -0
  152. package/src/tui/Tui.res +247 -0
  153. package/src/tui/Tui.res.mjs +337 -0
  154. package/src/tui/bindings/Ink.res +371 -0
  155. package/src/tui/bindings/Ink.res.mjs +72 -0
  156. package/src/tui/bindings/Style.res +123 -0
  157. package/src/tui/bindings/Style.res.mjs +2 -0
  158. package/src/tui/components/BufferedProgressBar.res +40 -0
  159. package/src/tui/components/BufferedProgressBar.res.mjs +57 -0
  160. package/src/tui/components/CustomHooks.res +122 -0
  161. package/src/tui/components/CustomHooks.res.mjs +179 -0
  162. package/src/tui/components/Messages.res +41 -0
  163. package/src/tui/components/Messages.res.mjs +75 -0
  164. package/src/tui/components/SyncETA.res +174 -0
  165. package/src/tui/components/SyncETA.res.mjs +263 -0
  166. package/src/tui/components/TuiData.res +47 -0
  167. package/src/tui/components/TuiData.res.mjs +34 -0
  168. package/svm.schema.json +112 -0
  169. package/bin.js +0 -48
  170. package/src/EventRegister.res +0 -241
  171. package/src/EventRegister.res.mjs +0 -240
  172. package/src/bindings/Ethers.gen.ts +0 -14
  173. package/src/bindings/Ethers.res +0 -204
  174. package/src/bindings/Ethers.res.mjs +0 -130
  175. /package/src/{Indexer.res.mjs → Ctx.res.mjs} +0 -0
@@ -0,0 +1,527 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Env from "./Env.res.mjs";
4
+ import * as Main from "./Main.res.mjs";
5
+ import * as Table from "./db/Table.res.mjs";
6
+ import * as Config from "./Config.res.mjs";
7
+ import * as Js_exn from "rescript/lib/es6/js_exn.js";
8
+ import * as Js_dict from "rescript/lib/es6/js_dict.js";
9
+ import * as Logging from "./Logging.res.mjs";
10
+ import * as Process from "process";
11
+ import * as Belt_Int from "rescript/lib/es6/belt_Int.js";
12
+ import * as ChainMap from "./ChainMap.res.mjs";
13
+ import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
14
+ import * as Belt_Option from "rescript/lib/es6/belt_Option.js";
15
+ import * as Caml_option from "rescript/lib/es6/caml_option.js";
16
+ import * as Persistence from "./Persistence.res.mjs";
17
+ import * as TableIndices from "./TableIndices.res.mjs";
18
+ import * as InternalTable from "./db/InternalTable.res.mjs";
19
+ import * as Worker_threads from "worker_threads";
20
+ import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
21
+ import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
22
+ import * as TestIndexerProxyStorage from "./TestIndexerProxyStorage.res.mjs";
23
+
24
+ function toIndexingContract(dc) {
25
+ return {
26
+ address: dc.contract_address,
27
+ contractName: dc.contract_name,
28
+ startBlock: dc.registering_event_block_number,
29
+ registrationBlock: dc.registering_event_block_number
30
+ };
31
+ }
32
+
33
+ function handleLoadByIds(state, tableName, ids) {
34
+ var entityDict = Belt_Option.getWithDefault(Js_dict.get(state.entities, tableName), {});
35
+ var entityConfig = state.entityConfigs[tableName];
36
+ var results = [];
37
+ Belt_Array.forEach(ids, (function (id) {
38
+ var entity = Js_dict.get(entityDict, id);
39
+ if (entity === undefined) {
40
+ return ;
41
+ }
42
+ var jsonEntity = S$RescriptSchema.reverseConvertToJsonOrThrow(entity, entityConfig.schema);
43
+ results.push(jsonEntity);
44
+ }));
45
+ return results;
46
+ }
47
+
48
+ function handleLoadByField(state, tableName, fieldName, fieldValue, operator) {
49
+ var entityDict = Belt_Option.getWithDefault(Js_dict.get(state.entities, tableName), {});
50
+ var entityConfig = state.entityConfigs[tableName];
51
+ var results = [];
52
+ var match = Table.getFieldByName(entityConfig.table, fieldName);
53
+ var fieldSchema;
54
+ var exit = 0;
55
+ if (match !== undefined && match.TAG === "Field") {
56
+ fieldSchema = match._0.fieldSchema;
57
+ } else {
58
+ exit = 1;
59
+ }
60
+ if (exit === 1) {
61
+ fieldSchema = Js_exn.raiseError("Field " + fieldName + " not found in entity " + tableName);
62
+ }
63
+ var parsedFieldValue = S$RescriptSchema.convertOrThrow(fieldValue, fieldSchema);
64
+ Belt_Array.forEach(Js_dict.values(entityDict), (function (entity) {
65
+ var entityFieldValue = Js_dict.get(entity, fieldName);
66
+ if (entityFieldValue === undefined) {
67
+ return ;
68
+ }
69
+ var entityFieldValue$1 = Caml_option.valFromOption(entityFieldValue);
70
+ var matches = operator === "=" ? TableIndices.FieldValue.eq(entityFieldValue$1, parsedFieldValue) : (
71
+ operator === ">" ? TableIndices.FieldValue.gt(entityFieldValue$1, parsedFieldValue) : TableIndices.FieldValue.lt(entityFieldValue$1, parsedFieldValue)
72
+ );
73
+ if (!matches) {
74
+ return ;
75
+ }
76
+ var jsonEntity = S$RescriptSchema.reverseConvertToJsonOrThrow(entity, entityConfig.schema);
77
+ results.push(jsonEntity);
78
+ }));
79
+ return results;
80
+ }
81
+
82
+ function handleWriteBatch(state, updatedEntities, checkpointIds, checkpointChainIds, checkpointBlockNumbers, checkpointBlockHashes, checkpointEventsProcessed) {
83
+ var changesByCheckpoint = {};
84
+ Belt_Array.forEach(updatedEntities, (function (param) {
85
+ var entityName = param.entityName;
86
+ var dict = Js_dict.get(state.entities, entityName);
87
+ var entityDict;
88
+ if (dict !== undefined) {
89
+ entityDict = dict;
90
+ } else {
91
+ var dict$1 = {};
92
+ state.entities[entityName] = dict$1;
93
+ entityDict = dict$1;
94
+ }
95
+ var entityConfig = state.entityConfigs[entityName];
96
+ Belt_Array.forEach(param.updates, (function (update) {
97
+ var processChange = function (change) {
98
+ if (change.type === "SET") {
99
+ var parsedEntity = S$RescriptSchema.parseOrThrow(change.entity, entityConfig.schema);
100
+ entityDict[change.entityId] = parsedEntity;
101
+ var checkpointKey = change.checkpointId.toString();
102
+ var changes = Js_dict.get(changesByCheckpoint, checkpointKey);
103
+ var entityChanges;
104
+ if (changes !== undefined) {
105
+ entityChanges = changes;
106
+ } else {
107
+ var changes$1 = {};
108
+ changesByCheckpoint[checkpointKey] = changes$1;
109
+ entityChanges = changes$1;
110
+ }
111
+ var change$1 = Js_dict.get(entityChanges, entityName);
112
+ var entityChange;
113
+ if (change$1 !== undefined) {
114
+ entityChange = change$1;
115
+ } else {
116
+ var change_sets = [];
117
+ var change_deleted = [];
118
+ var change$2 = {
119
+ sets: change_sets,
120
+ deleted: change_deleted
121
+ };
122
+ entityChanges[entityName] = change$2;
123
+ entityChange = change$2;
124
+ }
125
+ entityChange.sets.push(parsedEntity);
126
+ return ;
127
+ }
128
+ var entityId = change.entityId;
129
+ Js_dict.unsafeDeleteKey(entityDict, entityId);
130
+ var checkpointKey$1 = change.checkpointId.toString();
131
+ var changes$2 = Js_dict.get(changesByCheckpoint, checkpointKey$1);
132
+ var entityChanges$1;
133
+ if (changes$2 !== undefined) {
134
+ entityChanges$1 = changes$2;
135
+ } else {
136
+ var changes$3 = {};
137
+ changesByCheckpoint[checkpointKey$1] = changes$3;
138
+ entityChanges$1 = changes$3;
139
+ }
140
+ var change$3 = Js_dict.get(entityChanges$1, entityName);
141
+ var entityChange$1;
142
+ if (change$3 !== undefined) {
143
+ entityChange$1 = change$3;
144
+ } else {
145
+ var change_sets$1 = [];
146
+ var change_deleted$1 = [];
147
+ var change$4 = {
148
+ sets: change_sets$1,
149
+ deleted: change_deleted$1
150
+ };
151
+ entityChanges$1[entityName] = change$4;
152
+ entityChange$1 = change$4;
153
+ }
154
+ entityChange$1.deleted.push(entityId);
155
+ };
156
+ Belt_Array.forEach(update.history, processChange);
157
+ if (update.history.length === 0) {
158
+ return processChange(update.latestChange);
159
+ }
160
+
161
+ }));
162
+ }));
163
+ for(var i = 0 ,i_finish = checkpointIds.length; i < i_finish; ++i){
164
+ var checkpointId = checkpointIds[i];
165
+ var change = {};
166
+ change["block"] = checkpointBlockNumbers[i];
167
+ var hash = checkpointBlockHashes[i];
168
+ if (hash !== null) {
169
+ change["blockHash"] = hash;
170
+ }
171
+ change["chainId"] = checkpointChainIds[i];
172
+ change["eventsProcessed"] = checkpointEventsProcessed[i];
173
+ var checkpointKey = checkpointId.toString();
174
+ var entityChanges = Js_dict.get(changesByCheckpoint, checkpointKey);
175
+ if (entityChanges !== undefined) {
176
+ Belt_Array.forEach(Js_dict.entries(entityChanges), (function(change){
177
+ return function (param) {
178
+ var match = param[1];
179
+ var deleted = match.deleted;
180
+ var sets = match.sets;
181
+ var entityName = param[0];
182
+ if (entityName === Config.DynamicContractRegistry.name) {
183
+ var entityObj = {};
184
+ if (sets.length !== 0) {
185
+ var simplifiedSets = Belt_Array.map(sets, (function (entity) {
186
+ return {
187
+ address: entity.contract_address,
188
+ contract: entity.contract_name
189
+ };
190
+ }));
191
+ entityObj["sets"] = simplifiedSets;
192
+ }
193
+ change["addresses"] = entityObj;
194
+ return ;
195
+ }
196
+ var entityObj$1 = {};
197
+ if (sets.length !== 0) {
198
+ entityObj$1["sets"] = sets;
199
+ }
200
+ if (deleted.length !== 0) {
201
+ entityObj$1["deleted"] = deleted;
202
+ }
203
+ change[entityName] = entityObj$1;
204
+ }
205
+ }(change)));
206
+ }
207
+ state.processChanges.push(change);
208
+ }
209
+ }
210
+
211
+ function makeInitialState(config, processConfigChains, dynamicContractsByChain) {
212
+ var chainKeys = Object.keys(processConfigChains);
213
+ var chains = Belt_Array.map(chainKeys, (function (chainIdStr) {
214
+ var chainId = Belt_Option.getWithDefault(Belt_Int.fromString(chainIdStr), 0);
215
+ var chain = ChainMap.Chain.makeUnsafe(chainId);
216
+ if (!ChainMap.has(config.chainMap, chain)) {
217
+ Js_exn.raiseError("Chain " + chainIdStr + " is not configured in config.yaml");
218
+ }
219
+ var processChainConfig = processConfigChains[chainIdStr];
220
+ var dynamicContracts = Belt_Option.getWithDefault(Js_dict.get(dynamicContractsByChain, chainIdStr), []);
221
+ return {
222
+ id: chainId,
223
+ startBlock: processChainConfig.startBlock,
224
+ endBlock: processChainConfig.endBlock,
225
+ maxReorgDepth: 0,
226
+ progressBlockNumber: -1,
227
+ numEventsProcessed: 0,
228
+ firstEventBlockNumber: undefined,
229
+ timestampCaughtUpToHeadOrEndblock: undefined,
230
+ dynamicContracts: dynamicContracts,
231
+ sourceBlockNumber: processChainConfig.endBlock
232
+ };
233
+ }));
234
+ return {
235
+ cleanRun: true,
236
+ cache: {},
237
+ chains: chains,
238
+ checkpointId: InternalTable.Checkpoints.initialCheckpointId,
239
+ reorgCheckpoints: []
240
+ };
241
+ }
242
+
243
+ function validateBlockRange(chainId, configChain, processChainConfig, progressBlock) {
244
+ if (processChainConfig.startBlock < configChain.startBlock) {
245
+ Js_exn.raiseError("Invalid block range for chain " + chainId + ": startBlock (" + String(processChainConfig.startBlock) + ") is less than config.startBlock (" + String(configChain.startBlock) + "). " + ("Either use startBlock >= " + String(configChain.startBlock) + " or create a new test indexer with createTestIndexer()."));
246
+ }
247
+ var configEndBlock = configChain.endBlock;
248
+ if (configEndBlock !== undefined && processChainConfig.endBlock > configEndBlock) {
249
+ Js_exn.raiseError("Invalid block range for chain " + chainId + ": endBlock (" + String(processChainConfig.endBlock) + ") exceeds config.endBlock (" + String(configEndBlock) + "). " + ("Either use endBlock <= " + String(configEndBlock) + " or create a new test indexer with createTestIndexer()."));
250
+ }
251
+ if (progressBlock !== undefined && processChainConfig.startBlock <= progressBlock) {
252
+ return Js_exn.raiseError("Invalid block range for chain " + chainId + ": startBlock (" + String(processChainConfig.startBlock) + ") must be greater than previously processed endBlock (" + String(progressBlock) + "). " + ("Either use startBlock > " + String(progressBlock) + " or create a new test indexer with createTestIndexer()."));
253
+ }
254
+
255
+ }
256
+
257
+ function makeEntityGet(state, entityConfig) {
258
+ return function (entityId) {
259
+ if (state.processInProgress) {
260
+ Js_exn.raiseError("Cannot call " + entityConfig.name + ".get() while indexer.process() is running. Wait for process() to complete before accessing entities directly.");
261
+ }
262
+ var entityDict = Belt_Option.getWithDefault(Js_dict.get(state.entities, entityConfig.name), {});
263
+ return Promise.resolve(Js_dict.get(entityDict, entityId));
264
+ };
265
+ }
266
+
267
+ function makeEntitySet(state, entityConfig) {
268
+ return function (entity) {
269
+ if (state.processInProgress) {
270
+ Js_exn.raiseError("Cannot call " + entityConfig.name + ".set() while indexer.process() is running. Wait for process() to complete before modifying entities directly.");
271
+ }
272
+ var dict = Js_dict.get(state.entities, entityConfig.name);
273
+ var entityDict;
274
+ if (dict !== undefined) {
275
+ entityDict = dict;
276
+ } else {
277
+ var dict$1 = {};
278
+ state.entities[entityConfig.name] = dict$1;
279
+ entityDict = dict$1;
280
+ }
281
+ entityDict[entity.id] = entity;
282
+ };
283
+ }
284
+
285
+ function makeCreateTestIndexer(config, workerPath, allEntities) {
286
+ return function () {
287
+ var entities = {};
288
+ var entityConfigs = {};
289
+ Belt_Array.forEach(allEntities, (function (entityConfig) {
290
+ entities[entityConfig.name] = {};
291
+ entityConfigs[entityConfig.name] = entityConfig;
292
+ }));
293
+ var state = {
294
+ processInProgress: false,
295
+ progressBlockByChain: {},
296
+ entities: entities,
297
+ entityConfigs: entityConfigs,
298
+ processChanges: []
299
+ };
300
+ var entityOpsDict = {};
301
+ Belt_Array.forEach(allEntities, (function (entityConfig) {
302
+ if (entityConfig.name !== Config.DynamicContractRegistry.name) {
303
+ entityOpsDict[entityConfig.name] = {
304
+ get: makeEntityGet(state, entityConfig),
305
+ set: makeEntitySet(state, entityConfig)
306
+ };
307
+ return ;
308
+ }
309
+
310
+ }));
311
+ var chainIds = [];
312
+ var chains = Object.create(null);
313
+ Belt_Array.forEach(ChainMap.values(config.chainMap), (function (chainConfig) {
314
+ var chainIdStr = String(chainConfig.id);
315
+ chainIds.push(chainConfig.id);
316
+ var chainObj = Object.create(null);
317
+ Object.defineProperty(Object.defineProperty(Object.defineProperty(Object.defineProperty(Object.defineProperty(chainObj, "id", {
318
+ enumerable: true,
319
+ value: chainConfig.id
320
+ }), "startBlock", {
321
+ enumerable: true,
322
+ value: chainConfig.startBlock
323
+ }), "endBlock", {
324
+ enumerable: true,
325
+ value: chainConfig.endBlock
326
+ }), "name", {
327
+ enumerable: true,
328
+ value: chainConfig.name
329
+ }), "isLive", {
330
+ enumerable: true,
331
+ value: false
332
+ });
333
+ Belt_Array.forEach(chainConfig.contracts, (function (contract) {
334
+ var contractObj = Object.create(null);
335
+ Object.defineProperty(Object.defineProperty(Object.defineProperty(contractObj, "name", {
336
+ enumerable: true,
337
+ value: contract.name
338
+ }), "abi", {
339
+ enumerable: true,
340
+ value: contract.abi
341
+ }), "addresses", {
342
+ enumerable: true,
343
+ get: (function () {
344
+ if (state.processInProgress) {
345
+ Js_exn.raiseError("Cannot access " + contract.name + ".addresses while indexer.process() is running. Wait for process() to complete before reading contract addresses.");
346
+ }
347
+ var addresses = contract.addresses.slice(0);
348
+ var dcDict = Js_dict.get(state.entities, Config.DynamicContractRegistry.name);
349
+ if (dcDict !== undefined) {
350
+ Belt_Array.forEach(Js_dict.values(dcDict), (function (entity) {
351
+ if (entity.contract_name === contract.name && entity.chain_id === chainConfig.id) {
352
+ addresses.push(entity.contract_address);
353
+ return ;
354
+ }
355
+
356
+ }));
357
+ }
358
+ return addresses;
359
+ })
360
+ });
361
+ Object.defineProperty(chainObj, contract.name, {
362
+ enumerable: true,
363
+ value: contractObj
364
+ });
365
+ }));
366
+ Object.defineProperty(chains, chainIdStr, {
367
+ enumerable: true,
368
+ value: chainObj
369
+ });
370
+ if (chainConfig.name !== chainIdStr) {
371
+ Object.defineProperty(chains, chainConfig.name, {
372
+ enumerable: false,
373
+ value: chainObj
374
+ });
375
+ return ;
376
+ }
377
+
378
+ }));
379
+ var result = {};
380
+ result["chainIds"] = chainIds;
381
+ result["chains"] = chains;
382
+ Belt_Array.forEach(Js_dict.entries(entityOpsDict), (function (param) {
383
+ result[param[0]] = param[1];
384
+ }));
385
+ result["process"] = (function (processConfig) {
386
+ if (state.processInProgress) {
387
+ Js_exn.raiseError("createTestIndexer process is already running. Only one process call is allowed at a time");
388
+ }
389
+ var chains = processConfig.chains;
390
+ var chainKeys = Object.keys(chains);
391
+ var n = chainKeys.length;
392
+ if (n !== 0) {
393
+ if (n !== 1) {
394
+ Js_exn.raiseError("createTestIndexer does not support processing multiple chains at once. Found " + String(n) + " chains defined");
395
+ }
396
+
397
+ } else {
398
+ Js_exn.raiseError("createTestIndexer requires exactly one chain to be defined");
399
+ }
400
+ Belt_Array.forEach(chainKeys, (function (chainIdStr) {
401
+ var chainId = Belt_Option.getWithDefault(Belt_Int.fromString(chainIdStr), 0);
402
+ var chain = ChainMap.Chain.makeUnsafe(chainId);
403
+ var configChain = ChainMap.get(config.chainMap, chain);
404
+ var processChainConfig = chains[chainIdStr];
405
+ var progressBlock = Js_dict.get(state.progressBlockByChain, chainIdStr);
406
+ validateBlockRange(chainIdStr, configChain, processChainConfig, progressBlock);
407
+ }));
408
+ state.processChanges = [];
409
+ var dynamicContractsByChain = {};
410
+ var dcDict = Js_dict.get(state.entities, Config.DynamicContractRegistry.name);
411
+ if (dcDict !== undefined) {
412
+ Belt_Array.forEach(Js_dict.values(dcDict), (function (entity) {
413
+ var chainIdStr = String(entity.chain_id);
414
+ var arr = Js_dict.get(dynamicContractsByChain, chainIdStr);
415
+ var contracts;
416
+ if (arr !== undefined) {
417
+ contracts = arr;
418
+ } else {
419
+ var arr$1 = [];
420
+ dynamicContractsByChain[chainIdStr] = arr$1;
421
+ contracts = arr$1;
422
+ }
423
+ contracts.push(toIndexingContract(entity));
424
+ }));
425
+ }
426
+ var initialState = makeInitialState(config, chains, dynamicContractsByChain);
427
+ return new Promise((function (resolve, reject) {
428
+ var workerDataObj = {
429
+ processConfig: processConfig,
430
+ initialState: initialState
431
+ };
432
+ var worker;
433
+ try {
434
+ worker = new Worker_threads.Worker(workerPath, {
435
+ workerData: workerDataObj
436
+ });
437
+ }
438
+ catch (raw_exn){
439
+ var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
440
+ reject(exn);
441
+ throw exn;
442
+ }
443
+ state.processInProgress = true;
444
+ worker.on("message", (function (msg) {
445
+ var respond = function (data) {
446
+ worker.postMessage({
447
+ id: msg.id,
448
+ payload: {
449
+ type: "response",
450
+ data: data
451
+ }
452
+ });
453
+ };
454
+ var match = msg.payload;
455
+ switch (match.type) {
456
+ case "loadByIds" :
457
+ return respond(handleLoadByIds(state, match.tableName, match.ids));
458
+ case "loadByField" :
459
+ return respond(handleLoadByField(state, match.tableName, match.fieldName, match.fieldValue, match.operator));
460
+ case "writeBatch" :
461
+ handleWriteBatch(state, match.updatedEntities, match.checkpointIds, match.checkpointChainIds, match.checkpointBlockNumbers, match.checkpointBlockHashes, match.checkpointEventsProcessed);
462
+ return respond(null);
463
+
464
+ }
465
+ }));
466
+ worker.on("error", (function (err) {
467
+ state.processInProgress = false;
468
+ worker.terminate();
469
+ reject(err);
470
+ }));
471
+ worker.on("exit", (function (code) {
472
+ state.processInProgress = false;
473
+ if (code !== 0) {
474
+ return reject(new Error("Worker exited with code " + String(code)));
475
+ } else {
476
+ Belt_Array.forEach(chainKeys, (function (chainIdStr) {
477
+ var processChainConfig = chains[chainIdStr];
478
+ state.progressBlockByChain[chainIdStr] = processChainConfig.endBlock;
479
+ }));
480
+ return resolve({
481
+ changes: state.processChanges
482
+ });
483
+ }
484
+ }));
485
+ }));
486
+ });
487
+ return result;
488
+ };
489
+ }
490
+
491
+ function initTestWorker(makeGeneratedConfig) {
492
+ if (Worker_threads.isMainThread) {
493
+ Js_exn.raiseError("initTestWorker must be called from a worker thread");
494
+ }
495
+ var port = Worker_threads.parentPort;
496
+ var parentPort = (port == null) ? Js_exn.raiseError("initTestWorker: No parent port available") : port;
497
+ var workerData = Worker_threads.workerData;
498
+ if (workerData == null) {
499
+ Logging.error("TestIndexerWorker: No worker data provided");
500
+ Process.exit(1);
501
+ return ;
502
+ }
503
+ var proxy = TestIndexerProxyStorage.make(parentPort, workerData.initialState);
504
+ var storage = TestIndexerProxyStorage.makeStorage(proxy);
505
+ var config = makeGeneratedConfig();
506
+ var persistence = Persistence.make(config.userEntities, config.allEnums, storage);
507
+ if (Env.userLogLevel !== undefined) {
508
+
509
+ } else {
510
+ Logging.setLogLevel("silent");
511
+ }
512
+ Main.start(makeGeneratedConfig, persistence, true);
513
+ }
514
+
515
+ export {
516
+ toIndexingContract ,
517
+ handleLoadByIds ,
518
+ handleLoadByField ,
519
+ handleWriteBatch ,
520
+ makeInitialState ,
521
+ validateBlockRange ,
522
+ makeEntityGet ,
523
+ makeEntitySet ,
524
+ makeCreateTestIndexer ,
525
+ initTestWorker ,
526
+ }
527
+ /* Env Not a pure module */