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.
- package/bin.mjs +2 -48
- package/evm.schema.json +67 -0
- package/fuel.schema.json +67 -0
- package/index.d.ts +822 -38
- package/index.js +5 -3
- package/package.json +10 -8
- package/rescript.json +5 -9
- package/src/Address.res +4 -5
- package/src/Address.res.mjs +9 -12
- package/src/Api.res +15 -0
- package/src/Api.res.mjs +20 -0
- package/src/Batch.res +32 -34
- package/src/Batch.res.mjs +172 -187
- package/src/Bin.res +89 -0
- package/src/Bin.res.mjs +97 -0
- package/src/ChainFetcher.res +33 -57
- package/src/ChainFetcher.res.mjs +197 -227
- package/src/ChainManager.res +6 -14
- package/src/ChainManager.res.mjs +74 -85
- package/src/ChainMap.res +14 -16
- package/src/ChainMap.res.mjs +38 -38
- package/src/Config.res +193 -135
- package/src/Config.res.mjs +566 -592
- package/src/Core.res +182 -0
- package/src/Core.res.mjs +207 -0
- package/src/Ecosystem.res +25 -4
- package/src/Ecosystem.res.mjs +12 -13
- package/src/Env.res +20 -13
- package/src/Env.res.mjs +124 -113
- package/src/EnvSafe.res +269 -0
- package/src/EnvSafe.res.mjs +296 -0
- package/src/EnvSafe.resi +18 -0
- package/src/Envio.res +37 -26
- package/src/Envio.res.mjs +59 -60
- package/src/ErrorHandling.res +2 -2
- package/src/ErrorHandling.res.mjs +15 -15
- package/src/EventConfigBuilder.res +219 -81
- package/src/EventConfigBuilder.res.mjs +259 -202
- package/src/EventProcessing.res +27 -38
- package/src/EventProcessing.res.mjs +165 -183
- package/src/EventUtils.res +11 -11
- package/src/EventUtils.res.mjs +21 -22
- package/src/EvmTypes.res +0 -1
- package/src/EvmTypes.res.mjs +5 -5
- package/src/FetchState.res +360 -256
- package/src/FetchState.res.mjs +958 -914
- package/src/GlobalState.res +365 -351
- package/src/GlobalState.res.mjs +958 -992
- package/src/GlobalStateManager.res +1 -2
- package/src/GlobalStateManager.res.mjs +36 -44
- package/src/HandlerLoader.res +107 -23
- package/src/HandlerLoader.res.mjs +128 -38
- package/src/HandlerRegister.res +127 -103
- package/src/HandlerRegister.res.mjs +164 -164
- package/src/HandlerRegister.resi +12 -4
- package/src/Hasura.res +35 -22
- package/src/Hasura.res.mjs +158 -167
- package/src/InMemoryStore.res +20 -27
- package/src/InMemoryStore.res.mjs +64 -80
- package/src/InMemoryTable.res +34 -39
- package/src/InMemoryTable.res.mjs +165 -170
- package/src/Internal.res +52 -33
- package/src/Internal.res.mjs +84 -81
- package/src/LazyLoader.res.mjs +55 -61
- package/src/LoadLayer.res +77 -78
- package/src/LoadLayer.res.mjs +160 -189
- package/src/LoadManager.res +16 -21
- package/src/LoadManager.res.mjs +79 -84
- package/src/LogSelection.res +236 -68
- package/src/LogSelection.res.mjs +211 -141
- package/src/Logging.res +13 -9
- package/src/Logging.res.mjs +130 -143
- package/src/Main.res +428 -51
- package/src/Main.res.mjs +528 -271
- package/src/Persistence.res +77 -84
- package/src/Persistence.res.mjs +131 -132
- package/src/PgStorage.res +291 -167
- package/src/PgStorage.res.mjs +797 -817
- package/src/Prometheus.res +50 -58
- package/src/Prometheus.res.mjs +345 -373
- package/src/ReorgDetection.res +22 -24
- package/src/ReorgDetection.res.mjs +100 -106
- package/src/SafeCheckpointTracking.res +7 -7
- package/src/SafeCheckpointTracking.res.mjs +40 -43
- package/src/SimulateItems.res +41 -49
- package/src/SimulateItems.res.mjs +257 -272
- package/src/Sink.res +2 -2
- package/src/Sink.res.mjs +22 -26
- package/src/TableIndices.res +1 -2
- package/src/TableIndices.res.mjs +42 -48
- package/src/TestIndexer.res +196 -189
- package/src/TestIndexer.res.mjs +536 -536
- package/src/TestIndexerProxyStorage.res +15 -16
- package/src/TestIndexerProxyStorage.res.mjs +98 -122
- package/src/TestIndexerWorker.res +4 -0
- package/src/TestIndexerWorker.res.mjs +7 -0
- package/src/Throttler.res +3 -3
- package/src/Throttler.res.mjs +23 -24
- package/src/Time.res +1 -1
- package/src/Time.res.mjs +18 -21
- package/src/TopicFilter.res +3 -3
- package/src/TopicFilter.res.mjs +29 -30
- package/src/UserContext.res +93 -54
- package/src/UserContext.res.mjs +197 -182
- package/src/Utils.res +141 -86
- package/src/Utils.res.mjs +334 -295
- package/src/bindings/BigDecimal.res +0 -2
- package/src/bindings/BigDecimal.res.mjs +19 -23
- package/src/bindings/ClickHouse.res +28 -27
- package/src/bindings/ClickHouse.res.mjs +243 -240
- package/src/bindings/DateFns.res +11 -11
- package/src/bindings/DateFns.res.mjs +7 -7
- package/src/bindings/EventSource.res.mjs +2 -2
- package/src/bindings/Express.res +2 -5
- package/src/bindings/Hrtime.res +2 -2
- package/src/bindings/Hrtime.res.mjs +30 -32
- package/src/bindings/Lodash.res.mjs +1 -1
- package/src/bindings/NodeJs.res +14 -9
- package/src/bindings/NodeJs.res.mjs +20 -20
- package/src/bindings/Pino.res +8 -10
- package/src/bindings/Pino.res.mjs +40 -43
- package/src/bindings/Postgres.res +2 -5
- package/src/bindings/Postgres.res.mjs +9 -9
- package/src/bindings/PromClient.res +17 -2
- package/src/bindings/PromClient.res.mjs +30 -7
- package/src/bindings/SDSL.res.mjs +2 -2
- package/src/bindings/Viem.res +4 -4
- package/src/bindings/Viem.res.mjs +20 -22
- package/src/bindings/Vitest.res +1 -1
- package/src/bindings/Vitest.res.mjs +2 -2
- package/src/bindings/WebSocket.res +1 -1
- package/src/db/EntityHistory.res +9 -3
- package/src/db/EntityHistory.res.mjs +84 -59
- package/src/db/InternalTable.res +62 -60
- package/src/db/InternalTable.res.mjs +271 -203
- package/src/db/Schema.res +1 -2
- package/src/db/Schema.res.mjs +28 -32
- package/src/db/Table.res +28 -27
- package/src/db/Table.res.mjs +276 -292
- package/src/sources/EventRouter.res +21 -16
- package/src/sources/EventRouter.res.mjs +55 -57
- package/src/sources/Evm.res +17 -1
- package/src/sources/Evm.res.mjs +16 -8
- package/src/sources/EvmChain.res +15 -17
- package/src/sources/EvmChain.res.mjs +40 -42
- package/src/sources/Fuel.res +14 -1
- package/src/sources/Fuel.res.mjs +16 -8
- package/src/sources/FuelSDK.res +1 -1
- package/src/sources/FuelSDK.res.mjs +6 -8
- package/src/sources/HyperFuel.res +8 -10
- package/src/sources/HyperFuel.res.mjs +113 -123
- package/src/sources/HyperFuelClient.res.mjs +6 -7
- package/src/sources/HyperFuelSource.res +19 -20
- package/src/sources/HyperFuelSource.res.mjs +339 -356
- package/src/sources/HyperSync.res +11 -13
- package/src/sources/HyperSync.res.mjs +206 -220
- package/src/sources/HyperSyncClient.res +5 -7
- package/src/sources/HyperSyncClient.res.mjs +70 -75
- package/src/sources/HyperSyncHeightStream.res +8 -9
- package/src/sources/HyperSyncHeightStream.res.mjs +78 -86
- package/src/sources/HyperSyncJsonApi.res +18 -15
- package/src/sources/HyperSyncJsonApi.res.mjs +201 -231
- package/src/sources/HyperSyncSource.res +17 -21
- package/src/sources/HyperSyncSource.res.mjs +268 -290
- package/src/sources/Rpc.res +5 -5
- package/src/sources/Rpc.res.mjs +168 -192
- package/src/sources/RpcSource.res +166 -167
- package/src/sources/RpcSource.res.mjs +972 -1046
- package/src/sources/RpcWebSocketHeightStream.res +10 -11
- package/src/sources/RpcWebSocketHeightStream.res.mjs +131 -145
- package/src/sources/SimulateSource.res +1 -1
- package/src/sources/SimulateSource.res.mjs +35 -38
- package/src/sources/Source.res +1 -1
- package/src/sources/Source.res.mjs +3 -3
- package/src/sources/SourceManager.res +39 -20
- package/src/sources/SourceManager.res.mjs +340 -371
- package/src/sources/SourceManager.resi +2 -1
- package/src/sources/Svm.res +12 -5
- package/src/sources/Svm.res.mjs +44 -41
- package/src/tui/Tui.res +23 -12
- package/src/tui/Tui.res.mjs +292 -290
- package/src/tui/bindings/Ink.res +2 -4
- package/src/tui/bindings/Ink.res.mjs +35 -41
- package/src/tui/components/BufferedProgressBar.res +7 -7
- package/src/tui/components/BufferedProgressBar.res.mjs +46 -46
- package/src/tui/components/CustomHooks.res +1 -2
- package/src/tui/components/CustomHooks.res.mjs +102 -122
- package/src/tui/components/Messages.res +1 -2
- package/src/tui/components/Messages.res.mjs +38 -42
- package/src/tui/components/SyncETA.res +10 -11
- package/src/tui/components/SyncETA.res.mjs +178 -196
- package/src/tui/components/TuiData.res +1 -1
- package/src/tui/components/TuiData.res.mjs +7 -6
- package/src/vendored/Rest.res +52 -66
- package/src/vendored/Rest.res.mjs +324 -364
- package/svm.schema.json +67 -0
- package/src/Address.gen.ts +0 -8
- package/src/Config.gen.ts +0 -19
- package/src/Envio.gen.ts +0 -55
- package/src/EvmTypes.gen.ts +0 -6
- package/src/InMemoryStore.gen.ts +0 -6
- package/src/Internal.gen.ts +0 -64
- package/src/PgStorage.gen.ts +0 -10
- package/src/PgStorage.res.d.mts +0 -5
- package/src/Types.ts +0 -56
- package/src/bindings/BigDecimal.gen.ts +0 -14
- package/src/bindings/BigDecimal.res.d.mts +0 -5
- package/src/bindings/BigInt.gen.ts +0 -10
- package/src/bindings/BigInt.res +0 -70
- package/src/bindings/BigInt.res.d.mts +0 -5
- package/src/bindings/BigInt.res.mjs +0 -154
- package/src/bindings/Ethers.res.d.mts +0 -5
- package/src/bindings/Pino.gen.ts +0 -17
- package/src/bindings/Postgres.gen.ts +0 -8
- package/src/bindings/Postgres.res.d.mts +0 -5
- package/src/bindings/Promise.res +0 -67
- package/src/bindings/Promise.res.mjs +0 -26
- package/src/db/InternalTable.gen.ts +0 -36
- 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
|
|
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
|
-
|
|
26
|
-
return "Secondary";
|
|
27
|
-
} else {
|
|
28
|
-
return "Primary";
|
|
29
|
-
}
|
|
30
|
-
case "Fallback" :
|
|
24
|
+
if (hasLive) {
|
|
31
25
|
return "Secondary";
|
|
32
|
-
|
|
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
|
-
|
|
37
|
+
return "Primary";
|
|
40
38
|
case "Fallback" :
|
|
41
|
-
|
|
39
|
+
return "Secondary";
|
|
42
40
|
case "Live" :
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
return;
|
|
45
42
|
}
|
|
46
43
|
}
|
|
47
44
|
}
|
|
48
45
|
|
|
49
46
|
function makeGetHeightRetryInterval(initialRetryInterval, backoffMultiplicative, maxRetryInterval) {
|
|
50
|
-
return
|
|
51
|
-
|
|
52
|
-
return
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
99
|
-
|
|
91
|
+
let match = sourceManager.status;
|
|
92
|
+
let promCounter;
|
|
100
93
|
switch (match) {
|
|
101
94
|
case "Idle" :
|
|
102
|
-
|
|
103
|
-
|
|
95
|
+
promCounter = Prometheus.IndexingIdleTime.counter;
|
|
96
|
+
break;
|
|
104
97
|
case "WaitingForNewBlock" :
|
|
105
|
-
|
|
106
|
-
|
|
98
|
+
promCounter = Prometheus.IndexingSourceWaitingTime.counter;
|
|
99
|
+
break;
|
|
107
100
|
case "Querieng" :
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
140
|
-
|
|
131
|
+
return;
|
|
141
132
|
}
|
|
142
133
|
} else {
|
|
143
|
-
|
|
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(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
159
|
+
let unsubscribe = sourceState.unsubscribe;
|
|
170
160
|
if (unsubscribe !== undefined) {
|
|
171
161
|
unsubscribe();
|
|
172
162
|
}
|
|
173
163
|
if (sourceState.source.sourceFor === "Live") {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
193
|
-
while(newHeight.contents <= knownHeight && status.contents !== "Done") {
|
|
194
|
-
|
|
182
|
+
let retry = 0;
|
|
183
|
+
while (newHeight.contents <= knownHeight && status.contents !== "Done") {
|
|
184
|
+
let match = sourceState.unsubscribe;
|
|
195
185
|
if (match !== undefined) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
217
|
+
let height$1 = await source.getHeightOrThrow();
|
|
231
218
|
newHeight.contents = height$1;
|
|
232
219
|
if (height$1 <= knownHeight) {
|
|
233
220
|
retry = 0;
|
|
234
|
-
|
|
235
|
-
|
|
221
|
+
let createSubscription = source.createHeightSubscription;
|
|
222
|
+
let exit = 0;
|
|
236
223
|
if (createSubscription !== undefined && isLive) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
-
|
|
278
|
-
|
|
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
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
for(
|
|
304
|
-
|
|
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
|
-
|
|
290
|
+
let isExcluded = excludedSources !== undefined ? Primitive_option.valFromOption(excludedSources).has(sourceState) : false;
|
|
307
291
|
if (!isExcluded) {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
|
|
313
|
+
allPrimarySources.sort(compareByOldestFailure);
|
|
314
|
+
return allPrimarySources;
|
|
335
315
|
}
|
|
336
316
|
}
|
|
337
317
|
|
|
338
318
|
function getNextSource(sourceManager, isLive, excludedSources) {
|
|
339
|
-
|
|
340
|
-
|
|
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
|
-
|
|
348
|
-
return s.source === sourceManager.activeSource;
|
|
349
|
-
});
|
|
327
|
+
let result = sources.find(s => s.source === sourceManager.activeSource);
|
|
350
328
|
if (result !== undefined) {
|
|
351
|
-
|
|
352
|
-
return ;
|
|
353
|
-
} else {
|
|
354
|
-
return Caml_option.some(result);
|
|
355
|
-
}
|
|
329
|
+
return result;
|
|
356
330
|
} else {
|
|
357
|
-
return
|
|
331
|
+
return sources[0];
|
|
358
332
|
}
|
|
359
333
|
}
|
|
360
334
|
|
|
361
|
-
async function waitForNewBlock(sourceManager, knownHeight, isLive) {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
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
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
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
|
-
|
|
380
|
+
let log = status.contents === "Stalled" ? Logging.childInfo : Logging.childTrace;
|
|
406
381
|
log(logger, {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
while(
|
|
421
|
-
|
|
422
|
-
|
|
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
|
-
|
|
426
|
-
|
|
427
|
-
|
|
400
|
+
let logger = Logging.createChild({
|
|
401
|
+
chainId: sourceManager.activeSource.chain
|
|
402
|
+
});
|
|
428
403
|
Logging.childInfo(logger, {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
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
|
-
|
|
438
|
-
|
|
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
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
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
|
-
|
|
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
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
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
|
-
|
|
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
|
-
|
|
471
|
-
|
|
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
|
-
|
|
476
|
-
|
|
449
|
+
exit = 1;
|
|
450
|
+
break;
|
|
477
451
|
case "FailedGettingItems" :
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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
|
-
|
|
518
|
+
let notAlreadyDisabled = disableSource(sourceManager, sourceState);
|
|
548
519
|
if (notAlreadyDisabled) {
|
|
549
520
|
switch (error$1.TAG) {
|
|
550
521
|
case "UnsupportedSelection" :
|
|
551
|
-
|
|
552
|
-
|
|
522
|
+
Logging.childError(logger$2, error$1.message);
|
|
523
|
+
break;
|
|
553
524
|
case "FailedGettingFieldSelection" :
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
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
|
-
|
|
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 */
|