envio 3.3.0 → 3.3.1

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 (54) hide show
  1. package/package.json +6 -7
  2. package/src/ChainFetching.res +4 -32
  3. package/src/ChainFetching.res.mjs +2 -12
  4. package/src/ChainState.res +73 -53
  5. package/src/ChainState.res.mjs +61 -30
  6. package/src/ChainState.resi +13 -17
  7. package/src/Config.res +5 -0
  8. package/src/Config.res.mjs +1 -0
  9. package/src/CrossChainState.res +2 -8
  10. package/src/CrossChainState.res.mjs +6 -8
  11. package/src/CrossChainState.resi +1 -0
  12. package/src/EffectState.res +183 -44
  13. package/src/EffectState.res.mjs +134 -26
  14. package/src/EffectState.resi +26 -3
  15. package/src/EventProcessing.res +14 -9
  16. package/src/EventProcessing.res.mjs +7 -7
  17. package/src/FetchState.res +18 -29
  18. package/src/FetchState.res.mjs +20 -37
  19. package/src/IndexerState.res +280 -31
  20. package/src/IndexerState.res.mjs +234 -25
  21. package/src/IndexerState.resi +22 -0
  22. package/src/LoadLayer.res +19 -65
  23. package/src/LoadLayer.res.mjs +13 -55
  24. package/src/Main.res +42 -23
  25. package/src/Main.res.mjs +32 -35
  26. package/src/Metrics.res +943 -66
  27. package/src/Metrics.res.mjs +367 -50
  28. package/src/Persistence.res +3 -0
  29. package/src/PgStorage.res +3 -8
  30. package/src/PgStorage.res.mjs +3 -4
  31. package/src/PruneStaleHistory.res +1 -1
  32. package/src/PruneStaleHistory.res.mjs +1 -2
  33. package/src/Rollback.res +4 -5
  34. package/src/Rollback.res.mjs +2 -3
  35. package/src/SimulateItems.res.mjs +3 -21
  36. package/src/TestIndexer.res.mjs +4 -23
  37. package/src/TestIndexerProxyStorage.res +1 -0
  38. package/src/TestIndexerProxyStorage.res.mjs +1 -1
  39. package/src/Writing.res +3 -5
  40. package/src/Writing.res.mjs +3 -6
  41. package/src/bindings/ClickHouse.res +101 -17
  42. package/src/bindings/ClickHouse.res.mjs +58 -19
  43. package/src/bindings/NodeJs.res +64 -0
  44. package/src/bindings/NodeJs.res.mjs +6 -0
  45. package/src/sources/HyperSyncClient.res +5 -11
  46. package/src/sources/SourceManager.res +72 -27
  47. package/src/sources/SourceManager.res.mjs +81 -11
  48. package/src/sources/SourceManager.resi +14 -0
  49. package/src/tui/Tui.res +1 -1
  50. package/src/tui/Tui.res.mjs +2 -2
  51. package/src/Prometheus.res +0 -789
  52. package/src/Prometheus.res.mjs +0 -847
  53. package/src/bindings/PromClient.res +0 -72
  54. package/src/bindings/PromClient.res.mjs +0 -38
package/src/Main.res CHANGED
@@ -1,4 +1,22 @@
1
- type chainData = ChainState.chainData
1
+ // The public console/state chain shape. Kept to exactly this field set for
2
+ // backward compatibility with consumers like RACE — new metric fields stay off
3
+ // the HTTP response.
4
+ type chainData = {
5
+ chainId: float,
6
+ poweredByHyperSync: bool,
7
+ firstEventBlockNumber: option<int>,
8
+ latestProcessedBlock: option<int>,
9
+ timestampCaughtUpToHeadOrEndblock: option<Date.t>,
10
+ numEventsProcessed: float,
11
+ latestFetchedBlockNumber: int,
12
+ // Need this for API backwards compatibility
13
+ @as("currentBlockHeight")
14
+ knownHeight: int,
15
+ numBatchesFetched: int,
16
+ startBlock: int,
17
+ endBlock: option<int>,
18
+ numAddresses: int,
19
+ }
2
20
  @tag("status")
3
21
  type state =
4
22
  | @as("disabled") Disabled({})
@@ -12,6 +30,21 @@ type state =
12
30
  rollbackOnReorg: bool,
13
31
  })
14
32
 
33
+ let toChainData = (m: Metrics.chainMetrics): chainData => {
34
+ chainId: m.chainId,
35
+ poweredByHyperSync: m.poweredByHyperSync,
36
+ firstEventBlockNumber: m.firstEventBlockNumber,
37
+ latestProcessedBlock: m.latestProcessedBlock,
38
+ timestampCaughtUpToHeadOrEndblock: m.timestampCaughtUpToHeadOrEndblock,
39
+ numEventsProcessed: m.numEventsProcessed,
40
+ latestFetchedBlockNumber: m.latestFetchedBlockNumber,
41
+ knownHeight: m.knownHeight,
42
+ numBatchesFetched: m.numBatchesFetched,
43
+ startBlock: m.startBlock,
44
+ endBlock: m.endBlock,
45
+ numAddresses: m.numAddresses,
46
+ }
47
+
15
48
  let chainDataSchema = S.schema((s): chainData => {
16
49
  chainId: s.matches(S.float),
17
50
  poweredByHyperSync: s.matches(S.bool),
@@ -331,13 +364,7 @@ let getGlobalIndexer = (): 'indexer => {
331
364
 
332
365
  let onBlockFn = (rawOptions: 'a, handler: 'b) => {
333
366
  HandlerRegister.throwIfFinishedRegistration(~methodName="onBlock")
334
- let raw =
335
- rawOptions->(
336
- Utils.magic: 'a => {
337
- "name": string,
338
- "where": unknown,
339
- }
340
- )
367
+ let raw = rawOptions->(Utils.magic: 'a => {"name": string, "where": unknown})
341
368
  HandlerRegister.registerOnBlock(
342
369
  ~name=raw["name"],
343
370
  ~where=raw["where"],
@@ -496,23 +523,19 @@ let startServer = (~getState, ~persistence: Persistence.t, ~isDevelopmentMode: b
496
523
  }
497
524
  })
498
525
 
499
- let runtimeRegistry = PromClient.makeRegistry()
500
- PromClient.collectDefaultMetrics({"register": runtimeRegistry})
526
+ Metrics.startRuntimeCollectors()
501
527
 
502
528
  app->get("/metrics", (_req, res) => {
503
- res->set("Content-Type", PromClient.defaultRegister->PromClient.getContentType)
529
+ res->set("Content-Type", Metrics.contentType)
504
530
  let _ =
505
- Metrics.collect(~state=getIndexerState())->Promise.thenResolve(metrics =>
506
- res->endWithData(metrics)
531
+ res->endWithData(
532
+ Metrics.collect(~metrics=getIndexerState()->Option.map(IndexerState.toMetrics)),
507
533
  )
508
534
  })
509
535
 
510
536
  app->get("/metrics/runtime", (_req, res) => {
511
- res->set("Content-Type", runtimeRegistry->PromClient.getContentType)
512
- let _ =
513
- runtimeRegistry
514
- ->PromClient.metrics
515
- ->Promise.thenResolve(metrics => res->endWithData(metrics))
537
+ res->set("Content-Type", Metrics.contentType)
538
+ let _ = res->endWithData(Metrics.collectRuntime())
516
539
  })
517
540
 
518
541
  let server = app->listen(Env.serverPort)
@@ -636,17 +659,13 @@ let start = async (
636
659
  (onErrorReject.contents->Option.getUnsafe)(FatalError(errHandler.exn->Utils.prettifyExn))
637
660
  }
638
661
  let envioVersion = Utils.EnvioPackage.value.version
639
- Prometheus.Info.set(~version=envioVersion)
640
- Prometheus.ProcessStartTimeSeconds.set()
641
- Prometheus.RollbackEnabled.set(~enabled=config.shouldRollbackOnReorg)
642
662
 
643
663
  if !isTest {
644
664
  startServer(~persistence, ~isDevelopmentMode, ~getState=() =>
645
665
  switch getIndexerState() {
646
666
  | None => Initializing({})
647
667
  | Some(state) => {
648
- let chains =
649
- state->IndexerState.chainStates->Dict.valuesToArray->Array.map(ChainState.toChainData)
668
+ let chains = (state->IndexerState.toMetrics).chains->Array.map(toChainData)
650
669
  Active({
651
670
  envioVersion,
652
671
  chains,
package/src/Main.res.mjs CHANGED
@@ -12,11 +12,9 @@ import * as Process from "process";
12
12
  import * as ChainMap from "./ChainMap.res.mjs";
13
13
  import * as PgStorage from "./PgStorage.res.mjs";
14
14
  import * as ChainState from "./ChainState.res.mjs";
15
- import * as Prometheus from "./Prometheus.res.mjs";
16
15
  import * as EnvioGlobal from "./EnvioGlobal.res.mjs";
17
16
  import * as IndexerLoop from "./IndexerLoop.res.mjs";
18
17
  import * as Persistence from "./Persistence.res.mjs";
19
- import * as PromClient from "prom-client";
20
18
  import Yargs from "yargs/yargs";
21
19
  import * as IndexerState from "./IndexerState.res.mjs";
22
20
  import * as ErrorHandling from "./ErrorHandling.res.mjs";
@@ -30,6 +28,23 @@ import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js
30
28
  import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
31
29
  import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
32
30
 
31
+ function toChainData(m) {
32
+ return {
33
+ chainId: m.chainId,
34
+ poweredByHyperSync: m.poweredByHyperSync,
35
+ firstEventBlockNumber: m.firstEventBlockNumber,
36
+ latestProcessedBlock: m.latestProcessedBlock,
37
+ timestampCaughtUpToHeadOrEndblock: m.timestampCaughtUpToHeadOrEndblock,
38
+ numEventsProcessed: m.numEventsProcessed,
39
+ latestFetchedBlockNumber: m.latestFetchedBlockNumber,
40
+ currentBlockHeight: m.knownHeight,
41
+ numBatchesFetched: m.numBatchesFetched,
42
+ startBlock: m.startBlock,
43
+ endBlock: m.endBlock,
44
+ numAddresses: m.numAddresses
45
+ };
46
+ }
47
+
33
48
  let chainDataSchema = S$RescriptSchema.schema(s => ({
34
49
  chainId: s.m(S$RescriptSchema.float),
35
50
  poweredByHyperSync: s.m(S$RescriptSchema.bool),
@@ -409,17 +424,14 @@ function startServer(getState, persistence, isDevelopmentMode) {
409
424
  res.json(false);
410
425
  }
411
426
  });
412
- let runtimeRegistry = new PromClient.Registry();
413
- PromClient.collectDefaultMetrics({
414
- register: runtimeRegistry
415
- });
427
+ Metrics.startRuntimeCollectors();
416
428
  app.get("/metrics", (_req, res) => {
417
- res.set("Content-Type", PromClient.register.contentType);
418
- Metrics.collect(EnvioGlobal.value.indexerState).then(metrics => res.end(metrics));
429
+ res.set("Content-Type", Metrics.contentType);
430
+ res.end(Metrics.collect(Stdlib_Option.map(EnvioGlobal.value.indexerState, IndexerState.toMetrics)));
419
431
  });
420
432
  app.get("/metrics/runtime", (_req, res) => {
421
- res.set("Content-Type", runtimeRegistry.contentType);
422
- runtimeRegistry.metrics().then(metrics => res.end(metrics));
433
+ res.set("Content-Type", Metrics.contentType);
434
+ res.end(Metrics.collectRuntime());
423
435
  });
424
436
  let server = app.listen(Env.serverPort);
425
437
  server.on("error", err => {
@@ -469,27 +481,14 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
469
481
  EnvioGlobal.value.persistence = Primitive_option.some(persistence$1);
470
482
  await Persistence.init(persistence$1, ChainMap.values(config.chainMap), Config.stripSensitiveData(Config.getPublicConfigJson()), isDevelopmentMode ? "envio dev -r" : "envio start -r", isDevelopmentMode ? "envio dev" : "envio start", reset);
471
483
  let registrationsByChainId = await HandlerLoader.registerAllHandlers(config);
472
- let config$1 = isTest ? ({
473
- name: config.name,
474
- description: config.description,
475
- handlers: config.handlers,
476
- contractHandlers: config.contractHandlers,
477
- shouldRollbackOnReorg: false,
478
- shouldSaveFullHistory: config.shouldSaveFullHistory,
479
- storage: config.storage,
480
- chainMap: config.chainMap,
481
- defaultChain: config.defaultChain,
482
- ecosystem: config.ecosystem,
483
- enableRawEvents: config.enableRawEvents,
484
- maxAddrInPartition: config.maxAddrInPartition,
485
- batchSize: config.batchSize,
486
- lowercaseAddresses: config.lowercaseAddresses,
487
- isDev: config.isDev,
488
- userEntitiesByName: config.userEntitiesByName,
489
- userEntities: config.userEntities,
490
- allEntities: config.allEntities,
491
- allEnums: config.allEnums
492
- }) : config;
484
+ let config$1;
485
+ if (isTest) {
486
+ let newrecord = {...config};
487
+ newrecord.shouldRollbackOnReorg = false;
488
+ config$1 = newrecord;
489
+ } else {
490
+ config$1 = config;
491
+ }
493
492
  let config$2 = patchConfig !== undefined ? patchConfig(config$1, registrationsByChainId) : config$1;
494
493
  let onErrorReject = {
495
494
  contents: undefined
@@ -505,9 +504,6 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
505
504
  });
506
505
  };
507
506
  let envioVersion = Utils.EnvioPackage.value.version;
508
- Prometheus.Info.set(envioVersion);
509
- Prometheus.ProcessStartTimeSeconds.set();
510
- Prometheus.RollbackEnabled.set(config$2.shouldRollbackOnReorg);
511
507
  if (!isTest) {
512
508
  startServer(() => {
513
509
  let state = EnvioGlobal.value.indexerState;
@@ -517,7 +513,7 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
517
513
  };
518
514
  }
519
515
  let state$1 = Primitive_option.valFromOption(state);
520
- let chains = Object.values(IndexerState.chainStates(state$1)).map(ChainState.toChainData);
516
+ let chains = IndexerState.toMetrics(state$1).chains.map(toChainData);
521
517
  return {
522
518
  status: "active",
523
519
  envioVersion: envioVersion,
@@ -538,6 +534,7 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
538
534
  }
539
535
 
540
536
  export {
537
+ toChainData,
541
538
  chainDataSchema,
542
539
  stateSchema,
543
540
  getIndexerState,