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
package/src/Env.res.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as EnvSafe from "
|
|
3
|
+
import * as EnvSafe from "./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 Belt_Option from "rescript/lib/es6/
|
|
6
|
+
import * as Belt_Option from "@rescript/runtime/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
9
|
import * as HypersyncClient from "@envio-dev/hypersync-client";
|
|
@@ -11,87 +11,87 @@ import * as HypersyncClient from "@envio-dev/hypersync-client";
|
|
|
11
11
|
import 'dotenv/config'
|
|
12
12
|
;
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
let envSafe = EnvSafe.make(undefined);
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
let updateSyncTimeOnRestart = EnvSafe.get(envSafe, "UPDATE_SYNC_TIME_ON_RESTART", S$RescriptSchema.bool, undefined, true, undefined, undefined);
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
let targetBufferSize = EnvSafe.get(envSafe, "ENVIO_INDEXING_MAX_BUFFER_SIZE", S$RescriptSchema.option(S$RescriptSchema.int), undefined, undefined, undefined, undefined);
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
let maxAddrInPartition = EnvSafe.get(envSafe, "MAX_PARTITION_SIZE", S$RescriptSchema.int, undefined, 5000, undefined, undefined);
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
let maxPartitionConcurrency = EnvSafe.get(envSafe, "ENVIO_MAX_PARTITION_CONCURRENCY", S$RescriptSchema.int, undefined, 10, undefined, undefined);
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
let 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);
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
let tuiOffEnvVar = EnvSafe.get(envSafe, "TUI_OFF", S$RescriptSchema.bool, undefined, false, undefined, undefined);
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
28
|
+
let 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
41
|
|
|
42
|
-
|
|
42
|
+
let logFilePath = EnvSafe.get(envSafe, "LOG_FILE", S$RescriptSchema.string, undefined, "logs/envio.log", undefined, undefined);
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
let userLogLevel = EnvSafe.get(envSafe, "LOG_LEVEL", S$RescriptSchema.option(logLevelSchema), undefined, undefined, undefined, undefined);
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
let defaultFileLogLevel = EnvSafe.get(envSafe, "FILE_LOG_LEVEL", logLevelSchema, undefined, "trace", undefined, undefined);
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
let prodEnvioAppUrl = "https://envio.dev";
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
let envioAppUrl = EnvSafe.get(envSafe, "ENVIO_APP", S$RescriptSchema.string, undefined, prodEnvioAppUrl, undefined, undefined);
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
let envioApiToken = EnvSafe.get(envSafe, "ENVIO_API_TOKEN", S$RescriptSchema.option(S$RescriptSchema.string), undefined, undefined, undefined, undefined);
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
let hyperSyncClientTimeoutMillis = EnvSafe.get(envSafe, "ENVIO_HYPERSYNC_CLIENT_TIMEOUT_MILLIS", S$RescriptSchema.int, undefined, 120000, undefined, undefined);
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
let hyperSyncClientMaxRetries = EnvSafe.get(envSafe, "ENVIO_HYPERSYNC_CLIENT_MAX_RETRIES", S$RescriptSchema.int, undefined, 0, undefined, undefined);
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
let hypersyncClientSerializationFormat = EnvSafe.get(envSafe, "ENVIO_HYPERSYNC_CLIENT_SERIALIZATION_FORMAT", HyperSyncClient.serializationFormatSchema, undefined, "CapnProto", undefined, undefined);
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
let hypersyncClientEnableQueryCaching = EnvSafe.get(envSafe, "ENVIO_HYPERSYNC_CLIENT_ENABLE_QUERY_CACHING", S$RescriptSchema.bool, undefined, true, undefined, undefined);
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
let hypersyncLogLevel = EnvSafe.get(envSafe, "ENVIO_HYPERSYNC_LOG_LEVEL", HyperSyncClient.logLevelSchema, undefined, "info", undefined, undefined);
|
|
63
63
|
|
|
64
64
|
HypersyncClient.setLogLevel(hypersyncLogLevel);
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
66
|
+
let logStrategy = EnvSafe.get(envSafe, "LOG_STRATEGY", S$RescriptSchema.$$enum([
|
|
67
|
+
"ecs-file",
|
|
68
|
+
"ecs-console",
|
|
69
|
+
"ecs-console-multistream",
|
|
70
|
+
"file-only",
|
|
71
|
+
"console-raw",
|
|
72
|
+
"console-pretty",
|
|
73
|
+
"both-prettyconsole"
|
|
74
|
+
]), undefined, "console-pretty", undefined, undefined);
|
|
75
75
|
|
|
76
76
|
Logging.setLogger(Logging.makeLogger(logStrategy, logFilePath, defaultFileLogLevel, Belt_Option.getWithDefault(userLogLevel, "info")));
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
let host = EnvSafe.get(envSafe, "ENVIO_PG_HOST", S$RescriptSchema.string, undefined, undefined, "localhost", undefined);
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
let port = EnvSafe.get(envSafe, "ENVIO_PG_PORT", S$RescriptSchema.port(S$RescriptSchema.int, undefined), undefined, undefined, 5433, undefined);
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
let user = EnvSafe.get(envSafe, "ENVIO_PG_USER", S$RescriptSchema.string, undefined, undefined, "postgres", undefined);
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
let password = EnvSafe.get(envSafe, "ENVIO_PG_PASSWORD", S$RescriptSchema.string, undefined, EnvSafe.get(envSafe, "ENVIO_POSTGRES_PASSWORD", S$RescriptSchema.string, undefined, "testing", undefined, undefined), undefined, undefined);
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
let database = EnvSafe.get(envSafe, "ENVIO_PG_DATABASE", S$RescriptSchema.string, undefined, undefined, "envio-dev", undefined);
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
let 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);
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
let ssl = EnvSafe.get(envSafe, "ENVIO_PG_SSL_MODE", Postgres.sslOptionsSchema, undefined, undefined, false, undefined);
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
let maxConnections = EnvSafe.get(envSafe, "ENVIO_PG_MAX_CONNECTIONS", S$RescriptSchema.int, undefined, 2, undefined, undefined);
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
let Db = {
|
|
95
95
|
host: host,
|
|
96
96
|
port: port,
|
|
97
97
|
user: user,
|
|
@@ -102,53 +102,64 @@ var Db = {
|
|
|
102
102
|
maxConnections: maxConnections
|
|
103
103
|
};
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
let read = ((k) => {
|
|
106
|
+
const v = process.env[k];
|
|
107
|
+
return v === undefined || v === "" ? undefined : v;
|
|
108
|
+
});
|
|
106
109
|
|
|
107
|
-
|
|
110
|
+
function host$1() {
|
|
111
|
+
return read("ENVIO_CLICKHOUSE_HOST");
|
|
112
|
+
}
|
|
108
113
|
|
|
109
|
-
|
|
114
|
+
function database$1() {
|
|
115
|
+
return read("ENVIO_CLICKHOUSE_DATABASE");
|
|
116
|
+
}
|
|
110
117
|
|
|
111
|
-
|
|
118
|
+
function username() {
|
|
119
|
+
return read("ENVIO_CLICKHOUSE_USERNAME");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function password$1() {
|
|
123
|
+
return read("ENVIO_CLICKHOUSE_PASSWORD");
|
|
124
|
+
}
|
|
112
125
|
|
|
113
|
-
|
|
126
|
+
let ClickHouse = {
|
|
114
127
|
host: host$1,
|
|
115
128
|
database: database$1,
|
|
116
129
|
username: username,
|
|
117
130
|
password: password$1
|
|
118
131
|
};
|
|
119
132
|
|
|
120
|
-
|
|
133
|
+
let enabled = EnvSafe.get(envSafe, "ENVIO_HASURA", S$RescriptSchema.bool, undefined, true, undefined, undefined);
|
|
121
134
|
|
|
122
|
-
|
|
135
|
+
let s = EnvSafe.get(envSafe, "ENVIO_HASURA_RESPONSE_LIMIT", S$RescriptSchema.option(S$RescriptSchema.int), undefined, undefined, undefined, undefined);
|
|
123
136
|
|
|
124
|
-
|
|
137
|
+
let responseLimit = s !== undefined ? s : EnvSafe.get(envSafe, "HASURA_RESPONSE_LIMIT", S$RescriptSchema.option(S$RescriptSchema.int), undefined, undefined, undefined, undefined);
|
|
125
138
|
|
|
126
|
-
|
|
139
|
+
let graphqlEndpoint = EnvSafe.get(envSafe, "HASURA_GRAPHQL_ENDPOINT", S$RescriptSchema.string, undefined, undefined, "http://localhost:8080/v1/metadata", undefined);
|
|
127
140
|
|
|
128
|
-
|
|
141
|
+
let url = graphqlEndpoint.slice(0, -"/v1/metadata".length | 0);
|
|
129
142
|
|
|
130
|
-
|
|
143
|
+
let role = EnvSafe.get(envSafe, "HASURA_GRAPHQL_ROLE", S$RescriptSchema.string, undefined, undefined, "admin", undefined);
|
|
131
144
|
|
|
132
|
-
|
|
145
|
+
let secret = EnvSafe.get(envSafe, "HASURA_GRAPHQL_ADMIN_SECRET", S$RescriptSchema.string, undefined, undefined, "testing", undefined);
|
|
133
146
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}))
|
|
149
|
-
]), undefined, [], undefined, undefined);
|
|
147
|
+
let aggregateEntities = EnvSafe.get(envSafe, "ENVIO_HASURA_PUBLIC_AGGREGATE", S$RescriptSchema.union([
|
|
148
|
+
S$RescriptSchema.array(S$RescriptSchema.string),
|
|
149
|
+
S$RescriptSchema.transform(S$RescriptSchema.string, s => ({
|
|
150
|
+
p: string => {
|
|
151
|
+
let entities = string.split("&");
|
|
152
|
+
let len = entities.length;
|
|
153
|
+
if (len !== 1 && len !== 0) {
|
|
154
|
+
return entities;
|
|
155
|
+
} else {
|
|
156
|
+
return s.fail(`Provide an array of entities in the JSON format.`, undefined);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}))
|
|
160
|
+
]), undefined, [], undefined, undefined);
|
|
150
161
|
|
|
151
|
-
|
|
162
|
+
let Hasura = {
|
|
152
163
|
enabled: enabled,
|
|
153
164
|
responseLimit: responseLimit,
|
|
154
165
|
graphqlEndpoint: graphqlEndpoint,
|
|
@@ -158,30 +169,30 @@ var Hasura = {
|
|
|
158
169
|
aggregateEntities: aggregateEntities
|
|
159
170
|
};
|
|
160
171
|
|
|
161
|
-
|
|
172
|
+
let initialBlockInterval = EnvSafe.get(envSafe, "ENVIO_RPC_INITIAL_BLOCK_INTERVAL", S$RescriptSchema.option(S$RescriptSchema.int), undefined, undefined, undefined, undefined);
|
|
162
173
|
|
|
163
|
-
|
|
174
|
+
let backoffMultiplicative = EnvSafe.get(envSafe, "ENVIO_RPC_BACKOFF_MULTIPLICATIVE", S$RescriptSchema.option(S$RescriptSchema.float), undefined, undefined, undefined, undefined);
|
|
164
175
|
|
|
165
|
-
|
|
176
|
+
let accelerationAdditive = EnvSafe.get(envSafe, "ENVIO_RPC_ACCELERATION_ADDITIVE", S$RescriptSchema.option(S$RescriptSchema.int), undefined, undefined, undefined, undefined);
|
|
166
177
|
|
|
167
|
-
|
|
178
|
+
let intervalCeiling = EnvSafe.get(envSafe, "ENVIO_RPC_INTERVAL_CEILING", S$RescriptSchema.option(S$RescriptSchema.int), undefined, undefined, undefined, undefined);
|
|
168
179
|
|
|
169
|
-
|
|
180
|
+
let SyncConfig = {
|
|
170
181
|
initialBlockInterval: initialBlockInterval,
|
|
171
182
|
backoffMultiplicative: backoffMultiplicative,
|
|
172
183
|
accelerationAdditive: accelerationAdditive,
|
|
173
184
|
intervalCeiling: intervalCeiling
|
|
174
185
|
};
|
|
175
186
|
|
|
176
|
-
|
|
187
|
+
let Configurable = {
|
|
177
188
|
SyncConfig: SyncConfig
|
|
178
189
|
};
|
|
179
190
|
|
|
180
|
-
|
|
191
|
+
let chainMetadataIntervalMillis = EnvSafe.get(envSafe, "ENVIO_THROTTLE_CHAIN_METADATA_INTERVAL_MILLIS", S$RescriptSchema.int, undefined, undefined, 500, undefined);
|
|
181
192
|
|
|
182
|
-
|
|
193
|
+
let pruneStaleDataIntervalMillis = EnvSafe.get(envSafe, "ENVIO_THROTTLE_PRUNE_STALE_DATA_INTERVAL_MILLIS", S$RescriptSchema.int, undefined, undefined, 30000, undefined);
|
|
183
194
|
|
|
184
|
-
|
|
195
|
+
let ThrottleWrites = {
|
|
185
196
|
chainMetadataIntervalMillis: chainMetadataIntervalMillis,
|
|
186
197
|
pruneStaleDataIntervalMillis: pruneStaleDataIntervalMillis
|
|
187
198
|
};
|
|
@@ -189,29 +200,29 @@ var ThrottleWrites = {
|
|
|
189
200
|
EnvSafe.close(envSafe);
|
|
190
201
|
|
|
191
202
|
export {
|
|
192
|
-
updateSyncTimeOnRestart
|
|
193
|
-
targetBufferSize
|
|
194
|
-
maxAddrInPartition
|
|
195
|
-
maxPartitionConcurrency
|
|
196
|
-
serverPort
|
|
197
|
-
tuiOffEnvVar
|
|
198
|
-
logLevelSchema
|
|
199
|
-
logFilePath
|
|
200
|
-
userLogLevel
|
|
201
|
-
defaultFileLogLevel
|
|
202
|
-
prodEnvioAppUrl
|
|
203
|
-
envioAppUrl
|
|
204
|
-
envioApiToken
|
|
205
|
-
hyperSyncClientTimeoutMillis
|
|
206
|
-
hyperSyncClientMaxRetries
|
|
207
|
-
hypersyncClientSerializationFormat
|
|
208
|
-
hypersyncClientEnableQueryCaching
|
|
209
|
-
hypersyncLogLevel
|
|
210
|
-
logStrategy
|
|
211
|
-
Db
|
|
212
|
-
|
|
213
|
-
Hasura
|
|
214
|
-
Configurable
|
|
215
|
-
ThrottleWrites
|
|
203
|
+
updateSyncTimeOnRestart,
|
|
204
|
+
targetBufferSize,
|
|
205
|
+
maxAddrInPartition,
|
|
206
|
+
maxPartitionConcurrency,
|
|
207
|
+
serverPort,
|
|
208
|
+
tuiOffEnvVar,
|
|
209
|
+
logLevelSchema,
|
|
210
|
+
logFilePath,
|
|
211
|
+
userLogLevel,
|
|
212
|
+
defaultFileLogLevel,
|
|
213
|
+
prodEnvioAppUrl,
|
|
214
|
+
envioAppUrl,
|
|
215
|
+
envioApiToken,
|
|
216
|
+
hyperSyncClientTimeoutMillis,
|
|
217
|
+
hyperSyncClientMaxRetries,
|
|
218
|
+
hypersyncClientSerializationFormat,
|
|
219
|
+
hypersyncClientEnableQueryCaching,
|
|
220
|
+
hypersyncLogLevel,
|
|
221
|
+
logStrategy,
|
|
222
|
+
Db,
|
|
223
|
+
ClickHouse,
|
|
224
|
+
Hasura,
|
|
225
|
+
Configurable,
|
|
226
|
+
ThrottleWrites,
|
|
216
227
|
}
|
|
217
228
|
/* Not a pure module */
|
package/src/EnvSafe.res
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// Vendored from rescript-envsafe v5.0.0 (https://github.com/DZakh/rescript-envsafe).
|
|
2
|
+
// Kept in-tree so it's compiled with our ReScript toolchain and the emitted
|
|
3
|
+
// JS artifacts stay under our control (upstream's published JS may lag or
|
|
4
|
+
// target a different ReScript version). Diff against the v5.0.0 source when
|
|
5
|
+
// pulling upstream fixes. See LICENSE for attribution.
|
|
6
|
+
@@uncurried
|
|
7
|
+
|
|
8
|
+
%%private(external magic: 'a => 'b = "%identity")
|
|
9
|
+
|
|
10
|
+
module Stdlib = {
|
|
11
|
+
module Dict = {
|
|
12
|
+
@get_index external get: (dict<'a>, string) => option<'a> = ""
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
module Option = {
|
|
16
|
+
@inline
|
|
17
|
+
let forEach = (option, fn) => {
|
|
18
|
+
switch option {
|
|
19
|
+
| Some(v) => fn(v)
|
|
20
|
+
| None => ()
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module Window = {
|
|
26
|
+
let alert = (message: string): unit => {
|
|
27
|
+
message->ignore
|
|
28
|
+
if %raw(`typeof window !== 'undefined' && window.alert`) {
|
|
29
|
+
%raw(`window.alert(message)`)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module Exn = {
|
|
35
|
+
type error
|
|
36
|
+
|
|
37
|
+
@new
|
|
38
|
+
external makeError: string => error = "Error"
|
|
39
|
+
@new
|
|
40
|
+
external makeTypeError: string => error = "TypeError"
|
|
41
|
+
|
|
42
|
+
let raiseError = (error: error): 'a => error->magic->throw
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
module Error = {
|
|
47
|
+
@inline
|
|
48
|
+
let panic = message =>
|
|
49
|
+
Stdlib.Exn.raiseError(Stdlib.Exn.makeError(`[rescript-envsafe] ${message}`))
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
type env = dict<string>
|
|
53
|
+
type invalidIssue = {name: string, error: S.error, input: option<string>}
|
|
54
|
+
type missingIssue = {name: string, input: option<string>}
|
|
55
|
+
type t = {
|
|
56
|
+
env: env,
|
|
57
|
+
mutable isLocked: bool,
|
|
58
|
+
mutable maybeMissingIssues: option<array<missingIssue>>,
|
|
59
|
+
mutable maybeInvalidIssues: option<array<invalidIssue>>,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
module Env = {
|
|
63
|
+
@val
|
|
64
|
+
external // FIXME: process might be missing
|
|
65
|
+
default: dict<string> = "process.env"
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let mixinMissingIssue = (envSafe, issue) => {
|
|
69
|
+
switch envSafe.maybeMissingIssues {
|
|
70
|
+
| Some(missingIssues) => missingIssues->Array.push(issue)->ignore
|
|
71
|
+
| None => envSafe.maybeMissingIssues = Some([issue])
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let mixinInvalidIssue = (envSafe, issue: invalidIssue) => {
|
|
76
|
+
switch envSafe.maybeInvalidIssues {
|
|
77
|
+
| Some(invalidIssues) => invalidIssues->Array.push(issue)->ignore
|
|
78
|
+
| None => envSafe.maybeInvalidIssues = Some([issue])
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let make = (~env=Env.default) => {
|
|
83
|
+
{env, isLocked: false, maybeMissingIssues: None, maybeInvalidIssues: None}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
let close = envSafe => {
|
|
87
|
+
if envSafe.isLocked {
|
|
88
|
+
Error.panic("EnvSafe is already closed.")
|
|
89
|
+
}
|
|
90
|
+
envSafe.isLocked = true
|
|
91
|
+
switch (envSafe.maybeMissingIssues, envSafe.maybeInvalidIssues) {
|
|
92
|
+
| (None, None) => ()
|
|
93
|
+
| (maybeMissingIssues, maybeInvalidIssues) => {
|
|
94
|
+
let text = {
|
|
95
|
+
let line = "========================================"
|
|
96
|
+
let output = [line]
|
|
97
|
+
|
|
98
|
+
maybeInvalidIssues->Stdlib.Option.forEach(invalidIssues => {
|
|
99
|
+
output->Array.push("❌ Invalid environment variables:")->ignore
|
|
100
|
+
invalidIssues->Array.forEach(issue => {
|
|
101
|
+
output->Array.push(` ${issue.name}: ${issue.error->S.Error.message}`)->ignore
|
|
102
|
+
})
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
maybeMissingIssues->Stdlib.Option.forEach(missingIssues => {
|
|
106
|
+
output->Array.push("💨 Missing environment variables:")->ignore
|
|
107
|
+
missingIssues->Array.forEach(issue => {
|
|
108
|
+
output
|
|
109
|
+
->Array.push(
|
|
110
|
+
` ${issue.name}: ${switch issue.input {
|
|
111
|
+
| Some("") => "Disallowed empty string"
|
|
112
|
+
| _ => "Missing value"
|
|
113
|
+
}}`,
|
|
114
|
+
)
|
|
115
|
+
->ignore
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
output->Array.push(line)->ignore
|
|
120
|
+
output->Array.joinUnsafe("\n")
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
Console.error(text)
|
|
124
|
+
Stdlib.Window.alert(text)
|
|
125
|
+
Stdlib.Exn.raiseError(Stdlib.Exn.makeTypeError(text))
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let boolCoerce = string =>
|
|
131
|
+
switch string {
|
|
132
|
+
| "true"
|
|
133
|
+
| "t"
|
|
134
|
+
| "1" =>
|
|
135
|
+
true->magic
|
|
136
|
+
| "false"
|
|
137
|
+
| "f"
|
|
138
|
+
| "0" =>
|
|
139
|
+
false->magic
|
|
140
|
+
| _ => string
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
let numberCoerce = string => {
|
|
144
|
+
let float = %raw(`+string`)
|
|
145
|
+
if Float.isNaN(float) {
|
|
146
|
+
string
|
|
147
|
+
} else {
|
|
148
|
+
float->magic
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
let bigintCoerce = string => {
|
|
153
|
+
try string->BigInt.fromStringOrThrow->magic catch {
|
|
154
|
+
| _ => string
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
let jsonCoerce = string => {
|
|
159
|
+
try string->JSON.parseOrThrow->magic catch {
|
|
160
|
+
| _ => string
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
@inline
|
|
165
|
+
let prepareUnionSchemaCoercion = schema => {
|
|
166
|
+
schema->S.preprocess(s => {
|
|
167
|
+
let tagged = switch s.schema->S.classify {
|
|
168
|
+
| Option(optionalSchema) => optionalSchema->S.classify
|
|
169
|
+
| tagged => tagged
|
|
170
|
+
}
|
|
171
|
+
switch tagged {
|
|
172
|
+
| Literal(Boolean(_))
|
|
173
|
+
| Bool => {
|
|
174
|
+
parser: unknown => unknown->magic->boolCoerce->magic,
|
|
175
|
+
}
|
|
176
|
+
| Literal(BigInt(_))
|
|
177
|
+
| BigInt => {
|
|
178
|
+
parser: unknown => unknown->magic->bigintCoerce->magic,
|
|
179
|
+
}
|
|
180
|
+
| Literal(Number(_))
|
|
181
|
+
| Int
|
|
182
|
+
| Float => {
|
|
183
|
+
parser: unknown => unknown->magic->numberCoerce->magic,
|
|
184
|
+
}
|
|
185
|
+
| String
|
|
186
|
+
| Literal(String(_))
|
|
187
|
+
| Union(_)
|
|
188
|
+
| Never => {}
|
|
189
|
+
| _ => {
|
|
190
|
+
parser: unknown => unknown->magic->jsonCoerce->magic,
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
})
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
let get = (
|
|
197
|
+
envSafe,
|
|
198
|
+
name,
|
|
199
|
+
schema,
|
|
200
|
+
~allowEmpty=false,
|
|
201
|
+
~fallback as maybeFallback=?,
|
|
202
|
+
~devFallback as maybeDevFallback=?,
|
|
203
|
+
~input as maybeInlinedInput=?,
|
|
204
|
+
) => {
|
|
205
|
+
if envSafe.isLocked {
|
|
206
|
+
Error.panic("EnvSafe is closed. Make a new one to get access to environment variables.")
|
|
207
|
+
}
|
|
208
|
+
let input = switch maybeInlinedInput {
|
|
209
|
+
| Some(inlinedInput) => inlinedInput
|
|
210
|
+
| None => envSafe.env->Stdlib.Dict.get(name)
|
|
211
|
+
}
|
|
212
|
+
let isMissing = switch (input, allowEmpty) {
|
|
213
|
+
| (None, _)
|
|
214
|
+
| (Some(""), false) => true
|
|
215
|
+
| _ => false
|
|
216
|
+
}
|
|
217
|
+
let isOptional = switch schema->S.classify {
|
|
218
|
+
| Option(_) => true
|
|
219
|
+
| _ => false
|
|
220
|
+
}
|
|
221
|
+
if isMissing && !isOptional {
|
|
222
|
+
switch (maybeDevFallback, maybeFallback) {
|
|
223
|
+
| (Some(devFallback), _)
|
|
224
|
+
if envSafe.env->Stdlib.Dict.get("NODE_ENV") !== Some("production") => devFallback
|
|
225
|
+
| (_, Some(fallback)) => fallback
|
|
226
|
+
| _ => {
|
|
227
|
+
envSafe->mixinMissingIssue({name, input})
|
|
228
|
+
%raw(`undefined`)
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
} else {
|
|
232
|
+
let tagged = switch schema->S.classify {
|
|
233
|
+
| Option(optionalSchema) => optionalSchema->S.classify
|
|
234
|
+
| tagged => tagged
|
|
235
|
+
}
|
|
236
|
+
let input = switch input {
|
|
237
|
+
| Some("") if !allowEmpty => None
|
|
238
|
+
| None => None
|
|
239
|
+
| Some(string) =>
|
|
240
|
+
switch tagged {
|
|
241
|
+
| Literal(Boolean(_))
|
|
242
|
+
| Bool =>
|
|
243
|
+
string->boolCoerce
|
|
244
|
+
| Literal(BigInt(_))
|
|
245
|
+
| BigInt =>
|
|
246
|
+
string->bigintCoerce
|
|
247
|
+
| Literal(Number(_))
|
|
248
|
+
| Int
|
|
249
|
+
| Float =>
|
|
250
|
+
string->numberCoerce
|
|
251
|
+
| String
|
|
252
|
+
| Literal(String(_))
|
|
253
|
+
| Never
|
|
254
|
+
| Union(_) => string
|
|
255
|
+
| _ => string->jsonCoerce
|
|
256
|
+
}->Some
|
|
257
|
+
}
|
|
258
|
+
let schema = switch tagged {
|
|
259
|
+
| Union(_) => prepareUnionSchemaCoercion(schema)
|
|
260
|
+
| _ => schema
|
|
261
|
+
}
|
|
262
|
+
try input->S.parseOrThrow(schema) catch {
|
|
263
|
+
| S.Raised(error) => {
|
|
264
|
+
envSafe->mixinInvalidIssue({name, error, input})
|
|
265
|
+
%raw(`undefined`)
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|