@foxpage/foxpage-node-sdk
Version:
foxpage node sdk
125 lines (124 loc) • 4.01 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPm2 = exports.createPm2 = exports.FPPm2 = void 0;
const events_1 = require("events");
const pm2_1 = __importDefault(require("pm2"));
const foxpage_shared_1 = require("@foxpage/foxpage-shared");
let pm2;
/**
* foxpage pm2 instance
*
* @export
* @class FPPm2
* @extends {EventEmitter}
*/
class FPPm2 extends events_1.EventEmitter {
constructor(opt) {
super();
const instance = process.env.instance_var || 'NODE_APP_INSTANCE';
this.id = Number(process.env[instance]) || 0;
this.isPm2 = !!process.env[instance];
this.isMaster = this.id === (opt === null || opt === void 0 ? void 0 : opt.masterPmId);
this.isWorker = !this.isMaster;
this.count = Number(process.env.instances) || 1;
this.mode = this.isPm2 && this.count > 1 ? 'IPC' : 'LOCAL';
}
broadcast(data) {
if (this.mode === 'IPC') {
if (this.isMaster) {
pm2_1.default.list((error, list) => {
if (error) {
console.error('PM2 get list error:', error);
}
list.forEach(proc => {
if (proc.pm_id) {
pm2_1.default.sendDataToProcessId(proc.pm_id, {
id: proc.pm_id,
type: 'process:msg',
data: {
pm2Id: proc.pm_id,
pId: proc.pid,
data,
},
topic: true,
}, err => {
if (err) {
console.error(`process:${proc.pm_id} send data failed:`, err);
}
});
}
});
});
}
else {
console.error('Invalid broadcast by worker.');
throw new Error('Invalid broadcast by worker.');
}
}
}
onMessage(fn) {
process.on('message', (msg) => {
const { pId, data } = msg.data || {};
if (String(pId) === String(process.pid)) {
if (typeof fn === 'function') {
fn(data);
}
}
});
}
}
exports.FPPm2 = FPPm2;
/**
* create pm2
* @param param0
* @returns pm2 instance
*/
const createPm2 = async ({ name, enable = true }) => {
if (!enable) {
pm2 = null;
return null;
}
const list = await getPm2List();
const filtered = name ? list.filter(item => item.name === name) : list;
const masterProc = getMasterProc(filtered);
pm2 = new FPPm2({ masterPmId: Number((masterProc === null || masterProc === void 0 ? void 0 : masterProc.pm_id) || 0) });
return pm2;
};
exports.createPm2 = createPm2;
/**
* get pm2 instance
* @returns
*/
const getPm2 = () => {
return pm2;
};
exports.getPm2 = getPm2;
const getPm2List = async () => {
const promise = new Promise(resolve => {
if (typeof pm2_1.default.list === 'function') {
pm2_1.default.list((error, list) => {
if (error) {
console.error('PM2 get list error:', error);
}
resolve(list);
});
}
else {
resolve([]);
}
});
try {
const list = await (0, foxpage_shared_1.timeout)(promise, 1000 * 3);
return list;
}
catch (e) {
console.error(e);
return [];
}
};
const getMasterProc = (list) => {
return list.sort((one, two) => (one.pm_id || 0) - (two.pm_id || 0))[0];
};