()
| 64 | export class MarkdownWorkerUnavailableError extends Error {} |
| 65 | |
| 66 | function getWorker() { |
| 67 | if (worker) return worker |
| 68 | if (disabled) throw new MarkdownWorkerUnavailableError(disabled.message) |
| 69 | try { |
| 70 | worker = new Worker(MarkdownShikiWorkerUrl, { type: "module" }) |
| 71 | } catch (error) { |
| 72 | disabled = error instanceof Error ? error : new Error(String(error)) |
| 73 | throw new MarkdownWorkerUnavailableError(disabled.message) |
| 74 | } |
| 75 | worker.onmessage = (event: MessageEvent<MarkdownWorkerResponse>) => { |
| 76 | const result = pending.get(event.data.id) |
| 77 | if (!result) { |
| 78 | transport.complete(event.data.key, event.data.id) |
| 79 | return |
| 80 | } |
| 81 | pending.delete(event.data.id) |
| 82 | if (!keys.has(event.data.key)) { |
| 83 | result.reject(new MarkdownWorkerDisposedError()) |
| 84 | transport.complete(event.data.key, event.data.id) |
| 85 | return |
| 86 | } |
| 87 | if (event.data.type === "superseded") { |
| 88 | result.reject(new MarkdownWorkerSupersededError()) |
| 89 | transport.complete(event.data.key, event.data.id) |
| 90 | return |
| 91 | } |
| 92 | if (event.data.type === "error") { |
| 93 | result.reject(new Error(event.data.message)) |
| 94 | transport.complete(event.data.key, event.data.id) |
| 95 | return |
| 96 | } |
| 97 | const state = applyMarkdownWorkerResponse(states.get(event.data.key), event.data) |
| 98 | if (shouldReleaseMarkdownWorkerState(result.complete, latest.get(event.data.key), event.data.id)) { |
| 99 | states.delete(event.data.key) |
| 100 | keys.delete(event.data.key) |
| 101 | latest.delete(event.data.key) |
| 102 | } else states.set(event.data.key, state) |
| 103 | result.resolve(state) |
| 104 | transport.complete(event.data.key, event.data.id) |
| 105 | } |
| 106 | const fail = (message: string) => { |
| 107 | const error = new Error(message) |
| 108 | disabled = error |
| 109 | transport.reset() |
| 110 | pending.forEach((request) => request.reject(error)) |
| 111 | pending.clear() |
| 112 | states.clear() |
| 113 | keys.clear() |
| 114 | latest.clear() |
| 115 | worker?.terminate() |
| 116 | worker = undefined |
| 117 | } |
| 118 | worker.onerror = (event) => fail(event.message || "Markdown highlighting worker failed") |
| 119 | worker.onmessageerror = () => fail("Markdown worker response failed") |
| 120 | worker.postMessage({ type: "init", theme: OpenCodeTheme } satisfies MarkdownWorkerRequest) |
| 121 | return worker |
| 122 | } |
no test coverage detected