envio 3.0.0-alpha.21 → 3.0.0-alpha.22

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 (219) hide show
  1. package/bin.mjs +2 -48
  2. package/evm.schema.json +67 -0
  3. package/fuel.schema.json +67 -0
  4. package/index.d.ts +822 -38
  5. package/index.js +5 -3
  6. package/package.json +10 -8
  7. package/rescript.json +5 -9
  8. package/src/Address.res +4 -5
  9. package/src/Address.res.mjs +9 -12
  10. package/src/Api.res +15 -0
  11. package/src/Api.res.mjs +20 -0
  12. package/src/Batch.res +32 -34
  13. package/src/Batch.res.mjs +172 -187
  14. package/src/Bin.res +89 -0
  15. package/src/Bin.res.mjs +97 -0
  16. package/src/ChainFetcher.res +33 -57
  17. package/src/ChainFetcher.res.mjs +197 -227
  18. package/src/ChainManager.res +6 -14
  19. package/src/ChainManager.res.mjs +74 -85
  20. package/src/ChainMap.res +14 -16
  21. package/src/ChainMap.res.mjs +38 -38
  22. package/src/Config.res +193 -135
  23. package/src/Config.res.mjs +566 -592
  24. package/src/Core.res +182 -0
  25. package/src/Core.res.mjs +207 -0
  26. package/src/Ecosystem.res +25 -4
  27. package/src/Ecosystem.res.mjs +12 -13
  28. package/src/Env.res +20 -13
  29. package/src/Env.res.mjs +124 -113
  30. package/src/EnvSafe.res +269 -0
  31. package/src/EnvSafe.res.mjs +296 -0
  32. package/src/EnvSafe.resi +18 -0
  33. package/src/Envio.res +37 -26
  34. package/src/Envio.res.mjs +59 -60
  35. package/src/ErrorHandling.res +2 -2
  36. package/src/ErrorHandling.res.mjs +15 -15
  37. package/src/EventConfigBuilder.res +219 -81
  38. package/src/EventConfigBuilder.res.mjs +259 -202
  39. package/src/EventProcessing.res +27 -38
  40. package/src/EventProcessing.res.mjs +165 -183
  41. package/src/EventUtils.res +11 -11
  42. package/src/EventUtils.res.mjs +21 -22
  43. package/src/EvmTypes.res +0 -1
  44. package/src/EvmTypes.res.mjs +5 -5
  45. package/src/FetchState.res +360 -256
  46. package/src/FetchState.res.mjs +958 -914
  47. package/src/GlobalState.res +365 -351
  48. package/src/GlobalState.res.mjs +958 -992
  49. package/src/GlobalStateManager.res +1 -2
  50. package/src/GlobalStateManager.res.mjs +36 -44
  51. package/src/HandlerLoader.res +107 -23
  52. package/src/HandlerLoader.res.mjs +128 -38
  53. package/src/HandlerRegister.res +127 -103
  54. package/src/HandlerRegister.res.mjs +164 -164
  55. package/src/HandlerRegister.resi +12 -4
  56. package/src/Hasura.res +35 -22
  57. package/src/Hasura.res.mjs +158 -167
  58. package/src/InMemoryStore.res +20 -27
  59. package/src/InMemoryStore.res.mjs +64 -80
  60. package/src/InMemoryTable.res +34 -39
  61. package/src/InMemoryTable.res.mjs +165 -170
  62. package/src/Internal.res +52 -33
  63. package/src/Internal.res.mjs +84 -81
  64. package/src/LazyLoader.res.mjs +55 -61
  65. package/src/LoadLayer.res +77 -78
  66. package/src/LoadLayer.res.mjs +160 -189
  67. package/src/LoadManager.res +16 -21
  68. package/src/LoadManager.res.mjs +79 -84
  69. package/src/LogSelection.res +236 -68
  70. package/src/LogSelection.res.mjs +211 -141
  71. package/src/Logging.res +13 -9
  72. package/src/Logging.res.mjs +130 -143
  73. package/src/Main.res +428 -51
  74. package/src/Main.res.mjs +528 -271
  75. package/src/Persistence.res +77 -84
  76. package/src/Persistence.res.mjs +131 -132
  77. package/src/PgStorage.res +291 -167
  78. package/src/PgStorage.res.mjs +797 -817
  79. package/src/Prometheus.res +50 -58
  80. package/src/Prometheus.res.mjs +345 -373
  81. package/src/ReorgDetection.res +22 -24
  82. package/src/ReorgDetection.res.mjs +100 -106
  83. package/src/SafeCheckpointTracking.res +7 -7
  84. package/src/SafeCheckpointTracking.res.mjs +40 -43
  85. package/src/SimulateItems.res +41 -49
  86. package/src/SimulateItems.res.mjs +257 -272
  87. package/src/Sink.res +2 -2
  88. package/src/Sink.res.mjs +22 -26
  89. package/src/TableIndices.res +1 -2
  90. package/src/TableIndices.res.mjs +42 -48
  91. package/src/TestIndexer.res +196 -189
  92. package/src/TestIndexer.res.mjs +536 -536
  93. package/src/TestIndexerProxyStorage.res +15 -16
  94. package/src/TestIndexerProxyStorage.res.mjs +98 -122
  95. package/src/TestIndexerWorker.res +4 -0
  96. package/src/TestIndexerWorker.res.mjs +7 -0
  97. package/src/Throttler.res +3 -3
  98. package/src/Throttler.res.mjs +23 -24
  99. package/src/Time.res +1 -1
  100. package/src/Time.res.mjs +18 -21
  101. package/src/TopicFilter.res +3 -3
  102. package/src/TopicFilter.res.mjs +29 -30
  103. package/src/UserContext.res +93 -54
  104. package/src/UserContext.res.mjs +197 -182
  105. package/src/Utils.res +141 -86
  106. package/src/Utils.res.mjs +334 -295
  107. package/src/bindings/BigDecimal.res +0 -2
  108. package/src/bindings/BigDecimal.res.mjs +19 -23
  109. package/src/bindings/ClickHouse.res +28 -27
  110. package/src/bindings/ClickHouse.res.mjs +243 -240
  111. package/src/bindings/DateFns.res +11 -11
  112. package/src/bindings/DateFns.res.mjs +7 -7
  113. package/src/bindings/EventSource.res.mjs +2 -2
  114. package/src/bindings/Express.res +2 -5
  115. package/src/bindings/Hrtime.res +2 -2
  116. package/src/bindings/Hrtime.res.mjs +30 -32
  117. package/src/bindings/Lodash.res.mjs +1 -1
  118. package/src/bindings/NodeJs.res +14 -9
  119. package/src/bindings/NodeJs.res.mjs +20 -20
  120. package/src/bindings/Pino.res +8 -10
  121. package/src/bindings/Pino.res.mjs +40 -43
  122. package/src/bindings/Postgres.res +2 -5
  123. package/src/bindings/Postgres.res.mjs +9 -9
  124. package/src/bindings/PromClient.res +17 -2
  125. package/src/bindings/PromClient.res.mjs +30 -7
  126. package/src/bindings/SDSL.res.mjs +2 -2
  127. package/src/bindings/Viem.res +4 -4
  128. package/src/bindings/Viem.res.mjs +20 -22
  129. package/src/bindings/Vitest.res +1 -1
  130. package/src/bindings/Vitest.res.mjs +2 -2
  131. package/src/bindings/WebSocket.res +1 -1
  132. package/src/db/EntityHistory.res +9 -3
  133. package/src/db/EntityHistory.res.mjs +84 -59
  134. package/src/db/InternalTable.res +62 -60
  135. package/src/db/InternalTable.res.mjs +271 -203
  136. package/src/db/Schema.res +1 -2
  137. package/src/db/Schema.res.mjs +28 -32
  138. package/src/db/Table.res +28 -27
  139. package/src/db/Table.res.mjs +276 -292
  140. package/src/sources/EventRouter.res +21 -16
  141. package/src/sources/EventRouter.res.mjs +55 -57
  142. package/src/sources/Evm.res +17 -1
  143. package/src/sources/Evm.res.mjs +16 -8
  144. package/src/sources/EvmChain.res +15 -17
  145. package/src/sources/EvmChain.res.mjs +40 -42
  146. package/src/sources/Fuel.res +14 -1
  147. package/src/sources/Fuel.res.mjs +16 -8
  148. package/src/sources/FuelSDK.res +1 -1
  149. package/src/sources/FuelSDK.res.mjs +6 -8
  150. package/src/sources/HyperFuel.res +8 -10
  151. package/src/sources/HyperFuel.res.mjs +113 -123
  152. package/src/sources/HyperFuelClient.res.mjs +6 -7
  153. package/src/sources/HyperFuelSource.res +19 -20
  154. package/src/sources/HyperFuelSource.res.mjs +339 -356
  155. package/src/sources/HyperSync.res +11 -13
  156. package/src/sources/HyperSync.res.mjs +206 -220
  157. package/src/sources/HyperSyncClient.res +5 -7
  158. package/src/sources/HyperSyncClient.res.mjs +70 -75
  159. package/src/sources/HyperSyncHeightStream.res +8 -9
  160. package/src/sources/HyperSyncHeightStream.res.mjs +78 -86
  161. package/src/sources/HyperSyncJsonApi.res +18 -15
  162. package/src/sources/HyperSyncJsonApi.res.mjs +201 -231
  163. package/src/sources/HyperSyncSource.res +17 -21
  164. package/src/sources/HyperSyncSource.res.mjs +268 -290
  165. package/src/sources/Rpc.res +5 -5
  166. package/src/sources/Rpc.res.mjs +168 -192
  167. package/src/sources/RpcSource.res +166 -167
  168. package/src/sources/RpcSource.res.mjs +972 -1046
  169. package/src/sources/RpcWebSocketHeightStream.res +10 -11
  170. package/src/sources/RpcWebSocketHeightStream.res.mjs +131 -145
  171. package/src/sources/SimulateSource.res +1 -1
  172. package/src/sources/SimulateSource.res.mjs +35 -38
  173. package/src/sources/Source.res +1 -1
  174. package/src/sources/Source.res.mjs +3 -3
  175. package/src/sources/SourceManager.res +39 -20
  176. package/src/sources/SourceManager.res.mjs +340 -371
  177. package/src/sources/SourceManager.resi +2 -1
  178. package/src/sources/Svm.res +12 -5
  179. package/src/sources/Svm.res.mjs +44 -41
  180. package/src/tui/Tui.res +23 -12
  181. package/src/tui/Tui.res.mjs +292 -290
  182. package/src/tui/bindings/Ink.res +2 -4
  183. package/src/tui/bindings/Ink.res.mjs +35 -41
  184. package/src/tui/components/BufferedProgressBar.res +7 -7
  185. package/src/tui/components/BufferedProgressBar.res.mjs +46 -46
  186. package/src/tui/components/CustomHooks.res +1 -2
  187. package/src/tui/components/CustomHooks.res.mjs +102 -122
  188. package/src/tui/components/Messages.res +1 -2
  189. package/src/tui/components/Messages.res.mjs +38 -42
  190. package/src/tui/components/SyncETA.res +10 -11
  191. package/src/tui/components/SyncETA.res.mjs +178 -196
  192. package/src/tui/components/TuiData.res +1 -1
  193. package/src/tui/components/TuiData.res.mjs +7 -6
  194. package/src/vendored/Rest.res +52 -66
  195. package/src/vendored/Rest.res.mjs +324 -364
  196. package/svm.schema.json +67 -0
  197. package/src/Address.gen.ts +0 -8
  198. package/src/Config.gen.ts +0 -19
  199. package/src/Envio.gen.ts +0 -55
  200. package/src/EvmTypes.gen.ts +0 -6
  201. package/src/InMemoryStore.gen.ts +0 -6
  202. package/src/Internal.gen.ts +0 -64
  203. package/src/PgStorage.gen.ts +0 -10
  204. package/src/PgStorage.res.d.mts +0 -5
  205. package/src/Types.ts +0 -56
  206. package/src/bindings/BigDecimal.gen.ts +0 -14
  207. package/src/bindings/BigDecimal.res.d.mts +0 -5
  208. package/src/bindings/BigInt.gen.ts +0 -10
  209. package/src/bindings/BigInt.res +0 -70
  210. package/src/bindings/BigInt.res.d.mts +0 -5
  211. package/src/bindings/BigInt.res.mjs +0 -154
  212. package/src/bindings/Ethers.res.d.mts +0 -5
  213. package/src/bindings/Pino.gen.ts +0 -17
  214. package/src/bindings/Postgres.gen.ts +0 -8
  215. package/src/bindings/Postgres.res.d.mts +0 -5
  216. package/src/bindings/Promise.res +0 -67
  217. package/src/bindings/Promise.res.mjs +0 -26
  218. package/src/db/InternalTable.gen.ts +0 -36
  219. package/src/sources/HyperSyncClient.gen.ts +0 -19
@@ -1,18 +1,17 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
- import * as Caml from "rescript/lib/es6/caml.js";
4
3
  import * as Utils from "../Utils.res.mjs";
5
4
  import * as Hrtime from "../bindings/Hrtime.res.mjs";
6
- import * as Js_exn from "rescript/lib/es6/js_exn.js";
7
5
  import * as Source from "./Source.res.mjs";
8
6
  import * as Logging from "../Logging.res.mjs";
9
- import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
10
7
  import * as FetchState from "../FetchState.res.mjs";
11
8
  import * as Prometheus from "../Prometheus.res.mjs";
12
- import * as Belt_Option from "rescript/lib/es6/belt_Option.js";
13
- import * as Caml_option from "rescript/lib/es6/caml_option.js";
14
9
  import * as ErrorHandling from "../ErrorHandling.res.mjs";
15
- import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
10
+ import * as Primitive_int from "@rescript/runtime/lib/es6/Primitive_int.js";
11
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
12
+ import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
13
+ import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
14
+ import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
16
15
 
17
16
  function getActiveSource(sourceManager) {
18
17
  return sourceManager.activeSource;
@@ -22,92 +21,85 @@ function getSourceRole(sourceFor, isLive, hasLive) {
22
21
  if (isLive) {
23
22
  switch (sourceFor) {
24
23
  case "Sync" :
25
- if (hasLive) {
26
- return "Secondary";
27
- } else {
28
- return "Primary";
29
- }
30
- case "Fallback" :
24
+ if (hasLive) {
31
25
  return "Secondary";
32
- case "Live" :
26
+ } else {
33
27
  return "Primary";
34
-
28
+ }
29
+ case "Fallback" :
30
+ return "Secondary";
31
+ case "Live" :
32
+ return "Primary";
35
33
  }
36
34
  } else {
37
35
  switch (sourceFor) {
38
36
  case "Sync" :
39
- return "Primary";
37
+ return "Primary";
40
38
  case "Fallback" :
41
- return "Secondary";
39
+ return "Secondary";
42
40
  case "Live" :
43
- return ;
44
-
41
+ return;
45
42
  }
46
43
  }
47
44
  }
48
45
 
49
46
  function makeGetHeightRetryInterval(initialRetryInterval, backoffMultiplicative, maxRetryInterval) {
50
- return function (retry) {
51
- var backoff = retry === 0 ? 1 : Math.imul(retry, backoffMultiplicative);
52
- return Caml.int_min(Math.imul(initialRetryInterval, backoff), maxRetryInterval);
47
+ return retry => {
48
+ let backoff = retry === 0 ? 1 : retry * backoffMultiplicative | 0;
49
+ return Primitive_int.min(initialRetryInterval * backoff | 0, maxRetryInterval);
53
50
  };
54
51
  }
55
52
 
56
- function make(sources, maxPartitionConcurrency, isLive, newBlockStallTimeoutOpt, newBlockStallTimeoutLiveOpt, stalledPollingIntervalOpt, recoveryTimeoutOpt, getHeightRetryIntervalOpt) {
57
- var newBlockStallTimeout = newBlockStallTimeoutOpt !== undefined ? newBlockStallTimeoutOpt : 60000;
58
- var newBlockStallTimeoutLive = newBlockStallTimeoutLiveOpt !== undefined ? newBlockStallTimeoutLiveOpt : 20000;
59
- var stalledPollingInterval = stalledPollingIntervalOpt !== undefined ? stalledPollingIntervalOpt : 5000;
60
- var recoveryTimeout = recoveryTimeoutOpt !== undefined ? recoveryTimeoutOpt : 60000.0;
61
- var getHeightRetryInterval = getHeightRetryIntervalOpt !== undefined ? getHeightRetryIntervalOpt : makeGetHeightRetryInterval(1000, 2, 60000);
62
- var hasLive = sources.some(function (s) {
63
- return s.sourceFor === "Live";
64
- });
65
- var source = sources.find(function (source) {
66
- return getSourceRole(source.sourceFor, isLive, hasLive) === "Primary";
67
- });
68
- var initialActiveSource = source !== undefined ? source : Js_exn.raiseError("Invalid configuration, no data-source for historical sync provided");
53
+ function make(sources, maxPartitionConcurrency, isLive, newBlockStallTimeoutOpt, newBlockStallTimeoutLiveOpt, stalledPollingIntervalOpt, reducedPollingIntervalOpt, recoveryTimeoutOpt, getHeightRetryIntervalOpt) {
54
+ let newBlockStallTimeout = newBlockStallTimeoutOpt !== undefined ? newBlockStallTimeoutOpt : 60000;
55
+ let newBlockStallTimeoutLive = newBlockStallTimeoutLiveOpt !== undefined ? newBlockStallTimeoutLiveOpt : 20000;
56
+ let stalledPollingInterval = stalledPollingIntervalOpt !== undefined ? stalledPollingIntervalOpt : 5000;
57
+ let reducedPollingInterval = reducedPollingIntervalOpt !== undefined ? reducedPollingIntervalOpt : 60000;
58
+ let recoveryTimeout = recoveryTimeoutOpt !== undefined ? recoveryTimeoutOpt : 60000.0;
59
+ let getHeightRetryInterval = getHeightRetryIntervalOpt !== undefined ? getHeightRetryIntervalOpt : makeGetHeightRetryInterval(1000, 2, 60000);
60
+ let hasLive = sources.some(s => s.sourceFor === "Live");
61
+ let source = sources.find(source => getSourceRole(source.sourceFor, isLive, hasLive) === "Primary");
62
+ let initialActiveSource = source !== undefined ? source : Stdlib_JsError.throwWithMessage("Invalid configuration, no data-source for historical sync provided");
69
63
  Prometheus.IndexingMaxConcurrency.set(maxPartitionConcurrency, initialActiveSource.chain);
70
64
  Prometheus.IndexingConcurrency.set(0, initialActiveSource.chain);
71
65
  return {
72
- sourcesState: Belt_Array.map(sources, (function (source) {
73
- return {
74
- source: source,
75
- knownHeight: 0,
76
- unsubscribe: undefined,
77
- pendingHeightResolvers: [],
78
- disabled: false,
79
- lastFailedAt: undefined
80
- };
81
- })),
82
- statusStart: Hrtime.makeTimer(),
83
- status: "Idle",
84
- maxPartitionConcurrency: maxPartitionConcurrency,
85
- newBlockStallTimeout: newBlockStallTimeout,
86
- newBlockStallTimeoutLive: newBlockStallTimeoutLive,
87
- stalledPollingInterval: stalledPollingInterval,
88
- getHeightRetryInterval: getHeightRetryInterval,
89
- activeSource: initialActiveSource,
90
- waitingForNewBlockStateId: undefined,
91
- fetchingPartitionsCount: 0,
92
- recoveryTimeout: recoveryTimeout,
93
- hasLive: hasLive
94
- };
66
+ sourcesState: sources.map(source => ({
67
+ source: source,
68
+ knownHeight: 0,
69
+ unsubscribe: undefined,
70
+ pendingHeightResolvers: [],
71
+ disabled: false,
72
+ lastFailedAt: undefined
73
+ })),
74
+ statusStart: Hrtime.makeTimer(),
75
+ status: "Idle",
76
+ maxPartitionConcurrency: maxPartitionConcurrency,
77
+ newBlockStallTimeout: newBlockStallTimeout,
78
+ newBlockStallTimeoutLive: newBlockStallTimeoutLive,
79
+ stalledPollingInterval: stalledPollingInterval,
80
+ reducedPollingInterval: reducedPollingInterval,
81
+ getHeightRetryInterval: getHeightRetryInterval,
82
+ activeSource: initialActiveSource,
83
+ waitingForNewBlockStateId: undefined,
84
+ fetchingPartitionsCount: 0,
85
+ recoveryTimeout: recoveryTimeout,
86
+ hasLive: hasLive
87
+ };
95
88
  }
96
89
 
97
90
  function trackNewStatus(sourceManager, newStatus) {
98
- var match = sourceManager.status;
99
- var promCounter;
91
+ let match = sourceManager.status;
92
+ let promCounter;
100
93
  switch (match) {
101
94
  case "Idle" :
102
- promCounter = Prometheus.IndexingIdleTime.counter;
103
- break;
95
+ promCounter = Prometheus.IndexingIdleTime.counter;
96
+ break;
104
97
  case "WaitingForNewBlock" :
105
- promCounter = Prometheus.IndexingSourceWaitingTime.counter;
106
- break;
98
+ promCounter = Prometheus.IndexingSourceWaitingTime.counter;
99
+ break;
107
100
  case "Querieng" :
108
- promCounter = Prometheus.IndexingQueryTime.counter;
109
- break;
110
-
101
+ promCounter = Prometheus.IndexingQueryTime.counter;
102
+ break;
111
103
  }
112
104
  Prometheus.SafeCounter.handleFloat(promCounter, sourceManager.activeSource.chain, Hrtime.toSecondsFloat(Hrtime.timeSince(sourceManager.statusStart)));
113
105
  sourceManager.statusStart = Hrtime.makeTimer();
@@ -115,49 +107,47 @@ function trackNewStatus(sourceManager, newStatus) {
115
107
  }
116
108
 
117
109
  async function fetchNext(sourceManager, fetchState, executeQuery, waitForNewBlock, onNewBlock, stateId) {
118
- var nextQuery = FetchState.getNextQuery(fetchState, sourceManager.maxPartitionConcurrency - sourceManager.fetchingPartitionsCount | 0);
110
+ let nextQuery = FetchState.getNextQuery(fetchState, sourceManager.maxPartitionConcurrency - sourceManager.fetchingPartitionsCount | 0);
119
111
  if (typeof nextQuery !== "object") {
120
112
  switch (nextQuery) {
121
113
  case "WaitingForNewBlock" :
122
- var waitingStateId = sourceManager.waitingForNewBlockStateId;
123
- if (waitingStateId !== undefined && waitingStateId >= stateId) {
124
- return ;
125
- }
126
- trackNewStatus(sourceManager, "WaitingForNewBlock");
127
- sourceManager.waitingForNewBlockStateId = stateId;
128
- var knownHeight = await waitForNewBlock(fetchState.knownHeight);
129
- var waitingStateId$1 = sourceManager.waitingForNewBlockStateId;
130
- if (waitingStateId$1 !== undefined && waitingStateId$1 === stateId) {
131
- trackNewStatus(sourceManager, "Idle");
132
- sourceManager.waitingForNewBlockStateId = undefined;
133
- return onNewBlock(knownHeight);
134
- } else {
135
- return ;
136
- }
114
+ let waitingStateId = sourceManager.waitingForNewBlockStateId;
115
+ if (waitingStateId !== undefined && waitingStateId >= stateId) {
116
+ return;
117
+ }
118
+ trackNewStatus(sourceManager, "WaitingForNewBlock");
119
+ sourceManager.waitingForNewBlockStateId = stateId;
120
+ let knownHeight = await waitForNewBlock(fetchState.knownHeight);
121
+ let waitingStateId$1 = sourceManager.waitingForNewBlockStateId;
122
+ if (waitingStateId$1 !== undefined && waitingStateId$1 === stateId) {
123
+ trackNewStatus(sourceManager, "Idle");
124
+ sourceManager.waitingForNewBlockStateId = undefined;
125
+ return onNewBlock(knownHeight);
126
+ } else {
127
+ return;
128
+ }
137
129
  case "ReachedMaxConcurrency" :
138
130
  case "NothingToQuery" :
139
- return ;
140
-
131
+ return;
141
132
  }
142
133
  } else {
143
- var queries = nextQuery._0;
134
+ let queries = nextQuery._0;
144
135
  FetchState.startFetchingQueries(fetchState, queries);
145
136
  sourceManager.fetchingPartitionsCount = sourceManager.fetchingPartitionsCount + queries.length | 0;
146
137
  Prometheus.IndexingConcurrency.set(sourceManager.fetchingPartitionsCount, sourceManager.activeSource.chain);
147
138
  trackNewStatus(sourceManager, "Querieng");
148
- await Promise.all(Belt_Array.map(queries, (function (q) {
149
- var promise = executeQuery(q);
150
- promise.then(function (param) {
151
- sourceManager.fetchingPartitionsCount = sourceManager.fetchingPartitionsCount - 1 | 0;
152
- Prometheus.IndexingConcurrency.set(sourceManager.fetchingPartitionsCount, sourceManager.activeSource.chain);
153
- if (sourceManager.fetchingPartitionsCount === 0) {
154
- return trackNewStatus(sourceManager, "Idle");
155
- }
156
-
157
- });
158
- return promise;
159
- })));
160
- return ;
139
+ await Promise.all(queries.map(q => {
140
+ let promise = executeQuery(q);
141
+ promise.then(param => {
142
+ sourceManager.fetchingPartitionsCount = sourceManager.fetchingPartitionsCount - 1 | 0;
143
+ Prometheus.IndexingConcurrency.set(sourceManager.fetchingPartitionsCount, sourceManager.activeSource.chain);
144
+ if (sourceManager.fetchingPartitionsCount === 0) {
145
+ return trackNewStatus(sourceManager, "Idle");
146
+ }
147
+ });
148
+ return promise;
149
+ }));
150
+ return;
161
151
  }
162
152
  }
163
153
 
@@ -166,102 +156,96 @@ function disableSource(sourceManager, sourceState) {
166
156
  return false;
167
157
  }
168
158
  sourceState.disabled = true;
169
- var unsubscribe = sourceState.unsubscribe;
159
+ let unsubscribe = sourceState.unsubscribe;
170
160
  if (unsubscribe !== undefined) {
171
161
  unsubscribe();
172
162
  }
173
163
  if (sourceState.source.sourceFor === "Live") {
174
- var hasOtherLive = sourceManager.sourcesState.some(function (s) {
175
- if (s !== sourceState && !s.disabled) {
176
- return s.source.sourceFor === "Live";
177
- } else {
178
- return false;
179
- }
180
- });
164
+ let hasOtherLive = sourceManager.sourcesState.some(s => {
165
+ if (s !== sourceState && !s.disabled) {
166
+ return s.source.sourceFor === "Live";
167
+ } else {
168
+ return false;
169
+ }
170
+ });
181
171
  sourceManager.hasLive = hasOtherLive;
182
172
  }
183
173
  return true;
184
174
  }
185
175
 
186
- async function getSourceNewHeight(sourceManager, sourceState, knownHeight, stallTimeout, isLive, status, logger) {
187
- var source = sourceState.source;
188
- var initialHeight = sourceState.knownHeight;
189
- var newHeight = {
176
+ async function getSourceNewHeight(sourceManager, sourceState, knownHeight, stallTimeout, isLive, status, logger, reducedPolling) {
177
+ let source = sourceState.source;
178
+ let initialHeight = sourceState.knownHeight;
179
+ let newHeight = {
190
180
  contents: initialHeight
191
181
  };
192
- var retry = 0;
193
- while(newHeight.contents <= knownHeight && status.contents !== "Done") {
194
- var match = sourceState.unsubscribe;
182
+ let retry = 0;
183
+ while (newHeight.contents <= knownHeight && status.contents !== "Done") {
184
+ let match = sourceState.unsubscribe;
195
185
  if (match !== undefined) {
196
- var subscriptionPromise = new Promise((function (resolve, _reject) {
197
- sourceState.pendingHeightResolvers.push(resolve);
198
- }));
199
- var pollingFallback = Utils.delay(stallTimeout / 2 | 0).then(async function () {
200
- Logging.childTrace(logger, {
201
- msg: "onHeight subscription stale, switching to polling fallback",
202
- source: source.name,
203
- chainId: source.chain
204
- });
205
- var h = initialHeight;
206
- while(h <= knownHeight && newHeight.contents <= initialHeight) {
207
- try {
208
- h = await source.getHeightOrThrow();
209
- }
210
- catch (exn){
211
-
212
- }
213
- if (h <= knownHeight && newHeight.contents <= initialHeight) {
214
- await Utils.delay(source.pollingInterval);
215
- }
216
-
217
- };
218
- return h;
219
- });
220
- var height = await Promise.race([
221
- subscriptionPromise,
222
- pollingFallback
223
- ]);
186
+ let subscriptionPromise = new Promise((resolve, _reject) => {
187
+ sourceState.pendingHeightResolvers.push(resolve);
188
+ });
189
+ let pollingFallback = Utils.delay(stallTimeout / 2 | 0).then(async () => {
190
+ Logging.childTrace(logger, {
191
+ msg: "onHeight subscription stale, switching to polling fallback",
192
+ source: source.name,
193
+ chainId: source.chain
194
+ });
195
+ let h = initialHeight;
196
+ while (h <= knownHeight && newHeight.contents <= initialHeight) {
197
+ try {
198
+ h = await source.getHeightOrThrow();
199
+ } catch (exn) {
200
+
201
+ }
202
+ if (h <= knownHeight && newHeight.contents <= initialHeight) {
203
+ await Utils.delay(source.pollingInterval);
204
+ }
205
+ };
206
+ return h;
207
+ });
208
+ let height = await Promise.race([
209
+ subscriptionPromise,
210
+ pollingFallback
211
+ ]);
224
212
  if (height > initialHeight) {
225
213
  newHeight.contents = height;
226
214
  }
227
-
228
215
  } else {
229
216
  try {
230
- var height$1 = await source.getHeightOrThrow();
217
+ let height$1 = await source.getHeightOrThrow();
231
218
  newHeight.contents = height$1;
232
219
  if (height$1 <= knownHeight) {
233
220
  retry = 0;
234
- var createSubscription = source.createHeightSubscription;
235
- var exit = 0;
221
+ let createSubscription = source.createHeightSubscription;
222
+ let exit = 0;
236
223
  if (createSubscription !== undefined && isLive) {
237
- var unsubscribe = createSubscription(function (newHeight) {
238
- sourceState.knownHeight = newHeight;
239
- var resolvers = sourceState.pendingHeightResolvers;
240
- sourceState.pendingHeightResolvers = [];
241
- Belt_Array.forEach(resolvers, (function (resolve) {
242
- resolve(newHeight);
243
- }));
244
- });
224
+ let unsubscribe = createSubscription(newHeight => {
225
+ sourceState.knownHeight = newHeight;
226
+ let resolvers = sourceState.pendingHeightResolvers;
227
+ sourceState.pendingHeightResolvers = [];
228
+ resolvers.forEach(resolve => resolve(newHeight));
229
+ });
245
230
  sourceState.unsubscribe = unsubscribe;
246
231
  } else {
247
232
  exit = 1;
248
233
  }
249
234
  if (exit === 1) {
250
- var pollingInterval = status.contents === "Stalled" ? sourceManager.stalledPollingInterval : source.pollingInterval;
235
+ let pollingInterval = reducedPolling ? sourceManager.reducedPollingInterval : (
236
+ status.contents === "Stalled" ? sourceManager.stalledPollingInterval : source.pollingInterval
237
+ );
251
238
  await Utils.delay(pollingInterval);
252
239
  }
253
-
254
240
  }
255
-
256
- }
257
- catch (raw_exn){
258
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
259
- var retryInterval = sourceManager.getHeightRetryInterval(retry);
241
+ } catch (raw_exn) {
242
+ let exn = Primitive_exceptions.internalToException(raw_exn);
243
+ let retryInterval = sourceManager.getHeightRetryInterval(retry);
260
244
  Logging.childTrace(logger, {
261
- msg: "Height retrieval from " + source.name + " source failed. Retrying in " + String(retryInterval) + "ms.",
262
- source: source.name,
263
- err: Utils.prettifyExn(exn)
264
- });
245
+ msg: `Height retrieval from ` + source.name + ` source failed. Retrying in ` + retryInterval.toString() + `ms.`,
246
+ source: source.name,
247
+ err: Utils.prettifyExn(exn)
248
+ });
265
249
  retry = retry + 1 | 0;
266
250
  await Utils.delay(retryInterval);
267
251
  }
@@ -274,8 +258,8 @@ async function getSourceNewHeight(sourceManager, sourceState, knownHeight, stall
274
258
  }
275
259
 
276
260
  function compareByOldestFailure(a, b) {
277
- var match = a.lastFailedAt;
278
- var match$1 = b.lastFailedAt;
261
+ let match = a.lastFailedAt;
262
+ let match$1 = b.lastFailedAt;
279
263
  if (match !== undefined) {
280
264
  if (match$1 !== undefined) {
281
265
  if (match < match$1) {
@@ -296,276 +280,261 @@ function compareByOldestFailure(a, b) {
296
280
  }
297
281
 
298
282
  function getNextSources(sourceManager, isLive, excludedSources) {
299
- var now = Date.now();
300
- var workingPrimarySources = [];
301
- var allPrimarySources = [];
302
- var workingSecondarySources = [];
303
- for(var i = 0 ,i_finish = sourceManager.sourcesState.length; i < i_finish; ++i){
304
- var sourceState = sourceManager.sourcesState[i];
283
+ let now = Date.now();
284
+ let workingPrimarySources = [];
285
+ let allPrimarySources = [];
286
+ let workingSecondarySources = [];
287
+ for (let i = 0, i_finish = sourceManager.sourcesState.length; i < i_finish; ++i) {
288
+ let sourceState = sourceManager.sourcesState[i];
305
289
  if (!sourceState.disabled) {
306
- var isExcluded = excludedSources !== undefined ? Caml_option.valFromOption(excludedSources).has(sourceState) : false;
290
+ let isExcluded = excludedSources !== undefined ? Primitive_option.valFromOption(excludedSources).has(sourceState) : false;
307
291
  if (!isExcluded) {
308
- var failedAt = sourceState.lastFailedAt;
309
- var isWorking = failedAt !== undefined ? now - failedAt >= sourceManager.recoveryTimeout : true;
310
- var match = getSourceRole(sourceState.source.sourceFor, isLive, sourceManager.hasLive);
292
+ let failedAt = sourceState.lastFailedAt;
293
+ let isWorking = failedAt !== undefined ? now - failedAt >= sourceManager.recoveryTimeout : true;
294
+ let match = getSourceRole(sourceState.source.sourceFor, isLive, sourceManager.hasLive);
311
295
  if (match !== undefined) {
312
296
  if (match === "Primary") {
313
297
  allPrimarySources.push(sourceState);
314
298
  if (isWorking) {
315
299
  workingPrimarySources.push(sourceState);
316
300
  }
317
-
318
301
  } else if (isWorking) {
319
302
  workingSecondarySources.push(sourceState);
320
303
  }
321
-
322
304
  }
323
-
324
305
  }
325
-
326
306
  }
327
-
328
307
  }
329
308
  if (workingPrimarySources.length !== 0) {
330
309
  return workingPrimarySources;
331
310
  } else if (workingSecondarySources.length !== 0) {
332
311
  return workingSecondarySources;
333
312
  } else {
334
- return allPrimarySources.sort(compareByOldestFailure);
313
+ allPrimarySources.sort(compareByOldestFailure);
314
+ return allPrimarySources;
335
315
  }
336
316
  }
337
317
 
338
318
  function getNextSource(sourceManager, isLive, excludedSources) {
339
- var sources = getNextSources(sourceManager, isLive, excludedSources);
340
- var first = Belt_Array.get(sources, 0);
319
+ let sources = getNextSources(sourceManager, isLive, excludedSources);
320
+ let first = sources[0];
341
321
  if (first === undefined) {
342
- return ;
322
+ return;
343
323
  }
344
324
  if (first.source === sourceManager.activeSource) {
345
325
  return first;
346
326
  }
347
- var result = sources.find(function (s) {
348
- return s.source === sourceManager.activeSource;
349
- });
327
+ let result = sources.find(s => s.source === sourceManager.activeSource);
350
328
  if (result !== undefined) {
351
- if (result === undefined) {
352
- return ;
353
- } else {
354
- return Caml_option.some(result);
355
- }
329
+ return result;
356
330
  } else {
357
- return Belt_Array.get(sources, 0);
331
+ return sources[0];
358
332
  }
359
333
  }
360
334
 
361
- async function waitForNewBlock(sourceManager, knownHeight, isLive) {
362
- var sourcesState = sourceManager.sourcesState;
363
- var logger = Logging.createChild({
364
- chainId: sourceManager.activeSource.chain,
365
- knownHeight: knownHeight
366
- });
367
- Logging.childTrace(logger, "Initiating check for new blocks.");
368
- var mainSources = getNextSources(sourceManager, isLive, undefined);
369
- var status = {
335
+ async function waitForNewBlock(sourceManager, knownHeight, isLive, reducedPolling) {
336
+ let sourcesState = sourceManager.sourcesState;
337
+ let logger = Logging.createChild({
338
+ chainId: sourceManager.activeSource.chain,
339
+ knownHeight: knownHeight
340
+ });
341
+ if (reducedPolling) {
342
+ Logging.childTrace(logger, `Waiting for new blocks with reduced polling (` + (sourceManager.reducedPollingInterval / 1000 | 0).toString() + `s). Chain is caught up, waiting for other chains to backfill.`);
343
+ } else {
344
+ Logging.childTrace(logger, "Initiating check for new blocks.");
345
+ }
346
+ let mainSources = getNextSources(sourceManager, isLive, undefined);
347
+ let status = {
370
348
  contents: "Active"
371
349
  };
372
- var stallTimeout = isLive ? sourceManager.newBlockStallTimeoutLive : sourceManager.newBlockStallTimeout;
373
- var match = await Promise.race(Belt_Array.concat(Belt_Array.map(mainSources, (async function (sourceState) {
374
- return [
375
- sourceState.source,
376
- await getSourceNewHeight(sourceManager, sourceState, knownHeight, stallTimeout, isLive, status, logger)
377
- ];
378
- })), [Utils.delay(stallTimeout).then(function () {
379
- var fallbackSources = [];
380
- Belt_Array.forEach(sourcesState, (function (sourceState) {
381
- if (!mainSources.includes(sourceState) && Belt_Option.isSome(getSourceRole(sourceState.source.sourceFor, isLive, sourceManager.hasLive))) {
382
- fallbackSources.push(sourceState);
383
- return ;
384
- }
385
-
386
- }));
387
- if (status.contents !== "Done") {
388
- status.contents = "Stalled";
389
- if (fallbackSources.length !== 0) {
390
- Logging.childWarn(logger, "No new blocks detected within " + String(stallTimeout / 1000 | 0) + "s. Continuing polling with secondary RPC sources from the configuration.");
391
- } else {
392
- Logging.childWarn(logger, "No new blocks detected within " + String(stallTimeout / 1000 | 0) + "s. Polling will continue at a reduced rate. For better reliability, refer to our RPC fallback guide: https://docs.envio.dev/docs/HyperIndex/rpc-sync");
393
- }
394
- }
395
- return Promise.race(Belt_Array.map(fallbackSources, (async function (sourceState) {
396
- return [
397
- sourceState.source,
398
- await getSourceNewHeight(sourceManager, sourceState, knownHeight, stallTimeout, isLive, status, logger)
399
- ];
400
- })));
401
- })]));
402
- var newBlockHeight = match[1];
403
- var source = match[0];
350
+ let stallTimeout = reducedPolling ? (sourceManager.reducedPollingInterval << 1) : (
351
+ isLive ? sourceManager.newBlockStallTimeoutLive : sourceManager.newBlockStallTimeout
352
+ );
353
+ let match = await Promise.race(mainSources.map(async sourceState => [
354
+ sourceState.source,
355
+ await getSourceNewHeight(sourceManager, sourceState, knownHeight, stallTimeout, isLive, status, logger, reducedPolling)
356
+ ]).concat([Utils.delay(stallTimeout).then(() => {
357
+ let fallbackSources = [];
358
+ sourcesState.forEach(sourceState => {
359
+ if (!mainSources.includes(sourceState) && Stdlib_Option.isSome(getSourceRole(sourceState.source.sourceFor, isLive, sourceManager.hasLive))) {
360
+ fallbackSources.push(sourceState);
361
+ return;
362
+ }
363
+ });
364
+ if (status.contents !== "Done") {
365
+ status.contents = "Stalled";
366
+ if (fallbackSources.length !== 0) {
367
+ Logging.childWarn(logger, `No new blocks detected within ` + (stallTimeout / 1000 | 0).toString() + `s. Continuing polling with secondary RPC sources from the configuration.`);
368
+ } else {
369
+ Logging.childWarn(logger, `No new blocks detected within ` + (stallTimeout / 1000 | 0).toString() + `s. Polling will continue at a reduced rate. For better reliability, refer to our RPC fallback guide: https://docs.envio.dev/docs/HyperIndex/rpc-sync`);
370
+ }
371
+ }
372
+ return Promise.race(fallbackSources.map(async sourceState => [
373
+ sourceState.source,
374
+ await getSourceNewHeight(sourceManager, sourceState, knownHeight, stallTimeout, isLive, status, logger, reducedPolling)
375
+ ]));
376
+ })]));
377
+ let newBlockHeight = match[1];
378
+ let source = match[0];
404
379
  sourceManager.activeSource = source;
405
- var log = status.contents === "Stalled" ? Logging.childInfo : Logging.childTrace;
380
+ let log = status.contents === "Stalled" ? Logging.childInfo : Logging.childTrace;
406
381
  log(logger, {
407
- msg: "New blocks successfully found.",
408
- source: source.name,
409
- newBlockHeight: newBlockHeight
410
- });
382
+ msg: `New blocks successfully found.`,
383
+ source: source.name,
384
+ newBlockHeight: newBlockHeight
385
+ });
411
386
  status.contents = "Done";
412
387
  return newBlockHeight;
413
388
  }
414
389
 
415
390
  async function executeQuery(sourceManager, query, knownHeight, isLive) {
416
- var excludedSourcesRef;
417
- var toBlockRef = query.toBlock;
418
- var responseRef;
419
- var retryRef = 0;
420
- while(Belt_Option.isNone(responseRef)) {
421
- var s = getNextSource(sourceManager, isLive, excludedSourcesRef);
422
- var sourceState;
391
+ let excludedSourcesRef;
392
+ let toBlockRef = query.toBlock;
393
+ let responseRef;
394
+ let retryRef = 0;
395
+ while (Stdlib_Option.isNone(responseRef)) {
396
+ let s = getNextSource(sourceManager, isLive, excludedSourcesRef);
397
+ let sourceState;
423
398
  if (s !== undefined) {
424
399
  if (s.source !== sourceManager.activeSource) {
425
- var logger = Logging.createChild({
426
- chainId: sourceManager.activeSource.chain
427
- });
400
+ let logger = Logging.createChild({
401
+ chainId: sourceManager.activeSource.chain
402
+ });
428
403
  Logging.childInfo(logger, {
429
- msg: "Switching data-source",
430
- source: s.source.name,
431
- previousSource: sourceManager.activeSource.name,
432
- fromBlock: query.fromBlock
433
- });
404
+ msg: "Switching data-source",
405
+ source: s.source.name,
406
+ previousSource: sourceManager.activeSource.name,
407
+ fromBlock: query.fromBlock
408
+ });
434
409
  }
435
410
  sourceState = s;
436
411
  } else {
437
- var logger$1 = Logging.createChild({
438
- chainId: sourceManager.activeSource.chain
439
- });
412
+ let logger$1 = Logging.createChild({
413
+ chainId: sourceManager.activeSource.chain
414
+ });
440
415
  sourceState = ErrorHandling.mkLogAndRaise(logger$1, "The indexer doesn't have data-sources which can continue fetching. Please, check the error logs or reach out to the Envio team.", null);
441
416
  }
442
417
  sourceManager.activeSource = sourceState.source;
443
- var source = sourceState.source;
444
- var toBlock = toBlockRef;
445
- var retry = retryRef;
446
- var logger$2 = Logging.createChild({
447
- chainId: source.chain,
448
- logType: "Block Range Query",
449
- partitionId: query.partitionId,
450
- source: source.name,
451
- fromBlock: query.fromBlock,
452
- toBlock: toBlock,
453
- addresses: FetchState.addressesByContractNameCount(query.addressesByContractName),
454
- retry: retry
455
- });
418
+ let source = sourceState.source;
419
+ let toBlock = toBlockRef;
420
+ let retry = retryRef;
421
+ let logger$2 = Logging.createChild({
422
+ chainId: source.chain,
423
+ logType: "Block Range Query",
424
+ partitionId: query.partitionId,
425
+ source: source.name,
426
+ fromBlock: query.fromBlock,
427
+ toBlock: toBlock,
428
+ addresses: FetchState.addressesByContractNameCount(query.addressesByContractName),
429
+ retry: retry
430
+ });
456
431
  try {
457
- var response = await source.getItemsOrThrow(query.fromBlock, toBlock, query.addressesByContractName, query.indexingContracts, knownHeight, query.partitionId, query.selection, retry, logger$2);
432
+ let response = await source.getItemsOrThrow(query.fromBlock, toBlock, query.addressesByContractName, query.indexingAddresses, knownHeight, query.partitionId, query.selection, retry, logger$2);
458
433
  Logging.childTrace(logger$2, {
459
- msg: "Fetched block range from server",
460
- toBlock: response.latestFetchedBlockNumber,
461
- numEvents: response.parsedQueueItems.length,
462
- stats: response.stats
463
- });
434
+ msg: "Fetched block range from server",
435
+ toBlock: response.latestFetchedBlockNumber,
436
+ numEvents: response.parsedQueueItems.length,
437
+ stats: response.stats
438
+ });
464
439
  sourceState.lastFailedAt = undefined;
465
440
  responseRef = response;
466
- }
467
- catch (raw_error){
468
- var error = Caml_js_exceptions.internalToOCamlException(raw_error);
441
+ } catch (raw_error) {
442
+ let error = Primitive_exceptions.internalToException(raw_error);
469
443
  if (error.RE_EXN_ID === Source.GetItemsError) {
470
- var error$1 = error._1;
471
- var exit = 0;
444
+ let error$1 = error._1;
445
+ let exit = 0;
472
446
  switch (error$1.TAG) {
473
447
  case "UnsupportedSelection" :
474
448
  case "FailedGettingFieldSelection" :
475
- exit = 1;
476
- break;
449
+ exit = 1;
450
+ break;
477
451
  case "FailedGettingItems" :
478
- var match = error$1.retry;
479
- var attemptedToBlock = error$1.attemptedToBlock;
480
- var exn = error$1.exn;
481
- switch (match.TAG) {
482
- case "WithSuggestedToBlock" :
483
- var toBlock$1 = match.toBlock;
484
- Logging.childTrace(logger$2, {
485
- msg: "Failed getting data for the block range. Immediately retrying with the suggested block range from response.",
486
- toBlock: attemptedToBlock,
487
- suggestedToBlock: toBlock$1
488
- });
489
- toBlockRef = toBlock$1;
490
- retryRef = 0;
491
- break;
492
- case "WithBackoff" :
493
- var backoffMillis = match.backoffMillis;
494
- var log = retry >= 4 ? Logging.childWarn : Logging.childTrace;
495
- log(logger$2, {
496
- msg: match.message,
497
- toBlock: attemptedToBlock,
498
- backOffMilliseconds: backoffMillis,
499
- retry: retry,
500
- err: Utils.prettifyExn(exn)
501
- });
502
- var shouldSwitch = retry === 0 || retry === 1 ? false : retry % 2 === 0;
503
- if (shouldSwitch) {
504
- var now = Date.now();
505
- sourceState.lastFailedAt = now;
506
- var nextSource = getNextSource(sourceManager, isLive, excludedSourcesRef);
507
- var hasWorkingAlternative;
508
- if (nextSource !== undefined) {
509
- var failedAt = nextSource.lastFailedAt;
510
- hasWorkingAlternative = failedAt !== undefined ? now - failedAt >= sourceManager.recoveryTimeout : true;
511
- } else {
512
- hasWorkingAlternative = false;
513
- }
514
- if (!hasWorkingAlternative) {
515
- await Utils.delay(backoffMillis < 60000 ? backoffMillis : 60000);
516
- }
517
-
518
- } else {
519
- await Utils.delay(backoffMillis < 60000 ? backoffMillis : 60000);
520
- }
521
- retryRef = retryRef + 1 | 0;
522
- break;
523
- case "ImpossibleForTheQuery" :
524
- var s$1 = excludedSourcesRef;
525
- var excludedSources;
526
- if (s$1 !== undefined) {
527
- excludedSources = Caml_option.valFromOption(s$1);
528
- } else {
529
- var s$2 = new Set();
530
- excludedSourcesRef = Caml_option.some(s$2);
531
- excludedSources = s$2;
532
- }
533
- excludedSources.add(sourceState);
534
- Logging.childWarn(logger$2, {
535
- msg: match.message + " - Attempting another source",
536
- toBlock: attemptedToBlock,
537
- err: Utils.prettifyExn(exn)
538
- });
539
- retryRef = 0;
540
- break;
541
-
542
- }
543
- break;
544
-
452
+ let match = error$1.retry;
453
+ let attemptedToBlock = error$1.attemptedToBlock;
454
+ let exn = error$1.exn;
455
+ switch (match.TAG) {
456
+ case "WithSuggestedToBlock" :
457
+ let toBlock$1 = match.toBlock;
458
+ Logging.childTrace(logger$2, {
459
+ msg: "Failed getting data for the block range. Immediately retrying with the suggested block range from response.",
460
+ toBlock: attemptedToBlock,
461
+ suggestedToBlock: toBlock$1
462
+ });
463
+ toBlockRef = toBlock$1;
464
+ retryRef = 0;
465
+ break;
466
+ case "WithBackoff" :
467
+ let backoffMillis = match.backoffMillis;
468
+ let log = retry >= 4 ? Logging.childWarn : Logging.childTrace;
469
+ log(logger$2, {
470
+ msg: match.message,
471
+ toBlock: attemptedToBlock,
472
+ backOffMilliseconds: backoffMillis,
473
+ retry: retry,
474
+ err: Utils.prettifyExn(exn)
475
+ });
476
+ let shouldSwitch = retry !== 0 && retry !== 1 ? retry % 2 === 0 : false;
477
+ if (shouldSwitch) {
478
+ let now = Date.now();
479
+ sourceState.lastFailedAt = now;
480
+ let nextSource = getNextSource(sourceManager, isLive, excludedSourcesRef);
481
+ let hasWorkingAlternative;
482
+ if (nextSource !== undefined) {
483
+ let failedAt = nextSource.lastFailedAt;
484
+ hasWorkingAlternative = failedAt !== undefined ? now - failedAt >= sourceManager.recoveryTimeout : true;
485
+ } else {
486
+ hasWorkingAlternative = false;
487
+ }
488
+ if (!hasWorkingAlternative) {
489
+ await Utils.delay(Primitive_int.min(backoffMillis, 60000));
490
+ }
491
+ } else {
492
+ await Utils.delay(Primitive_int.min(backoffMillis, 60000));
493
+ }
494
+ retryRef = retryRef + 1 | 0;
495
+ break;
496
+ case "ImpossibleForTheQuery" :
497
+ let s$1 = excludedSourcesRef;
498
+ let excludedSources;
499
+ if (s$1 !== undefined) {
500
+ excludedSources = Primitive_option.valFromOption(s$1);
501
+ } else {
502
+ let s$2 = new Set();
503
+ excludedSourcesRef = Primitive_option.some(s$2);
504
+ excludedSources = s$2;
505
+ }
506
+ excludedSources.add(sourceState);
507
+ Logging.childWarn(logger$2, {
508
+ msg: match.message + " - Attempting another source",
509
+ toBlock: attemptedToBlock,
510
+ err: Utils.prettifyExn(exn)
511
+ });
512
+ retryRef = 0;
513
+ break;
514
+ }
515
+ break;
545
516
  }
546
517
  if (exit === 1) {
547
- var notAlreadyDisabled = disableSource(sourceManager, sourceState);
518
+ let notAlreadyDisabled = disableSource(sourceManager, sourceState);
548
519
  if (notAlreadyDisabled) {
549
520
  switch (error$1.TAG) {
550
521
  case "UnsupportedSelection" :
551
- Logging.childError(logger$2, error$1.message);
552
- break;
522
+ Logging.childError(logger$2, error$1.message);
523
+ break;
553
524
  case "FailedGettingFieldSelection" :
554
- Logging.childError(logger$2, {
555
- msg: error$1.message,
556
- err: Utils.prettifyExn(error$1.exn),
557
- blockNumber: error$1.blockNumber,
558
- logIndex: error$1.logIndex
559
- });
560
- break;
525
+ Logging.childError(logger$2, {
526
+ msg: error$1.message,
527
+ err: Utils.prettifyExn(error$1.exn),
528
+ blockNumber: error$1.blockNumber,
529
+ logIndex: error$1.logIndex
530
+ });
531
+ break;
561
532
  case "FailedGettingItems" :
562
- break;
563
-
533
+ break;
564
534
  }
565
535
  }
566
536
  retryRef = 0;
567
537
  }
568
-
569
538
  } else {
570
539
  ErrorHandling.mkLogAndRaise(logger$2, "Failed to fetch block Range", error);
571
540
  }
@@ -575,12 +544,12 @@ async function executeQuery(sourceManager, query, knownHeight, isLive) {
575
544
  }
576
545
 
577
546
  export {
578
- getSourceRole ,
579
- make ,
580
- getActiveSource ,
581
- fetchNext ,
582
- waitForNewBlock ,
583
- executeQuery ,
584
- makeGetHeightRetryInterval ,
547
+ getSourceRole,
548
+ make,
549
+ getActiveSource,
550
+ fetchNext,
551
+ waitForNewBlock,
552
+ executeQuery,
553
+ makeGetHeightRetryInterval,
585
554
  }
586
555
  /* Utils Not a pure module */