worker.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { WorkerPoolManager } from "@pierre/diffs/worker"
  2. import ShikiWorkerUrl from "@pierre/diffs/worker/worker.js?worker&url"
  3. export type WorkerPoolStyle = "unified" | "split"
  4. export function workerFactory(): Worker {
  5. return new Worker(ShikiWorkerUrl, { type: "module" })
  6. }
  7. function createPool(lineDiffType: "none" | "word-alt") {
  8. const pool = new WorkerPoolManager(
  9. {
  10. workerFactory,
  11. // poolSize defaults to 8. More workers = more parallelism but
  12. // also more memory. Too many can actually slow things down.
  13. // NOTE: 2 is probably better for OpenCode, as I think 8 might be
  14. // a bit overkill, especially because Safari has a significantly slower
  15. // boot up time for workers
  16. poolSize: 2,
  17. },
  18. {
  19. theme: "OpenCode",
  20. lineDiffType,
  21. },
  22. )
  23. pool.initialize()
  24. return pool
  25. }
  26. let unified: WorkerPoolManager | undefined
  27. let split: WorkerPoolManager | undefined
  28. export function getWorkerPool(style: WorkerPoolStyle | undefined): WorkerPoolManager | undefined {
  29. if (typeof window === "undefined") return
  30. if (style === "split") {
  31. if (!split) split = createPool("word-alt")
  32. return split
  33. }
  34. if (!unified) unified = createPool("none")
  35. return unified
  36. }
  37. export function getWorkerPools() {
  38. return {
  39. unified: getWorkerPool("unified"),
  40. split: getWorkerPool("split"),
  41. }
  42. }