worker.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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. preferredHighlighter: "shiki-wasm",
  22. },
  23. )
  24. pool.initialize()
  25. return pool
  26. }
  27. let unified: WorkerPoolManager | undefined
  28. let split: WorkerPoolManager | undefined
  29. export function getWorkerPool(style: WorkerPoolStyle | undefined): WorkerPoolManager | undefined {
  30. if (typeof window === "undefined") return
  31. if (style === "split") {
  32. if (!split) split = createPool("word-alt")
  33. return split
  34. }
  35. if (!unified) unified = createPool("none")
  36. return unified
  37. }
  38. export function getWorkerPools() {
  39. return {
  40. unified: getWorkerPool("unified"),
  41. split: getWorkerPool("split"),
  42. }
  43. }