envio 3.0.0-alpha.0 → 3.0.0-alpha.2
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/evm.schema.json +19 -15
- package/fuel.schema.json +3 -10
- package/package.json +14 -11
- package/rescript.json +1 -1
- package/src/Config.res +4 -7
- package/src/Config.res.mjs +4 -6
- package/src/{Platform.res → Ecosystem.res} +3 -3
- package/src/{Platform.res.mjs → Ecosystem.res.mjs} +2 -2
- package/src/Env.res +244 -0
- package/src/Env.res.mjs +273 -0
- package/src/EventRegister.res +4 -15
- package/src/EventRegister.res.mjs +3 -9
- package/src/EventRegister.resi +2 -8
- package/src/Internal.gen.ts +3 -14
- package/src/Internal.res +2 -11
- package/src/bindings/EventSource.res +13 -0
- package/src/bindings/EventSource.res.mjs +2 -0
- package/src/bindings/Pino.res +2 -2
- package/src/bindings/Pino.res.mjs +1 -1
- package/src/sources/HyperSyncHeightStream.res +179 -0
- package/src/sources/HyperSyncHeightStream.res.mjs +127 -0
- package/src/sources/HyperSyncSource.res +2 -60
- package/src/sources/HyperSyncSource.res.mjs +5 -61
package/evm.schema.json
CHANGED
|
@@ -50,18 +50,22 @@
|
|
|
50
50
|
"$ref": "#/$defs/GlobalContract_for_ContractConfig"
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
|
-
"
|
|
54
|
-
"description": "Configuration of the blockchain
|
|
53
|
+
"chains": {
|
|
54
|
+
"description": "Configuration of the blockchain chains that the project is deployed on.",
|
|
55
55
|
"type": "array",
|
|
56
56
|
"items": {
|
|
57
57
|
"$ref": "#/$defs/Network"
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
|
-
"
|
|
61
|
-
"description": "
|
|
62
|
-
"
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
"multichain": {
|
|
61
|
+
"description": "Multichain mode: 'ordered' processes events across chains in order, 'unordered' processes chain events in order, but non-deterministically relatively to other chains (default: unordered)",
|
|
62
|
+
"anyOf": [
|
|
63
|
+
{
|
|
64
|
+
"$ref": "#/$defs/Multichain"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"type": "null"
|
|
68
|
+
}
|
|
65
69
|
]
|
|
66
70
|
},
|
|
67
71
|
"event_decoder": {
|
|
@@ -107,13 +111,6 @@
|
|
|
107
111
|
"null"
|
|
108
112
|
]
|
|
109
113
|
},
|
|
110
|
-
"preload_handlers": {
|
|
111
|
-
"description": "Makes handlers run twice to enable preload optimisations. Removes handlerWithLoader API, since it's not needed. (recommended, default: false)",
|
|
112
|
-
"type": [
|
|
113
|
-
"boolean",
|
|
114
|
-
"null"
|
|
115
|
-
]
|
|
116
|
-
},
|
|
117
114
|
"address_format": {
|
|
118
115
|
"description": "Address format for Ethereum addresses: 'checksum' or 'lowercase' (default: checksum)",
|
|
119
116
|
"anyOf": [
|
|
@@ -136,7 +133,7 @@
|
|
|
136
133
|
"additionalProperties": false,
|
|
137
134
|
"required": [
|
|
138
135
|
"name",
|
|
139
|
-
"
|
|
136
|
+
"chains"
|
|
140
137
|
],
|
|
141
138
|
"$defs": {
|
|
142
139
|
"EcosystemTag": {
|
|
@@ -675,6 +672,13 @@
|
|
|
675
672
|
}
|
|
676
673
|
]
|
|
677
674
|
},
|
|
675
|
+
"Multichain": {
|
|
676
|
+
"type": "string",
|
|
677
|
+
"enum": [
|
|
678
|
+
"ordered",
|
|
679
|
+
"unordered"
|
|
680
|
+
]
|
|
681
|
+
},
|
|
678
682
|
"EventDecoder": {
|
|
679
683
|
"type": "string",
|
|
680
684
|
"enum": [
|
package/fuel.schema.json
CHANGED
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"$ref": "#/$defs/GlobalContract_for_ContractConfig"
|
|
44
44
|
}
|
|
45
45
|
},
|
|
46
|
-
"
|
|
47
|
-
"description": "Configuration of the blockchain
|
|
46
|
+
"chains": {
|
|
47
|
+
"description": "Configuration of the blockchain chains that the project is deployed on.",
|
|
48
48
|
"type": "array",
|
|
49
49
|
"items": {
|
|
50
50
|
"$ref": "#/$defs/Network"
|
|
@@ -57,13 +57,6 @@
|
|
|
57
57
|
"null"
|
|
58
58
|
]
|
|
59
59
|
},
|
|
60
|
-
"preload_handlers": {
|
|
61
|
-
"description": "Makes handlers run twice to enable preload optimisations. Removes handlerWithLoader API, since it's not needed. (recommended, default: false)",
|
|
62
|
-
"type": [
|
|
63
|
-
"boolean",
|
|
64
|
-
"null"
|
|
65
|
-
]
|
|
66
|
-
},
|
|
67
60
|
"handlers": {
|
|
68
61
|
"description": "Optional relative path to handlers directory for auto-loading. Defaults to 'src/handlers' if not specified.",
|
|
69
62
|
"type": [
|
|
@@ -76,7 +69,7 @@
|
|
|
76
69
|
"required": [
|
|
77
70
|
"name",
|
|
78
71
|
"ecosystem",
|
|
79
|
-
"
|
|
72
|
+
"chains"
|
|
80
73
|
],
|
|
81
74
|
"$defs": {
|
|
82
75
|
"EcosystemTag": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "envio",
|
|
3
|
-
"version": "v3.0.0-alpha.
|
|
3
|
+
"version": "v3.0.0-alpha.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A latency and sync speed optimized, developer friendly blockchain data indexer.",
|
|
6
6
|
"bin": "./bin.js",
|
|
@@ -29,23 +29,26 @@
|
|
|
29
29
|
"node": ">=22.0.0"
|
|
30
30
|
},
|
|
31
31
|
"optionalDependencies": {
|
|
32
|
-
"envio-linux-x64": "v3.0.0-alpha.
|
|
33
|
-
"envio-linux-arm64": "v3.0.0-alpha.
|
|
34
|
-
"envio-darwin-x64": "v3.0.0-alpha.
|
|
35
|
-
"envio-darwin-arm64": "v3.0.0-alpha.
|
|
32
|
+
"envio-linux-x64": "v3.0.0-alpha.2",
|
|
33
|
+
"envio-linux-arm64": "v3.0.0-alpha.2",
|
|
34
|
+
"envio-darwin-x64": "v3.0.0-alpha.2",
|
|
35
|
+
"envio-darwin-arm64": "v3.0.0-alpha.2"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@clickhouse/client": "1.12.1",
|
|
39
|
-
"@
|
|
39
|
+
"@elastic/ecs-pino-format": "1.4.0",
|
|
40
40
|
"@envio-dev/hyperfuel-client": "1.2.2",
|
|
41
|
-
"
|
|
42
|
-
"rescript-schema": "9.3.4",
|
|
43
|
-
"viem": "2.21.0",
|
|
41
|
+
"@envio-dev/hypersync-client": "0.7.0",
|
|
44
42
|
"bignumber.js": "9.1.2",
|
|
43
|
+
"eventsource": "4.1.0",
|
|
45
44
|
"pino": "8.16.1",
|
|
46
45
|
"pino-pretty": "10.2.3",
|
|
47
|
-
"
|
|
48
|
-
"
|
|
46
|
+
"prom-client": "15.0.0",
|
|
47
|
+
"rescript": "11.1.3",
|
|
48
|
+
"rescript-schema": "9.3.4",
|
|
49
|
+
"viem": "2.21.0",
|
|
50
|
+
"rescript-envsafe": "5.0.0",
|
|
51
|
+
"dotenv": "16.4.5"
|
|
49
52
|
},
|
|
50
53
|
"files": [
|
|
51
54
|
"bin.js",
|
package/rescript.json
CHANGED
package/src/Config.res
CHANGED
|
@@ -45,9 +45,8 @@ type t = {
|
|
|
45
45
|
multichain: multichain,
|
|
46
46
|
chainMap: ChainMap.t<chain>,
|
|
47
47
|
defaultChain: option<chain>,
|
|
48
|
-
|
|
48
|
+
ecosystem: Ecosystem.t,
|
|
49
49
|
enableRawEvents: bool,
|
|
50
|
-
preloadHandlers: bool,
|
|
51
50
|
maxAddrInPartition: int,
|
|
52
51
|
batchSize: int,
|
|
53
52
|
lowercaseAddresses: bool,
|
|
@@ -59,8 +58,7 @@ let make = (
|
|
|
59
58
|
~shouldSaveFullHistory=false,
|
|
60
59
|
~chains: array<chain>=[],
|
|
61
60
|
~enableRawEvents=false,
|
|
62
|
-
~
|
|
63
|
-
~ecosystem: Platform.name=Platform.Evm,
|
|
61
|
+
~ecosystem: Ecosystem.name=Ecosystem.Evm,
|
|
64
62
|
~batchSize=5000,
|
|
65
63
|
~lowercaseAddresses=false,
|
|
66
64
|
~multichain=Unordered,
|
|
@@ -90,7 +88,7 @@ let make = (
|
|
|
90
88
|
})
|
|
91
89
|
})
|
|
92
90
|
|
|
93
|
-
let
|
|
91
|
+
let ecosystem = Ecosystem.fromName(ecosystem)
|
|
94
92
|
|
|
95
93
|
{
|
|
96
94
|
shouldRollbackOnReorg,
|
|
@@ -99,9 +97,8 @@ let make = (
|
|
|
99
97
|
chainMap,
|
|
100
98
|
defaultChain: chains->Array.get(0),
|
|
101
99
|
enableRawEvents,
|
|
102
|
-
|
|
100
|
+
ecosystem,
|
|
103
101
|
maxAddrInPartition,
|
|
104
|
-
preloadHandlers,
|
|
105
102
|
batchSize,
|
|
106
103
|
lowercaseAddresses,
|
|
107
104
|
addContractNameToContractNameMapping,
|
package/src/Config.res.mjs
CHANGED
|
@@ -3,15 +3,14 @@
|
|
|
3
3
|
import * as Utils from "./Utils.res.mjs";
|
|
4
4
|
import * as Js_exn from "rescript/lib/es6/js_exn.js";
|
|
5
5
|
import * as ChainMap from "./ChainMap.res.mjs";
|
|
6
|
-
import * as
|
|
6
|
+
import * as Ecosystem from "./Ecosystem.res.mjs";
|
|
7
7
|
import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
|
|
8
8
|
|
|
9
|
-
function make(shouldRollbackOnReorgOpt, shouldSaveFullHistoryOpt, chainsOpt, enableRawEventsOpt,
|
|
9
|
+
function make(shouldRollbackOnReorgOpt, shouldSaveFullHistoryOpt, chainsOpt, enableRawEventsOpt, ecosystemOpt, batchSizeOpt, lowercaseAddressesOpt, multichainOpt, shouldUseHypersyncClientDecoderOpt, maxAddrInPartitionOpt) {
|
|
10
10
|
var shouldRollbackOnReorg = shouldRollbackOnReorgOpt !== undefined ? shouldRollbackOnReorgOpt : true;
|
|
11
11
|
var shouldSaveFullHistory = shouldSaveFullHistoryOpt !== undefined ? shouldSaveFullHistoryOpt : false;
|
|
12
12
|
var chains = chainsOpt !== undefined ? chainsOpt : [];
|
|
13
13
|
var enableRawEvents = enableRawEventsOpt !== undefined ? enableRawEventsOpt : false;
|
|
14
|
-
var preloadHandlers = preloadHandlersOpt !== undefined ? preloadHandlersOpt : false;
|
|
15
14
|
var ecosystem = ecosystemOpt !== undefined ? ecosystemOpt : "evm";
|
|
16
15
|
var batchSize = batchSizeOpt !== undefined ? batchSizeOpt : 5000;
|
|
17
16
|
var lowercaseAddresses = lowercaseAddressesOpt !== undefined ? lowercaseAddressesOpt : false;
|
|
@@ -34,16 +33,15 @@ function make(shouldRollbackOnReorgOpt, shouldSaveFullHistoryOpt, chainsOpt, ena
|
|
|
34
33
|
addContractNameToContractNameMapping[addKey] = contract.name;
|
|
35
34
|
}));
|
|
36
35
|
}));
|
|
37
|
-
var
|
|
36
|
+
var ecosystem$1 = Ecosystem.fromName(ecosystem);
|
|
38
37
|
return {
|
|
39
38
|
shouldRollbackOnReorg: shouldRollbackOnReorg,
|
|
40
39
|
shouldSaveFullHistory: shouldSaveFullHistory,
|
|
41
40
|
multichain: multichain,
|
|
42
41
|
chainMap: chainMap,
|
|
43
42
|
defaultChain: Belt_Array.get(chains, 0),
|
|
44
|
-
|
|
43
|
+
ecosystem: ecosystem$1,
|
|
45
44
|
enableRawEvents: enableRawEvents,
|
|
46
|
-
preloadHandlers: preloadHandlers,
|
|
47
45
|
maxAddrInPartition: maxAddrInPartition,
|
|
48
46
|
batchSize: batchSize,
|
|
49
47
|
lowercaseAddresses: lowercaseAddresses,
|
|
@@ -132,9 +132,9 @@ let fromName = (name: name): t => {
|
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
// Create a block event object for block handlers based on
|
|
136
|
-
let makeBlockEvent = (~blockNumber: int,
|
|
135
|
+
// Create a block event object for block handlers based on ecosystem
|
|
136
|
+
let makeBlockEvent = (~blockNumber: int, ecosystem: t): Internal.blockEvent => {
|
|
137
137
|
let blockEvent = Js.Dict.empty()
|
|
138
|
-
blockEvent->Js.Dict.set(
|
|
138
|
+
blockEvent->Js.Dict.set(ecosystem.blockNumberName, blockNumber->Utils.magic)
|
|
139
139
|
blockEvent->Utils.magic
|
|
140
140
|
}
|
|
@@ -153,9 +153,9 @@ function fromName(name) {
|
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
function makeBlockEvent(blockNumber,
|
|
156
|
+
function makeBlockEvent(blockNumber, ecosystem) {
|
|
157
157
|
var blockEvent = {};
|
|
158
|
-
blockEvent[
|
|
158
|
+
blockEvent[ecosystem.blockNumberName] = blockNumber;
|
|
159
159
|
return blockEvent;
|
|
160
160
|
}
|
|
161
161
|
|
package/src/Env.res
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
|
|
2
|
+
// Loads the .env from the root working directory
|
|
3
|
+
%%raw(`import 'dotenv/config'`)
|
|
4
|
+
|
|
5
|
+
%%private(
|
|
6
|
+
let envSafe = EnvSafe.make()
|
|
7
|
+
|
|
8
|
+
let getLogLevelConfig = (name, ~default): Pino.logLevel =>
|
|
9
|
+
envSafe->EnvSafe.get(
|
|
10
|
+
name,
|
|
11
|
+
S.enum([#trace, #debug, #info, #warn, #error, #fatal, #udebug, #uinfo, #uwarn, #uerror]),
|
|
12
|
+
~fallback=default,
|
|
13
|
+
)
|
|
14
|
+
)
|
|
15
|
+
// resets the timestampCaughtUpToHeadOrEndblock after a restart when true
|
|
16
|
+
let updateSyncTimeOnRestart =
|
|
17
|
+
envSafe->EnvSafe.get("UPDATE_SYNC_TIME_ON_RESTART", S.bool, ~fallback=true)
|
|
18
|
+
let batchSize = envSafe->EnvSafe.get("MAX_BATCH_SIZE", S.option(S.int))
|
|
19
|
+
let targetBufferSize = envSafe->EnvSafe.get("ENVIO_INDEXING_MAX_BUFFER_SIZE", S.option(S.int))
|
|
20
|
+
let maxAddrInPartition = envSafe->EnvSafe.get("MAX_PARTITION_SIZE", S.int, ~fallback=5_000)
|
|
21
|
+
let maxPartitionConcurrency =
|
|
22
|
+
envSafe->EnvSafe.get("ENVIO_MAX_PARTITION_CONCURRENCY", S.int, ~fallback=10)
|
|
23
|
+
let indexingBlockLag = envSafe->EnvSafe.get("ENVIO_INDEXING_BLOCK_LAG", S.option(S.int))
|
|
24
|
+
|
|
25
|
+
// FIXME: This broke HS grafana dashboard. Should investigate it later. Maybe we should use :: as a default value?
|
|
26
|
+
// We want to be able to set it to 0.0.0.0
|
|
27
|
+
// to allow to passthrough the port from a Docker container
|
|
28
|
+
// let serverHost = envSafe->EnvSafe.get("ENVIO_INDEXER_HOST", S.string, ~fallback="localhost")
|
|
29
|
+
let serverPort =
|
|
30
|
+
envSafe->EnvSafe.get(
|
|
31
|
+
"ENVIO_INDEXER_PORT",
|
|
32
|
+
S.int->S.port,
|
|
33
|
+
~fallback=envSafe->EnvSafe.get("METRICS_PORT", S.int->S.port, ~fallback=9898),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
let tuiOffEnvVar = envSafe->EnvSafe.get("TUI_OFF", S.bool, ~fallback=false)
|
|
37
|
+
|
|
38
|
+
let logFilePath = envSafe->EnvSafe.get("LOG_FILE", S.string, ~fallback="logs/envio.log")
|
|
39
|
+
let userLogLevel = getLogLevelConfig("LOG_LEVEL", ~default=#info)
|
|
40
|
+
let defaultFileLogLevel = getLogLevelConfig("FILE_LOG_LEVEL", ~default=#trace)
|
|
41
|
+
|
|
42
|
+
let prodEnvioAppUrl = "https://envio.dev"
|
|
43
|
+
let envioAppUrl = envSafe->EnvSafe.get("ENVIO_APP", S.string, ~fallback=prodEnvioAppUrl)
|
|
44
|
+
let envioApiToken = envSafe->EnvSafe.get("ENVIO_API_TOKEN", S.option(S.string))
|
|
45
|
+
let hyperSyncClientTimeoutMillis =
|
|
46
|
+
envSafe->EnvSafe.get("ENVIO_HYPERSYNC_CLIENT_TIMEOUT_MILLIS", S.int, ~fallback=120_000)
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
This is the number of retries that the binary client makes before rejecting the promise with an error
|
|
50
|
+
Default is 0 so that the indexer can handle retries internally
|
|
51
|
+
*/
|
|
52
|
+
let hyperSyncClientMaxRetries =
|
|
53
|
+
envSafe->EnvSafe.get("ENVIO_HYPERSYNC_CLIENT_MAX_RETRIES", S.int, ~fallback=0)
|
|
54
|
+
|
|
55
|
+
let hypersyncClientSerializationFormat =
|
|
56
|
+
envSafe->EnvSafe.get(
|
|
57
|
+
"ENVIO_HYPERSYNC_CLIENT_SERIALIZATION_FORMAT",
|
|
58
|
+
HyperSyncClient.serializationFormatSchema,
|
|
59
|
+
~fallback=CapnProto,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
let hypersyncClientEnableQueryCaching =
|
|
63
|
+
envSafe->EnvSafe.get("ENVIO_HYPERSYNC_CLIENT_ENABLE_QUERY_CACHING", S.bool, ~fallback=true)
|
|
64
|
+
|
|
65
|
+
module Benchmark = {
|
|
66
|
+
module SaveDataStrategy: {
|
|
67
|
+
type t
|
|
68
|
+
let schema: S.t<t>
|
|
69
|
+
let default: t
|
|
70
|
+
let shouldSaveJsonFile: t => bool
|
|
71
|
+
let shouldSavePrometheus: t => bool
|
|
72
|
+
let shouldSaveData: t => bool
|
|
73
|
+
} = {
|
|
74
|
+
@unboxed
|
|
75
|
+
type t = Bool(bool) | @as("json-file") JsonFile | @as("prometheus") Prometheus
|
|
76
|
+
|
|
77
|
+
let schema = S.enum([Bool(true), Bool(false), JsonFile, Prometheus])
|
|
78
|
+
let default = Bool(false)
|
|
79
|
+
|
|
80
|
+
let shouldSaveJsonFile = self =>
|
|
81
|
+
switch self {
|
|
82
|
+
| JsonFile | Bool(true) => true
|
|
83
|
+
| _ => false
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
let shouldSavePrometheus = _ => true
|
|
87
|
+
|
|
88
|
+
let shouldSaveData = self => self->shouldSavePrometheus || self->shouldSaveJsonFile
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
let saveDataStrategy =
|
|
92
|
+
envSafe->EnvSafe.get(
|
|
93
|
+
"ENVIO_SAVE_BENCHMARK_DATA",
|
|
94
|
+
SaveDataStrategy.schema,
|
|
95
|
+
~fallback=SaveDataStrategy.default,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
let shouldSaveData = saveDataStrategy->SaveDataStrategy.shouldSaveData
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
StdDev involves saving sum of squares of data points, which could get very large.
|
|
102
|
+
|
|
103
|
+
Currently only do this for local runs on json-file and not prometheus.
|
|
104
|
+
*/
|
|
105
|
+
let shouldSaveStdDev =
|
|
106
|
+
saveDataStrategy->SaveDataStrategy.shouldSaveJsonFile
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let logStrategy =
|
|
110
|
+
envSafe->EnvSafe.get(
|
|
111
|
+
"LOG_STRATEGY",
|
|
112
|
+
S.enum([
|
|
113
|
+
Logging.EcsFile,
|
|
114
|
+
EcsConsole,
|
|
115
|
+
EcsConsoleMultistream,
|
|
116
|
+
FileOnly,
|
|
117
|
+
ConsoleRaw,
|
|
118
|
+
ConsolePretty,
|
|
119
|
+
Both,
|
|
120
|
+
]),
|
|
121
|
+
~fallback=ConsolePretty,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
Logging.setLogger(
|
|
125
|
+
Logging.makeLogger(~logStrategy, ~logFilePath, ~defaultFileLogLevel, ~userLogLevel),
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
module Db = {
|
|
129
|
+
let host = envSafe->EnvSafe.get("ENVIO_PG_HOST", S.string, ~devFallback="localhost")
|
|
130
|
+
let port = envSafe->EnvSafe.get("ENVIO_PG_PORT", S.int->S.port, ~devFallback=5433)
|
|
131
|
+
let user = envSafe->EnvSafe.get("ENVIO_PG_USER", S.string, ~devFallback="postgres")
|
|
132
|
+
let password = envSafe->EnvSafe.get(
|
|
133
|
+
"ENVIO_PG_PASSWORD",
|
|
134
|
+
S.string,
|
|
135
|
+
~fallback={
|
|
136
|
+
envSafe->EnvSafe.get("ENVIO_POSTGRES_PASSWORD", S.string, ~fallback="testing")
|
|
137
|
+
},
|
|
138
|
+
)
|
|
139
|
+
let database = envSafe->EnvSafe.get("ENVIO_PG_DATABASE", S.string, ~devFallback="envio-dev")
|
|
140
|
+
let publicSchema = envSafe->EnvSafe.get("ENVIO_PG_PUBLIC_SCHEMA", S.string, ~fallback="public")
|
|
141
|
+
let ssl = envSafe->EnvSafe.get(
|
|
142
|
+
"ENVIO_PG_SSL_MODE",
|
|
143
|
+
Postgres.sslOptionsSchema,
|
|
144
|
+
//this is a dev fallback option for local deployments, shouldn't run in the prod env
|
|
145
|
+
//the SSL modes should be provided as string otherwise as 'require' | 'allow' | 'prefer' | 'verify-full'
|
|
146
|
+
~devFallback=Bool(false),
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
module ClickHouseSink = {
|
|
151
|
+
let host = envSafe->EnvSafe.get("ENVIO_CLICKHOUSE_SINK_HOST", S.option(S.string))
|
|
152
|
+
let database = envSafe->EnvSafe.get("ENVIO_CLICKHOUSE_SINK_DATABASE", S.option(S.string))
|
|
153
|
+
let username = switch host {
|
|
154
|
+
| None => ""
|
|
155
|
+
| Some(_) => envSafe->EnvSafe.get("ENVIO_CLICKHOUSE_SINK_USERNAME", S.string)
|
|
156
|
+
}
|
|
157
|
+
let password = switch host {
|
|
158
|
+
| None => ""
|
|
159
|
+
| Some(_) => envSafe->EnvSafe.get("ENVIO_CLICKHOUSE_SINK_PASSWORD", S.string)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
module Hasura = {
|
|
164
|
+
// Disable it on HS indexer run, since we don't have Hasura credentials anyways
|
|
165
|
+
// Also, it might be useful for some users who don't care about Hasura
|
|
166
|
+
let enabled = envSafe->EnvSafe.get("ENVIO_HASURA", S.bool, ~fallback=true)
|
|
167
|
+
|
|
168
|
+
let responseLimit = switch envSafe->EnvSafe.get("ENVIO_HASURA_RESPONSE_LIMIT", S.option(S.int)) {
|
|
169
|
+
| Some(_) as s => s
|
|
170
|
+
| None => envSafe->EnvSafe.get("HASURA_RESPONSE_LIMIT", S.option(S.int))
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
let graphqlEndpoint =
|
|
174
|
+
envSafe->EnvSafe.get(
|
|
175
|
+
"HASURA_GRAPHQL_ENDPOINT",
|
|
176
|
+
S.string,
|
|
177
|
+
~devFallback="http://localhost:8080/v1/metadata",
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
let url = graphqlEndpoint->Js.String2.slice(~from=0, ~to_=-("/v1/metadata"->Js.String2.length))
|
|
181
|
+
|
|
182
|
+
let role = envSafe->EnvSafe.get("HASURA_GRAPHQL_ROLE", S.string, ~devFallback="admin")
|
|
183
|
+
|
|
184
|
+
let secret = envSafe->EnvSafe.get("HASURA_GRAPHQL_ADMIN_SECRET", S.string, ~devFallback="testing")
|
|
185
|
+
|
|
186
|
+
let aggregateEntities = envSafe->EnvSafe.get(
|
|
187
|
+
"ENVIO_HASURA_PUBLIC_AGGREGATE",
|
|
188
|
+
S.union([
|
|
189
|
+
S.array(S.string),
|
|
190
|
+
// Temporary workaround: Hosted Service can't use commas in env vars for multiple entities.
|
|
191
|
+
// Will be removed once comma support is added — don't rely on this.
|
|
192
|
+
S.string->S.transform(s => {
|
|
193
|
+
parser: string =>
|
|
194
|
+
switch string->Js.String2.split("&") {
|
|
195
|
+
| []
|
|
196
|
+
| [_] =>
|
|
197
|
+
s.fail(`Provide an array of entities in the JSON format.`)
|
|
198
|
+
| entities => entities
|
|
199
|
+
},
|
|
200
|
+
}),
|
|
201
|
+
]),
|
|
202
|
+
~fallback=[],
|
|
203
|
+
)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
module Configurable = {
|
|
207
|
+
module SyncConfig = {
|
|
208
|
+
let initialBlockInterval =
|
|
209
|
+
envSafe->EnvSafe.get("ENVIO_RPC_INITIAL_BLOCK_INTERVAL", S.option(S.int))
|
|
210
|
+
let backoffMultiplicative =
|
|
211
|
+
envSafe->EnvSafe.get("ENVIO_RPC_BACKOFF_MULTIPLICATIVE", S.option(S.float))
|
|
212
|
+
let accelerationAdditive =
|
|
213
|
+
envSafe->EnvSafe.get("ENVIO_RPC_ACCELERATION_ADDITIVE", S.option(S.int))
|
|
214
|
+
let intervalCeiling = envSafe->EnvSafe.get("ENVIO_RPC_INTERVAL_CEILING", S.option(S.int))
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
module ThrottleWrites = {
|
|
219
|
+
let chainMetadataIntervalMillis =
|
|
220
|
+
envSafe->EnvSafe.get("ENVIO_THROTTLE_CHAIN_METADATA_INTERVAL_MILLIS", S.int, ~devFallback=500)
|
|
221
|
+
let pruneStaleDataIntervalMillis =
|
|
222
|
+
envSafe->EnvSafe.get(
|
|
223
|
+
"ENVIO_THROTTLE_PRUNE_STALE_DATA_INTERVAL_MILLIS",
|
|
224
|
+
S.int,
|
|
225
|
+
~devFallback=30_000,
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
let liveMetricsBenchmarkIntervalMillis =
|
|
229
|
+
envSafe->EnvSafe.get(
|
|
230
|
+
"ENVIO_THROTTLE_LIVE_METRICS_BENCHMARK_INTERVAL_MILLIS",
|
|
231
|
+
S.int,
|
|
232
|
+
~devFallback=1_000,
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
let jsonFileBenchmarkIntervalMillis =
|
|
236
|
+
envSafe->EnvSafe.get(
|
|
237
|
+
"ENVIO_THROTTLE_JSON_FILE_BENCHMARK_INTERVAL_MILLIS",
|
|
238
|
+
S.int,
|
|
239
|
+
~devFallback=500,
|
|
240
|
+
)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// You need to close the envSafe after you're done with it so that it immediately tells you about your misconfigured environment on startup.
|
|
244
|
+
envSafe->EnvSafe.close
|