%PDF- %PDF-
| Direktori : /usr/lib/node_modules/ncm-ng/lib/ |
| Current File : //usr/lib/node_modules/ncm-ng/lib/config.js |
'use strict'
const ENV_VAR_PREFIX = 'NCM_WORKERS_'
const SSM_PREFIX = '/ncm-workers'
exports.init = init
exports.initStatic = initStatic
exports.get = get
exports.log = log
exports.getConfigKeys = getConfigKeys
exports.getStaticConfigKeys = getStaticConfigKeys
exports.isStaticConfigKey = isStaticConfigKey
exports.ENV_VAR_PREFIX = ENV_VAR_PREFIX
exports.SSM_PREFIX = SSM_PREFIX
const LOCAL_CONFIG = {
TMP_PATH: null, // Use random-generated tmp dir by default.
SLACK_WEBHOOK: '',
NCM2_API_URL: 'file:',
QUEUE_FLOW_P0: 'memory:flow-p0',
QUEUE_FLOW_P1: 'memory:flow-p1',
QUEUE_FLOW_P2: 'memory:flow-p2'
}
// config keys that are mostly static, don't need to be in SSM, but can be
// overridden via env vars
const STATIC_CONFIG = {
NPM_FOLLOW_REGISTRY: 'https://replicate.npmjs.com/registry'
}
const CONFIG_KEYS = Object.keys(LOCAL_CONFIG)
const DeauthedKeys = new Set()
const URL = require('url')
const nsUtil = require('../util')
const logger = nsUtil.logger.getLogger(__filename)
const defaultOptions = {
}
const Config = {}
let Loaded = false
function getConfigKeys () {
return Object.keys(Object.assign({}, LOCAL_CONFIG, STATIC_CONFIG))
}
function isStaticConfigKey (key) {
return Object.keys(STATIC_CONFIG).indexOf(key) !== -1
}
function getStaticConfigKeys () {
return Object.keys(STATIC_CONFIG)
}
function initStatic (config) {
// delete existing keys
for (let key in Config) {
delete Config[key]
}
// add new keys
for (let key in config) {
Config[key] = config[key]
}
// set loaded to true
Loaded = true
logger.debug(`config loaded via initStatic: ${JSON.stringify(Config)}`)
}
// load configuration
async function init (options) {
options = Object.assign({}, defaultOptions, options)
if (Loaded) return
Loaded = true
if (options == null) throw new Error('options must not be null')
Config.env = 'local'
Config.envName = 'local'
Config.isDeployed = false
Config.PORT = process.env.PORT || '3001'
const params = {
Path: root,
MaxResults: 10,
Recursive: true,
WithDecryption: true
}
// set config from SSM params
for (let paramKey of Object.keys(params)) {
if (!paramKey.startsWith(SSM_PREFIX)) continue
const match = paramKey.match(/^\/.*?\/(.*?)\/(.*)/)
if (match == null) {
logger.warn(`skipping unmmatched ssm key/val: ${paramKey}: ${params[paramKey]}`)
continue
}
const env = match[1]
const configKey = match[2]
const configVal = params[paramKey]
if (env !== Config.env) {
logger.debug(`skipping different env ssm key/val: ${paramKey}: ${params[paramKey]}`)
continue
}
Config[configKey] = configVal
}
// set config for local envs from env vars and defaults
if (!Config.isDeployed) {
getEnvDefaults(Config)
getLocalDefaults(Config)
}
// ensure expected properties are available
let someMissing = false
for (let configKey of CONFIG_KEYS) {
if (Config[configKey] == null && LOCAL_CONFIG[configKey] != null) {
someMissing = true
logger.error(`config key ${configKey} for env ${Config.env} not found`)
}
}
if (someMissing) {
throw new Error('missing some config keys: see previous messages')
}
// add the static data, allowing it to be overridden
for (let key of Object.keys(STATIC_CONFIG)) {
Config[key] = STATIC_CONFIG[key]
const envVarName = `${ENV_VAR_PREFIX}${key}`
const envVal = process.env[envVarName]
if (envVal == null) continue
Config[key] = envVal
}
// replace %PR_NUM% in values for dev envs
if (Config.env === 'dev') {
const devPR = nsUtil.getEnvDevPR()
if (devPR == null) {
logger.warn(`dev env should have a PR number, but does not seem to`)
} else {
for (let key of Object.keys(Config)) {
const val = Config[key]
if (typeof val !== 'string') continue
if (val.indexOf('%PR_NUM%') === -1) continue
Config[key] = val.replace(/%PR_NUM%/g, devPR)
}
}
}
}
// get the current configuration
function get () {
if (!Loaded) throw new Error('configuration not yet loaded')
return Object.assign({}, Config)
}
// log the current configuration
function log () {
if (!Loaded) return logger.warn('config not yet loaded')
const sortedKeys = Object.keys(Config).sort()
for (let key of sortedKeys) {
let val = Config[key]
if (DeauthedKeys.has(key)) val = loggableURL(val)
logger.info(`config: ${key} - ${val}`)
}
}
// get defaults from the environment
function getEnvDefaults (config) {
for (let configKey of CONFIG_KEYS) {
const envVarName = `${ENV_VAR_PREFIX}${configKey}`
if (config[configKey] != null) continue
if (process.env[envVarName] == null) continue
config[configKey] = process.env[envVarName]
}
}
// get defaults for local-ish environments
function getLocalDefaults (config) {
for (let configKey of CONFIG_KEYS) {
if (config[configKey] != null) continue
config[configKey] = LOCAL_CONFIG[configKey]
}
}
// return a URL with the auth replaced with USER:PASS
function loggableURL (url) {
if (url == null) return url
try {
var urlParsed = URL.parse(url)
} catch (err) {
logger.warning(`unable to parse url: "${url}"`)
return 'unparseable-url'
}
urlParsed.auth = 'USER:PASS'
return URL.format(urlParsed)
}