2022-10-11 23:49:36 -05:00
|
|
|
import {
|
|
|
|
type LevelName,
|
|
|
|
LogLevels,
|
|
|
|
} from "https://deno.land/std@0.159.0/log/mod.ts";
|
2022-10-11 12:20:25 -05:00
|
|
|
|
2022-11-09 16:55:27 -06:00
|
|
|
export interface LogConfig {
|
|
|
|
consoleLevelName: LevelName;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface PostgresConfig {
|
|
|
|
url: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface MailgunConfig {
|
|
|
|
apiKey?: string;
|
|
|
|
domain?: string;
|
|
|
|
}
|
|
|
|
|
2022-10-07 23:22:35 -05:00
|
|
|
export interface Config {
|
2022-11-09 16:55:27 -06:00
|
|
|
log: LogConfig;
|
|
|
|
postgres: PostgresConfig;
|
|
|
|
mailgun: MailgunConfig;
|
|
|
|
isDevelopmentMode: boolean;
|
2022-10-07 23:22:35 -05:00
|
|
|
}
|
2022-10-07 21:55:20 -05:00
|
|
|
|
2022-11-09 16:55:27 -06:00
|
|
|
function truthyEnv(key: string): boolean {
|
|
|
|
return (Deno.env.get(key) || "").toString().toLowerCase().trim() in
|
|
|
|
["true", "1"];
|
2022-10-07 23:22:35 -05:00
|
|
|
}
|
2022-10-07 21:55:20 -05:00
|
|
|
|
2022-10-11 23:49:36 -05:00
|
|
|
function isLogLevelName(s: string): s is LevelName {
|
|
|
|
return s in LogLevels;
|
|
|
|
}
|
|
|
|
|
2022-11-09 16:55:27 -06:00
|
|
|
export let config: Readonly<Config>;
|
|
|
|
|
|
|
|
type Logger = { warning: (s: string, ...opts: unknown[]) => void };
|
|
|
|
|
|
|
|
export function setAll(newConfig: Config) {
|
|
|
|
config = newConfig;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function reload(): [
|
|
|
|
Config,
|
|
|
|
((logger: Logger) => void)[],
|
|
|
|
] {
|
|
|
|
// since we want configuration to be setup before any logging, lets save logs here until the logger is setup
|
|
|
|
const logCalls = [];
|
|
|
|
|
|
|
|
const envOrWarn = (key: string, fallback: string): string => {
|
|
|
|
const val = Deno.env.get(key);
|
|
|
|
if (!val) {
|
|
|
|
logCalls.push((logger: Logger) =>
|
|
|
|
logger.warning(`${key} is not set! Using fallback: ${fallback}`)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return val || fallback;
|
|
|
|
};
|
|
|
|
|
|
|
|
const desiredLogLevel = envOrWarn("LOG_LEVEL", "INFO").toUpperCase();
|
|
|
|
if (!isLogLevelName(desiredLogLevel)) {
|
|
|
|
logCalls.push((logger: Logger) =>
|
|
|
|
logger.warning(
|
|
|
|
`Specified LOG_LEVEL '${desiredLogLevel}' is invalid. Falling back to INFO`,
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
const logLevel: LevelName = isLogLevelName(desiredLogLevel)
|
|
|
|
? desiredLogLevel
|
|
|
|
: "INFO";
|
|
|
|
|
|
|
|
const config: Config = {
|
|
|
|
log: {
|
|
|
|
consoleLevelName: logLevel,
|
|
|
|
},
|
|
|
|
postgres: {
|
|
|
|
url: envOrWarn(
|
|
|
|
"POSTGRES_URL",
|
|
|
|
"postgresql://postgres:@127.0.0.1:5432/lyricscreen",
|
|
|
|
),
|
|
|
|
},
|
|
|
|
mailgun: {},
|
|
|
|
isDevelopmentMode: truthyEnv("DEVELOPMENT_MODE"),
|
|
|
|
};
|
|
|
|
|
|
|
|
return [config, logCalls];
|
|
|
|
}
|