envio 3.0.0-alpha.2 → 3.0.0-alpha.21
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 +578 -1
- package/index.js +4 -0
- package/package.json +47 -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 +725 -25
- package/src/Config.res.mjs +692 -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 +33 -73
- package/src/Env.res.mjs +29 -85
- package/src/Envio.gen.ts +3 -1
- package/src/Envio.res +77 -9
- package/src/Envio.res.mjs +39 -1
- package/src/EventConfigBuilder.res +408 -0
- package/src/EventConfigBuilder.res.mjs +376 -0
- 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 +1224 -0
- package/src/GlobalState.res.mjs +1291 -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/HandlerRegister.resi +30 -0
- 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 +6 -0
- package/src/Internal.res +265 -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 +390 -0
- package/src/Main.res.mjs +341 -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/SimulateItems.res +353 -0
- package/src/SimulateItems.res.mjs +335 -0
- package/src/Sink.res +4 -2
- package/src/Sink.res.mjs +2 -1
- package/src/TableIndices.res +0 -1
- package/src/TestIndexer.res +913 -0
- package/src/TestIndexer.res.mjs +698 -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 +11 -2
- 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 +144 -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 +35 -13
- package/src/sources/HyperFuelSource.res.mjs +26 -16
- package/src/sources/HyperSync.res +61 -60
- package/src/sources/HyperSync.res.mjs +53 -67
- package/src/sources/HyperSync.resi +6 -4
- package/src/sources/HyperSyncClient.res +29 -2
- package/src/sources/HyperSyncClient.res.mjs +9 -0
- package/src/sources/HyperSyncHeightStream.res +76 -118
- package/src/sources/HyperSyncHeightStream.res.mjs +68 -75
- package/src/sources/HyperSyncSource.res +122 -143
- package/src/sources/HyperSyncSource.res.mjs +106 -121
- package/src/sources/Rpc.res +86 -14
- package/src/sources/Rpc.res.mjs +101 -9
- package/src/sources/RpcSource.res +731 -364
- package/src/sources/RpcSource.res.mjs +845 -410
- package/src/sources/RpcWebSocketHeightStream.res +181 -0
- package/src/sources/RpcWebSocketHeightStream.res.mjs +196 -0
- package/src/sources/SimulateSource.res +59 -0
- package/src/sources/SimulateSource.res.mjs +50 -0
- package/src/sources/Source.res +7 -5
- package/src/sources/SourceManager.res +358 -221
- package/src/sources/SourceManager.res.mjs +346 -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/EventRegister.resi +0 -30
- 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
package/src/Main.res.mjs
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Env from "./Env.res.mjs";
|
|
4
|
+
import * as Tui from "./tui/Tui.res.mjs";
|
|
5
|
+
import * as Caml from "rescript/lib/es6/caml.js";
|
|
6
|
+
import * as Utils from "./Utils.res.mjs";
|
|
7
|
+
import * as Js_dict from "rescript/lib/es6/js_dict.js";
|
|
8
|
+
import * as Logging from "./Logging.res.mjs";
|
|
9
|
+
import Express from "express";
|
|
10
|
+
import * as Process from "process";
|
|
11
|
+
import * as ChainMap from "./ChainMap.res.mjs";
|
|
12
|
+
import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
|
|
13
|
+
import * as FetchState from "./FetchState.res.mjs";
|
|
14
|
+
import * as Prometheus from "./Prometheus.res.mjs";
|
|
15
|
+
import * as Belt_Option from "rescript/lib/es6/belt_Option.js";
|
|
16
|
+
import * as Caml_option from "rescript/lib/es6/caml_option.js";
|
|
17
|
+
import * as GlobalState from "./GlobalState.res.mjs";
|
|
18
|
+
import * as Persistence from "./Persistence.res.mjs";
|
|
19
|
+
import * as PromClient from "prom-client";
|
|
20
|
+
import Yargs from "yargs/yargs";
|
|
21
|
+
import * as ChainFetcher from "./ChainFetcher.res.mjs";
|
|
22
|
+
import * as ChainManager from "./ChainManager.res.mjs";
|
|
23
|
+
import * as HandlerLoader from "./HandlerLoader.res.mjs";
|
|
24
|
+
import * as SourceManager from "./sources/SourceManager.res.mjs";
|
|
25
|
+
import * as Helpers from "yargs/helpers";
|
|
26
|
+
import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
|
|
27
|
+
import * as GlobalStateManager from "./GlobalStateManager.res.mjs";
|
|
28
|
+
|
|
29
|
+
var chainDataSchema = S$RescriptSchema.schema(function (s) {
|
|
30
|
+
return {
|
|
31
|
+
chainId: s.m(S$RescriptSchema.$$float),
|
|
32
|
+
poweredByHyperSync: s.m(S$RescriptSchema.bool),
|
|
33
|
+
firstEventBlockNumber: s.m(S$RescriptSchema.option(S$RescriptSchema.$$int)),
|
|
34
|
+
latestProcessedBlock: s.m(S$RescriptSchema.option(S$RescriptSchema.$$int)),
|
|
35
|
+
timestampCaughtUpToHeadOrEndblock: s.m(S$RescriptSchema.option(S$RescriptSchema.datetime(S$RescriptSchema.string, undefined))),
|
|
36
|
+
numEventsProcessed: s.m(S$RescriptSchema.$$float),
|
|
37
|
+
latestFetchedBlockNumber: s.m(S$RescriptSchema.$$int),
|
|
38
|
+
currentBlockHeight: s.m(S$RescriptSchema.$$int),
|
|
39
|
+
numBatchesFetched: s.m(S$RescriptSchema.$$int),
|
|
40
|
+
startBlock: s.m(S$RescriptSchema.$$int),
|
|
41
|
+
endBlock: s.m(S$RescriptSchema.option(S$RescriptSchema.$$int)),
|
|
42
|
+
numAddresses: s.m(S$RescriptSchema.$$int)
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
var stateSchema = S$RescriptSchema.union([
|
|
47
|
+
S$RescriptSchema.literal({
|
|
48
|
+
status: "disabled"
|
|
49
|
+
}),
|
|
50
|
+
S$RescriptSchema.literal({
|
|
51
|
+
status: "initializing"
|
|
52
|
+
}),
|
|
53
|
+
S$RescriptSchema.schema(function (s) {
|
|
54
|
+
return {
|
|
55
|
+
status: "active",
|
|
56
|
+
envioVersion: s.m(S$RescriptSchema.string),
|
|
57
|
+
chains: s.m(S$RescriptSchema.array(chainDataSchema)),
|
|
58
|
+
indexerStartTime: s.m(S$RescriptSchema.datetime(S$RescriptSchema.string, undefined)),
|
|
59
|
+
isPreRegisteringDynamicContracts: false,
|
|
60
|
+
isUnorderedMultichainMode: s.m(S$RescriptSchema.bool),
|
|
61
|
+
rollbackOnReorg: s.m(S$RescriptSchema.bool)
|
|
62
|
+
};
|
|
63
|
+
})
|
|
64
|
+
]);
|
|
65
|
+
|
|
66
|
+
var globalGsManagerRef = {
|
|
67
|
+
contents: undefined
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
function getGlobalIndexer(config) {
|
|
71
|
+
var indexer = Object.create(null);
|
|
72
|
+
Object.defineProperty(Object.defineProperty(indexer, "name", {
|
|
73
|
+
enumerable: true,
|
|
74
|
+
value: config.name
|
|
75
|
+
}), "description", {
|
|
76
|
+
enumerable: true,
|
|
77
|
+
value: config.description
|
|
78
|
+
});
|
|
79
|
+
var chainIds = [];
|
|
80
|
+
var chains = Object.create(null);
|
|
81
|
+
Belt_Array.forEach(ChainMap.values(config.chainMap), (function (chainConfig) {
|
|
82
|
+
var chainIdStr = String(chainConfig.id);
|
|
83
|
+
chainIds.push(chainConfig.id);
|
|
84
|
+
var chainObj = Object.create(null);
|
|
85
|
+
Object.defineProperty(Object.defineProperty(Object.defineProperty(Object.defineProperty(Object.defineProperty(chainObj, "id", {
|
|
86
|
+
enumerable: true,
|
|
87
|
+
value: chainConfig.id
|
|
88
|
+
}), "startBlock", {
|
|
89
|
+
enumerable: true,
|
|
90
|
+
value: chainConfig.startBlock
|
|
91
|
+
}), "endBlock", {
|
|
92
|
+
enumerable: true,
|
|
93
|
+
value: chainConfig.endBlock
|
|
94
|
+
}), "name", {
|
|
95
|
+
enumerable: true,
|
|
96
|
+
value: chainConfig.name
|
|
97
|
+
}), "isLive", {
|
|
98
|
+
enumerable: true,
|
|
99
|
+
get: (function () {
|
|
100
|
+
var gsManager = globalGsManagerRef.contents;
|
|
101
|
+
if (gsManager === undefined) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
var state = GlobalStateManager.getState(Caml_option.valFromOption(gsManager));
|
|
105
|
+
var chain = ChainMap.Chain.makeUnsafe(chainConfig.id);
|
|
106
|
+
var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
|
|
107
|
+
return ChainFetcher.isReady(chainFetcher);
|
|
108
|
+
})
|
|
109
|
+
});
|
|
110
|
+
Belt_Array.forEach(chainConfig.contracts, (function (contract) {
|
|
111
|
+
var contractObj = Object.create(null);
|
|
112
|
+
Object.defineProperty(Object.defineProperty(Object.defineProperty(contractObj, "name", {
|
|
113
|
+
enumerable: true,
|
|
114
|
+
value: contract.name
|
|
115
|
+
}), "abi", {
|
|
116
|
+
enumerable: true,
|
|
117
|
+
value: contract.abi
|
|
118
|
+
}), "addresses", {
|
|
119
|
+
enumerable: true,
|
|
120
|
+
get: (function () {
|
|
121
|
+
var gsManager = globalGsManagerRef.contents;
|
|
122
|
+
if (gsManager === undefined) {
|
|
123
|
+
return contract.addresses;
|
|
124
|
+
}
|
|
125
|
+
var state = GlobalStateManager.getState(Caml_option.valFromOption(gsManager));
|
|
126
|
+
var chain = ChainMap.Chain.makeUnsafe(chainConfig.id);
|
|
127
|
+
var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
|
|
128
|
+
var indexingContracts = chainFetcher.fetchState.indexingContracts;
|
|
129
|
+
var addresses = [];
|
|
130
|
+
var values = Js_dict.values(indexingContracts);
|
|
131
|
+
for(var idx = 0 ,idx_finish = values.length; idx < idx_finish; ++idx){
|
|
132
|
+
var indexingContract = values[idx];
|
|
133
|
+
if (indexingContract.contractName === contract.name) {
|
|
134
|
+
addresses.push(indexingContract.address);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
return addresses;
|
|
139
|
+
})
|
|
140
|
+
});
|
|
141
|
+
Object.defineProperty(chainObj, contract.name, {
|
|
142
|
+
enumerable: true,
|
|
143
|
+
value: contractObj
|
|
144
|
+
});
|
|
145
|
+
}));
|
|
146
|
+
Object.defineProperty(chains, chainIdStr, {
|
|
147
|
+
enumerable: true,
|
|
148
|
+
value: chainObj
|
|
149
|
+
});
|
|
150
|
+
if (chainConfig.name !== chainIdStr) {
|
|
151
|
+
Object.defineProperty(chains, chainConfig.name, {
|
|
152
|
+
enumerable: false,
|
|
153
|
+
value: chainObj
|
|
154
|
+
});
|
|
155
|
+
return ;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
}));
|
|
159
|
+
Object.defineProperty(indexer, "chainIds", {
|
|
160
|
+
enumerable: true,
|
|
161
|
+
value: chainIds
|
|
162
|
+
});
|
|
163
|
+
Object.defineProperty(indexer, "chains", {
|
|
164
|
+
enumerable: true,
|
|
165
|
+
value: chains
|
|
166
|
+
});
|
|
167
|
+
return indexer;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function startServer(getState, ctx, isDevelopmentMode) {
|
|
171
|
+
var app = Express();
|
|
172
|
+
var consoleCorsMiddleware = function (req, res, next) {
|
|
173
|
+
var origin = Js_dict.get(req.headers, "origin");
|
|
174
|
+
if (origin !== undefined && (origin === Env.prodEnvioAppUrl || origin === Env.envioAppUrl)) {
|
|
175
|
+
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
176
|
+
}
|
|
177
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
|
|
178
|
+
res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
|
|
179
|
+
if (req.method === "OPTIONS") {
|
|
180
|
+
res.sendStatus(200);
|
|
181
|
+
return ;
|
|
182
|
+
} else {
|
|
183
|
+
return next();
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
app.use("/console", consoleCorsMiddleware);
|
|
187
|
+
app.use("/metrics", consoleCorsMiddleware);
|
|
188
|
+
app.use("/metrics/runtime", consoleCorsMiddleware);
|
|
189
|
+
app.get("/healthz", (function (_req, res) {
|
|
190
|
+
res.sendStatus(200);
|
|
191
|
+
}));
|
|
192
|
+
app.get("/console/state", (function (_req, res) {
|
|
193
|
+
var state = isDevelopmentMode ? getState() : ({
|
|
194
|
+
status: "disabled"
|
|
195
|
+
});
|
|
196
|
+
res.json(S$RescriptSchema.reverseConvertToJsonOrThrow(state, stateSchema));
|
|
197
|
+
}));
|
|
198
|
+
app.post("/console/syncCache", (function (_req, res) {
|
|
199
|
+
if (isDevelopmentMode) {
|
|
200
|
+
Persistence.getInitializedStorageOrThrow(ctx.persistence).dumpEffectCache().then(function () {
|
|
201
|
+
res.json(true);
|
|
202
|
+
});
|
|
203
|
+
} else {
|
|
204
|
+
res.json(false);
|
|
205
|
+
}
|
|
206
|
+
}));
|
|
207
|
+
var runtimeRegistry = new PromClient.Registry();
|
|
208
|
+
PromClient.collectDefaultMetrics({
|
|
209
|
+
register: runtimeRegistry
|
|
210
|
+
});
|
|
211
|
+
app.get("/metrics", (function (_req, res) {
|
|
212
|
+
res.set("Content-Type", PromClient.register.contentType);
|
|
213
|
+
PromClient.register.metrics().then(function (metrics) {
|
|
214
|
+
return res.end(metrics);
|
|
215
|
+
});
|
|
216
|
+
}));
|
|
217
|
+
app.get("/metrics/runtime", (function (_req, res) {
|
|
218
|
+
res.set("Content-Type", runtimeRegistry.contentType);
|
|
219
|
+
runtimeRegistry.metrics().then(function (metrics) {
|
|
220
|
+
return res.end(metrics);
|
|
221
|
+
});
|
|
222
|
+
}));
|
|
223
|
+
var server = app.listen(Env.serverPort);
|
|
224
|
+
server.on("error", (function (err) {
|
|
225
|
+
var code = err.code;
|
|
226
|
+
if (code === "EADDRINUSE") {
|
|
227
|
+
Logging.error("Port " + String(Env.serverPort) + " is already in use. To fix this either:" + ("\n 1. Kill the process using the port: lsof -ti :" + String(Env.serverPort) + " | xargs kill -9") + "\n 2. Use a different port by setting the ENVIO_INDEXER_PORT environment variable: ENVIO_INDEXER_PORT=9899 envio start");
|
|
228
|
+
} else {
|
|
229
|
+
Logging.errorWithExn(err, "Failed to start indexer server");
|
|
230
|
+
}
|
|
231
|
+
Process.exit(1);
|
|
232
|
+
}));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async function start(makeGeneratedConfig, persistence, isTestOpt, exitAfterFirstEventBlockOpt, patchConfig) {
|
|
236
|
+
var isTest = isTestOpt !== undefined ? isTestOpt : false;
|
|
237
|
+
var exitAfterFirstEventBlock = exitAfterFirstEventBlockOpt !== undefined ? exitAfterFirstEventBlockOpt : false;
|
|
238
|
+
var mainArgs = Yargs(Helpers.hideBin(process.argv)).argv;
|
|
239
|
+
var shouldUseTui = !isTest && !Belt_Option.getWithDefault(mainArgs["tui-off"], Env.tuiOffEnvVar);
|
|
240
|
+
var isDevelopmentMode = !isTest && Env.Db.password === "testing";
|
|
241
|
+
var configWithoutRegistrations = makeGeneratedConfig();
|
|
242
|
+
var registrations = await HandlerLoader.registerAllHandlers(configWithoutRegistrations);
|
|
243
|
+
var config = makeGeneratedConfig();
|
|
244
|
+
var config$1 = isTest ? ({
|
|
245
|
+
name: config.name,
|
|
246
|
+
description: config.description,
|
|
247
|
+
handlers: config.handlers,
|
|
248
|
+
contractHandlers: config.contractHandlers,
|
|
249
|
+
shouldRollbackOnReorg: false,
|
|
250
|
+
shouldSaveFullHistory: config.shouldSaveFullHistory,
|
|
251
|
+
multichain: config.multichain,
|
|
252
|
+
chainMap: config.chainMap,
|
|
253
|
+
defaultChain: config.defaultChain,
|
|
254
|
+
ecosystem: config.ecosystem,
|
|
255
|
+
enableRawEvents: config.enableRawEvents,
|
|
256
|
+
maxAddrInPartition: config.maxAddrInPartition,
|
|
257
|
+
batchSize: config.batchSize,
|
|
258
|
+
lowercaseAddresses: config.lowercaseAddresses,
|
|
259
|
+
addContractNameToContractNameMapping: config.addContractNameToContractNameMapping,
|
|
260
|
+
userEntitiesByName: config.userEntitiesByName,
|
|
261
|
+
userEntities: config.userEntities,
|
|
262
|
+
allEntities: config.allEntities,
|
|
263
|
+
allEnums: config.allEnums
|
|
264
|
+
}) : config;
|
|
265
|
+
var config$2 = patchConfig !== undefined ? patchConfig(config$1, registrations) : config$1;
|
|
266
|
+
var ctx = {
|
|
267
|
+
registrations: registrations,
|
|
268
|
+
config: config$2,
|
|
269
|
+
persistence: persistence
|
|
270
|
+
};
|
|
271
|
+
var envioVersion = Utils.EnvioPackage.value.version;
|
|
272
|
+
Prometheus.Info.set(envioVersion);
|
|
273
|
+
Prometheus.ProcessStartTimeSeconds.set();
|
|
274
|
+
Prometheus.RollbackEnabled.set(config$2.shouldRollbackOnReorg);
|
|
275
|
+
if (!isTest) {
|
|
276
|
+
startServer((function () {
|
|
277
|
+
var gsManager = globalGsManagerRef.contents;
|
|
278
|
+
if (gsManager === undefined) {
|
|
279
|
+
return {
|
|
280
|
+
status: "initializing"
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
var state = GlobalStateManager.getState(Caml_option.valFromOption(gsManager));
|
|
284
|
+
var chains = Belt_Array.map(ChainMap.values(state.chainManager.chainFetchers), (function (cf) {
|
|
285
|
+
var latestFetchedBlockNumber = Caml.int_max(FetchState.bufferBlockNumber(cf.fetchState), 0);
|
|
286
|
+
var knownHeight = ChainFetcher.hasProcessedToEndblock(cf) ? Belt_Option.getWithDefault(cf.fetchState.endBlock, cf.fetchState.knownHeight) : cf.fetchState.knownHeight;
|
|
287
|
+
return {
|
|
288
|
+
chainId: cf.chainConfig.id,
|
|
289
|
+
poweredByHyperSync: SourceManager.getActiveSource(cf.sourceManager).poweredByHyperSync,
|
|
290
|
+
firstEventBlockNumber: cf.fetchState.firstEventBlock,
|
|
291
|
+
latestProcessedBlock: cf.committedProgressBlockNumber === -1 ? undefined : cf.committedProgressBlockNumber,
|
|
292
|
+
timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
|
|
293
|
+
numEventsProcessed: cf.numEventsProcessed,
|
|
294
|
+
latestFetchedBlockNumber: latestFetchedBlockNumber,
|
|
295
|
+
currentBlockHeight: knownHeight,
|
|
296
|
+
numBatchesFetched: 0,
|
|
297
|
+
startBlock: cf.fetchState.startBlock,
|
|
298
|
+
endBlock: cf.fetchState.endBlock,
|
|
299
|
+
numAddresses: FetchState.numAddresses(cf.fetchState)
|
|
300
|
+
};
|
|
301
|
+
}));
|
|
302
|
+
var match = config$2.multichain;
|
|
303
|
+
var tmp;
|
|
304
|
+
tmp = match === "ordered" ? false : true;
|
|
305
|
+
return {
|
|
306
|
+
status: "active",
|
|
307
|
+
envioVersion: envioVersion,
|
|
308
|
+
chains: chains,
|
|
309
|
+
indexerStartTime: state.indexerStartTime,
|
|
310
|
+
isPreRegisteringDynamicContracts: false,
|
|
311
|
+
isUnorderedMultichainMode: tmp,
|
|
312
|
+
rollbackOnReorg: config$2.shouldRollbackOnReorg
|
|
313
|
+
};
|
|
314
|
+
}), ctx, isDevelopmentMode);
|
|
315
|
+
}
|
|
316
|
+
await Persistence.init(persistence, ChainMap.values(config$2.chainMap), undefined);
|
|
317
|
+
var chainManager = await ChainManager.makeFromDbState(Persistence.getInitializedState(persistence), config$2, registrations);
|
|
318
|
+
var globalState = GlobalState.make(ctx, chainManager, isDevelopmentMode, shouldUseTui, exitAfterFirstEventBlock);
|
|
319
|
+
var gsManager = GlobalStateManager.make(globalState, undefined);
|
|
320
|
+
if (shouldUseTui) {
|
|
321
|
+
Tui.start(function () {
|
|
322
|
+
return GlobalStateManager.getState(gsManager);
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
globalGsManagerRef.contents = Caml_option.some(gsManager);
|
|
326
|
+
GlobalStateManager.dispatchTask(gsManager, {
|
|
327
|
+
TAG: "NextQuery",
|
|
328
|
+
_0: "CheckAllChains"
|
|
329
|
+
});
|
|
330
|
+
return GlobalStateManager.dispatchTask(gsManager, "ProcessEventBatch");
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export {
|
|
334
|
+
chainDataSchema ,
|
|
335
|
+
stateSchema ,
|
|
336
|
+
globalGsManagerRef ,
|
|
337
|
+
getGlobalIndexer ,
|
|
338
|
+
startServer ,
|
|
339
|
+
start ,
|
|
340
|
+
}
|
|
341
|
+
/* chainDataSchema Not a pure module */
|
package/src/Persistence.res
CHANGED
|
@@ -19,10 +19,11 @@ type initialChainState = {
|
|
|
19
19
|
endBlock: option<int>,
|
|
20
20
|
maxReorgDepth: int,
|
|
21
21
|
progressBlockNumber: int,
|
|
22
|
-
numEventsProcessed:
|
|
22
|
+
numEventsProcessed: float,
|
|
23
23
|
firstEventBlockNumber: option<int>,
|
|
24
24
|
timestampCaughtUpToHeadOrEndblock: option<Js.Date.t>,
|
|
25
25
|
dynamicContracts: array<Internal.indexingContract>,
|
|
26
|
+
sourceBlockNumber: int,
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
type initialState = {
|
|
@@ -74,24 +75,9 @@ type storage = {
|
|
|
74
75
|
~table: Table.table,
|
|
75
76
|
~rowsSchema: S.t<array<'item>>,
|
|
76
77
|
) => promise<array<'item>>,
|
|
77
|
-
@raises("StorageError")
|
|
78
|
-
setOrThrow: 'item. (
|
|
79
|
-
~items: array<'item>,
|
|
80
|
-
~table: Table.table,
|
|
81
|
-
~itemSchema: S.t<'item>,
|
|
82
|
-
) => promise<unit>,
|
|
83
|
-
@raises("StorageError")
|
|
84
|
-
setEffectCacheOrThrow: (
|
|
85
|
-
~effect: Internal.effect,
|
|
86
|
-
~items: array<Internal.effectCacheItem>,
|
|
87
|
-
~initialize: bool,
|
|
88
|
-
) => promise<unit>,
|
|
89
78
|
// This is to download cache from the database to .envio/cache
|
|
90
79
|
dumpEffectCache: unit => promise<unit>,
|
|
91
|
-
|
|
92
|
-
executeUnsafe: string => promise<unknown>,
|
|
93
|
-
// Check if entity history has rows
|
|
94
|
-
hasEntityHistoryRows: unit => promise<bool>,
|
|
80
|
+
reset: unit => promise<unit>,
|
|
95
81
|
// Update chain metadata
|
|
96
82
|
setChainMeta: dict<InternalTable.Chains.metaFields> => promise<unknown>,
|
|
97
83
|
// Prune old checkpoints
|
|
@@ -106,7 +92,7 @@ type storage = {
|
|
|
106
92
|
getRollbackTargetCheckpoint: (
|
|
107
93
|
~reorgChainId: int,
|
|
108
94
|
~lastKnownValidBlockNumber: int,
|
|
109
|
-
) => promise<
|
|
95
|
+
) => promise<option<Internal.checkpointId>>,
|
|
110
96
|
// Get rollback progress diff
|
|
111
97
|
getRollbackProgressDiff: (
|
|
112
98
|
~rollbackTargetCheckpointId: Internal.checkpointId,
|
|
@@ -156,7 +142,8 @@ let make = (
|
|
|
156
142
|
~allEnums,
|
|
157
143
|
~storage,
|
|
158
144
|
) => {
|
|
159
|
-
let allEntities =
|
|
145
|
+
let allEntities =
|
|
146
|
+
userEntities->Js.Array2.concat([InternalTable.DynamicContractRegistry.entityConfig])
|
|
160
147
|
let allEnums =
|
|
161
148
|
allEnums->Js.Array2.concat([EntityHistory.RowAction.config->Table.fromGenericEnumConfig])
|
|
162
149
|
{
|
|
@@ -217,8 +204,7 @@ let init = {
|
|
|
217
204
|
resolveRef.contents()
|
|
218
205
|
}
|
|
219
206
|
} catch {
|
|
220
|
-
| exn =>
|
|
221
|
-
exn->ErrorHandling.mkLogAndRaise(~msg=`EE800: Failed to initialize the indexer storage.`)
|
|
207
|
+
| exn => exn->ErrorHandling.mkLogAndRaise(~msg=`Failed to initialize the indexer storage.`)
|
|
222
208
|
}
|
|
223
209
|
}
|
|
224
210
|
}
|
package/src/Persistence.res.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
3
|
import * as Utils from "./Utils.res.mjs";
|
|
4
|
+
import * as Config from "./Config.res.mjs";
|
|
4
5
|
import * as Js_exn from "rescript/lib/es6/js_exn.js";
|
|
5
6
|
import * as Logging from "./Logging.res.mjs";
|
|
6
7
|
import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
|
|
@@ -9,7 +10,6 @@ import * as EntityHistory from "./db/EntityHistory.res.mjs";
|
|
|
9
10
|
import * as ErrorHandling from "./ErrorHandling.res.mjs";
|
|
10
11
|
import * as InMemoryStore from "./InMemoryStore.res.mjs";
|
|
11
12
|
import * as InMemoryTable from "./InMemoryTable.res.mjs";
|
|
12
|
-
import * as InternalTable from "./db/InternalTable.res.mjs";
|
|
13
13
|
import * as Caml_exceptions from "rescript/lib/es6/caml_exceptions.js";
|
|
14
14
|
import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
|
|
15
15
|
import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
|
|
@@ -17,7 +17,7 @@ import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
|
|
|
17
17
|
var StorageError = /* @__PURE__ */Caml_exceptions.create("Persistence.StorageError");
|
|
18
18
|
|
|
19
19
|
function make(userEntities, allEnums, storage) {
|
|
20
|
-
var allEntities = userEntities.concat([
|
|
20
|
+
var allEntities = userEntities.concat([Config.DynamicContractRegistry.entityConfig]);
|
|
21
21
|
var allEnums$1 = allEnums.concat([EntityHistory.RowAction.config]);
|
|
22
22
|
return {
|
|
23
23
|
userEntities: userEntities,
|
|
@@ -88,7 +88,7 @@ async function init(persistence, chainConfigs, resetOpt) {
|
|
|
88
88
|
}
|
|
89
89
|
catch (raw_exn){
|
|
90
90
|
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
91
|
-
return ErrorHandling.mkLogAndRaise(undefined, "
|
|
91
|
+
return ErrorHandling.mkLogAndRaise(undefined, "Failed to initialize the indexer storage.", exn);
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/* TypeScript file generated from PgStorage.res by genType. */
|
|
2
|
+
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
/* tslint:disable */
|
|
5
|
+
|
|
6
|
+
import * as PgStorageJS from './PgStorage.res.mjs';
|
|
7
|
+
|
|
8
|
+
import type {sql as Postgres_sql} from '../src/bindings/Postgres.gen.js';
|
|
9
|
+
|
|
10
|
+
export const makeClient: () => Postgres_sql = PgStorageJS.makeClient as any;
|