PHP WebShell

Текущая директория: /opt/BitGoJS/modules/express/src

Просмотр файла: config.ts

import { EnvironmentName, V1Network } from 'bitgo';
import { isNil, isNumber } from 'lodash';
import 'dotenv/config';

import { args } from './args';

function readEnvVar(name, ...deprecatedAliases): string | undefined {
  if (process.env[name] !== undefined && process.env[name] !== '') {
    return process.env[name];
  }

  for (const deprecatedAlias of deprecatedAliases) {
    if (process.env[deprecatedAlias] !== undefined) {
      console.warn(
        `warning: using deprecated environment variable '${deprecatedAlias}'. Please use the '${name}' environment variable instead.`
      );
      return process.env[deprecatedAlias];
    }
  }
}

export interface Config {
  port: number;
  bind: string;
  ipc?: string;
  env: EnvironmentName;
  debugNamespace: string[];
  keyPath?: string;
  crtPath?: string;
  sslKey?: string;
  sslCert?: string;
  logFile?: string;
  disableSSL: boolean;
  disableProxy: boolean;
  disableEnvCheck: boolean;
  timeout: number;
  customRootUri?: string;
  customBitcoinNetwork?: V1Network;
  authVersion: number;
  externalSignerUrl?: string;
  signerMode?: boolean;
  signerFileSystemPath?: string;
  lightningSignerFileSystemPath?: string;
  keepAliveTimeout?: number;
  headersTimeout?: number;
}

export const ArgConfig = (args): Partial<Config> => ({
  port: args.port,
  bind: args.bind,
  ipc: args.ipc,
  env: args.env,
  debugNamespace: args.debugnamespace,
  keyPath: args.keypath,
  crtPath: args.crtpath,
  sslKey: args.sslkey,
  sslCert: args.sslcert,
  logFile: args.logfile,
  disableSSL: args.disablessl,
  disableProxy: args.disableproxy,
  disableEnvCheck: args.disableenvcheck,
  timeout: args.timeout,
  customRootUri: args.customrooturi,
  customBitcoinNetwork: args.custombitcoinnetwork,
  authVersion: args.authVersion,
  externalSignerUrl: args.externalSignerUrl,
  signerMode: args.signerMode,
  signerFileSystemPath: args.signerFileSystemPath,
  lightningSignerFileSystemPath: args.lightningSignerFileSystemPath,
  keepAliveTimeout: args.keepalivetimeout,
  headersTimeout: args.headerstimeout,
});

export const EnvConfig = (): Partial<Config> => ({
  port: Number(readEnvVar('BITGO_PORT')),
  bind: readEnvVar('BITGO_BIND'),
  ipc: readEnvVar('BITGO_IPC'),
  env: readEnvVar('BITGO_ENV') as EnvironmentName,
  debugNamespace: (readEnvVar('BITGO_DEBUG_NAMESPACE') || '').split(','),
  keyPath: readEnvVar('BITGO_KEYPATH'),
  crtPath: readEnvVar('BITGO_CRTPATH'),
  sslKey: readEnvVar('BITGO_SSL_KEY'),
  sslCert: readEnvVar('BITGO_SSL_CERT'),
  logFile: readEnvVar('BITGO_LOGFILE'),
  disableSSL: readEnvVar('BITGO_DISABLE_SSL', 'BITGO_DISABLESSL', 'DISABLESSL', 'DISABLE_SSL') ? true : undefined,
  disableProxy: readEnvVar('BITGO_DISABLE_PROXY', 'DISABLE_PROXY') ? true : undefined,
  disableEnvCheck: readEnvVar('BITGO_DISABLE_ENV_CHECK', 'DISABLE_ENV_CHECK') ? true : undefined,
  timeout: Number(readEnvVar('BITGO_TIMEOUT')),
  customRootUri: readEnvVar('BITGO_CUSTOM_ROOT_URI'),
  customBitcoinNetwork: readEnvVar('BITGO_CUSTOM_BITCOIN_NETWORK') as V1Network,
  authVersion: Number(readEnvVar('BITGO_AUTH_VERSION')),
  externalSignerUrl: readEnvVar('BITGO_EXTERNAL_SIGNER_URL'),
  signerMode: readEnvVar('BITGO_SIGNER_MODE') ? true : undefined,
  signerFileSystemPath: readEnvVar('BITGO_SIGNER_FILE_SYSTEM_PATH'),
  lightningSignerFileSystemPath: readEnvVar('BITGO_LIGHTNING_SIGNER_FILE_SYSTEM_PATH'),
  keepAliveTimeout: Number(readEnvVar('BITGO_KEEP_ALIVE_TIMEOUT')),
  headersTimeout: Number(readEnvVar('BITGO_HEADERS_TIMEOUT')),
});

export const DefaultConfig: Config = {
  port: 3080,
  bind: 'localhost',
  env: 'test',
  debugNamespace: [],
  logFile: '',
  disableSSL: false,
  disableProxy: false,
  // BG-9584: temporarily disable env check while we give users time to react to change in runtime behavior
  // This will require a major version bump, since this is a breaking change to default behavior.
  disableEnvCheck: true,
  timeout: 305 * 1000,
  authVersion: 2,
};

/**
 * Force https:// prefix unless ssl is disabled
 * @param url
 * @return {string}
 */
export function forceSecureUrl(url: string): string {
  const regex = new RegExp(/(^\w+:|^)\/\//);
  if (regex.test(url)) {
    return url.replace(/(^\w+:|^)\/\//, 'https://');
  }
  return `https://${url}`;
}

/**
 * Helper function to merge config sources into a single config object.
 *
 * Later configs have higher precedence over earlier configs.
 */
function mergeConfigs(...configs: Partial<Config>[]): Config {
  function isNilOrNaN(val: unknown): val is null | undefined | number {
    return isNil(val) || (isNumber(val) && isNaN(val));
  }

  // helper to get the last defined value for a given config key
  // from each of the config sources in a type safe manner.
  function get<T extends keyof Config>(k: T): Config[T] {
    return configs.reduce(
      (entry: Config[T], config) => (!isNilOrNaN(config[k]) ? (config[k] as Config[T]) : entry),
      DefaultConfig[k]
    );
  }

  const disableSSL = get('disableSSL') || false;
  let customRootUri = get('customRootUri');
  let externalSignerUrl = get('externalSignerUrl');

  if (disableSSL !== true) {
    if (customRootUri) {
      customRootUri = forceSecureUrl(customRootUri);
    }
    if (externalSignerUrl) {
      externalSignerUrl = forceSecureUrl(externalSignerUrl);
    }
  }

  return {
    port: get('port'),
    bind: get('bind'),
    ipc: get('ipc'),
    env: get('env'),
    debugNamespace: get('debugNamespace'),
    keyPath: get('keyPath'),
    crtPath: get('crtPath'),
    sslKey: get('sslKey'),
    sslCert: get('sslCert'),
    logFile: get('logFile'),
    disableSSL,
    disableProxy: get('disableProxy'),
    disableEnvCheck: get('disableEnvCheck'),
    timeout: get('timeout'),
    customRootUri: customRootUri || undefined,
    customBitcoinNetwork: get('customBitcoinNetwork'),
    authVersion: get('authVersion'),
    externalSignerUrl,
    signerMode: get('signerMode'),
    signerFileSystemPath: get('signerFileSystemPath'),
    lightningSignerFileSystemPath: get('lightningSignerFileSystemPath'),
    keepAliveTimeout: get('keepAliveTimeout'),
    headersTimeout: get('headersTimeout'),
  };
}

export const config = () => {
  const arg = ArgConfig(args());
  const env = EnvConfig();
  return mergeConfigs(env, arg);
};

Выполнить команду


Для локальной разработки. Не используйте в интернете!