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.
- package/README.md +164 -30
- package/bin.mjs +49 -0
- package/evm.schema.json +79 -169
- package/fuel.schema.json +50 -21
- package/index.d.ts +497 -1
- package/index.js +4 -0
- package/package.json +42 -31
- package/rescript.json +4 -1
- package/src/Batch.res +11 -8
- package/src/Batch.res.mjs +11 -9
- package/src/ChainFetcher.res +531 -0
- package/src/ChainFetcher.res.mjs +339 -0
- package/src/ChainManager.res +190 -0
- package/src/ChainManager.res.mjs +166 -0
- package/src/Change.res +3 -3
- package/src/Config.gen.ts +19 -0
- package/src/Config.res +737 -22
- package/src/Config.res.mjs +703 -26
- package/src/{Indexer.res → Ctx.res} +1 -1
- package/src/Ecosystem.res +9 -124
- package/src/Ecosystem.res.mjs +19 -160
- package/src/Env.res +30 -74
- package/src/Env.res.mjs +25 -87
- package/src/Envio.gen.ts +3 -1
- package/src/Envio.res +20 -9
- package/src/EventProcessing.res +469 -0
- package/src/EventProcessing.res.mjs +337 -0
- package/src/EvmTypes.gen.ts +6 -0
- package/src/EvmTypes.res +1 -0
- package/src/FetchState.res +1256 -639
- package/src/FetchState.res.mjs +1135 -612
- package/src/GlobalState.res +1190 -0
- package/src/GlobalState.res.mjs +1183 -0
- package/src/GlobalStateManager.res +68 -0
- package/src/GlobalStateManager.res.mjs +75 -0
- package/src/GlobalStateManager.resi +7 -0
- package/src/HandlerLoader.res +89 -0
- package/src/HandlerLoader.res.mjs +79 -0
- package/src/HandlerRegister.res +357 -0
- package/src/HandlerRegister.res.mjs +299 -0
- package/src/{EventRegister.resi → HandlerRegister.resi} +13 -13
- package/src/Hasura.res +111 -175
- package/src/Hasura.res.mjs +88 -150
- package/src/InMemoryStore.res +1 -1
- package/src/InMemoryStore.res.mjs +3 -3
- package/src/InMemoryTable.res +1 -1
- package/src/InMemoryTable.res.mjs +1 -1
- package/src/Internal.gen.ts +4 -0
- package/src/Internal.res +230 -12
- package/src/Internal.res.mjs +115 -1
- package/src/LoadLayer.res +444 -0
- package/src/LoadLayer.res.mjs +296 -0
- package/src/LoadLayer.resi +32 -0
- package/src/LogSelection.res +33 -27
- package/src/LogSelection.res.mjs +6 -0
- package/src/Logging.res +21 -7
- package/src/Logging.res.mjs +16 -8
- package/src/Main.res +377 -0
- package/src/Main.res.mjs +339 -0
- package/src/Persistence.res +7 -21
- package/src/Persistence.res.mjs +3 -3
- package/src/PgStorage.gen.ts +10 -0
- package/src/PgStorage.res +116 -69
- package/src/PgStorage.res.d.mts +5 -0
- package/src/PgStorage.res.mjs +93 -50
- package/src/Prometheus.res +294 -224
- package/src/Prometheus.res.mjs +353 -340
- package/src/ReorgDetection.res +6 -10
- package/src/ReorgDetection.res.mjs +6 -6
- package/src/SafeCheckpointTracking.res +4 -4
- package/src/SafeCheckpointTracking.res.mjs +2 -2
- package/src/Sink.res +4 -2
- package/src/Sink.res.mjs +2 -1
- package/src/TableIndices.res +0 -1
- package/src/TestIndexer.res +692 -0
- package/src/TestIndexer.res.mjs +527 -0
- package/src/TestIndexerProxyStorage.res +205 -0
- package/src/TestIndexerProxyStorage.res.mjs +151 -0
- package/src/TopicFilter.res +1 -1
- package/src/Types.ts +1 -1
- package/src/UserContext.res +424 -0
- package/src/UserContext.res.mjs +279 -0
- package/src/Utils.res +97 -26
- package/src/Utils.res.mjs +91 -44
- package/src/bindings/BigInt.res +10 -0
- package/src/bindings/BigInt.res.mjs +15 -0
- package/src/bindings/ClickHouse.res +120 -23
- package/src/bindings/ClickHouse.res.mjs +118 -28
- package/src/bindings/DateFns.res +74 -0
- package/src/bindings/DateFns.res.mjs +22 -0
- package/src/bindings/EventSource.res +8 -1
- package/src/bindings/EventSource.res.mjs +8 -1
- package/src/bindings/Express.res +1 -0
- package/src/bindings/Hrtime.res +14 -1
- package/src/bindings/Hrtime.res.mjs +22 -2
- package/src/bindings/Hrtime.resi +4 -0
- package/src/bindings/Lodash.res +0 -1
- package/src/bindings/NodeJs.res +49 -3
- package/src/bindings/NodeJs.res.mjs +11 -3
- package/src/bindings/Pino.res +24 -10
- package/src/bindings/Pino.res.mjs +14 -8
- package/src/bindings/Postgres.gen.ts +8 -0
- package/src/bindings/Postgres.res +5 -1
- package/src/bindings/Postgres.res.d.mts +5 -0
- package/src/bindings/PromClient.res +0 -10
- package/src/bindings/PromClient.res.mjs +0 -3
- package/src/bindings/Vitest.res +142 -0
- package/src/bindings/Vitest.res.mjs +9 -0
- package/src/bindings/WebSocket.res +27 -0
- package/src/bindings/WebSocket.res.mjs +2 -0
- package/src/bindings/Yargs.res +8 -0
- package/src/bindings/Yargs.res.mjs +2 -0
- package/src/db/EntityHistory.res +7 -7
- package/src/db/EntityHistory.res.mjs +9 -9
- package/src/db/InternalTable.res +59 -111
- package/src/db/InternalTable.res.mjs +73 -104
- package/src/db/Table.res +27 -8
- package/src/db/Table.res.mjs +25 -14
- package/src/sources/Evm.res +84 -0
- package/src/sources/Evm.res.mjs +105 -0
- package/src/sources/EvmChain.res +94 -0
- package/src/sources/EvmChain.res.mjs +60 -0
- package/src/sources/Fuel.res +19 -34
- package/src/sources/Fuel.res.mjs +34 -16
- package/src/sources/FuelSDK.res +38 -0
- package/src/sources/FuelSDK.res.mjs +29 -0
- package/src/sources/HyperFuel.res +2 -2
- package/src/sources/HyperFuel.resi +1 -1
- package/src/sources/HyperFuelClient.res +2 -2
- package/src/sources/HyperFuelSource.res +33 -13
- package/src/sources/HyperFuelSource.res.mjs +24 -16
- package/src/sources/HyperSync.res +36 -6
- package/src/sources/HyperSync.res.mjs +9 -7
- package/src/sources/HyperSync.resi +4 -0
- package/src/sources/HyperSyncClient.res +1 -1
- package/src/sources/HyperSyncHeightStream.res +47 -116
- package/src/sources/HyperSyncHeightStream.res.mjs +46 -73
- package/src/sources/HyperSyncSource.res +118 -139
- package/src/sources/HyperSyncSource.res.mjs +104 -121
- package/src/sources/Rpc.res +86 -14
- package/src/sources/Rpc.res.mjs +101 -9
- package/src/sources/RpcSource.res +621 -364
- package/src/sources/RpcSource.res.mjs +843 -410
- package/src/sources/RpcWebSocketHeightStream.res +181 -0
- package/src/sources/RpcWebSocketHeightStream.res.mjs +196 -0
- package/src/sources/Source.res +7 -5
- package/src/sources/SourceManager.res +325 -225
- package/src/sources/SourceManager.res.mjs +314 -171
- package/src/sources/SourceManager.resi +17 -6
- package/src/sources/Svm.res +81 -0
- package/src/sources/Svm.res.mjs +90 -0
- package/src/tui/Tui.res +247 -0
- package/src/tui/Tui.res.mjs +337 -0
- package/src/tui/bindings/Ink.res +371 -0
- package/src/tui/bindings/Ink.res.mjs +72 -0
- package/src/tui/bindings/Style.res +123 -0
- package/src/tui/bindings/Style.res.mjs +2 -0
- package/src/tui/components/BufferedProgressBar.res +40 -0
- package/src/tui/components/BufferedProgressBar.res.mjs +57 -0
- package/src/tui/components/CustomHooks.res +122 -0
- package/src/tui/components/CustomHooks.res.mjs +179 -0
- package/src/tui/components/Messages.res +41 -0
- package/src/tui/components/Messages.res.mjs +75 -0
- package/src/tui/components/SyncETA.res +174 -0
- package/src/tui/components/SyncETA.res.mjs +263 -0
- package/src/tui/components/TuiData.res +47 -0
- package/src/tui/components/TuiData.res.mjs +34 -0
- package/svm.schema.json +112 -0
- package/bin.js +0 -48
- package/src/EventRegister.res +0 -241
- package/src/EventRegister.res.mjs +0 -240
- package/src/bindings/Ethers.gen.ts +0 -14
- package/src/bindings/Ethers.res +0 -204
- package/src/bindings/Ethers.res.mjs +0 -130
- /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 */
|