Home Reference Source

packages/skygear-core/lib/cloud/settings.js

/**
 * Copyright 2015 Oursky Ltd.
 *
 * Licensed 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.
 */
require('dotenv').config();

function loadHttpSettings() {
  // TODO: set the default value to false when other transport is supported
  const enabled = process.env.HTTP || true;
  const httpAddr = process.env.HTTP_ADDR || '0.0.0.0:9000';


  let addrComponents = httpAddr.split(':', 2);
  if (addrComponents.length < 2) {
    addrComponents.unshift('0.0.0.0');
  }

  const address = addrComponents[0] ? addrComponents[0] : '0.0.0.0';
  const port = parseInt(addrComponents[1]);

  return {
    enabled,
    address,
    port
  };
}

function loadModuleSettings() {
  const modulesList = process.env.LOAD_MODULES || '';

  if (modulesList === '') {
    return [];
  }

  var modules = [];
  if (modulesList.indexOf(':') >= 0) {
    modules = modulesList.split(':');
  } else if (modulesList.indexOf(',') >= 0) {
    modules = modulesList.split(',');
  } else {
    modules = modulesList.split(' ');
  }

  var loadingModules = [];
  modules.forEach(function (moduleName) {
    if (moduleName.indexOf('~') === -1) {
      loadingModules.push(moduleName);
    } else if (moduleName.substring(moduleName.length - 3) === '~js') {
      loadingModules.push(moduleName.substring(0, moduleName.length - 3));
    }
  });

  return loadingModules;
}

function parseBool(val, defaultValue) {
  if (val === '' || val === null || val === undefined) {
    return defaultValue;
  }
  if (typeof val === 'string') {
    var lowerCase = val.toLowerCase().trim();
    return lowerCase !== 'false' && lowerCase !== 'no' && lowerCase !== '0';
  }
  return val !== 0 && val !== false;
}

export function parseInteger(val, defaultValue) {
  if (val === '' || val === null || val === undefined) {
    return defaultValue;
  }
  let i = parseInt(val, 10);
  if (i || i === 0) {
    return i;
  }
  return defaultValue;
}

export const settings = {
  skygearAddress: process.env.SKYGEAR_ADDRESS || 'tcp://127.0.0.1:6666',
  skygearEndpoint: process.env.SKYGEAR_ENDPOINT || 'http://127.0.0.1:3000',
  apiKey: process.env.API_KEY || null,
  masterKey: process.env.MASTER_KEY || null,
  appName: process.env.APP_NAME || '',
  logLevel: process.env.LOG_LEVEL || 'info',
  logFormat: process.env.LOG_FORMAT || 'text',
  http: loadHttpSettings(),
  debug: parseBool(process.env.DEBUG, false),
  pubsubURL: process.env.PUBSUB_URL || 'ws://127.0.0.0.1:3000/',
  serveStaticAssets: parseBool(process.env.SERVE_STATIC_ASSETS, true),
  collectAsset: process.env.COLLECT_ASSET || '/usr/src/assets',
  forceAsset: parseBool(process.env.FORCE_ASSET, false),
  databaseURL: process.env.DATABASE_URL ||
    'postgres://postgres@db/postgres?sslmode=disable',
  pgPoolMax: parseInteger(process.env.PG_POOL_MAX, 10),
  pgPoolMin: parseInteger(process.env.PG_POOL_MIN, 0),
  pgPoolIdleTimeoutMillis:
    parseInteger(process.env.PG_POOL_IDLE_TIMEOUT_MILLIS, 3000),

  assetStore: process.env.ASSET_STORE || 'fs',

  // FS asset settings
  assetStoreSecret: process.env.ASSET_STORE_SECRET || 'asset-secret',
  assetStoreURLPrefix: process.env.ASSET_STORE_URL_PREFIX ||
    'http://127.0.0.1:3000/files',
  assetStoreURLExpireDuration:
    parseInteger(process.env.ASSET_STORE_URL_EXPIRE_DURATION, 3600),

  // S3 asset settings
  assetStoreS3AccessKey: process.env.ASSET_STORE_ACCESS_KEY || '',
  assetStoreS3SecretKey: process.env.ASSET_STORE_SECRET_KEY || 'asset-secret',
  assetStoreS3Bucket: process.env.ASSET_STORE_BUCKET || 'bucket-name',
  assetStoreS3Region: process.env.ASSET_STORE_REGION || 'us-east-1',
  assetStoreS3URLPrefix: process.env.ASSET_STORE_S3_URL_PREFIX,

  // Cloud asset settings
  cloudAssetHost: process.env.CLOUD_ASSET_HOST,
  cloudAssetToken: process.env.CLOUD_ASSET_TOKEN,
  cloudAssetStorePublic: process.env.ASSET_STORE_PUBLIC,
  cloudAssetPublicPrefix: process.env.CLOUD_ASSET_PUBLIC_PREFIX,
  cloudAssetPrivatePrefix: process.env.CLOUD_ASSET_PRIVATE_PREFIX,

  loadModules: loadModuleSettings()
};