53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import { WorkerPoolManager } from "@pierre/diffs/worker"
|
|
import ShikiWorkerUrl from "@pierre/diffs/worker/worker.js?worker&url"
|
|
|
|
export type WorkerPoolStyle = "unified" | "split"
|
|
|
|
export function workerFactory(): Worker {
|
|
return new Worker(ShikiWorkerUrl, { type: "module" })
|
|
}
|
|
|
|
function createPool(lineDiffType: "none" | "word-alt") {
|
|
const pool = new WorkerPoolManager(
|
|
{
|
|
workerFactory,
|
|
// poolSize defaults to 8. More workers = more parallelism but
|
|
// also more memory. Too many can actually slow things down.
|
|
// NOTE: 2 is probably better for OpenCode, as I think 8 might be
|
|
// a bit overkill, especially because Safari has a significantly slower
|
|
// boot up time for workers
|
|
poolSize: 2,
|
|
},
|
|
{
|
|
theme: "OpenCode",
|
|
lineDiffType,
|
|
preferredHighlighter: "shiki-wasm",
|
|
},
|
|
)
|
|
|
|
pool.initialize()
|
|
return pool
|
|
}
|
|
|
|
let unified: WorkerPoolManager | undefined
|
|
let split: WorkerPoolManager | undefined
|
|
|
|
export function getWorkerPool(style: WorkerPoolStyle | undefined): WorkerPoolManager | undefined {
|
|
if (typeof window === "undefined") return
|
|
|
|
if (style === "split") {
|
|
if (!split) split = createPool("word-alt")
|
|
return split
|
|
}
|
|
|
|
if (!unified) unified = createPool("none")
|
|
return unified
|
|
}
|
|
|
|
export function getWorkerPools() {
|
|
return {
|
|
unified: getWorkerPool("unified"),
|
|
split: getWorkerPool("split"),
|
|
}
|
|
}
|