const axios = require('axios');
const config = require('config');
const qs = require('qs');
const dbHelper = require('./dbHelper');
const log = require('../lib/log');
/**
* To delay by a number of milliseconds.
* @param {number} ms Number of milliseconds.
* @returns {Promise} Promise object.
*/
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
/**
* To convert a parameter to a boolean.
* @param {(string|number|boolean)} parameter True, false, 1 or 0 in either string, number or boolean form.
* @returns {boolean} True or false.
*/
function ensureBoolean(parameter) {
let param;
if (parameter === 'false' || parameter === 0 || parameter === '0' || parameter === false) {
param = false;
}
if (parameter === 'true' || parameter === 1 || parameter === '1' || parameter === true) {
param = true;
}
return param;
}
/**
* To convert a parameter to a number.
* @param {*} parameter Parameter of any type.
* @returns {number} Parameter converted to number type.
*/
function ensureNumber(parameter) {
return Number(parameter);
}
/**
* To check if a parameter is an object and if not, return an empty object.
* @param {*} parameter Parameter of any type.
* @returns {object} Returns the original parameter if it is an object or returns an empty object.
*/
function ensureObject(parameter) {
if (typeof parameter === 'object') {
return parameter;
}
if (!parameter) {
return {};
}
let param;
try {
param = JSON.parse(parameter);
} catch (e) {
param = qs.parse(parameter);
}
if (typeof param !== 'object') {
return {};
}
return param;
}
/**
* To convert a parameter to a string.
* @param {*} parameter Parameter of any type.
* @returns {string} Parameter converted to string type.
*/
function ensureString(parameter) {
return typeof parameter === 'string' ? parameter : JSON.stringify(parameter);
}
/**
* To return the owner of a FluxOS application.
* @param {string} appName Name of app.
* @returns {number} Owner.
*/
// helper owner flux app function
async function getApplicationOwner(appName) {
const db = dbHelper.databaseConnection();
const database = db.db(config.database.appsglobal.database);
const query = { name: new RegExp(`^${appName}$`, 'i') };
const projection = {
projection: {
_id: 0,
owner: 1,
},
};
const globalAppsInformation = config.database.appsglobal.collections.appsInformation;
const appSpecs = await dbHelper.findOneInDatabase(database, globalAppsInformation, query, projection);
if (appSpecs) {
return appSpecs.owner;
}
// eslint-disable-next-line global-require
const appsService = require('./appsService');
const allApps = await appsService.availableApps();
const appInfo = allApps.find((app) => app.name.toLowerCase() === appName.toLowerCase());
if (appInfo) {
return appInfo.owner;
}
return null;
}
/**
* To delete login phrase.
* @param {string} phrase Login phrase.
*/
async function deleteLoginPhrase(phrase) {
try {
const db = dbHelper.databaseConnection();
const database = db.db(config.database.local.database);
const collection = config.database.local.collections.activeLoginPhrases;
const query = { loginPhrase: phrase };
const projection = {};
await dbHelper.findOneAndDeleteInDatabase(database, collection, query, projection);
} catch (error) {
log.error(error);
}
}
/**
* If a number or a string value has maximum of decimals
* @param {(string|number)} value Number to check agains
* @param {number} decimals Maximum number of allowed decimals. Defaults to 8 for satoshis
*/
function isDecimalLimit(value, decimals = 8) {
const numberRepresentation = ensureNumber(value);
if (Number.isNaN(numberRepresentation)) {
return false;
}
const decimalValue = ensureString(value).split('.')[1] || '';
if (decimalValue.length <= decimals) {
return true;
}
return false;
}
/**
* To handle timeouts on axios connection.
* @param {string} url URL.
* @param {object} options Options object.
* @returns {object} Response.
*/
// helper function for timeout on axios connection
const axiosGet = (url, options = {
timeout: 20000,
}) => {
const abort = axios.CancelToken.source();
const id = setTimeout(
() => abort.cancel(`Timeout of ${options.timeout}ms.`),
options.timeout,
);
return axios
.get(url, { cancelToken: abort.token, ...options })
.then((res) => {
clearTimeout(id);
return res;
});
};
module.exports = {
ensureBoolean,
ensureNumber,
ensureObject,
ensureString,
axiosGet,
delay,
getApplicationOwner,
deleteLoginPhrase,
isDecimalLimit,
};