UNPKG

redis-smq-common

Version:

Provides essential components and utilities shared across RedisSMQ packages.

96 lines 3.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WorkerHandler = void 0; const index_js_1 = require("../../runnable/index.js"); class WorkerHandler extends index_js_1.Runnable { constructor({ logger }) { super(); this.workers = new Map(); this.logger = logger.createLogger(this.constructor.name); } finalizeUp() { super.finalizeUp(); this.logger.debug(`All ${this.workers.size} workers started successfully`); } goingUp() { const workers = this.getAllWorkers(); if (workers.length === 0) { this.logger.warn('No workers to run'); return super.goingUp(); } const tasks = workers.map((worker, index) => { return (done) => { this.logger.debug(`Starting worker ${index + 1}/${workers.length} (ID: ${worker.getId()})`); worker.run((err) => { if (err) { this.logger.error(`Failed to start worker ${worker.getId()}: ${err.message}`, err); } else { this.logger.debug(`Worker ${worker.getId()} started successfully`); } done(err); }); }; }); return super.goingUp().concat(tasks); } finalizeDown() { super.finalizeDown(); this.logger.debug(`All workers stopped`); } goingDown() { const workers = this.getAllWorkers(); if (workers.length === 0) { this.logger.debug('No workers to stop'); return super.goingDown(); } this.logger.debug(`Stopping ${workers.length} workers...`); const tasks = workers.map((worker, index) => { return (done) => { this.logger.debug(`Shutting down worker ${index + 1}/${workers.length} (ID: ${worker.getId()})`); worker.shutdown((err) => { if (err) { this.logger.warn(`Worker shutdown failed for ${worker.getId()}: ${err.message}`); } done(); }); }; }); return tasks.concat(super.goingDown()); } addWorker(worker) { if (this.isOperational()) throw new Error('Instance must be shut down before managing workers'); this.workers.set(worker.getId(), worker); this.logger.debug(`Worker added: ${worker.getWorkerFilename()}, total: ${this.workers.size}`); } removeWorker(workerId) { if (this.isOperational()) throw new Error('Instance must be shut down before managing workers'); const removed = this.workers.delete(workerId); if (removed) { this.logger.debug(`Worker removed: ${workerId}, remaining: ${this.workers.size}`); } return removed; } getWorker(workerId) { return this.workers.get(workerId); } getAllWorkers() { return Array.from(this.workers.values()); } hasWorkers() { return this.workers.size > 0; } count() { return this.workers.size; } clear() { if (this.isOperational()) throw new Error('Instance must be shut down before managing workers'); this.workers.clear(); this.logger.debug('All workers cleared'); } } exports.WorkerHandler = WorkerHandler; //# sourceMappingURL=worker-handler.js.map