cod-dicomweb-server
Version:
A wadors server proxy that get data from a Cloud Optimized Dicom format.
56 lines (55 loc) • 1.92 kB
JavaScript
import { wrap } from 'comlink';
import { CustomError } from '../classes/customClasses';
class WebWorkerManager {
workerRegistry = {};
register(name, workerFn) {
try {
const worker = workerFn();
if (!worker) {
throw new CustomError(`WorkerFn of worker ${name} is not creating a worker`);
}
this.workerRegistry[name] = {
instance: wrap(worker),
nativeWorker: worker
};
}
catch (error) {
console.warn(error);
}
}
async executeTask(workerName, taskName, options) {
const worker = this.workerRegistry[workerName]?.instance;
if (!worker) {
throw new CustomError(`Worker ${workerName} not registered`);
}
try {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return await worker[taskName](options);
}
catch (error) {
console.error(`Error executing task "${taskName}" on worker "${workerName}":`, error);
throw new CustomError(`Task "${taskName}" failed: ${error.message}`);
}
}
addEventListener(workerName, eventType, listener) {
const worker = this.workerRegistry[workerName];
if (!worker) {
console.error(`Worker type '${workerName}' is not registered.`);
return;
}
worker.nativeWorker.addEventListener(eventType, listener);
}
removeEventListener(workerName, eventType, listener) {
const worker = this.workerRegistry[workerName];
if (!worker) {
console.error(`Worker type '${workerName}' is not registered.`);
return;
}
worker.nativeWorker.removeEventListener(eventType, listener);
}
reset() {
this.workerRegistry = {};
}
}
export default WebWorkerManager;