useWorker.ts 782 B

123456789101112131415161718192021222324252627282930
  1. import { useState } from "react";
  2. export interface MessageEventHandler {
  3. (event: MessageEvent): void;
  4. }
  5. export function useWorker(
  6. workerType: string,
  7. messageEventHandler: MessageEventHandler
  8. ): Worker {
  9. // Create new worker once and never again
  10. const [worker] = useState(() => createWorker(workerType, messageEventHandler));
  11. return worker;
  12. }
  13. function createWorker(
  14. workerType: string,
  15. messageEventHandler: MessageEventHandler
  16. ): Worker {
  17. if (workerType === "whisper") {
  18. const worker = new Worker(new URL("../workers/whisper.js", import.meta.url), {
  19. type: "module",
  20. });
  21. // Listen for messages from the Web Worker
  22. worker.addEventListener("message", messageEventHandler);
  23. return worker;
  24. }
  25. throw new Error('workerType not found');
  26. }