wildduck/lib/tools.js
2017-03-29 20:06:09 +03:00

71 lines
1.9 KiB
JavaScript

'use strict';
const punycode = require('punycode');
function normalizeAddress(address, withNames) {
if (typeof address === 'string') {
address = {
address
};
}
if (!address || !address.address) {
return '';
}
let user = address.address.substr(0, address.address.lastIndexOf('@')).normalize('NFC').toLowerCase().trim();
let domain = address.address.substr(address.address.lastIndexOf('@') + 1).toLowerCase().trim();
let addr = user + '@' + punycode.toUnicode(domain);
if (withNames) {
return {
name: address.name || '',
address: addr
};
}
return addr;
}
// returns a redis config object with a retry strategy
function redisConfig(defaultConfig) {
let response = {};
if (typeof defaultConfig === 'string') {
defaultConfig = {
url: defaultConfig
};
}
Object.keys(defaultConfig || {}).forEach(key => {
response[key] = defaultConfig[key];
});
if (!response.hasOwnProperty('retry_strategy')) {
response.retry_strategy = options => {
if (options.error && options.error.code === 'ECONNREFUSED') {
// End reconnecting on a specific error and flush all commands with a individual error
return new Error('The server refused the connection');
}
if (options.total_retry_time > 1000 * 60 * 60) {
// End reconnecting after a specific timeout and flush all commands with a individual error
return new Error('Retry time exhausted');
}
if (options.attempt > 10) {
// End reconnecting with built in error
return undefined; // eslint-disable-line no-undefined
}
// reconnect after
return Math.min(options.attempt * 100, 3000);
};
}
return response;
}
module.exports = {
normalizeAddress,
redisConfig
};