redis-smq-common
Version:
Provides essential components and utilities shared across RedisSMQ packages.
71 lines • 2.98 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RunnableWorker = void 0;
const index_js_1 = require("../power-switch/index.js");
const index_js_2 = require("./errors/index.js");
const index_js_3 = require("./types/index.js");
const worker_js_1 = require("./worker.js");
class RunnableWorker extends worker_js_1.Worker {
constructor(workerFilename, initialPayload, logger) {
super(workerFilename, initialPayload, logger);
this.type = index_js_3.EWorkerType.RUNNABLE;
this.powerSwitch = new index_js_1.PowerSwitch();
this.logger.debug(`RunnableWorker instance created for ${workerFilename}`);
}
run(cb) {
this.logger.debug(`Attempting to run worker ${this.id}`);
const r = this.powerSwitch.goingUp();
if (r) {
this.logger.debug('Power switch state changed to going up');
const message = {
type: index_js_3.EWorkerThreadParentMessage.RUN,
};
this.logger.debug('Posting RUN message to worker thread (fire-and-forget)');
try {
this.postMessage(message);
this.powerSwitch.commit();
this.logger.debug(`Worker ${this.id} started successfully (fire-and-forget)`);
cb(null);
}
catch (err) {
const error = err instanceof Error ? err : new Error('Unknown error');
this.logger.error(`Worker failed to start: ${error.message}`, {
error: error.message,
stack: error.stack,
});
this.powerSwitch.rollback();
cb(error);
}
}
else {
this.logger.warn(`Cannot start worker ${this.id}: already running`);
cb(new index_js_2.WorkerAlreadyRunningError());
}
}
shutdown(cb) {
this.logger.debug(`Attempting to shut down worker ${this.id}`);
const r = this.powerSwitch.goingDown();
if (r) {
this.logger.debug('Power switch state changed to going down');
this.logger.debug('Calling parent shutdown method');
super.shutdown((err) => {
if (err) {
this.logger.warn(`Error during worker ${this.id} shutdown: ${err.message}`, {
error: err.message,
stack: err.stack,
});
}
this.logger.debug('Committing power switch state change');
this.powerSwitch.commit();
this.logger.debug(`Worker ${this.id} shut down successfully`);
cb(null);
});
}
else {
this.logger.warn(`Cannot shut down worker ${this.id}: already down`);
cb(new index_js_2.WorkerAlreadyDownError());
}
}
}
exports.RunnableWorker = RunnableWorker;
//# sourceMappingURL=runnable-worker.js.map