murmuraba
Version:
Real-time audio noise reduction with advanced chunked processing for web applications
56 lines (55 loc) • 1.86 kB
JavaScript
import { MurmubaraError, ErrorCodes } from '../types';
export class WorkerManager {
constructor(logger) {
this.workers = new Map();
this.logger = logger;
}
createWorker(id, workerPath) {
if (this.workers.has(id)) {
throw new MurmubaraError(ErrorCodes.WORKER_ERROR, `Worker with id ${id} already exists`);
}
try {
const worker = new Worker(workerPath);
this.workers.set(id, worker);
this.logger.debug(`Worker created: ${id}`);
return worker;
}
catch (error) {
this.logger.error(`Failed to create worker: ${id}`, error);
throw new MurmubaraError(ErrorCodes.WORKER_ERROR, `Failed to create worker: ${error instanceof Error ? error.message : String(error)}`);
}
}
getWorker(id) {
return this.workers.get(id);
}
sendMessage(id, message) {
const worker = this.workers.get(id);
if (!worker) {
throw new MurmubaraError(ErrorCodes.WORKER_ERROR, `Worker ${id} not found`);
}
worker.postMessage(message);
this.logger.debug(`Message sent to worker ${id}:`, message);
}
terminateWorker(id) {
const worker = this.workers.get(id);
if (worker) {
worker.terminate();
this.workers.delete(id);
this.logger.debug(`Worker terminated: ${id}`);
}
}
terminateAll() {
this.logger.info(`Terminating all ${this.workers.size} workers`);
for (const [id, worker] of this.workers) {
worker.terminate();
this.logger.debug(`Worker terminated: ${id}`);
}
this.workers.clear();
}
getActiveWorkerCount() {
return this.workers.size;
}
getWorkerIds() {
return Array.from(this.workers.keys());
}
}