envio 3.12.0 → 3.13.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -6
- package/src/BatchProcessing.res +9 -9
- package/src/BatchProcessing.res.mjs +5 -5
- package/src/Bin.res +24 -17
- package/src/Bin.res.mjs +5 -0
- package/src/ChainFetching.res +31 -13
- package/src/ChainFetching.res.mjs +9 -4
- package/src/ChainState.res +55 -3
- package/src/ChainState.res.mjs +46 -3
- package/src/ChainState.resi +3 -1
- package/src/Config.res +35 -0
- package/src/Config.res.mjs +39 -0
- package/src/Core.res +4 -0
- package/src/Core.res.mjs +4 -0
- package/src/CrossChainState.res +61 -4
- package/src/CrossChainState.res.mjs +39 -5
- package/src/CrossChainState.resi +10 -1
- package/src/Env.res +4 -0
- package/src/FetchState.res +51 -46
- package/src/FetchState.res.mjs +54 -36
- package/src/InMemoryTable.res +155 -67
- package/src/InMemoryTable.res.mjs +151 -60
- package/src/IndexerLoop.res +2 -0
- package/src/IndexerLoop.res.mjs +1 -0
- package/src/IndexerState.res +41 -1
- package/src/IndexerState.res.mjs +43 -4
- package/src/IndexerState.resi +10 -0
- package/src/LoadLayer.res +57 -34
- package/src/LoadLayer.res.mjs +45 -62
- package/src/LoadLayer.resi +1 -1
- package/src/Logging.res +38 -6
- package/src/Logging.res.mjs +32 -5
- package/src/Main.res +131 -268
- package/src/Main.res.mjs +28 -152
- package/src/Metrics.res +263 -102
- package/src/Metrics.res.mjs +227 -48
- package/src/Persistence.res +27 -2
- package/src/Persistence.res.mjs +9 -2
- package/src/PgStorage.res +109 -71
- package/src/PgStorage.res.mjs +88 -58
- package/src/Server.res +181 -0
- package/src/Server.res.mjs +143 -0
- package/src/Supervisor.res +415 -0
- package/src/Supervisor.res.mjs +325 -0
- package/src/TestIndexer.res +9 -25
- package/src/TestIndexer.res.mjs +5 -4
- package/src/UserContext.res +13 -32
- package/src/UserContext.res.mjs +1 -7
- package/src/Utils.res +1 -4
- package/src/Utils.res.mjs +7 -16
- package/src/Worker.res +95 -0
- package/src/Worker.res.mjs +80 -0
- package/src/bindings/NodeJs.res +41 -0
- package/src/db/EntityFilter.res +487 -275
- package/src/db/EntityFilter.res.mjs +557 -309
- package/src/db/InternalTable.res +8 -1
- package/src/db/InternalTable.res.mjs +5 -1
- package/src/db/Table.res +21 -6
- package/src/db/Table.res.mjs +13 -4
- package/src/sources/BlockStore.res +7 -2
- package/src/sources/EvmHyperSyncSource.res +2 -0
- package/src/sources/EvmHyperSyncSource.res.mjs +2 -2
- package/src/sources/FuelHyperSyncSource.res +1 -0
- package/src/sources/FuelHyperSyncSource.res.mjs +1 -1
- package/src/sources/HyperSync.res +4 -0
- package/src/sources/HyperSync.res.mjs +4 -2
- package/src/sources/HyperSync.resi +1 -0
- package/src/sources/HyperSyncClient.res +3 -0
- package/src/sources/HyperSyncSSE.res +1 -1
- package/src/sources/HyperSyncSSE.res.mjs +4 -10
- package/src/sources/RpcSource.res +1 -0
- package/src/sources/RpcSource.res.mjs +1 -1
- package/src/sources/SimulateSource.res +1 -0
- package/src/sources/SimulateSource.res.mjs +1 -1
- package/src/sources/Source.res +7 -0
- package/src/sources/SourceManager.res +4 -3
- package/src/sources/SourceManager.res.mjs +2 -2
- package/src/sources/SvmHyperSyncClient.res +5 -0
- package/src/sources/SvmHyperSyncSource.res +3 -0
- package/src/sources/SvmHyperSyncSource.res.mjs +4 -2
- package/src/tui/Tui.res +24 -0
- package/src/tui/Tui.res.mjs +18 -0
- package/src/tui/components/SyncETA.res +12 -6
- package/src/tui/components/SyncETA.res.mjs +12 -8
package/src/Main.res.mjs
CHANGED
|
@@ -1,85 +1,32 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as Env from "./Env.res.mjs";
|
|
4
3
|
import * as Tui from "./tui/Tui.res.mjs";
|
|
5
|
-
import * as Envio from "./Envio.res.mjs";
|
|
6
4
|
import * as Utils from "./Utils.res.mjs";
|
|
7
5
|
import * as Config from "./Config.res.mjs";
|
|
6
|
+
import * as Server from "./Server.res.mjs";
|
|
7
|
+
import * as Worker from "./Worker.res.mjs";
|
|
8
8
|
import * as ChainId from "./ChainId.res.mjs";
|
|
9
9
|
import * as Logging from "./Logging.res.mjs";
|
|
10
10
|
import * as Metrics from "./Metrics.res.mjs";
|
|
11
|
-
import Express from "express";
|
|
12
|
-
import * as Process from "process";
|
|
13
11
|
import * as ChainMap from "./ChainMap.res.mjs";
|
|
14
12
|
import * as PgStorage from "./PgStorage.res.mjs";
|
|
15
13
|
import * as ChainState from "./ChainState.res.mjs";
|
|
14
|
+
import * as Supervisor from "./Supervisor.res.mjs";
|
|
16
15
|
import * as AddressRows from "./AddressRows.res.mjs";
|
|
17
16
|
import * as EnvioGlobal from "./EnvioGlobal.res.mjs";
|
|
18
17
|
import * as IndexerLoop from "./IndexerLoop.res.mjs";
|
|
19
18
|
import * as Persistence from "./Persistence.res.mjs";
|
|
20
|
-
import Yargs from "yargs/yargs";
|
|
21
19
|
import * as IndexerState from "./IndexerState.res.mjs";
|
|
22
20
|
import * as ErrorHandling from "./ErrorHandling.res.mjs";
|
|
23
21
|
import * as HandlerLoader from "./HandlerLoader.res.mjs";
|
|
24
22
|
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
25
|
-
import * as Helpers from "yargs/helpers";
|
|
26
23
|
import * as RollbackCommit from "./RollbackCommit.res.mjs";
|
|
27
24
|
import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
|
|
28
25
|
import * as ContractMapping from "./ContractMapping.res.mjs";
|
|
29
26
|
import * as HandlerRegister from "./HandlerRegister.res.mjs";
|
|
30
27
|
import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
|
|
31
|
-
import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
|
|
32
28
|
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
|
|
33
29
|
|
|
34
|
-
function toChainData(m) {
|
|
35
|
-
return {
|
|
36
|
-
chainId: m.chainId,
|
|
37
|
-
poweredByHyperSync: m.poweredByHyperSync,
|
|
38
|
-
firstEventBlockNumber: m.firstEventBlockNumber,
|
|
39
|
-
latestProcessedBlock: m.latestProcessedBlock,
|
|
40
|
-
timestampCaughtUpToHeadOrEndblock: m.timestampCaughtUpToHeadOrEndblock,
|
|
41
|
-
numEventsProcessed: m.numEventsProcessed,
|
|
42
|
-
latestFetchedBlockNumber: m.latestFetchedBlockNumber,
|
|
43
|
-
currentBlockHeight: m.knownHeight,
|
|
44
|
-
numBatchesFetched: m.numBatchesFetched,
|
|
45
|
-
startBlock: m.startBlock,
|
|
46
|
-
endBlock: m.endBlock,
|
|
47
|
-
numAddresses: m.numAddresses
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
let chainDataSchema = S$RescriptSchema.schema(s => ({
|
|
52
|
-
chainId: s.m(ChainId.schema),
|
|
53
|
-
poweredByHyperSync: s.m(S$RescriptSchema.bool),
|
|
54
|
-
firstEventBlockNumber: s.m(S$RescriptSchema.option(S$RescriptSchema.int)),
|
|
55
|
-
latestProcessedBlock: s.m(S$RescriptSchema.option(S$RescriptSchema.int)),
|
|
56
|
-
timestampCaughtUpToHeadOrEndblock: s.m(S$RescriptSchema.option(S$RescriptSchema.datetime(S$RescriptSchema.string, undefined))),
|
|
57
|
-
numEventsProcessed: s.m(S$RescriptSchema.float),
|
|
58
|
-
latestFetchedBlockNumber: s.m(S$RescriptSchema.int),
|
|
59
|
-
currentBlockHeight: s.m(S$RescriptSchema.int),
|
|
60
|
-
numBatchesFetched: s.m(S$RescriptSchema.int),
|
|
61
|
-
startBlock: s.m(S$RescriptSchema.int),
|
|
62
|
-
endBlock: s.m(S$RescriptSchema.option(S$RescriptSchema.int)),
|
|
63
|
-
numAddresses: s.m(S$RescriptSchema.int)
|
|
64
|
-
}));
|
|
65
|
-
|
|
66
|
-
let stateSchema = S$RescriptSchema.union([
|
|
67
|
-
S$RescriptSchema.literal({
|
|
68
|
-
status: "disabled"
|
|
69
|
-
}),
|
|
70
|
-
S$RescriptSchema.literal({
|
|
71
|
-
status: "initializing"
|
|
72
|
-
}),
|
|
73
|
-
S$RescriptSchema.schema(s => ({
|
|
74
|
-
status: "active",
|
|
75
|
-
envioVersion: s.m(S$RescriptSchema.string),
|
|
76
|
-
chains: s.m(S$RescriptSchema.array(chainDataSchema)),
|
|
77
|
-
indexerStartTime: s.m(S$RescriptSchema.datetime(S$RescriptSchema.string, undefined)),
|
|
78
|
-
isPreRegisteringDynamicContracts: false,
|
|
79
|
-
rollbackOnReorg: s.m(S$RescriptSchema.bool)
|
|
80
|
-
}))
|
|
81
|
-
]);
|
|
82
|
-
|
|
83
30
|
function getIndexerState() {
|
|
84
31
|
return EnvioGlobal.value.indexerState;
|
|
85
32
|
}
|
|
@@ -402,87 +349,10 @@ function getGlobalIndexer() {
|
|
|
402
349
|
return new Proxy(Object.create(null), traps);
|
|
403
350
|
}
|
|
404
351
|
|
|
405
|
-
function startServer(getMetrics, envioVersion, persistence, isDevelopmentMode) {
|
|
406
|
-
let app = Express();
|
|
407
|
-
let consoleCorsMiddleware = (req, res, next) => {
|
|
408
|
-
let origin = req.headers["origin"];
|
|
409
|
-
if (origin !== undefined && (origin === Env.prodEnvioAppUrl || origin === Env.envioAppUrl)) {
|
|
410
|
-
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
411
|
-
}
|
|
412
|
-
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
|
|
413
|
-
res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
|
|
414
|
-
if (req.method === "OPTIONS") {
|
|
415
|
-
res.sendStatus(200);
|
|
416
|
-
return;
|
|
417
|
-
} else {
|
|
418
|
-
return next();
|
|
419
|
-
}
|
|
420
|
-
};
|
|
421
|
-
app.use("/console", consoleCorsMiddleware);
|
|
422
|
-
app.use("/metrics", consoleCorsMiddleware);
|
|
423
|
-
app.use("/metrics/runtime", consoleCorsMiddleware);
|
|
424
|
-
app.get("/healthz", (_req, res) => {
|
|
425
|
-
res.sendStatus(200);
|
|
426
|
-
});
|
|
427
|
-
app.get("/console/state", (_req, res) => {
|
|
428
|
-
let state;
|
|
429
|
-
if (isDevelopmentMode) {
|
|
430
|
-
let metrics = getMetrics();
|
|
431
|
-
state = metrics !== undefined ? ({
|
|
432
|
-
status: "active",
|
|
433
|
-
envioVersion: envioVersion,
|
|
434
|
-
chains: metrics.chains.map(toChainData),
|
|
435
|
-
indexerStartTime: metrics.startTime,
|
|
436
|
-
isPreRegisteringDynamicContracts: false,
|
|
437
|
-
rollbackOnReorg: metrics.rollbackEnabled
|
|
438
|
-
}) : ({
|
|
439
|
-
status: "initializing"
|
|
440
|
-
});
|
|
441
|
-
} else {
|
|
442
|
-
state = {
|
|
443
|
-
status: "disabled"
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
res.json(S$RescriptSchema.reverseConvertToJsonOrThrow(state, stateSchema));
|
|
447
|
-
});
|
|
448
|
-
app.post("/console/syncCache", (_req, res) => {
|
|
449
|
-
if (isDevelopmentMode) {
|
|
450
|
-
Persistence.getInitializedStorageOrThrow(persistence).dumpEffectCache().then(() => {
|
|
451
|
-
res.json(true);
|
|
452
|
-
});
|
|
453
|
-
} else {
|
|
454
|
-
res.json(false);
|
|
455
|
-
}
|
|
456
|
-
});
|
|
457
|
-
Metrics.startRuntimeCollectors();
|
|
458
|
-
app.get("/metrics", (_req, res) => {
|
|
459
|
-
res.set("Content-Type", Metrics.contentType);
|
|
460
|
-
res.end(Metrics.collect(getMetrics()));
|
|
461
|
-
});
|
|
462
|
-
app.get("/metrics/runtime", (_req, res) => {
|
|
463
|
-
res.set("Content-Type", Metrics.contentType);
|
|
464
|
-
res.end(Metrics.collectRuntime());
|
|
465
|
-
});
|
|
466
|
-
let server = app.listen(Env.serverPort);
|
|
467
|
-
server.on("error", err => {
|
|
468
|
-
let code = err.code;
|
|
469
|
-
if (code === "EADDRINUSE") {
|
|
470
|
-
Logging.error(`Port ` + Env.serverPort.toString() + ` is already in use. To fix this either:` + (`\n 1. Kill the process using the port: lsof -ti :` + Env.serverPort.toString() + ` | xargs kill -9`) + `\n 2. Use a different port by setting the ENVIO_INDEXER_PORT environment variable: ENVIO_INDEXER_PORT=9899 envio start`);
|
|
471
|
-
} else {
|
|
472
|
-
Logging.errorWithExn(err, "Failed to start indexer server");
|
|
473
|
-
}
|
|
474
|
-
Process.exit(1);
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
function getEnvioInfo() {
|
|
479
|
-
return Config.stripSensitiveData(Config.getPublicConfigJson());
|
|
480
|
-
}
|
|
481
|
-
|
|
482
352
|
async function migrate(reset) {
|
|
483
353
|
let config = Config.load();
|
|
484
354
|
let persistence = PgStorage.makePersistenceFromConfig(config, undefined);
|
|
485
|
-
await Persistence.init(persistence, ChainMap.values(config.chainMap), config.contractMapping, Config.
|
|
355
|
+
await Persistence.init(persistence, ChainMap.values(config.chainMap), config.contractMapping, Config.envioInfo(), "envio local db-migrate setup", undefined, reset, config.lowercaseAddresses, undefined, "Once");
|
|
486
356
|
return await persistence.storage.close();
|
|
487
357
|
}
|
|
488
358
|
|
|
@@ -495,21 +365,16 @@ async function dropSchema() {
|
|
|
495
365
|
|
|
496
366
|
let FatalError = /* @__PURE__ */Primitive_exceptions.create("Main.FatalError");
|
|
497
367
|
|
|
498
|
-
async function
|
|
368
|
+
async function startIndexer(config, persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockOpt, patchConfig) {
|
|
499
369
|
let reset = resetOpt !== undefined ? resetOpt : false;
|
|
500
370
|
let isTest = isTestOpt !== undefined ? isTestOpt : false;
|
|
501
371
|
let exitAfterFirstEventBlock = exitAfterFirstEventBlockOpt !== undefined ? exitAfterFirstEventBlockOpt : false;
|
|
502
|
-
let
|
|
503
|
-
|
|
504
|
-
let explicitTui = off !== undefined ? !off : Env.tuiEnvVar;
|
|
505
|
-
let shouldUseTui = isTest ? false : (
|
|
506
|
-
explicitTui !== undefined ? explicitTui : !Envio.isNonInteractive()
|
|
507
|
-
);
|
|
508
|
-
let config = Config.load();
|
|
372
|
+
let shouldUseTui = Tui.shouldUse(isTest || Worker.isEnabled);
|
|
373
|
+
Stdlib_Option.forEach(Config.logContext(config), Logging.setContext);
|
|
509
374
|
let isDevelopmentMode = !isTest && config.isDev;
|
|
510
375
|
let persistence$1 = persistence !== undefined ? persistence : PgStorage.makePersistenceFromConfig(config, undefined);
|
|
511
376
|
EnvioGlobal.value.persistence = Primitive_option.some(persistence$1);
|
|
512
|
-
await Persistence.
|
|
377
|
+
await Persistence.initForRun(persistence$1, config, reset, isDevelopmentMode, config.isolated);
|
|
513
378
|
let registrationsByChainId = await HandlerLoader.registerAllHandlers(config);
|
|
514
379
|
let config$1;
|
|
515
380
|
if (isTest) {
|
|
@@ -535,22 +400,35 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
|
|
|
535
400
|
};
|
|
536
401
|
let envioVersion = Utils.EnvioPackage.value.version;
|
|
537
402
|
let getMetrics = () => Stdlib_Option.map(EnvioGlobal.value.indexerState, IndexerState.toMetrics);
|
|
538
|
-
if (!isTest) {
|
|
539
|
-
|
|
403
|
+
if (!isTest && !Worker.isEnabled) {
|
|
404
|
+
Metrics.startRuntimeCollectors();
|
|
405
|
+
Server.startServer(getMetrics, envioVersion, () => Persistence.getInitializedStorageOrThrow(persistence$1).dumpEffectCache().then(prim => {}), Metrics.collectRuntime, isDevelopmentMode);
|
|
540
406
|
}
|
|
541
|
-
let state = IndexerState.makeFromDbState(config$2, persistence$1, Persistence.getInitializedState(persistence$1), registrationsByChainId, isDevelopmentMode, shouldUseTui, exitAfterFirstEventBlock, undefined, undefined, onError, undefined);
|
|
407
|
+
let state = IndexerState.makeFromDbState(config$2, persistence$1, Persistence.getInitializedState(persistence$1), registrationsByChainId, isDevelopmentMode, shouldUseTui, exitAfterFirstEventBlock, undefined, undefined, Stdlib_Option.mapOr(Worker.config, false, worker => worker.holdRealtime), onError, undefined);
|
|
542
408
|
if (shouldUseTui) {
|
|
543
409
|
Tui.start(config$2, () => IndexerState.toMetrics(state));
|
|
544
410
|
}
|
|
411
|
+
Worker.bindRun(() => IndexerState.toMetrics(state), () => IndexerState.releaseRealtime(state));
|
|
545
412
|
EnvioGlobal.value.indexerState = Primitive_option.some(state);
|
|
546
413
|
IndexerLoop.start(state);
|
|
547
414
|
return await runUntilFatalError;
|
|
548
415
|
}
|
|
549
416
|
|
|
417
|
+
async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockOpt, patchConfig) {
|
|
418
|
+
let reset = resetOpt !== undefined ? resetOpt : false;
|
|
419
|
+
let isTest = isTestOpt !== undefined ? isTestOpt : false;
|
|
420
|
+
let exitAfterFirstEventBlock = exitAfterFirstEventBlockOpt !== undefined ? exitAfterFirstEventBlockOpt : false;
|
|
421
|
+
Stdlib_Option.forEach(Worker.config, param => Config.prime(Config.withIsolatedChains(Config.getPublicConfigJson(), param.chainIds)));
|
|
422
|
+
let config = Config.load();
|
|
423
|
+
let workers = isTest ? undefined : Supervisor.planForRun(config, undefined);
|
|
424
|
+
if (workers !== undefined) {
|
|
425
|
+
return await Supervisor.run(config, workers, reset);
|
|
426
|
+
} else {
|
|
427
|
+
return await startIndexer(config, persistence, reset, isTest, exitAfterFirstEventBlock, patchConfig);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
550
431
|
export {
|
|
551
|
-
toChainData,
|
|
552
|
-
chainDataSchema,
|
|
553
|
-
stateSchema,
|
|
554
432
|
getIndexerState,
|
|
555
433
|
setIndexerState,
|
|
556
434
|
getGlobalPersistence,
|
|
@@ -559,11 +437,9 @@ export {
|
|
|
559
437
|
getInitialChainState,
|
|
560
438
|
buildChainsObject,
|
|
561
439
|
getGlobalIndexer,
|
|
562
|
-
startServer,
|
|
563
|
-
getEnvioInfo,
|
|
564
440
|
migrate,
|
|
565
441
|
dropSchema,
|
|
566
442
|
FatalError,
|
|
567
443
|
start,
|
|
568
444
|
}
|
|
569
|
-
/*
|
|
445
|
+
/* Tui Not a pure module */
|