UNPKG

redis-smq-common

Version:

Provides essential components and utilities shared across RedisSMQ packages.

61 lines 2.2 kB
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