UNPKG

@foxpage/foxpage-node-sdk

Version:

foxpage node sdk

125 lines (124 loc) 4.01 kB
"use strict"; 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]; };