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.
Files changed (84) hide show
  1. package/package.json +6 -6
  2. package/src/BatchProcessing.res +9 -9
  3. package/src/BatchProcessing.res.mjs +5 -5
  4. package/src/Bin.res +24 -17
  5. package/src/Bin.res.mjs +5 -0
  6. package/src/ChainFetching.res +31 -13
  7. package/src/ChainFetching.res.mjs +9 -4
  8. package/src/ChainState.res +55 -3
  9. package/src/ChainState.res.mjs +46 -3
  10. package/src/ChainState.resi +3 -1
  11. package/src/Config.res +35 -0
  12. package/src/Config.res.mjs +39 -0
  13. package/src/Core.res +4 -0
  14. package/src/Core.res.mjs +4 -0
  15. package/src/CrossChainState.res +61 -4
  16. package/src/CrossChainState.res.mjs +39 -5
  17. package/src/CrossChainState.resi +10 -1
  18. package/src/Env.res +4 -0
  19. package/src/FetchState.res +51 -46
  20. package/src/FetchState.res.mjs +54 -36
  21. package/src/InMemoryTable.res +155 -67
  22. package/src/InMemoryTable.res.mjs +151 -60
  23. package/src/IndexerLoop.res +2 -0
  24. package/src/IndexerLoop.res.mjs +1 -0
  25. package/src/IndexerState.res +41 -1
  26. package/src/IndexerState.res.mjs +43 -4
  27. package/src/IndexerState.resi +10 -0
  28. package/src/LoadLayer.res +57 -34
  29. package/src/LoadLayer.res.mjs +45 -62
  30. package/src/LoadLayer.resi +1 -1
  31. package/src/Logging.res +38 -6
  32. package/src/Logging.res.mjs +32 -5
  33. package/src/Main.res +131 -268
  34. package/src/Main.res.mjs +28 -152
  35. package/src/Metrics.res +263 -102
  36. package/src/Metrics.res.mjs +227 -48
  37. package/src/Persistence.res +27 -2
  38. package/src/Persistence.res.mjs +9 -2
  39. package/src/PgStorage.res +109 -71
  40. package/src/PgStorage.res.mjs +88 -58
  41. package/src/Server.res +181 -0
  42. package/src/Server.res.mjs +143 -0
  43. package/src/Supervisor.res +415 -0
  44. package/src/Supervisor.res.mjs +325 -0
  45. package/src/TestIndexer.res +9 -25
  46. package/src/TestIndexer.res.mjs +5 -4
  47. package/src/UserContext.res +13 -32
  48. package/src/UserContext.res.mjs +1 -7
  49. package/src/Utils.res +1 -4
  50. package/src/Utils.res.mjs +7 -16
  51. package/src/Worker.res +95 -0
  52. package/src/Worker.res.mjs +80 -0
  53. package/src/bindings/NodeJs.res +41 -0
  54. package/src/db/EntityFilter.res +487 -275
  55. package/src/db/EntityFilter.res.mjs +557 -309
  56. package/src/db/InternalTable.res +8 -1
  57. package/src/db/InternalTable.res.mjs +5 -1
  58. package/src/db/Table.res +21 -6
  59. package/src/db/Table.res.mjs +13 -4
  60. package/src/sources/BlockStore.res +7 -2
  61. package/src/sources/EvmHyperSyncSource.res +2 -0
  62. package/src/sources/EvmHyperSyncSource.res.mjs +2 -2
  63. package/src/sources/FuelHyperSyncSource.res +1 -0
  64. package/src/sources/FuelHyperSyncSource.res.mjs +1 -1
  65. package/src/sources/HyperSync.res +4 -0
  66. package/src/sources/HyperSync.res.mjs +4 -2
  67. package/src/sources/HyperSync.resi +1 -0
  68. package/src/sources/HyperSyncClient.res +3 -0
  69. package/src/sources/HyperSyncSSE.res +1 -1
  70. package/src/sources/HyperSyncSSE.res.mjs +4 -10
  71. package/src/sources/RpcSource.res +1 -0
  72. package/src/sources/RpcSource.res.mjs +1 -1
  73. package/src/sources/SimulateSource.res +1 -0
  74. package/src/sources/SimulateSource.res.mjs +1 -1
  75. package/src/sources/Source.res +7 -0
  76. package/src/sources/SourceManager.res +4 -3
  77. package/src/sources/SourceManager.res.mjs +2 -2
  78. package/src/sources/SvmHyperSyncClient.res +5 -0
  79. package/src/sources/SvmHyperSyncSource.res +3 -0
  80. package/src/sources/SvmHyperSyncSource.res.mjs +4 -2
  81. package/src/tui/Tui.res +24 -0
  82. package/src/tui/Tui.res.mjs +18 -0
  83. package/src/tui/components/SyncETA.res +12 -6
  84. 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.stripSensitiveData(Config.getPublicConfigJson()), "envio local db-migrate setup", undefined, reset, config.lowercaseAddresses, undefined, "Once");
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 start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockOpt, patchConfig) {
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 mainArgs = Yargs(Helpers.hideBin(process.argv)).argv;
503
- let off = mainArgs["tui-off"];
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.init(persistence$1, ChainMap.values(config.chainMap), config.contractMapping, Config.stripSensitiveData(Config.getPublicConfigJson()), isDevelopmentMode ? "envio dev -r" : "envio start -r", isDevelopmentMode ? "envio dev" : "envio start", reset, config.lowercaseAddresses, config.isolated, undefined);
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
- startServer(getMetrics, envioVersion, persistence$1, isDevelopmentMode);
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
- /* chainDataSchema Not a pure module */
445
+ /* Tui Not a pure module */