envio 3.2.1 → 3.3.0-alpha.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 (106) hide show
  1. package/package.json +6 -7
  2. package/src/Batch.res +12 -15
  3. package/src/Batch.res.mjs +4 -5
  4. package/src/BatchProcessing.res +199 -0
  5. package/src/BatchProcessing.res.mjs +125 -0
  6. package/src/ChainFetching.res +373 -0
  7. package/src/ChainFetching.res.mjs +206 -0
  8. package/src/ChainMetadata.res +27 -0
  9. package/src/ChainMetadata.res.mjs +27 -0
  10. package/src/ChainState.res +643 -0
  11. package/src/ChainState.res.mjs +476 -0
  12. package/src/ChainState.resi +87 -0
  13. package/src/Config.res +13 -4
  14. package/src/Config.res.mjs +8 -3
  15. package/src/ContractRegisterContext.res +106 -0
  16. package/src/ContractRegisterContext.res.mjs +76 -0
  17. package/src/Core.res +3 -0
  18. package/src/CrossChainState.res +294 -0
  19. package/src/CrossChainState.res.mjs +221 -0
  20. package/src/CrossChainState.resi +39 -0
  21. package/src/Ecosystem.res +58 -0
  22. package/src/Ecosystem.res.mjs +43 -1
  23. package/src/Env.res +0 -2
  24. package/src/Env.res.mjs +0 -3
  25. package/src/EventConfigBuilder.res +2 -2
  26. package/src/EventProcessing.res +60 -46
  27. package/src/EventProcessing.res.mjs +33 -32
  28. package/src/EventUtils.res +0 -4
  29. package/src/EventUtils.res.mjs +0 -4
  30. package/src/ExitOnCaughtUp.res +10 -0
  31. package/src/ExitOnCaughtUp.res.mjs +22 -0
  32. package/src/FetchState.res +205 -73
  33. package/src/FetchState.res.mjs +242 -103
  34. package/src/InMemoryStore.res +36 -451
  35. package/src/InMemoryStore.res.mjs +20 -369
  36. package/src/IndexerLoop.res +43 -0
  37. package/src/IndexerLoop.res.mjs +46 -0
  38. package/src/IndexerState.res +536 -0
  39. package/src/IndexerState.res.mjs +543 -0
  40. package/src/IndexerState.resi +128 -0
  41. package/src/Internal.res +29 -8
  42. package/src/LoadLayer.res +20 -18
  43. package/src/LoadLayer.res.mjs +14 -12
  44. package/src/LoadLayer.resi +6 -3
  45. package/src/Logging.res +11 -44
  46. package/src/Logging.res.mjs +10 -42
  47. package/src/Main.res +54 -79
  48. package/src/Main.res.mjs +44 -56
  49. package/src/PgStorage.res +8 -71
  50. package/src/PgStorage.res.mjs +3 -47
  51. package/src/Prometheus.res +1 -13
  52. package/src/Prometheus.res.mjs +84 -96
  53. package/src/PruneStaleHistory.res +45 -0
  54. package/src/PruneStaleHistory.res.mjs +46 -0
  55. package/src/RawEvent.res +73 -0
  56. package/src/RawEvent.res.mjs +51 -0
  57. package/src/Rollback.res +204 -0
  58. package/src/Rollback.res.mjs +118 -0
  59. package/src/SimulateItems.res +12 -10
  60. package/src/SimulateItems.res.mjs +1 -1
  61. package/src/UserContext.res +26 -114
  62. package/src/UserContext.res.mjs +15 -78
  63. package/src/Writing.res +242 -0
  64. package/src/Writing.res.mjs +215 -0
  65. package/src/db/InternalTable.res +14 -27
  66. package/src/sources/Evm.res +40 -1
  67. package/src/sources/Evm.res.mjs +94 -84
  68. package/src/sources/Fuel.res +40 -1
  69. package/src/sources/Fuel.res.mjs +36 -26
  70. package/src/sources/HyperFuel.res +41 -120
  71. package/src/sources/HyperFuel.res.mjs +42 -80
  72. package/src/sources/HyperFuel.resi +1 -24
  73. package/src/sources/HyperFuelClient.res +16 -297
  74. package/src/sources/HyperFuelClient.res.mjs +5 -4
  75. package/src/sources/HyperFuelSource.res +33 -8
  76. package/src/sources/HyperFuelSource.res.mjs +56 -10
  77. package/src/sources/HyperSyncSource.res +5 -3
  78. package/src/sources/HyperSyncSource.res.mjs +1 -1
  79. package/src/sources/RpcSource.res +2 -2
  80. package/src/sources/RpcSource.res.mjs +1 -1
  81. package/src/sources/SourceManager.res +14 -23
  82. package/src/sources/SourceManager.res.mjs +27 -29
  83. package/src/sources/SourceManager.resi +4 -2
  84. package/src/sources/Svm.res +18 -1
  85. package/src/sources/Svm.res.mjs +30 -22
  86. package/src/sources/SvmHyperSyncSource.res +1 -1
  87. package/src/sources/SvmHyperSyncSource.res.mjs +1 -1
  88. package/src/tui/Tui.res +38 -36
  89. package/src/tui/Tui.res.mjs +51 -51
  90. package/src/ChainFetcher.res +0 -519
  91. package/src/ChainFetcher.res.mjs +0 -314
  92. package/src/ChainManager.res +0 -358
  93. package/src/ChainManager.res.mjs +0 -291
  94. package/src/Ctx.res +0 -6
  95. package/src/Ctx.res.mjs +0 -2
  96. package/src/GlobalState.res +0 -1056
  97. package/src/GlobalState.res.mjs +0 -1086
  98. package/src/GlobalStateManager.res +0 -57
  99. package/src/GlobalStateManager.res.mjs +0 -68
  100. package/src/GlobalStateManager.resi +0 -7
  101. package/src/Ports.res +0 -5
  102. package/src/Ports.res.mjs +0 -9
  103. package/src/adapters/MarkBatchProcessedAdapter.res +0 -5
  104. package/src/adapters/MarkBatchProcessedAdapter.res.mjs +0 -14
  105. package/src/sources/EnvioApiClient.res +0 -15
  106. package/src/sources/EnvioApiClient.res.mjs +0 -24
@@ -400,39 +400,28 @@ let IndexingAddresses = {
400
400
  set: set$4
401
401
  };
402
402
 
403
- let gauge$5 = makeOrThrow$1("envio_indexing_max_concurrency", "The maximum number of concurrent queries to the chain data-source.", chainIdLabelsSchema);
403
+ let gauge$5 = makeOrThrow$1("envio_indexing_concurrency", "The number of executing concurrent queries to the chain data-source.", chainIdLabelsSchema);
404
404
 
405
- function set$5(maxConcurrency, chainId) {
406
- handleInt$1(gauge$5, chainId, maxConcurrency);
405
+ function set$5(concurrency, chainId) {
406
+ handleInt$1(gauge$5, chainId, concurrency);
407
407
  }
408
408
 
409
- let IndexingMaxConcurrency = {
409
+ let IndexingConcurrency = {
410
410
  gauge: gauge$5,
411
411
  set: set$5
412
412
  };
413
413
 
414
- let gauge$6 = makeOrThrow$1("envio_indexing_concurrency", "The number of executing concurrent queries to the chain data-source.", chainIdLabelsSchema);
414
+ let gauge$6 = makeOrThrow$1("envio_indexing_partitions", "The number of partitions used to split fetching logic by addresses and block ranges.", chainIdLabelsSchema);
415
415
 
416
- function set$6(concurrency, chainId) {
417
- handleInt$1(gauge$6, chainId, concurrency);
416
+ function set$6(partitionsCount, chainId) {
417
+ handleInt$1(gauge$6, chainId, partitionsCount);
418
418
  }
419
419
 
420
- let IndexingConcurrency = {
420
+ let IndexingPartitions = {
421
421
  gauge: gauge$6,
422
422
  set: set$6
423
423
  };
424
424
 
425
- let gauge$7 = makeOrThrow$1("envio_indexing_partitions", "The number of partitions used to split fetching logic by addresses and block ranges.", chainIdLabelsSchema);
426
-
427
- function set$7(partitionsCount, chainId) {
428
- handleInt$1(gauge$7, chainId, partitionsCount);
429
- }
430
-
431
- let IndexingPartitions = {
432
- gauge: gauge$7,
433
- set: set$7
434
- };
435
-
436
425
  let counter = makeOrThrow("envio_indexing_idle_seconds", "The time the indexer source syncing has been idle. A high value may indicate the source sync is a bottleneck.", chainIdLabelsSchema);
437
426
 
438
427
  let IndexingIdleTime = {
@@ -451,51 +440,51 @@ let IndexingQueryTime = {
451
440
  counter: counter$2
452
441
  };
453
442
 
454
- let gauge$8 = makeOrThrow$1("envio_indexing_buffer_size", "The current number of items in the indexing buffer.", chainIdLabelsSchema);
443
+ let gauge$7 = makeOrThrow$1("envio_indexing_buffer_size", "The current number of items in the indexing buffer.", chainIdLabelsSchema);
455
444
 
456
- function set$8(bufferSize, chainId) {
457
- handleInt$1(gauge$8, chainId, bufferSize);
445
+ function set$7(bufferSize, chainId) {
446
+ handleInt$1(gauge$7, chainId, bufferSize);
458
447
  }
459
448
 
460
449
  let IndexingBufferSize = {
461
- gauge: gauge$8,
462
- set: set$8
450
+ gauge: gauge$7,
451
+ set: set$7
463
452
  };
464
453
 
465
- let gauge$9 = PromClient.Gauge.makeGauge({
454
+ let gauge$8 = PromClient.Gauge.makeGauge({
466
455
  name: "envio_indexing_target_buffer_size",
467
- help: "The target buffer size per chain for indexing. The actual number of items in the queue may exceed this value, but the indexer always tries to keep the buffer filled up to this target."
456
+ help: "The indexer-wide target buffer size shared across all chains. The actual number of items in the queue may exceed this value, but the indexer always tries to keep the buffer filled up to this target."
468
457
  });
469
458
 
470
- function set$9(targetBufferSize) {
471
- gauge$9.set(targetBufferSize);
459
+ function set$8(targetBufferSize) {
460
+ gauge$8.set(targetBufferSize);
472
461
  }
473
462
 
474
463
  let IndexingTargetBufferSize = {
475
- gauge: gauge$9,
476
- set: set$9
464
+ gauge: gauge$8,
465
+ set: set$8
477
466
  };
478
467
 
479
- let gauge$10 = makeOrThrow$1("envio_indexing_buffer_block", "The highest block number that has been fully fetched by the indexer.", chainIdLabelsSchema);
468
+ let gauge$9 = makeOrThrow$1("envio_indexing_buffer_block", "The highest block number that has been fully fetched by the indexer.", chainIdLabelsSchema);
480
469
 
481
- function set$10(blockNumber, chainId) {
482
- handleInt$1(gauge$10, chainId, blockNumber);
470
+ function set$9(blockNumber, chainId) {
471
+ handleInt$1(gauge$9, chainId, blockNumber);
483
472
  }
484
473
 
485
474
  let IndexingBufferBlockNumber = {
486
- gauge: gauge$10,
487
- set: set$10
475
+ gauge: gauge$9,
476
+ set: set$9
488
477
  };
489
478
 
490
- let gauge$11 = makeOrThrow$1("envio_indexing_end_block", "The block number to stop indexing at. (inclusive)", chainIdLabelsSchema);
479
+ let gauge$10 = makeOrThrow$1("envio_indexing_end_block", "The block number to stop indexing at. (inclusive)", chainIdLabelsSchema);
491
480
 
492
- function set$11(endBlock, chainId) {
493
- handleInt$1(gauge$11, chainId, endBlock);
481
+ function set$10(endBlock, chainId) {
482
+ handleInt$1(gauge$10, chainId, endBlock);
494
483
  }
495
484
 
496
485
  let IndexingEndBlock = {
497
- gauge: gauge$11,
498
- set: set$11
486
+ gauge: gauge$10,
487
+ set: set$10
499
488
  };
500
489
 
501
490
  let sourceLabelsSchema = S$RescriptSchema.schema(s => ({
@@ -536,18 +525,18 @@ let SourceRequestCount = {
536
525
  addSeconds: addSeconds
537
526
  };
538
527
 
539
- let gauge$12 = makeOrThrow$1("envio_source_known_height", "The latest known block number reported by the source. This value may lag behind the actual chain height, as it is updated only when queried.", sourceLabelsSchema);
528
+ let gauge$11 = makeOrThrow$1("envio_source_known_height", "The latest known block number reported by the source. This value may lag behind the actual chain height, as it is updated only when queried.", sourceLabelsSchema);
540
529
 
541
- function set$12(sourceName, chainId, blockNumber) {
542
- handleInt$1(gauge$12, {
530
+ function set$11(sourceName, chainId, blockNumber) {
531
+ handleInt$1(gauge$11, {
543
532
  source: sourceName,
544
533
  chainId: chainId
545
534
  }, blockNumber);
546
535
  }
547
536
 
548
537
  let SourceHeight = {
549
- gauge: gauge$12,
550
- set: set$12
538
+ gauge: gauge$11,
539
+ set: set$11
551
540
  };
552
541
 
553
542
  let counter$4 = makeOrThrow("envio_reorg_detected_total", "Total number of reorgs detected", chainIdLabelsSchema);
@@ -561,43 +550,43 @@ let ReorgCount = {
561
550
  increment: increment$5
562
551
  };
563
552
 
564
- let gauge$13 = makeOrThrow$1("envio_reorg_detected_block", "The block number where reorg was detected the last time. This doesn't mean that the block was reorged, this is simply where we found block hash to be different.", chainIdLabelsSchema);
553
+ let gauge$12 = makeOrThrow$1("envio_reorg_detected_block", "The block number where reorg was detected the last time. This doesn't mean that the block was reorged, this is simply where we found block hash to be different.", chainIdLabelsSchema);
565
554
 
566
- function set$13(blockNumber, chain) {
567
- handleInt$1(gauge$13, chain, blockNumber);
555
+ function set$12(blockNumber, chain) {
556
+ handleInt$1(gauge$12, chain, blockNumber);
568
557
  }
569
558
 
570
559
  let ReorgDetectionBlockNumber = {
571
- gauge: gauge$13,
572
- set: set$13
560
+ gauge: gauge$12,
561
+ set: set$12
573
562
  };
574
563
 
575
- let gauge$14 = PromClient.Gauge.makeGauge({
564
+ let gauge$13 = PromClient.Gauge.makeGauge({
576
565
  name: "envio_reorg_threshold",
577
566
  help: "Whether indexing is currently within the reorg threshold"
578
567
  });
579
568
 
580
- function set$14(isInReorgThreshold) {
581
- gauge$14.set(isInReorgThreshold ? 1 : 0);
569
+ function set$13(isInReorgThreshold) {
570
+ gauge$13.set(isInReorgThreshold ? 1 : 0);
582
571
  }
583
572
 
584
573
  let ReorgThreshold = {
585
- gauge: gauge$14,
586
- set: set$14
574
+ gauge: gauge$13,
575
+ set: set$13
587
576
  };
588
577
 
589
- let gauge$15 = PromClient.Gauge.makeGauge({
578
+ let gauge$14 = PromClient.Gauge.makeGauge({
590
579
  name: "envio_rollback_enabled",
591
580
  help: "Whether rollback on reorg is enabled"
592
581
  });
593
582
 
594
- function set$15(enabled) {
595
- gauge$15.set(enabled ? 1 : 0);
583
+ function set$14(enabled) {
584
+ gauge$14.set(enabled ? 1 : 0);
596
585
  }
597
586
 
598
587
  let RollbackEnabled = {
599
- gauge: gauge$15,
600
- set: set$15
588
+ gauge: gauge$14,
589
+ set: set$14
601
590
  };
602
591
 
603
592
  let timeCounter$3 = PromClient.Counter.makeCounter({
@@ -646,62 +635,62 @@ let RollbackHistoryPrune = {
646
635
  increment: increment$7
647
636
  };
648
637
 
649
- let gauge$16 = makeOrThrow$1("envio_rollback_target_block", "The block number reorg was rollbacked to the last time.", chainIdLabelsSchema);
638
+ let gauge$15 = makeOrThrow$1("envio_rollback_target_block", "The block number reorg was rollbacked to the last time.", chainIdLabelsSchema);
650
639
 
651
- function set$16(blockNumber, chain) {
652
- handleInt$1(gauge$16, chain, blockNumber);
640
+ function set$15(blockNumber, chain) {
641
+ handleInt$1(gauge$15, chain, blockNumber);
653
642
  }
654
643
 
655
644
  let RollbackTargetBlockNumber = {
656
- gauge: gauge$16,
657
- set: set$16
645
+ gauge: gauge$15,
646
+ set: set$15
658
647
  };
659
648
 
660
- let gauge$17 = PromClient.Gauge.makeGauge({
649
+ let gauge$16 = PromClient.Gauge.makeGauge({
661
650
  name: "envio_processing_max_batch_size",
662
651
  help: "The maximum number of items to process in a single batch."
663
652
  });
664
653
 
665
- function set$17(maxBatchSize) {
666
- gauge$17.set(maxBatchSize);
654
+ function set$16(maxBatchSize) {
655
+ gauge$16.set(maxBatchSize);
667
656
  }
668
657
 
669
658
  let ProcessingMaxBatchSize = {
670
- gauge: gauge$17,
671
- set: set$17
659
+ gauge: gauge$16,
660
+ set: set$16
672
661
  };
673
662
 
674
- let gauge$18 = makeOrThrow$1("envio_progress_block", "The block number of the latest block processed and stored in the database.", chainIdLabelsSchema);
663
+ let gauge$17 = makeOrThrow$1("envio_progress_block", "The block number of the latest block processed and stored in the database.", chainIdLabelsSchema);
675
664
 
676
- function set$18(blockNumber, chainId) {
677
- handleInt$1(gauge$18, chainId, blockNumber);
665
+ function set$17(blockNumber, chainId) {
666
+ handleInt$1(gauge$17, chainId, blockNumber);
678
667
  }
679
668
 
680
669
  let ProgressBlockNumber = {
681
- gauge: gauge$18,
682
- set: set$18
670
+ gauge: gauge$17,
671
+ set: set$17
683
672
  };
684
673
 
685
- let gauge$19 = makeOrThrow$1("envio_progress_events", "The number of events processed and reflected in the database.", chainIdLabelsSchema);
674
+ let gauge$18 = makeOrThrow$1("envio_progress_events", "The number of events processed and reflected in the database.", chainIdLabelsSchema);
686
675
 
687
- function set$19(processedCount, chainId) {
688
- handleFloat$1(gauge$19, chainId, processedCount);
676
+ function set$18(processedCount, chainId) {
677
+ handleFloat$1(gauge$18, chainId, processedCount);
689
678
  }
690
679
 
691
680
  let ProgressEventsCount = {
692
- gauge: gauge$19,
693
- set: set$19
681
+ gauge: gauge$18,
682
+ set: set$18
694
683
  };
695
684
 
696
- let gauge$20 = makeOrThrow$1("envio_progress_latency", "The latency in milliseconds between the latest processed event creation and the time it was written to storage.", chainIdLabelsSchema);
685
+ let gauge$19 = makeOrThrow$1("envio_progress_latency", "The latency in milliseconds between the latest processed event creation and the time it was written to storage.", chainIdLabelsSchema);
697
686
 
698
- function set$20(latencyMs, chainId) {
699
- handleInt$1(gauge$20, chainId, latencyMs);
687
+ function set$19(latencyMs, chainId) {
688
+ handleInt$1(gauge$19, chainId, latencyMs);
700
689
  }
701
690
 
702
691
  let ProgressLatency = {
703
- gauge: gauge$20,
704
- set: set$20
692
+ gauge: gauge$19,
693
+ set: set$19
705
694
  };
706
695
 
707
696
  let effectLabelsSchema = S$RescriptSchema.object(s => s.f("effect", S$RescriptSchema.string));
@@ -721,15 +710,15 @@ let EffectCalls = {
721
710
  activeCallsCount: activeCallsCount
722
711
  };
723
712
 
724
- let gauge$21 = makeOrThrow$1("envio_effect_cache", "The number of items in the effect cache.", effectLabelsSchema);
713
+ let gauge$20 = makeOrThrow$1("envio_effect_cache", "The number of items in the effect cache.", effectLabelsSchema);
725
714
 
726
- function set$21(count, effectName) {
727
- handleInt$1(gauge$21, effectName, count);
715
+ function set$20(count, effectName) {
716
+ handleInt$1(gauge$20, effectName, count);
728
717
  }
729
718
 
730
719
  let EffectCacheCount = {
731
- gauge: gauge$21,
732
- set: set$21
720
+ gauge: gauge$20,
721
+ set: set$20
733
722
  };
734
723
 
735
724
  let counter$7 = makeOrThrow("envio_effect_cache_invalidations", "The number of effect cache invalidations.", effectLabelsSchema);
@@ -743,18 +732,18 @@ let EffectCacheInvalidationsCount = {
743
732
  increment: increment$8
744
733
  };
745
734
 
746
- let gauge$22 = makeOrThrow$1("envio_effect_queue", "The number of effect calls waiting in the rate limit queue.", effectLabelsSchema);
735
+ let gauge$21 = makeOrThrow$1("envio_effect_queue", "The number of effect calls waiting in the rate limit queue.", effectLabelsSchema);
747
736
 
748
737
  let timeCounter$6 = makeOrThrow("envio_effect_queue_wait_seconds", "The time spent waiting in the rate limit queue.", effectLabelsSchema);
749
738
 
750
- function set$22(count, effectName) {
751
- handleInt$1(gauge$22, effectName, count);
739
+ function set$21(count, effectName) {
740
+ handleInt$1(gauge$21, effectName, count);
752
741
  }
753
742
 
754
743
  let EffectQueueCount = {
755
- gauge: gauge$22,
744
+ gauge: gauge$21,
756
745
  timeCounter: timeCounter$6,
757
- set: set$22
746
+ set: set$21
758
747
  };
759
748
 
760
749
  let loadLabelsSchema = S$RescriptSchema.schema(s => ({
@@ -858,7 +847,6 @@ export {
858
847
  Info,
859
848
  ProcessStartTimeSeconds,
860
849
  IndexingAddresses,
861
- IndexingMaxConcurrency,
862
850
  IndexingConcurrency,
863
851
  IndexingPartitions,
864
852
  IndexingIdleTime,
@@ -0,0 +1,45 @@
1
+ // Throttled prune of stale entity-history rows below the safe checkpoint.
2
+
3
+ let runPrune = async (state: IndexerState.t) => {
4
+ switch state->IndexerState.getSafeCheckpointId {
5
+ | None => ()
6
+ | Some(safeCheckpointId) =>
7
+ let persistence = state->IndexerState.persistence
8
+ await persistence.storage.pruneStaleCheckpoints(~safeCheckpointId)
9
+
10
+ for idx in 0 to persistence.allEntities->Array.length - 1 {
11
+ if idx !== 0 {
12
+ // Add some delay between entities
13
+ // To unblock the pg client if it's needed for something else
14
+ await Utils.delay(1000)
15
+ }
16
+ let entityConfig = persistence.allEntities->Array.getUnsafe(idx)
17
+ let timeRef = Hrtime.makeTimer()
18
+ try {
19
+ let () = await persistence.storage.pruneStaleEntityHistory(
20
+ ~entityName=entityConfig.name,
21
+ ~entityIndex=entityConfig.index,
22
+ ~safeCheckpointId,
23
+ )
24
+ } catch {
25
+ | exn =>
26
+ exn->ErrorHandling.mkLogAndRaise(
27
+ ~msg=`Failed to prune stale entity history`,
28
+ ~logger=Logging.createChild(
29
+ ~params={
30
+ "entityName": entityConfig.name,
31
+ "safeCheckpointId": safeCheckpointId,
32
+ },
33
+ ),
34
+ )
35
+ }
36
+ Prometheus.RollbackHistoryPrune.increment(
37
+ ~timeSeconds=Hrtime.timeSince(timeRef)->Hrtime.toSecondsFloat,
38
+ ~entityName=entityConfig.name,
39
+ )
40
+ }
41
+ }
42
+ }
43
+
44
+ let schedule = (state: IndexerState.t) =>
45
+ state->IndexerState.pruneStaleEntityHistoryThrottler->Throttler.schedule(() => runPrune(state))
@@ -0,0 +1,46 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Utils from "./Utils.res.mjs";
4
+ import * as Hrtime from "./bindings/Hrtime.res.mjs";
5
+ import * as Logging from "./Logging.res.mjs";
6
+ import * as Throttler from "./Throttler.res.mjs";
7
+ import * as Prometheus from "./Prometheus.res.mjs";
8
+ import * as IndexerState from "./IndexerState.res.mjs";
9
+ import * as ErrorHandling from "./ErrorHandling.res.mjs";
10
+ import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
11
+
12
+ async function runPrune(state) {
13
+ let safeCheckpointId = IndexerState.getSafeCheckpointId(state);
14
+ if (safeCheckpointId === undefined) {
15
+ return;
16
+ }
17
+ let persistence = IndexerState.persistence(state);
18
+ await persistence.storage.pruneStaleCheckpoints(safeCheckpointId);
19
+ for (let idx = 0, idx_finish = persistence.allEntities.length; idx < idx_finish; ++idx) {
20
+ if (idx !== 0) {
21
+ await Utils.delay(1000);
22
+ }
23
+ let entityConfig = persistence.allEntities[idx];
24
+ let timeRef = Hrtime.makeTimer();
25
+ try {
26
+ await persistence.storage.pruneStaleEntityHistory(entityConfig.name, entityConfig.index, safeCheckpointId);
27
+ } catch (raw_exn) {
28
+ let exn = Primitive_exceptions.internalToException(raw_exn);
29
+ ErrorHandling.mkLogAndRaise(Logging.createChild({
30
+ entityName: entityConfig.name,
31
+ safeCheckpointId: safeCheckpointId
32
+ }), `Failed to prune stale entity history`, exn);
33
+ }
34
+ Prometheus.RollbackHistoryPrune.increment(Hrtime.toSecondsFloat(Hrtime.timeSince(timeRef)), entityConfig.name);
35
+ }
36
+ }
37
+
38
+ function schedule(state) {
39
+ Throttler.schedule(IndexerState.pruneStaleEntityHistoryThrottler(state), () => runPrune(state));
40
+ }
41
+
42
+ export {
43
+ runPrune,
44
+ schedule,
45
+ }
46
+ /* Utils Not a pure module */
@@ -0,0 +1,73 @@
1
+ let convertFieldsToJson = (fields: option<dict<unknown>>) => {
2
+ switch fields {
3
+ | None => %raw(`{}`)
4
+ | Some(fields) =>
5
+ // Convert bigint fields to string. There are no fields with nested
6
+ // bigints, so iterating only the top level is safe.
7
+ fields
8
+ ->Utils.Dict.mapValues(value =>
9
+ typeof(value) === #bigint
10
+ ? value
11
+ ->(Utils.magic: unknown => bigint)
12
+ ->BigInt.toString
13
+ ->(Utils.magic: string => unknown)
14
+ : value
15
+ )
16
+ ->(Utils.magic: dict<unknown> => JSON.t)
17
+ }
18
+ }
19
+
20
+ // Block and transaction are passed already extracted from the ecosystem's
21
+ // concrete payload (EVM or Fuel) — `RawEvent` stays payload-shape-agnostic and
22
+ // only needs them as opaque field bags to serialise.
23
+ let make = (
24
+ eventItem: Internal.eventItem,
25
+ ~block,
26
+ ~transaction,
27
+ ~params: Internal.eventParams,
28
+ ~srcAddress: Address.t,
29
+ ~cleanUpRawEventFieldsInPlace: JSON.t => unit,
30
+ ): Internal.rawEvent => {
31
+ let {eventConfig, chain, blockNumber, blockHash, timestamp: blockTimestamp, logIndex} = eventItem
32
+ let chainId = chain->ChainMap.Chain.toChainId
33
+ let eventId = EventUtils.packEventIndex(~logIndex, ~blockNumber)
34
+ let blockFields =
35
+ block
36
+ ->(Utils.magic: 'block => option<dict<unknown>>)
37
+ ->convertFieldsToJson
38
+ let transactionFields =
39
+ transaction
40
+ ->(Utils.magic: 'transaction => option<dict<unknown>>)
41
+ ->convertFieldsToJson
42
+
43
+ blockFields->cleanUpRawEventFieldsInPlace
44
+
45
+ // Serialize to unknown, because serializing to Js.Json.t fails for Bytes Fuel type, since it has unknown schema
46
+ let params =
47
+ params
48
+ ->S.reverseConvertOrThrow(eventConfig.paramsRawEventSchema)
49
+ ->(Utils.magic: unknown => JSON.t)
50
+ let params = if params === %raw(`null`) {
51
+ // Should probably make the params field nullable
52
+ // But this is currently needed to make events
53
+ // with empty params work
54
+ %raw(`"null"`)
55
+ } else {
56
+ params
57
+ }
58
+
59
+ {
60
+ chain_id: chainId,
61
+ event_id: eventId,
62
+ event_name: eventConfig.name,
63
+ contract_name: eventConfig.contractName,
64
+ block_number: blockNumber,
65
+ log_index: logIndex,
66
+ src_address: srcAddress,
67
+ block_hash: blockHash,
68
+ block_timestamp: blockTimestamp,
69
+ block_fields: blockFields,
70
+ transaction_fields: transactionFields,
71
+ params,
72
+ }
73
+ }
@@ -0,0 +1,51 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Utils from "./Utils.res.mjs";
4
+ import * as EventUtils from "./EventUtils.res.mjs";
5
+ import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
6
+
7
+ function convertFieldsToJson(fields) {
8
+ if (fields !== undefined) {
9
+ return Utils.Dict.mapValues(fields, value => {
10
+ if (typeof value === "bigint") {
11
+ return value.toString();
12
+ } else {
13
+ return value;
14
+ }
15
+ });
16
+ } else {
17
+ return {};
18
+ }
19
+ }
20
+
21
+ function make(eventItem, block, transaction, params, srcAddress, cleanUpRawEventFieldsInPlace) {
22
+ let logIndex = eventItem.logIndex;
23
+ let blockNumber = eventItem.blockNumber;
24
+ let eventConfig = eventItem.eventConfig;
25
+ let eventId = EventUtils.packEventIndex(blockNumber, logIndex);
26
+ let blockFields = convertFieldsToJson(block);
27
+ let transactionFields = convertFieldsToJson(transaction);
28
+ cleanUpRawEventFieldsInPlace(blockFields);
29
+ let params$1 = S$RescriptSchema.reverseConvertOrThrow(params, eventConfig.paramsRawEventSchema);
30
+ let params$2 = params$1 === null ? "null" : params$1;
31
+ return {
32
+ chain_id: eventItem.chain,
33
+ event_id: eventId,
34
+ event_name: eventConfig.name,
35
+ contract_name: eventConfig.contractName,
36
+ block_number: blockNumber,
37
+ log_index: logIndex,
38
+ src_address: srcAddress,
39
+ block_hash: eventItem.blockHash,
40
+ block_timestamp: eventItem.timestamp,
41
+ block_fields: blockFields,
42
+ transaction_fields: transactionFields,
43
+ params: params$2
44
+ };
45
+ }
46
+
47
+ export {
48
+ convertFieldsToJson,
49
+ make,
50
+ }
51
+ /* Utils Not a pure module */