2021-04-29 12:37:57 -04:00
|
|
|
/**
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
|
|
* or more contributor license agreements. See the NOTICE file
|
|
|
|
* distributed with this work for additional information
|
|
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
|
|
* to you under the Apache License, Version 2.0 (the
|
|
|
|
* "License"); you may not use this file except in compliance
|
|
|
|
* with the License. You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing,
|
|
|
|
* software distributed under the License is distributed on an
|
|
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
* KIND, either express or implied. See the License for the
|
|
|
|
* specific language governing permissions and limitations
|
|
|
|
* under the License.
|
|
|
|
*/
|
|
|
|
type ConfigType = {
|
|
|
|
port: number;
|
|
|
|
logLevel: string;
|
|
|
|
logToFile: boolean;
|
|
|
|
logFilename: string;
|
|
|
|
statsd: {
|
|
|
|
host: string;
|
|
|
|
port: number;
|
|
|
|
globalTags: Array<string>;
|
|
|
|
};
|
|
|
|
redis: {
|
|
|
|
port: number;
|
|
|
|
host: string;
|
|
|
|
password: string;
|
|
|
|
db: number;
|
|
|
|
ssl: boolean;
|
|
|
|
};
|
|
|
|
redisStreamPrefix: string;
|
|
|
|
redisStreamReadCount: number;
|
|
|
|
redisStreamReadBlockMs: number;
|
|
|
|
jwtSecret: string;
|
|
|
|
jwtCookieName: string;
|
|
|
|
socketResponseTimeoutMs: number;
|
|
|
|
pingSocketsIntervalMs: number;
|
|
|
|
gcChannelsIntervalMs: number;
|
|
|
|
};
|
|
|
|
|
|
|
|
function defaultConfig(): ConfigType {
|
|
|
|
return {
|
|
|
|
port: 8080,
|
|
|
|
logLevel: 'info',
|
|
|
|
logToFile: false,
|
|
|
|
logFilename: 'app.log',
|
|
|
|
redisStreamPrefix: 'async-events-',
|
|
|
|
redisStreamReadCount: 100,
|
|
|
|
redisStreamReadBlockMs: 5000,
|
|
|
|
jwtSecret: '',
|
|
|
|
jwtCookieName: 'async-token',
|
|
|
|
socketResponseTimeoutMs: 60 * 1000,
|
|
|
|
pingSocketsIntervalMs: 20 * 1000,
|
|
|
|
gcChannelsIntervalMs: 120 * 1000,
|
|
|
|
statsd: {
|
|
|
|
host: '127.0.0.1',
|
|
|
|
port: 8125,
|
|
|
|
globalTags: [],
|
|
|
|
},
|
|
|
|
redis: {
|
|
|
|
host: '127.0.0.1',
|
|
|
|
port: 6379,
|
|
|
|
password: '',
|
|
|
|
db: 0,
|
|
|
|
ssl: false,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function configFromFile(): Partial<ConfigType> {
|
|
|
|
const isTest = process.env.NODE_ENV === 'test';
|
|
|
|
const configFile = isTest ? '../config.test.json' : '../config.json';
|
|
|
|
try {
|
|
|
|
return require(configFile);
|
|
|
|
} catch (err) {
|
|
|
|
console.warn('config.json file not found');
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const isPresent = (s: string) => /\S+/.test(s);
|
|
|
|
const toNumber = Number;
|
|
|
|
const toBoolean = (s: string) => s.toLowerCase() === 'true';
|
|
|
|
const toStringArray = (s: string) => s.split(',');
|
|
|
|
|
|
|
|
function applyEnvOverrides(config: ConfigType): ConfigType {
|
|
|
|
const envVarConfigSetter: { [envVar: string]: (val: string) => void } = {
|
|
|
|
PORT: val => (config.port = toNumber(val)),
|
|
|
|
LOG_LEVEL: val => (config.logLevel = val),
|
|
|
|
LOG_TO_FILE: val => (config.logToFile = toBoolean(val)),
|
|
|
|
LOG_FILENAME: val => (config.logFilename = val),
|
|
|
|
REDIS_STREAM_PREFIX: val => (config.redisStreamPrefix = val),
|
|
|
|
REDIS_STREAM_READ_COUNT: val =>
|
|
|
|
(config.redisStreamReadCount = toNumber(val)),
|
|
|
|
REDIS_STREAM_READ_BLOCK_MS: val =>
|
|
|
|
(config.redisStreamReadBlockMs = toNumber(val)),
|
|
|
|
JWT_SECRET: val => (config.jwtSecret = val),
|
|
|
|
JWT_COOKIE_NAME: val => (config.jwtCookieName = val),
|
|
|
|
SOCKET_RESPONSE_TIMEOUT_MS: val =>
|
|
|
|
(config.socketResponseTimeoutMs = toNumber(val)),
|
|
|
|
PING_SOCKETS_INTERVAL_MS: val =>
|
|
|
|
(config.pingSocketsIntervalMs = toNumber(val)),
|
|
|
|
GC_CHANNELS_INTERVAL_MS: val =>
|
|
|
|
(config.gcChannelsIntervalMs = toNumber(val)),
|
|
|
|
REDIS_HOST: val => (config.redis.host = val),
|
|
|
|
REDIS_PORT: val => (config.redis.port = toNumber(val)),
|
|
|
|
REDIS_PASSWORD: val => (config.redis.password = val),
|
|
|
|
REDIS_DB: val => (config.redis.db = toNumber(val)),
|
|
|
|
REDIS_SSL: val => (config.redis.ssl = toBoolean(val)),
|
|
|
|
STATSD_HOST: val => (config.statsd.host = val),
|
|
|
|
STATSD_PORT: val => (config.statsd.port = toNumber(val)),
|
|
|
|
STATSD_GLOBAL_TAGS: val => (config.statsd.globalTags = toStringArray(val)),
|
|
|
|
};
|
|
|
|
|
2021-05-05 01:07:53 -04:00
|
|
|
Object.entries(envVarConfigSetter).forEach(([envVar, set]) => {
|
2021-04-29 12:37:57 -04:00
|
|
|
const envValue = process.env[envVar];
|
|
|
|
if (envValue && isPresent(envValue)) {
|
|
|
|
set(envValue);
|
|
|
|
}
|
2021-05-05 01:07:53 -04:00
|
|
|
});
|
2021-04-29 12:37:57 -04:00
|
|
|
|
|
|
|
return config;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function buildConfig(): ConfigType {
|
|
|
|
const config = Object.assign(defaultConfig(), configFromFile());
|
|
|
|
return applyEnvOverrides(config);
|
|
|
|
}
|