-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.ts
86 lines (81 loc) · 4.97 KB
/
config.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import "dotenv/config";
import { z } from 'zod';
import { Option, program } from "commander";
import { $ } from "bun";
import pkg from "../package.json" with { type: "json" };
// defaults
export const DEFAULT_PORT = "8000";
export const DEFAULT_HOSTNAME = "localhost";
export const DEFAULT_SSE_PORT = "8080";
export const DEFAULT_SSE_ENDPOINT = "sse";
export const DEFAULT_URL = "http://localhost:8123";
export const DEFAULT_DATABASE = "default";
export const DEFAULT_USERNAME = "default";
export const DEFAULT_PASSWORD = "";
export const DEFAULT_MAX_LIMIT = 10000;
export const DEFAULT_LARGE_QUERIES_ROWS_TRIGGER = 10_000_000; // 10M rows
export const DEFAULT_LARGE_QUERIES_BYTES_TRIGGER = 1_000_000_000; // 1Gb
export const DEFAULT_IDLE_TIMEOUT = 60;
export const DEFAULT_PRETTY_LOGGING = false;
export const DEFAULT_VERBOSE = false;
export const DEFAULT_SORT_BY = "DESC";
export const DEFAULT_AGE = 30;
export const DEFAULT_MAX_AGE = 180;
export const DEFAULT_PAGE = 1;
export const DEFAULT_LIMIT = 10;
export const DEFAULT_NETWORK_ID = "mainnet";
export const DEFAULT_NETWORKS = "arbitrum-one,base,bsc,mainnet"
// GitHub metadata
const GIT_COMMIT = (process.env.GIT_COMMIT ?? await $`git rev-parse HEAD`.text()).replace(/\n/, "").slice(0, 7);
const GIT_DATE = (process.env.GIT_DATE ?? await $`git log -1 --format=%cd --date=short`.text()).replace(/\n/, "");
const GIT_REPOSITORY = (process.env.GIT_REPOSITORY ?? await $`git config --get remote.origin.url`.text()).replace(/[email protected]:/, "").replace(".git", "").replace(/\n/, "");
export const GIT_APP = {
version: pkg.version as `${number}.${number}.${number}`,
commit: GIT_COMMIT,
date: GIT_DATE as `${number}-${number}-${number}`,
repo: GIT_REPOSITORY,
};
export const APP_NAME = pkg.name;
export const APP_DESCRIPTION = pkg.description;
export const APP_VERSION = `${GIT_APP.version}+${GIT_APP.commit} (${GIT_APP.date})`;
// parse command line options
const opts = program
.name(pkg.name)
.version(APP_VERSION)
.description(APP_DESCRIPTION)
.showHelpAfterError()
.addOption(new Option("-p, --port <number>", "HTTP port on which to attach the API").env("PORT").default(DEFAULT_PORT))
.addOption(new Option("--hostname <string>", "Server listen on HTTP hostname").env("HOSTNAME").default(DEFAULT_HOSTNAME))
.addOption(new Option("--sse-port <number>", "HTTP port on which to attach the MCP SSE server").env("SSE_PORT").default(DEFAULT_SSE_PORT))
.addOption(new Option("--sse-endpoint <string>", "Endpoint name for the MCP SSE server").env("SSE_ENDPOINT").default(DEFAULT_SSE_ENDPOINT))
.addOption(new Option("--url <string>", "Database HTTP hostname").env("URL").default(DEFAULT_URL))
.addOption(new Option("--database <string>", "The database to use inside ClickHouse").env("DATABASE").default(DEFAULT_DATABASE))
.addOption(new Option("--username <string>", "Database user").env("USERNAME").default(DEFAULT_USERNAME))
.addOption(new Option("--password <string>", "Password associated with the specified username").env("PASSWORD").default(DEFAULT_PASSWORD))
.addOption(new Option("--max-limit <number>", "Maximum LIMIT queries").env("MAX_LIMIT").default(DEFAULT_MAX_LIMIT))
.addOption(new Option("--max-rows-trigger <number>", "Queries returning rows above this treshold will be considered large queries for metrics").env("LARGE_QUERIES_ROWS_TRIGGER").default(DEFAULT_LARGE_QUERIES_ROWS_TRIGGER))
.addOption(new Option("--max-bytes-trigger <number>", "Queries processing bytes above this treshold will be considered large queries for metrics").env("LARGE_QUERIES_BYTES_TRIGGER").default(DEFAULT_LARGE_QUERIES_BYTES_TRIGGER))
.addOption(new Option("--request-idle-timeout <number>", "Bun server request idle timeout (seconds)").env("BUN_IDLE_REQUEST_TIMEOUT").default(DEFAULT_IDLE_TIMEOUT))
.addOption(new Option("--pretty-logging <boolean>", "Enable pretty logging (default JSON)").choices(["true", "false"]).env("PRETTY_LOGGING").default(DEFAULT_PRETTY_LOGGING))
.addOption(new Option("--networks <string>", "Supported The Graph Network IDs").env("NETWORKS").default(DEFAULT_NETWORKS))
.addOption(new Option("-v, --verbose <boolean>", "Enable verbose logging").choices(["true", "false"]).env("VERBOSE").default(DEFAULT_VERBOSE))
.parse()
.opts();
export const config = z.object({
port: z.string(),
hostname: z.string(),
ssePort: z.coerce.number(),
sseEndpoint: z.string(),
url: z.string(),
database: z.string(),
username: z.string(),
password: z.string(),
maxLimit: z.coerce.number(),
maxRowsTrigger: z.coerce.number(),
maxBytesTrigger: z.coerce.number(),
requestIdleTimeout: z.coerce.number(),
networks: z.string().transform((networks) => networks.split(',')),
// `z.coerce.boolean` doesn't parse boolean string values as expected (see https://github.com/colinhacks/zod/issues/1630)
prettyLogging: z.coerce.string().transform((val) => val.toLowerCase() === "true"),
verbose: z.coerce.string().transform((val) => val.toLowerCase() === "true"),
}).parse(opts);