'use strict'; const EventEmitter = require('events'); // worker manager to record agent and worker forked by egg-cluster // can do some check stuff here to monitor the healthy class Manager extends EventEmitter { constructor() { super(); this.workers = new Map(); this.agent = null; } setAgent(agent) { this.agent = agent; } deleteAgent() { this.agent = null; } setWorker(worker) { this.workers.set(worker.process.pid, worker); } getWorker(pid) { return this.workers.get(pid); } deleteWorker(pid) { this.workers.delete(pid); } listWorkerIds() { return Array.from(this.workers.keys()); } getListeningWorkerIds() { const keys = []; for (const id of this.workers.keys()) { if (this.getWorker(id).state === 'listening') { keys.push(id); } } return keys; } count() { return { agent: (this.agent && this.agent.status === 'started') ? 1 : 0, worker: this.listWorkerIds().length, }; } // check agent and worker must both alive // if exception appear 3 times, emit an exception event startCheck() { this.exception = 0; this.timer = setInterval(() => { const count = this.count(); if (count.agent && count.worker) { this.exception = 0; return; } this.exception++; if (this.exception >= 3) { this.emit('exception', count); clearInterval(this.timer); } }, 10000); } } module.exports = Manager;