45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import path from 'path';
|
|
import { Worker as NodeWorker } from 'worker_threads';
|
|
|
|
export class UniversalWorker {
|
|
private worker: NodeWorker | Worker;
|
|
|
|
constructor(workerPath: string | URL) {
|
|
if (typeof window !== 'undefined' && 'Worker' in window) {
|
|
// 浏览器环境
|
|
this.worker = new Worker(workerPath);
|
|
} else {
|
|
// Node.js 环境
|
|
// const resolvedPath = require.resolve(workerPath);
|
|
this.worker = new NodeWorker(workerPath, { eval: false });
|
|
}
|
|
|
|
}
|
|
|
|
postMessage(message: any): void {
|
|
this.worker.postMessage(message);
|
|
}
|
|
|
|
onMessage(callback: (data: any) => void): void {
|
|
if ('onmessage' in this.worker) {
|
|
this.worker.onmessage = (event) => callback(event.data);
|
|
} else {
|
|
this.worker.on('message', callback);
|
|
}
|
|
}
|
|
|
|
onError(callback: (err: Error) => void): void {
|
|
if ('onerror' in this.worker) {
|
|
this.worker.onerror = (event) => callback(new Error(event.message));
|
|
} else {
|
|
this.worker.on('error', callback);
|
|
}
|
|
}
|
|
|
|
terminate(): void {
|
|
this.worker.terminate();
|
|
}
|
|
getWorker(){
|
|
return this.worker
|
|
}
|
|
} |