omelop
Version:
[](https://travis-ci.org/node-omelop/omelop)
358 lines • 26.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.promisify = exports.extendsObject = exports.isObject = exports.headHandler = exports.loadCluster = exports.isLocal = exports.checkPort = exports.ping = exports.unicodeToUtf8 = exports.hasChineseChar = exports.format = exports.arrayDiff = exports.startsWith = exports.endsWith = exports.size = exports.invokeCallback = void 0;
const os = require("os");
const util = require("util");
const child_process_1 = require("child_process");
const omelop_logger_1 = require("omelop-logger");
const Constants = require("./constants");
const omelop_1 = require("../omelop");
const path = require("path");
let logger = (0, omelop_logger_1.getLogger)('omelop', path.basename(__filename));
/**
* Invoke callback with check
*/
function invokeCallback(cb, ...args) {
if (typeof cb === 'function') {
let len = args.length + 1;
if (len === 1) {
return cb();
}
if (len === 2) {
return cb(args[0]);
}
if (len === 3) {
return cb(args[0], args[1]);
}
if (len === 4) {
return cb(args[0], args[1], args[2]);
}
cb.apply(null, args);
// cb.apply(null, Array.prototype.slice.call(arguments, 1));
}
}
exports.invokeCallback = invokeCallback;
/**
* Get the count of elements of object
*/
function size(obj) {
let count = 0;
for (let i in obj) {
if (obj.hasOwnProperty(i) && typeof obj[i] !== 'function') {
count++;
}
}
return count;
}
exports.size = size;
/**
* Check a string whether ends with another string
*/
function endsWith(str, suffix) {
if (typeof str !== 'string' || typeof suffix !== 'string' ||
suffix.length > str.length) {
return false;
}
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
exports.endsWith = endsWith;
/**
* Check a string whether starts with another string
*/
function startsWith(str, prefix) {
if (typeof str !== 'string' || typeof prefix !== 'string' ||
prefix.length > str.length) {
return false;
}
return str.indexOf(prefix) === 0;
}
exports.startsWith = startsWith;
/**
* Compare the two arrays and return the difference.
*/
function arrayDiff(array1, array2) {
let o = {};
for (let i = 0, len = array2.length; i < len; i++) {
o[array2[i]] = true;
}
let result = [];
for (let i = 0, len = array1.length; i < len; i++) {
let v = array1[i];
if (o[v])
continue;
result.push(v);
}
return result;
}
exports.arrayDiff = arrayDiff;
/*
* Date format
*/
function format(date, format) {
format = format || 'MMddhhmm';
let o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds(),
'q+': Math.floor((date.getMonth() + 3) / 3),
'S': date.getMilliseconds() // millisecond
};
if (/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
for (let k in o) {
if (new RegExp('(' + k + ')').test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] :
('00' + o[k]).substr(('' + o[k]).length));
}
}
return format;
}
exports.format = format;
/**
* check if has Chinese characters.
*/
function hasChineseChar(str) {
if (/.*[\u4e00-\u9fa5]+.*$/.test(str)) {
return true;
}
else {
return false;
}
}
exports.hasChineseChar = hasChineseChar;
/**
* transform unicode to utf8
*/
function unicodeToUtf8(str) {
let i, len, ch;
let utf8Str = '';
len = str.length;
for (i = 0; i < len; i++) {
ch = str.charCodeAt(i);
if ((ch >= 0x0) && (ch <= 0x7F)) {
utf8Str += str.charAt(i);
}
else if ((ch >= 0x80) && (ch <= 0x7FF)) {
utf8Str += String.fromCharCode(0xc0 | ((ch >> 6) & 0x1F));
utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
}
else if ((ch >= 0x800) && (ch <= 0xFFFF)) {
utf8Str += String.fromCharCode(0xe0 | ((ch >> 12) & 0xF));
utf8Str += String.fromCharCode(0x80 | ((ch >> 6) & 0x3F));
utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
}
else if ((ch >= 0x10000) && (ch <= 0x1FFFFF)) {
utf8Str += String.fromCharCode(0xF0 | ((ch >> 18) & 0x7));
utf8Str += String.fromCharCode(0x80 | ((ch >> 12) & 0x3F));
utf8Str += String.fromCharCode(0x80 | ((ch >> 6) & 0x3F));
utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
}
else if ((ch >= 0x200000) && (ch <= 0x3FFFFFF)) {
utf8Str += String.fromCharCode(0xF8 | ((ch >> 24) & 0x3));
utf8Str += String.fromCharCode(0x80 | ((ch >> 18) & 0x3F));
utf8Str += String.fromCharCode(0x80 | ((ch >> 12) & 0x3F));
utf8Str += String.fromCharCode(0x80 | ((ch >> 6) & 0x3F));
utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
}
else if ((ch >= 0x4000000) && (ch <= 0x7FFFFFFF)) {
utf8Str += String.fromCharCode(0xFC | ((ch >> 30) & 0x1));
utf8Str += String.fromCharCode(0x80 | ((ch >> 24) & 0x3F));
utf8Str += String.fromCharCode(0x80 | ((ch >> 18) & 0x3F));
utf8Str += String.fromCharCode(0x80 | ((ch >> 12) & 0x3F));
utf8Str += String.fromCharCode(0x80 | ((ch >> 6) & 0x3F));
utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
}
}
return utf8Str;
}
exports.unicodeToUtf8 = unicodeToUtf8;
/**
* Ping server to check if network is available
*
*/
function ping(host, cb) {
if (!isLocal(host)) {
let cmd = 'ping -w 15 ' + host;
(0, child_process_1.exec)(cmd, function (err, stdout, stderr) {
if (!!err) {
cb(false);
return;
}
cb(true);
});
}
else {
cb(true);
}
}
exports.ping = ping;
/**
* Check if server is exsit.
*
*/
function checkPort(server, cb) {
if (!server.port && !server.clientPort) {
invokeCallback(cb, 'leisure');
return;
}
let port = server.port || server.clientPort;
let host = server.host;
let generateCommand = function (host, port) {
let cmd;
let ssh_params = omelop_1.omelop.app.get(Constants.RESERVED.SSH_CONFIG_PARAMS);
if (!!ssh_params && Array.isArray(ssh_params)) {
ssh_params = ssh_params.join(' ');
}
else {
ssh_params = '';
}
if (!isLocal(host)) {
cmd = util.format('ssh %s %s "netstat -an|awk \'{print $4}\'|grep %s|wc -l"', host, ssh_params, port);
}
else {
cmd = util.format('netstat -an|awk \'{print $4}\'|grep %s|wc -l', port);
}
return cmd;
};
let cmd1 = generateCommand(host, port);
let child = (0, child_process_1.exec)(cmd1, function (err, stdout, stderr) {
if (err) {
logger.error('command %s execute with error: %j', cmd1, err.stack);
invokeCallback(cb, 'error');
}
else if (stdout.trim() !== '0') {
invokeCallback(cb, 'busy');
}
else {
port = server.clientPort;
let cmd2 = generateCommand(host, port);
(0, child_process_1.exec)(cmd2, function (err, stdout, stderr) {
if (err) {
logger.error('command %s execute with error: %j', cmd2, err.stack);
invokeCallback(cb, 'error');
}
else if (stdout.trim() !== '0') {
invokeCallback(cb, 'busy');
}
else {
invokeCallback(cb, 'leisure');
}
});
}
});
}
exports.checkPort = checkPort;
function isLocal(host) {
let app = omelop_1.omelop.app;
if (!app) {
return host === '127.0.0.1' || host === 'localhost' || host === '0.0.0.0' || inLocal(host);
}
else {
return host === '127.0.0.1' || host === 'localhost' || host === '0.0.0.0' || inLocal(host) || host === app.master.host;
}
}
exports.isLocal = isLocal;
/**
* Load cluster server.
*
*/
function loadCluster(app, server, serverMap) {
let increaseFields = {};
let host = server.host;
let count = Number(server[Constants.RESERVED.CLUSTER_COUNT]);
let seq = app.clusterSeq[server.serverType];
if (!seq) {
seq = 0;
app.clusterSeq[server.serverType] = count;
}
else {
app.clusterSeq[server.serverType] = seq + count;
}
for (let key in server) {
let value = server[key].toString();
if (value.indexOf(Constants.RESERVED.CLUSTER_SIGNAL) > 0) {
let base = server[key].slice(0, -2);
increaseFields[key] = base;
}
}
let clone = function (src) {
let rs = {};
for (let key in src) {
rs[key] = src[key];
}
return rs;
};
for (let i = 0, l = seq; i < count; i++, l++) {
let cserver = clone(server);
cserver.id = Constants.RESERVED.CLUSTER_PREFIX + server.serverType + '-' + l;
for (let k in increaseFields) {
let v = parseInt(increaseFields[k]);
cserver[k] = v + i;
}
serverMap[cserver.id] = cserver;
}
}
exports.loadCluster = loadCluster;
// export function extends(origin, add)
// {
// if (!add || !this.isObject(add)) return origin;
// let keys = Object.keys(add);
// let i = keys.length;
// while (i--)
// {
// origin[keys[i]] = add[keys[i]];
// }
// return origin;
// };
function headHandler(headBuffer) {
let len = 0;
for (let i = 1; i < 4; i++) {
if (i > 1) {
len <<= 8;
}
len += headBuffer.readUInt8(i);
}
return len;
}
exports.headHandler = headHandler;
let inLocal = function (host) {
for (let index in localIps) {
if (host === localIps[index]) {
return true;
}
}
return false;
};
let localIps = function () {
let ifaces = os.networkInterfaces();
let ips = [];
let func = function (details) {
if (details.family === 'IPv4') {
ips.push(details.address);
}
};
for (let dev in ifaces) {
ifaces[dev].forEach(func);
}
return ips;
}();
function isObject(arg) {
return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;
function extendsObject(origin, add) {
if (!add || !isObject(add))
return origin;
let keys = Object.keys(add);
let i = keys.length;
while (i--) {
origin[keys[i]] = add[keys[i]];
}
return origin;
}
exports.extendsObject = extendsObject;
exports.promisify = util.promisify;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLGlEQUFxQztBQUNyQyxpREFBMEM7QUFDMUMseUNBQXlDO0FBQ3pDLHNDQUFtQztBQUduQyw2QkFBNkI7QUFFN0IsSUFBSSxNQUFNLEdBQUcsSUFBQSx5QkFBUyxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFHNUQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQUMsRUFBWSxFQUFFLEdBQUcsSUFBVztJQUN2RCxJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRTtRQUMxQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7WUFDWCxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7WUFDWCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QjtRQUVELElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNYLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNYLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEM7UUFDRCxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyQiw0REFBNEQ7S0FDL0Q7QUFDTCxD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Q0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUV0RDthQUFNLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDLEVBQUU7WUFDNUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxRCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNELE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7U0FFdEQ7YUFBTSxJQUFJLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQyxFQUFFO1lBQzlDLE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzRCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNELE9BQU8sSUFBSSxNQUFNLENBQUMs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