fh-instance-url
Version:
Get a FeedHenry/RHMAP Cloud or MBaaS Service URL.
186 lines (153 loc) • 4.42 kB
JavaScript
;
var env = require('env-var')
, url = require('url')
, log = require('./log')
, assert = require('assert')
, VError = require('verror')
, pkg = require('./config');
/**
* Returns the app api key required to make a service request
* @return {String}
*/
function getApiKey () {
if (isLocal() && pkg.apiKey) {
log.trace('using apiKey in fhconfig');
return pkg.apiKey;
} else {
log.trace('using api key in FH_APP_API_KEY env var');
return env('FH_APP_API_KEY').asString();
}
}
/**
* Returns the widget id required to make a service request
* @return {String}
*/
var getWidget = exports.getWidget = function getWidget () {
if (isLocal() && pkg.appId) {
log.trace('using appId key in fhconfig');
return pkg.appId;
} else {
log.trace('using appId in FH_WIDGET env var');
return env('FH_WIDGET').asString();
}
};
/**
* Determine if the application is deployed on RHMAP, or locally
* @param {Object} env process.env Object
* @return {Boolean}
*/
var isLocal = exports.isLocal = function isLocal () {
// This should be suffificient to determine are we running locally or not, but
// might require more considerations since it is a little crude
var ret = (
env('FH_USE_LOCAL_DB').asString() ||
!env('FH_MILLICORE').asString() ||
!env('FH_ENV').asString()
);
log.trace('are we running locally? %s', ret);
return ret;
};
/**
* Returns data in the FH_SERVICE_MAP format if it exists in fhconfig or the
* older FH_SERVICE_MAP env var
* @return Object
*/
exports.getServiceMap = function getServiceMap (callback) {
var err = null
, ret = null;
if (pkg && typeof pkg.services === 'object') {
log.trace('fhconfig "services" entry found. using it for service mapping');
ret = {};
Object.keys(pkg.services).forEach(function (guid) {
ret[guid] = pkg.services[guid].devUrl;
});
} else if (env('FH_SERVICE_MAP').asString()) {
log.trace(
'fhconfig "services" entry not found. using FH_SERVICE_MAP instead'
);
try {
ret = env('FH_SERVICE_MAP').asJson();
} catch (e) {
err = new VError(e, 'cannot parse FH_SERVICE_MAP environment variable');
}
} else {
log.warn(
'no service mappings found as fhconfig.services, or FH_SERVICE_MAP'
);
}
callback(err, ret);
};
/**
* Normalise a host string to {HOST}.feedhenry.com
* @param {String} host
* @return {String}
*/
exports.genHost = function genHost () {
var ret = exports.getDomain();
assert(
ret && ret.length >= 0,
'fhconfig.json domain property must be provided, or FH_MILLICORE env var ' +
'must be set on the system'
);
assert.notEqual(
ret.indexOf('http'),
0,
'fhconfig.json "domain" must not contain a protcol string, just the host' +
', i.e "http://" or "https://"'
);
var parsedUrl = url.format({
host: ret,
protocol: 'https:',
pathname: '/box/srv/1.1/ide/apps/app/hosts'
});
log.trace('generated guid lookup endpoint as "%s"', parsedUrl);
return parsedUrl;
};
/**
* Returns the domain this application is running on.
*
* Locally it will use the domain in the fhconfig, else it'll check the
* environment variables, be sure they match to avoid headaches
* @return {String}
*/
exports.getDomain = function () {
var ret = null;
if (isLocal() && pkg.domain) {
log.trace('using fhconfig "domain" for host generation');
ret = pkg.domain;
} else {
log.trace('using FH_MILLICORE for host generation');
ret = env('FH_MILLICORE').asString();
}
log.trace('determined that domain is "%s"', ret);
return ret;
};
/**
* Returns service call headers that are required for secure calls
* @return {Object}
*/
exports.getServiceCallHeaders = function () {
var ret = {
'x-fh-auth-app': getApiKey(),
'x-request-with': getWidget()
};
log.trace('generated service call headers as', ret);
return ret;
};
/**
* Return the FH_ENV variable that indicates the env we're running in
* @return {String}
*/
exports.getEnv = function getEnv () {
var e = env('FH_ENV').asString();
if (!e) {
log.warn(
'FH_ENV environment variable not set. this is OK during local ' +
'development, and will default to "dev" unless you need to set it ' +
'explicitly e.g "export FH_ENV=rht-dev" or similar in bash'
);
return 'dev';
} else {
return e;
}
};