redis-smq-common
Version:
Provides essential components and utilities shared across RedisSMQ packages.
61 lines • 2.2 kB
JavaScript
import { statSync } from 'fs';
import { extname } from 'path';
import { isMainThread, parentPort, workerData, } from 'worker_threads';
import { EWorkerThreadChildExitCode, EWorkerType, } from '../types/index.js';
import { handleCallableWorker } from './callable-worker-thread.js';
import { exit } from './worker-thread-message.js';
import { handleRunnableWorker } from './runnable-worker-thread.js';
function isWorkerFunction(Worker) {
return typeof Worker === 'function';
}
function importWorkerInstance(filename, cb) {
if (!['.js', '.cjs'].includes(extname(filename))) {
exit(EWorkerThreadChildExitCode.FILE_EXTENSION_ERROR);
}
try {
statSync(filename);
}
catch (e) {
exit(EWorkerThreadChildExitCode.FILE_READ_ERROR, e);
}
import(filename)
.then((importedModule) => {
const fn = importedModule &&
typeof importedModule === 'object' &&
'default' in importedModule
? importedModule.default
: importedModule;
if (!isWorkerFunction(fn)) {
return exit(EWorkerThreadChildExitCode.INVALID_WORKER_TYPE);
}
cb(fn);
})
.catch(() => {
exit(EWorkerThreadChildExitCode.FILE_IMPORT_ERROR);
});
}
function isRunnableFunctionFactory(worker, type) {
return type === EWorkerType.RUNNABLE;
}
if (!isMainThread && parentPort) {
const { filename, type, initialPayload } = typeof workerData === 'object' ? workerData : {};
if (!filename ||
type === null ||
type === undefined ||
![EWorkerType.CALLABLE, EWorkerType.RUNNABLE].includes(type)) {
exit(EWorkerThreadChildExitCode.WORKER_DATA_REQUIRED);
}
else {
const messagePort = parentPort;
importWorkerInstance(filename, (worker) => {
if (isRunnableFunctionFactory(worker, type))
handleRunnableWorker(worker, messagePort, initialPayload);
else
handleCallableWorker(worker, messagePort);
});
}
process.on('uncaughtException', (err) => {
exit(EWorkerThreadChildExitCode.UNCAUGHT_EXCEPTION, err);
});
}
//# sourceMappingURL=worker-thread.js.map