envio 3.0.0-alpha.2 → 3.0.0-alpha.21
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/README.md +164 -30
- package/bin.mjs +49 -0
- package/evm.schema.json +79 -169
- package/fuel.schema.json +50 -21
- package/index.d.ts +578 -1
- package/index.js +4 -0
- package/package.json +47 -31
- package/rescript.json +4 -1
- package/src/Batch.res +11 -8
- package/src/Batch.res.mjs +11 -9
- package/src/ChainFetcher.res +531 -0
- package/src/ChainFetcher.res.mjs +339 -0
- package/src/ChainManager.res +190 -0
- package/src/ChainManager.res.mjs +166 -0
- package/src/Change.res +3 -3
- package/src/Config.gen.ts +19 -0
- package/src/Config.res +725 -25
- package/src/Config.res.mjs +692 -26
- package/src/{Indexer.res → Ctx.res} +1 -1
- package/src/Ecosystem.res +9 -124
- package/src/Ecosystem.res.mjs +19 -160
- package/src/Env.res +33 -73
- package/src/Env.res.mjs +29 -85
- package/src/Envio.gen.ts +3 -1
- package/src/Envio.res +77 -9
- package/src/Envio.res.mjs +39 -1
- package/src/EventConfigBuilder.res +408 -0
- package/src/EventConfigBuilder.res.mjs +376 -0
- package/src/EventProcessing.res +469 -0
- package/src/EventProcessing.res.mjs +337 -0
- package/src/EvmTypes.gen.ts +6 -0
- package/src/EvmTypes.res +1 -0
- package/src/FetchState.res +1256 -639
- package/src/FetchState.res.mjs +1135 -612
- package/src/GlobalState.res +1224 -0
- package/src/GlobalState.res.mjs +1291 -0
- package/src/GlobalStateManager.res +68 -0
- package/src/GlobalStateManager.res.mjs +75 -0
- package/src/GlobalStateManager.resi +7 -0
- package/src/HandlerLoader.res +89 -0
- package/src/HandlerLoader.res.mjs +79 -0
- package/src/HandlerRegister.res +357 -0
- package/src/HandlerRegister.res.mjs +299 -0
- package/src/HandlerRegister.resi +30 -0
- package/src/Hasura.res +111 -175
- package/src/Hasura.res.mjs +88 -150
- package/src/InMemoryStore.res +1 -1
- package/src/InMemoryStore.res.mjs +3 -3
- package/src/InMemoryTable.res +1 -1
- package/src/InMemoryTable.res.mjs +1 -1
- package/src/Internal.gen.ts +6 -0
- package/src/Internal.res +265 -12
- package/src/Internal.res.mjs +115 -1
- package/src/LoadLayer.res +444 -0
- package/src/LoadLayer.res.mjs +296 -0
- package/src/LoadLayer.resi +32 -0
- package/src/LogSelection.res +33 -27
- package/src/LogSelection.res.mjs +6 -0
- package/src/Logging.res +21 -7
- package/src/Logging.res.mjs +16 -8
- package/src/Main.res +390 -0
- package/src/Main.res.mjs +341 -0
- package/src/Persistence.res +7 -21
- package/src/Persistence.res.mjs +3 -3
- package/src/PgStorage.gen.ts +10 -0
- package/src/PgStorage.res +116 -69
- package/src/PgStorage.res.d.mts +5 -0
- package/src/PgStorage.res.mjs +93 -50
- package/src/Prometheus.res +294 -224
- package/src/Prometheus.res.mjs +353 -340
- package/src/ReorgDetection.res +6 -10
- package/src/ReorgDetection.res.mjs +6 -6
- package/src/SafeCheckpointTracking.res +4 -4
- package/src/SafeCheckpointTracking.res.mjs +2 -2
- package/src/SimulateItems.res +353 -0
- package/src/SimulateItems.res.mjs +335 -0
- package/src/Sink.res +4 -2
- package/src/Sink.res.mjs +2 -1
- package/src/TableIndices.res +0 -1
- package/src/TestIndexer.res +913 -0
- package/src/TestIndexer.res.mjs +698 -0
- package/src/TestIndexerProxyStorage.res +205 -0
- package/src/TestIndexerProxyStorage.res.mjs +151 -0
- package/src/TopicFilter.res +1 -1
- package/src/Types.ts +1 -1
- package/src/UserContext.res +424 -0
- package/src/UserContext.res.mjs +279 -0
- package/src/Utils.res +97 -26
- package/src/Utils.res.mjs +91 -44
- package/src/bindings/BigInt.res +10 -0
- package/src/bindings/BigInt.res.mjs +15 -0
- package/src/bindings/ClickHouse.res +120 -23
- package/src/bindings/ClickHouse.res.mjs +118 -28
- package/src/bindings/DateFns.res +74 -0
- package/src/bindings/DateFns.res.mjs +22 -0
- package/src/bindings/EventSource.res +11 -2
- package/src/bindings/EventSource.res.mjs +8 -1
- package/src/bindings/Express.res +1 -0
- package/src/bindings/Hrtime.res +14 -1
- package/src/bindings/Hrtime.res.mjs +22 -2
- package/src/bindings/Hrtime.resi +4 -0
- package/src/bindings/Lodash.res +0 -1
- package/src/bindings/NodeJs.res +49 -3
- package/src/bindings/NodeJs.res.mjs +11 -3
- package/src/bindings/Pino.res +24 -10
- package/src/bindings/Pino.res.mjs +14 -8
- package/src/bindings/Postgres.gen.ts +8 -0
- package/src/bindings/Postgres.res +5 -1
- package/src/bindings/Postgres.res.d.mts +5 -0
- package/src/bindings/PromClient.res +0 -10
- package/src/bindings/PromClient.res.mjs +0 -3
- package/src/bindings/Vitest.res +144 -0
- package/src/bindings/Vitest.res.mjs +9 -0
- package/src/bindings/WebSocket.res +27 -0
- package/src/bindings/WebSocket.res.mjs +2 -0
- package/src/bindings/Yargs.res +8 -0
- package/src/bindings/Yargs.res.mjs +2 -0
- package/src/db/EntityHistory.res +7 -7
- package/src/db/EntityHistory.res.mjs +9 -9
- package/src/db/InternalTable.res +59 -111
- package/src/db/InternalTable.res.mjs +73 -104
- package/src/db/Table.res +27 -8
- package/src/db/Table.res.mjs +25 -14
- package/src/sources/Evm.res +84 -0
- package/src/sources/Evm.res.mjs +105 -0
- package/src/sources/EvmChain.res +94 -0
- package/src/sources/EvmChain.res.mjs +60 -0
- package/src/sources/Fuel.res +19 -34
- package/src/sources/Fuel.res.mjs +34 -16
- package/src/sources/FuelSDK.res +38 -0
- package/src/sources/FuelSDK.res.mjs +29 -0
- package/src/sources/HyperFuel.res +2 -2
- package/src/sources/HyperFuel.resi +1 -1
- package/src/sources/HyperFuelClient.res +2 -2
- package/src/sources/HyperFuelSource.res +35 -13
- package/src/sources/HyperFuelSource.res.mjs +26 -16
- package/src/sources/HyperSync.res +61 -60
- package/src/sources/HyperSync.res.mjs +53 -67
- package/src/sources/HyperSync.resi +6 -4
- package/src/sources/HyperSyncClient.res +29 -2
- package/src/sources/HyperSyncClient.res.mjs +9 -0
- package/src/sources/HyperSyncHeightStream.res +76 -118
- package/src/sources/HyperSyncHeightStream.res.mjs +68 -75
- package/src/sources/HyperSyncSource.res +122 -143
- package/src/sources/HyperSyncSource.res.mjs +106 -121
- package/src/sources/Rpc.res +86 -14
- package/src/sources/Rpc.res.mjs +101 -9
- package/src/sources/RpcSource.res +731 -364
- package/src/sources/RpcSource.res.mjs +845 -410
- package/src/sources/RpcWebSocketHeightStream.res +181 -0
- package/src/sources/RpcWebSocketHeightStream.res.mjs +196 -0
- package/src/sources/SimulateSource.res +59 -0
- package/src/sources/SimulateSource.res.mjs +50 -0
- package/src/sources/Source.res +7 -5
- package/src/sources/SourceManager.res +358 -221
- package/src/sources/SourceManager.res.mjs +346 -171
- package/src/sources/SourceManager.resi +17 -6
- package/src/sources/Svm.res +81 -0
- package/src/sources/Svm.res.mjs +90 -0
- package/src/tui/Tui.res +247 -0
- package/src/tui/Tui.res.mjs +337 -0
- package/src/tui/bindings/Ink.res +371 -0
- package/src/tui/bindings/Ink.res.mjs +72 -0
- package/src/tui/bindings/Style.res +123 -0
- package/src/tui/bindings/Style.res.mjs +2 -0
- package/src/tui/components/BufferedProgressBar.res +40 -0
- package/src/tui/components/BufferedProgressBar.res.mjs +57 -0
- package/src/tui/components/CustomHooks.res +122 -0
- package/src/tui/components/CustomHooks.res.mjs +179 -0
- package/src/tui/components/Messages.res +41 -0
- package/src/tui/components/Messages.res.mjs +75 -0
- package/src/tui/components/SyncETA.res +174 -0
- package/src/tui/components/SyncETA.res.mjs +263 -0
- package/src/tui/components/TuiData.res +47 -0
- package/src/tui/components/TuiData.res.mjs +34 -0
- package/svm.schema.json +112 -0
- package/bin.js +0 -48
- package/src/EventRegister.res +0 -241
- package/src/EventRegister.res.mjs +0 -240
- package/src/EventRegister.resi +0 -30
- package/src/bindings/Ethers.gen.ts +0 -14
- package/src/bindings/Ethers.res +0 -204
- package/src/bindings/Ethers.res.mjs +0 -130
- /package/src/{Indexer.res.mjs → Ctx.res.mjs} +0 -0
package/src/Ecosystem.res
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type name = | @as("evm") Evm | @as("fuel") Fuel
|
|
1
|
+
type name = | @as("evm") Evm | @as("fuel") Fuel | @as("svm") Svm
|
|
2
2
|
|
|
3
3
|
type t = {
|
|
4
4
|
name: name,
|
|
@@ -13,128 +13,13 @@ type t = {
|
|
|
13
13
|
cleanUpRawEventFieldsInPlace: Js.Json.t => unit,
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
delete fields.timestamp
|
|
25
|
-
}`)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
let evm: t = {
|
|
29
|
-
name: Evm,
|
|
30
|
-
blockFields: [
|
|
31
|
-
"number",
|
|
32
|
-
"timestamp",
|
|
33
|
-
"hash",
|
|
34
|
-
"parentHash",
|
|
35
|
-
"nonce",
|
|
36
|
-
"sha3Uncles",
|
|
37
|
-
"logsBloom",
|
|
38
|
-
"transactionsRoot",
|
|
39
|
-
"stateRoot",
|
|
40
|
-
"receiptsRoot",
|
|
41
|
-
"miner",
|
|
42
|
-
"difficulty",
|
|
43
|
-
"totalDifficulty",
|
|
44
|
-
"extraData",
|
|
45
|
-
"size",
|
|
46
|
-
"gasLimit",
|
|
47
|
-
"gasUsed",
|
|
48
|
-
"uncles",
|
|
49
|
-
"baseFeePerGas",
|
|
50
|
-
"blobGasUsed",
|
|
51
|
-
"excessBlobGas",
|
|
52
|
-
"parentBeaconBlockRoot",
|
|
53
|
-
"withdrawalsRoot",
|
|
54
|
-
"l1BlockNumber",
|
|
55
|
-
"sendCount",
|
|
56
|
-
"sendRoot",
|
|
57
|
-
"mixHash",
|
|
58
|
-
],
|
|
59
|
-
transactionFields: [
|
|
60
|
-
"transactionIndex",
|
|
61
|
-
"hash",
|
|
62
|
-
"from",
|
|
63
|
-
"to",
|
|
64
|
-
"gas",
|
|
65
|
-
"gasPrice",
|
|
66
|
-
"maxPriorityFeePerGas",
|
|
67
|
-
"maxFeePerGas",
|
|
68
|
-
"cumulativeGasUsed",
|
|
69
|
-
"effectiveGasPrice",
|
|
70
|
-
"gasUsed",
|
|
71
|
-
"input",
|
|
72
|
-
"nonce",
|
|
73
|
-
"value",
|
|
74
|
-
"v",
|
|
75
|
-
"r",
|
|
76
|
-
"s",
|
|
77
|
-
"contractAddress",
|
|
78
|
-
"logsBloom",
|
|
79
|
-
"root",
|
|
80
|
-
"status",
|
|
81
|
-
"yParity",
|
|
82
|
-
"chainId",
|
|
83
|
-
"maxFeePerBlobGas",
|
|
84
|
-
"blobVersionedHashes",
|
|
85
|
-
"type",
|
|
86
|
-
"l1Fee",
|
|
87
|
-
"l1GasPrice",
|
|
88
|
-
"l1GasUsed",
|
|
89
|
-
"l1FeeScalar",
|
|
90
|
-
"gasUsedForL1",
|
|
91
|
-
"accessList",
|
|
92
|
-
"authorizationList",
|
|
93
|
-
],
|
|
94
|
-
blockNumberName: "number",
|
|
95
|
-
blockTimestampName: "timestamp",
|
|
96
|
-
blockHashName: "hash",
|
|
97
|
-
getNumber: Evm.getNumber,
|
|
98
|
-
getTimestamp: Evm.getTimestamp,
|
|
99
|
-
getId: Evm.getId,
|
|
100
|
-
cleanUpRawEventFieldsInPlace: Evm.cleanUpRawEventFieldsInPlace,
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
module Fuel = {
|
|
104
|
-
@get external getNumber: Internal.eventBlock => int = "height"
|
|
105
|
-
@get external getTimestamp: Internal.eventBlock => int = "time"
|
|
106
|
-
@get external getId: Internal.eventBlock => string = "id"
|
|
107
|
-
|
|
108
|
-
let cleanUpRawEventFieldsInPlace: Js.Json.t => unit = %raw(`fields => {
|
|
109
|
-
delete fields.id
|
|
110
|
-
delete fields.height
|
|
111
|
-
delete fields.time
|
|
112
|
-
}`)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
let fuel: t = {
|
|
116
|
-
name: Fuel,
|
|
117
|
-
blockFields: ["id", "height", "time"],
|
|
118
|
-
transactionFields: ["id"],
|
|
119
|
-
blockNumberName: "height",
|
|
120
|
-
blockTimestampName: "time",
|
|
121
|
-
blockHashName: "id",
|
|
122
|
-
getNumber: Fuel.getNumber,
|
|
123
|
-
getTimestamp: Fuel.getTimestamp,
|
|
124
|
-
getId: Fuel.getId,
|
|
125
|
-
cleanUpRawEventFieldsInPlace: Fuel.cleanUpRawEventFieldsInPlace,
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
let fromName = (name: name): t => {
|
|
129
|
-
switch name {
|
|
130
|
-
| Evm => evm
|
|
131
|
-
| Fuel => fuel
|
|
16
|
+
let makeOnBlockArgs = (~blockNumber: int, ~ecosystem: t, ~context): Internal.onBlockArgs => {
|
|
17
|
+
switch ecosystem.name {
|
|
18
|
+
| Svm => {slot: blockNumber, context}
|
|
19
|
+
| _ => {
|
|
20
|
+
let blockEvent = Js.Dict.empty()
|
|
21
|
+
blockEvent->Js.Dict.set(ecosystem.blockNumberName, blockNumber->(Utils.magic: int => unknown))
|
|
22
|
+
{block: blockEvent->(Utils.magic: Js.Dict.t<unknown> => Internal.blockEvent), context}
|
|
23
|
+
}
|
|
132
24
|
}
|
|
133
25
|
}
|
|
134
|
-
|
|
135
|
-
// Create a block event object for block handlers based on ecosystem
|
|
136
|
-
let makeBlockEvent = (~blockNumber: int, ecosystem: t): Internal.blockEvent => {
|
|
137
|
-
let blockEvent = Js.Dict.empty()
|
|
138
|
-
blockEvent->Js.Dict.set(ecosystem.blockNumberName, blockNumber->Utils.magic)
|
|
139
|
-
blockEvent->Utils.magic
|
|
140
|
-
}
|
package/src/Ecosystem.res.mjs
CHANGED
|
@@ -1,170 +1,29 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"hash",
|
|
18
|
-
"parentHash",
|
|
19
|
-
"nonce",
|
|
20
|
-
"sha3Uncles",
|
|
21
|
-
"logsBloom",
|
|
22
|
-
"transactionsRoot",
|
|
23
|
-
"stateRoot",
|
|
24
|
-
"receiptsRoot",
|
|
25
|
-
"miner",
|
|
26
|
-
"difficulty",
|
|
27
|
-
"totalDifficulty",
|
|
28
|
-
"extraData",
|
|
29
|
-
"size",
|
|
30
|
-
"gasLimit",
|
|
31
|
-
"gasUsed",
|
|
32
|
-
"uncles",
|
|
33
|
-
"baseFeePerGas",
|
|
34
|
-
"blobGasUsed",
|
|
35
|
-
"excessBlobGas",
|
|
36
|
-
"parentBeaconBlockRoot",
|
|
37
|
-
"withdrawalsRoot",
|
|
38
|
-
"l1BlockNumber",
|
|
39
|
-
"sendCount",
|
|
40
|
-
"sendRoot",
|
|
41
|
-
"mixHash"
|
|
42
|
-
];
|
|
43
|
-
|
|
44
|
-
var evm_transactionFields = [
|
|
45
|
-
"transactionIndex",
|
|
46
|
-
"hash",
|
|
47
|
-
"from",
|
|
48
|
-
"to",
|
|
49
|
-
"gas",
|
|
50
|
-
"gasPrice",
|
|
51
|
-
"maxPriorityFeePerGas",
|
|
52
|
-
"maxFeePerGas",
|
|
53
|
-
"cumulativeGasUsed",
|
|
54
|
-
"effectiveGasPrice",
|
|
55
|
-
"gasUsed",
|
|
56
|
-
"input",
|
|
57
|
-
"nonce",
|
|
58
|
-
"value",
|
|
59
|
-
"v",
|
|
60
|
-
"r",
|
|
61
|
-
"s",
|
|
62
|
-
"contractAddress",
|
|
63
|
-
"logsBloom",
|
|
64
|
-
"root",
|
|
65
|
-
"status",
|
|
66
|
-
"yParity",
|
|
67
|
-
"chainId",
|
|
68
|
-
"maxFeePerBlobGas",
|
|
69
|
-
"blobVersionedHashes",
|
|
70
|
-
"type",
|
|
71
|
-
"l1Fee",
|
|
72
|
-
"l1GasPrice",
|
|
73
|
-
"l1GasUsed",
|
|
74
|
-
"l1FeeScalar",
|
|
75
|
-
"gasUsedForL1",
|
|
76
|
-
"accessList",
|
|
77
|
-
"authorizationList"
|
|
78
|
-
];
|
|
79
|
-
|
|
80
|
-
function evm_getNumber(prim) {
|
|
81
|
-
return prim.number;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function evm_getTimestamp(prim) {
|
|
85
|
-
return prim.timestamp;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function evm_getId(prim) {
|
|
89
|
-
return prim.hash;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
var evm = {
|
|
93
|
-
name: "evm",
|
|
94
|
-
blockFields: evm_blockFields,
|
|
95
|
-
transactionFields: evm_transactionFields,
|
|
96
|
-
blockNumberName: "number",
|
|
97
|
-
blockTimestampName: "timestamp",
|
|
98
|
-
blockHashName: "hash",
|
|
99
|
-
getNumber: evm_getNumber,
|
|
100
|
-
getTimestamp: evm_getTimestamp,
|
|
101
|
-
getId: evm_getId,
|
|
102
|
-
cleanUpRawEventFieldsInPlace: cleanUpRawEventFieldsInPlace
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
var cleanUpRawEventFieldsInPlace$1 = (fields => {
|
|
106
|
-
delete fields.id
|
|
107
|
-
delete fields.height
|
|
108
|
-
delete fields.time
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
var Fuel = {
|
|
112
|
-
cleanUpRawEventFieldsInPlace: cleanUpRawEventFieldsInPlace$1
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
var fuel_blockFields = [
|
|
116
|
-
"id",
|
|
117
|
-
"height",
|
|
118
|
-
"time"
|
|
119
|
-
];
|
|
120
|
-
|
|
121
|
-
var fuel_transactionFields = ["id"];
|
|
122
|
-
|
|
123
|
-
function fuel_getNumber(prim) {
|
|
124
|
-
return prim.height;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function fuel_getTimestamp(prim) {
|
|
128
|
-
return prim.time;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function fuel_getId(prim) {
|
|
132
|
-
return prim.id;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
var fuel = {
|
|
136
|
-
name: "fuel",
|
|
137
|
-
blockFields: fuel_blockFields,
|
|
138
|
-
transactionFields: fuel_transactionFields,
|
|
139
|
-
blockNumberName: "height",
|
|
140
|
-
blockTimestampName: "time",
|
|
141
|
-
blockHashName: "id",
|
|
142
|
-
getNumber: fuel_getNumber,
|
|
143
|
-
getTimestamp: fuel_getTimestamp,
|
|
144
|
-
getId: fuel_getId,
|
|
145
|
-
cleanUpRawEventFieldsInPlace: cleanUpRawEventFieldsInPlace$1
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
function fromName(name) {
|
|
149
|
-
if (name === "evm") {
|
|
150
|
-
return evm;
|
|
151
|
-
} else {
|
|
152
|
-
return fuel;
|
|
3
|
+
import * as Caml_option from "rescript/lib/es6/caml_option.js";
|
|
4
|
+
|
|
5
|
+
function makeOnBlockArgs(blockNumber, ecosystem, context) {
|
|
6
|
+
var match = ecosystem.name;
|
|
7
|
+
switch (match) {
|
|
8
|
+
case "evm" :
|
|
9
|
+
case "fuel" :
|
|
10
|
+
break;
|
|
11
|
+
case "svm" :
|
|
12
|
+
return {
|
|
13
|
+
slot: blockNumber,
|
|
14
|
+
context: context
|
|
15
|
+
};
|
|
16
|
+
|
|
153
17
|
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function makeBlockEvent(blockNumber, ecosystem) {
|
|
157
18
|
var blockEvent = {};
|
|
158
19
|
blockEvent[ecosystem.blockNumberName] = blockNumber;
|
|
159
|
-
return
|
|
20
|
+
return {
|
|
21
|
+
block: Caml_option.some(blockEvent),
|
|
22
|
+
context: context
|
|
23
|
+
};
|
|
160
24
|
}
|
|
161
25
|
|
|
162
26
|
export {
|
|
163
|
-
|
|
164
|
-
evm ,
|
|
165
|
-
Fuel ,
|
|
166
|
-
fuel ,
|
|
167
|
-
fromName ,
|
|
168
|
-
makeBlockEvent ,
|
|
27
|
+
makeOnBlockArgs ,
|
|
169
28
|
}
|
|
170
29
|
/* No side effect */
|
package/src/Env.res
CHANGED
|
@@ -1,26 +1,15 @@
|
|
|
1
|
-
|
|
2
1
|
// Loads the .env from the root working directory
|
|
3
2
|
%%raw(`import 'dotenv/config'`)
|
|
4
3
|
|
|
5
|
-
%%private(
|
|
6
|
-
let envSafe = EnvSafe.make()
|
|
4
|
+
%%private(let envSafe = EnvSafe.make())
|
|
7
5
|
|
|
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
6
|
// resets the timestampCaughtUpToHeadOrEndblock after a restart when true
|
|
16
7
|
let updateSyncTimeOnRestart =
|
|
17
8
|
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
9
|
let targetBufferSize = envSafe->EnvSafe.get("ENVIO_INDEXING_MAX_BUFFER_SIZE", S.option(S.int))
|
|
20
10
|
let maxAddrInPartition = envSafe->EnvSafe.get("MAX_PARTITION_SIZE", S.int, ~fallback=5_000)
|
|
21
11
|
let maxPartitionConcurrency =
|
|
22
12
|
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
13
|
|
|
25
14
|
// FIXME: This broke HS grafana dashboard. Should investigate it later. Maybe we should use :: as a default value?
|
|
26
15
|
// We want to be able to set it to 0.0.0.0
|
|
@@ -35,9 +24,22 @@ let serverPort =
|
|
|
35
24
|
|
|
36
25
|
let tuiOffEnvVar = envSafe->EnvSafe.get("TUI_OFF", S.bool, ~fallback=false)
|
|
37
26
|
|
|
27
|
+
let logLevelSchema = S.enum([
|
|
28
|
+
#trace,
|
|
29
|
+
#debug,
|
|
30
|
+
#info,
|
|
31
|
+
#warn,
|
|
32
|
+
#error,
|
|
33
|
+
#fatal,
|
|
34
|
+
#udebug,
|
|
35
|
+
#uinfo,
|
|
36
|
+
#uwarn,
|
|
37
|
+
#uerror,
|
|
38
|
+
#silent,
|
|
39
|
+
])
|
|
38
40
|
let logFilePath = envSafe->EnvSafe.get("LOG_FILE", S.string, ~fallback="logs/envio.log")
|
|
39
|
-
let userLogLevel =
|
|
40
|
-
let defaultFileLogLevel =
|
|
41
|
+
let userLogLevel = envSafe->EnvSafe.get("LOG_LEVEL", S.option(logLevelSchema))
|
|
42
|
+
let defaultFileLogLevel = envSafe->EnvSafe.get("FILE_LOG_LEVEL", logLevelSchema, ~fallback=#trace)
|
|
41
43
|
|
|
42
44
|
let prodEnvioAppUrl = "https://envio.dev"
|
|
43
45
|
let envioAppUrl = envSafe->EnvSafe.get("ENVIO_APP", S.string, ~fallback=prodEnvioAppUrl)
|
|
@@ -62,49 +64,9 @@ let hypersyncClientSerializationFormat =
|
|
|
62
64
|
let hypersyncClientEnableQueryCaching =
|
|
63
65
|
envSafe->EnvSafe.get("ENVIO_HYPERSYNC_CLIENT_ENABLE_QUERY_CACHING", S.bool, ~fallback=true)
|
|
64
66
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
}
|
|
67
|
+
let hypersyncLogLevel =
|
|
68
|
+
envSafe->EnvSafe.get("ENVIO_HYPERSYNC_LOG_LEVEL", HyperSyncClient.logLevelSchema, ~fallback=#info)
|
|
69
|
+
HyperSyncClient.setLogLevel(hypersyncLogLevel)
|
|
108
70
|
|
|
109
71
|
let logStrategy =
|
|
110
72
|
envSafe->EnvSafe.get(
|
|
@@ -122,7 +84,12 @@ let logStrategy =
|
|
|
122
84
|
)
|
|
123
85
|
|
|
124
86
|
Logging.setLogger(
|
|
125
|
-
Logging.makeLogger(
|
|
87
|
+
Logging.makeLogger(
|
|
88
|
+
~logStrategy,
|
|
89
|
+
~logFilePath,
|
|
90
|
+
~defaultFileLogLevel,
|
|
91
|
+
~userLogLevel=userLogLevel->Belt.Option.getWithDefault(#info),
|
|
92
|
+
),
|
|
126
93
|
)
|
|
127
94
|
|
|
128
95
|
module Db = {
|
|
@@ -137,7 +104,13 @@ module Db = {
|
|
|
137
104
|
},
|
|
138
105
|
)
|
|
139
106
|
let database = envSafe->EnvSafe.get("ENVIO_PG_DATABASE", S.string, ~devFallback="envio-dev")
|
|
140
|
-
let publicSchema = envSafe->EnvSafe.get(
|
|
107
|
+
let publicSchema = envSafe->EnvSafe.get(
|
|
108
|
+
"ENVIO_PG_SCHEMA",
|
|
109
|
+
S.string,
|
|
110
|
+
~fallback={
|
|
111
|
+
envSafe->EnvSafe.get("ENVIO_PG_PUBLIC_SCHEMA", S.string, ~fallback="public")
|
|
112
|
+
},
|
|
113
|
+
)
|
|
141
114
|
let ssl = envSafe->EnvSafe.get(
|
|
142
115
|
"ENVIO_PG_SSL_MODE",
|
|
143
116
|
Postgres.sslOptionsSchema,
|
|
@@ -145,6 +118,7 @@ module Db = {
|
|
|
145
118
|
//the SSL modes should be provided as string otherwise as 'require' | 'allow' | 'prefer' | 'verify-full'
|
|
146
119
|
~devFallback=Bool(false),
|
|
147
120
|
)
|
|
121
|
+
let maxConnections = envSafe->EnvSafe.get("ENVIO_PG_MAX_CONNECTIONS", S.int, ~fallback=2)
|
|
148
122
|
}
|
|
149
123
|
|
|
150
124
|
module ClickHouseSink = {
|
|
@@ -224,20 +198,6 @@ module ThrottleWrites = {
|
|
|
224
198
|
S.int,
|
|
225
199
|
~devFallback=30_000,
|
|
226
200
|
)
|
|
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
201
|
}
|
|
242
202
|
|
|
243
203
|
// You need to close the envSafe after you're done with it so that it immediately tells you about your misconfigured environment on startup.
|
package/src/Env.res.mjs
CHANGED
|
@@ -3,51 +3,47 @@
|
|
|
3
3
|
import * as EnvSafe from "rescript-envsafe/src/EnvSafe.res.mjs";
|
|
4
4
|
import * as Logging from "./Logging.res.mjs";
|
|
5
5
|
import * as Postgres from "./bindings/Postgres.res.mjs";
|
|
6
|
-
import * as
|
|
6
|
+
import * as Belt_Option from "rescript/lib/es6/belt_Option.js";
|
|
7
7
|
import * as HyperSyncClient from "./sources/HyperSyncClient.res.mjs";
|
|
8
8
|
import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
|
|
9
|
+
import * as HypersyncClient from "@envio-dev/hypersync-client";
|
|
9
10
|
|
|
10
11
|
import 'dotenv/config'
|
|
11
12
|
;
|
|
12
13
|
|
|
13
14
|
var envSafe = EnvSafe.make(undefined);
|
|
14
15
|
|
|
15
|
-
function getLogLevelConfig(name, $$default) {
|
|
16
|
-
return EnvSafe.get(envSafe, name, S$RescriptSchema.$$enum([
|
|
17
|
-
"trace",
|
|
18
|
-
"debug",
|
|
19
|
-
"info",
|
|
20
|
-
"warn",
|
|
21
|
-
"error",
|
|
22
|
-
"fatal",
|
|
23
|
-
"udebug",
|
|
24
|
-
"uinfo",
|
|
25
|
-
"uwarn",
|
|
26
|
-
"uerror"
|
|
27
|
-
]), undefined, $$default, undefined, undefined);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
16
|
var updateSyncTimeOnRestart = EnvSafe.get(envSafe, "UPDATE_SYNC_TIME_ON_RESTART", S$RescriptSchema.bool, undefined, true, undefined, undefined);
|
|
31
17
|
|
|
32
|
-
var batchSize = EnvSafe.get(envSafe, "MAX_BATCH_SIZE", S$RescriptSchema.option(S$RescriptSchema.$$int), undefined, undefined, undefined, undefined);
|
|
33
|
-
|
|
34
18
|
var targetBufferSize = EnvSafe.get(envSafe, "ENVIO_INDEXING_MAX_BUFFER_SIZE", S$RescriptSchema.option(S$RescriptSchema.$$int), undefined, undefined, undefined, undefined);
|
|
35
19
|
|
|
36
20
|
var maxAddrInPartition = EnvSafe.get(envSafe, "MAX_PARTITION_SIZE", S$RescriptSchema.$$int, undefined, 5000, undefined, undefined);
|
|
37
21
|
|
|
38
22
|
var maxPartitionConcurrency = EnvSafe.get(envSafe, "ENVIO_MAX_PARTITION_CONCURRENCY", S$RescriptSchema.$$int, undefined, 10, undefined, undefined);
|
|
39
23
|
|
|
40
|
-
var indexingBlockLag = EnvSafe.get(envSafe, "ENVIO_INDEXING_BLOCK_LAG", S$RescriptSchema.option(S$RescriptSchema.$$int), undefined, undefined, undefined, undefined);
|
|
41
|
-
|
|
42
24
|
var serverPort = EnvSafe.get(envSafe, "ENVIO_INDEXER_PORT", S$RescriptSchema.port(S$RescriptSchema.$$int, undefined), undefined, EnvSafe.get(envSafe, "METRICS_PORT", S$RescriptSchema.port(S$RescriptSchema.$$int, undefined), undefined, 9898, undefined, undefined), undefined, undefined);
|
|
43
25
|
|
|
44
26
|
var tuiOffEnvVar = EnvSafe.get(envSafe, "TUI_OFF", S$RescriptSchema.bool, undefined, false, undefined, undefined);
|
|
45
27
|
|
|
28
|
+
var logLevelSchema = S$RescriptSchema.$$enum([
|
|
29
|
+
"trace",
|
|
30
|
+
"debug",
|
|
31
|
+
"info",
|
|
32
|
+
"warn",
|
|
33
|
+
"error",
|
|
34
|
+
"fatal",
|
|
35
|
+
"udebug",
|
|
36
|
+
"uinfo",
|
|
37
|
+
"uwarn",
|
|
38
|
+
"uerror",
|
|
39
|
+
"silent"
|
|
40
|
+
]);
|
|
41
|
+
|
|
46
42
|
var logFilePath = EnvSafe.get(envSafe, "LOG_FILE", S$RescriptSchema.string, undefined, "logs/envio.log", undefined, undefined);
|
|
47
43
|
|
|
48
|
-
var userLogLevel =
|
|
44
|
+
var userLogLevel = EnvSafe.get(envSafe, "LOG_LEVEL", S$RescriptSchema.option(logLevelSchema), undefined, undefined, undefined, undefined);
|
|
49
45
|
|
|
50
|
-
var defaultFileLogLevel =
|
|
46
|
+
var defaultFileLogLevel = EnvSafe.get(envSafe, "FILE_LOG_LEVEL", logLevelSchema, undefined, "trace", undefined, undefined);
|
|
51
47
|
|
|
52
48
|
var prodEnvioAppUrl = "https://envio.dev";
|
|
53
49
|
|
|
@@ -63,57 +59,9 @@ var hypersyncClientSerializationFormat = EnvSafe.get(envSafe, "ENVIO_HYPERSYNC_C
|
|
|
63
59
|
|
|
64
60
|
var hypersyncClientEnableQueryCaching = EnvSafe.get(envSafe, "ENVIO_HYPERSYNC_CLIENT_ENABLE_QUERY_CACHING", S$RescriptSchema.bool, undefined, true, undefined, undefined);
|
|
65
61
|
|
|
66
|
-
var
|
|
67
|
-
true,
|
|
68
|
-
false,
|
|
69
|
-
"json-file",
|
|
70
|
-
"prometheus"
|
|
71
|
-
]);
|
|
72
|
-
|
|
73
|
-
var $$default = false;
|
|
74
|
-
|
|
75
|
-
function shouldSaveJsonFile(self) {
|
|
76
|
-
if (typeof self !== "boolean") {
|
|
77
|
-
if (self === "json-file") {
|
|
78
|
-
return true;
|
|
79
|
-
} else {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
} else if (self) {
|
|
83
|
-
return true;
|
|
84
|
-
} else {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function shouldSavePrometheus(param) {
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function shouldSaveData(self) {
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
var SaveDataStrategy = {
|
|
98
|
-
schema: schema,
|
|
99
|
-
$$default: $$default,
|
|
100
|
-
shouldSaveJsonFile: shouldSaveJsonFile,
|
|
101
|
-
shouldSavePrometheus: shouldSavePrometheus,
|
|
102
|
-
shouldSaveData: shouldSaveData
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
var saveDataStrategy = EnvSafe.get(envSafe, "ENVIO_SAVE_BENCHMARK_DATA", schema, undefined, Caml_option.some($$default), undefined, undefined);
|
|
106
|
-
|
|
107
|
-
var shouldSaveData$1 = shouldSaveData(saveDataStrategy);
|
|
62
|
+
var hypersyncLogLevel = EnvSafe.get(envSafe, "ENVIO_HYPERSYNC_LOG_LEVEL", HyperSyncClient.logLevelSchema, undefined, "info", undefined, undefined);
|
|
108
63
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
var Benchmark = {
|
|
112
|
-
SaveDataStrategy: SaveDataStrategy,
|
|
113
|
-
saveDataStrategy: saveDataStrategy,
|
|
114
|
-
shouldSaveData: shouldSaveData$1,
|
|
115
|
-
shouldSaveStdDev: shouldSaveStdDev
|
|
116
|
-
};
|
|
64
|
+
HypersyncClient.setLogLevel(hypersyncLogLevel);
|
|
117
65
|
|
|
118
66
|
var logStrategy = EnvSafe.get(envSafe, "LOG_STRATEGY", S$RescriptSchema.$$enum([
|
|
119
67
|
"ecs-file",
|
|
@@ -125,7 +73,7 @@ var logStrategy = EnvSafe.get(envSafe, "LOG_STRATEGY", S$RescriptSchema.$$enum([
|
|
|
125
73
|
"both-prettyconsole"
|
|
126
74
|
]), undefined, "console-pretty", undefined, undefined);
|
|
127
75
|
|
|
128
|
-
Logging.setLogger(Logging.makeLogger(logStrategy, logFilePath, defaultFileLogLevel, userLogLevel));
|
|
76
|
+
Logging.setLogger(Logging.makeLogger(logStrategy, logFilePath, defaultFileLogLevel, Belt_Option.getWithDefault(userLogLevel, "info")));
|
|
129
77
|
|
|
130
78
|
var host = EnvSafe.get(envSafe, "ENVIO_PG_HOST", S$RescriptSchema.string, undefined, undefined, "localhost", undefined);
|
|
131
79
|
|
|
@@ -137,10 +85,12 @@ var password = EnvSafe.get(envSafe, "ENVIO_PG_PASSWORD", S$RescriptSchema.string
|
|
|
137
85
|
|
|
138
86
|
var database = EnvSafe.get(envSafe, "ENVIO_PG_DATABASE", S$RescriptSchema.string, undefined, undefined, "envio-dev", undefined);
|
|
139
87
|
|
|
140
|
-
var publicSchema = EnvSafe.get(envSafe, "ENVIO_PG_PUBLIC_SCHEMA", S$RescriptSchema.string, undefined, "public", undefined, undefined);
|
|
88
|
+
var publicSchema = EnvSafe.get(envSafe, "ENVIO_PG_SCHEMA", S$RescriptSchema.string, undefined, EnvSafe.get(envSafe, "ENVIO_PG_PUBLIC_SCHEMA", S$RescriptSchema.string, undefined, "public", undefined, undefined), undefined, undefined);
|
|
141
89
|
|
|
142
90
|
var ssl = EnvSafe.get(envSafe, "ENVIO_PG_SSL_MODE", Postgres.sslOptionsSchema, undefined, undefined, false, undefined);
|
|
143
91
|
|
|
92
|
+
var maxConnections = EnvSafe.get(envSafe, "ENVIO_PG_MAX_CONNECTIONS", S$RescriptSchema.$$int, undefined, 2, undefined, undefined);
|
|
93
|
+
|
|
144
94
|
var Db = {
|
|
145
95
|
host: host,
|
|
146
96
|
port: port,
|
|
@@ -148,7 +98,8 @@ var Db = {
|
|
|
148
98
|
password: password,
|
|
149
99
|
database: database,
|
|
150
100
|
publicSchema: publicSchema,
|
|
151
|
-
ssl: ssl
|
|
101
|
+
ssl: ssl,
|
|
102
|
+
maxConnections: maxConnections
|
|
152
103
|
};
|
|
153
104
|
|
|
154
105
|
var host$1 = EnvSafe.get(envSafe, "ENVIO_CLICKHOUSE_SINK_HOST", S$RescriptSchema.option(S$RescriptSchema.string), undefined, undefined, undefined, undefined);
|
|
@@ -230,28 +181,21 @@ var chainMetadataIntervalMillis = EnvSafe.get(envSafe, "ENVIO_THROTTLE_CHAIN_MET
|
|
|
230
181
|
|
|
231
182
|
var pruneStaleDataIntervalMillis = EnvSafe.get(envSafe, "ENVIO_THROTTLE_PRUNE_STALE_DATA_INTERVAL_MILLIS", S$RescriptSchema.$$int, undefined, undefined, 30000, undefined);
|
|
232
183
|
|
|
233
|
-
var liveMetricsBenchmarkIntervalMillis = EnvSafe.get(envSafe, "ENVIO_THROTTLE_LIVE_METRICS_BENCHMARK_INTERVAL_MILLIS", S$RescriptSchema.$$int, undefined, undefined, 1000, undefined);
|
|
234
|
-
|
|
235
|
-
var jsonFileBenchmarkIntervalMillis = EnvSafe.get(envSafe, "ENVIO_THROTTLE_JSON_FILE_BENCHMARK_INTERVAL_MILLIS", S$RescriptSchema.$$int, undefined, undefined, 500, undefined);
|
|
236
|
-
|
|
237
184
|
var ThrottleWrites = {
|
|
238
185
|
chainMetadataIntervalMillis: chainMetadataIntervalMillis,
|
|
239
|
-
pruneStaleDataIntervalMillis: pruneStaleDataIntervalMillis
|
|
240
|
-
liveMetricsBenchmarkIntervalMillis: liveMetricsBenchmarkIntervalMillis,
|
|
241
|
-
jsonFileBenchmarkIntervalMillis: jsonFileBenchmarkIntervalMillis
|
|
186
|
+
pruneStaleDataIntervalMillis: pruneStaleDataIntervalMillis
|
|
242
187
|
};
|
|
243
188
|
|
|
244
189
|
EnvSafe.close(envSafe);
|
|
245
190
|
|
|
246
191
|
export {
|
|
247
192
|
updateSyncTimeOnRestart ,
|
|
248
|
-
batchSize ,
|
|
249
193
|
targetBufferSize ,
|
|
250
194
|
maxAddrInPartition ,
|
|
251
195
|
maxPartitionConcurrency ,
|
|
252
|
-
indexingBlockLag ,
|
|
253
196
|
serverPort ,
|
|
254
197
|
tuiOffEnvVar ,
|
|
198
|
+
logLevelSchema ,
|
|
255
199
|
logFilePath ,
|
|
256
200
|
userLogLevel ,
|
|
257
201
|
defaultFileLogLevel ,
|
|
@@ -262,7 +206,7 @@ export {
|
|
|
262
206
|
hyperSyncClientMaxRetries ,
|
|
263
207
|
hypersyncClientSerializationFormat ,
|
|
264
208
|
hypersyncClientEnableQueryCaching ,
|
|
265
|
-
|
|
209
|
+
hypersyncLogLevel ,
|
|
266
210
|
logStrategy ,
|
|
267
211
|
Db ,
|
|
268
212
|
ClickHouseSink ,
|