redis-smq-common
Version:
Provides essential components and utilities shared across RedisSMQ packages.
68 lines • 2.84 kB
JavaScript
import { PowerSwitch } from '../power-switch/index.js';
import { WorkerAlreadyDownError, WorkerAlreadyRunningError, } from './errors/index.js';
import { EWorkerThreadParentMessage, EWorkerType, } from './types/index.js';
import { Worker } from './worker.js';
export class RunnableWorker extends Worker {
type = EWorkerType.RUNNABLE;
powerSwitch;
constructor(workerFilename, initialPayload, logger) {
super(workerFilename, initialPayload, logger);
this.powerSwitch = new 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: 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 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 WorkerAlreadyDownError());
}
}
}
//# sourceMappingURL=runnable-worker.js.map