refactor(app): use standard worker URLs

This commit is contained in:
LukeParkerDev 2026-08-05 10:48:57 +10:00
parent 842f1dcfdb
commit 1b0e4e4610
2 changed files with 40 additions and 66 deletions

View file

@ -5,7 +5,6 @@ import type { Session } from "@opencode-ai/sdk/v2/client"
type Response = { id: number; data?: unknown; error?: string }
let worker: Worker | undefined
let workerLoad: Promise<Worker> | undefined
let nextID = 0
const pending = new Map<number, { resolve: (value: unknown) => void; reject: (error: Error) => void }>()
@ -29,41 +28,29 @@ function decode<T>(
const id = ++nextID
return new Promise<T>((resolve, reject) => {
pending.set(id, { resolve: (value) => resolve(value as T), reject })
void getWorker()
.then((worker) => worker.postMessage({ id, type, buffer, options }, [buffer]))
.catch((error) => {
pending.delete(id)
reject(error instanceof Error ? error : new Error(String(error)))
})
getWorker().postMessage({ id, type, buffer, options }, [buffer])
})
}
function getWorker() {
if (worker) return Promise.resolve(worker)
if (workerLoad) return workerLoad
workerLoad = (async () => {
const { default: workerUrl } = await import("./session-message-decoder.worker.ts?worker&url")
const next = new Worker(workerUrl, { type: "module" })
next.onmessage = (event: MessageEvent<Response>) => {
const request = pending.get(event.data.id)
if (!request) return
pending.delete(event.data.id)
if (event.data.error) {
request.reject(new Error(event.data.error))
return
}
request.resolve(event.data.data)
if (worker) return worker
worker = new Worker(new URL("./session-message-decoder.worker.ts", import.meta.url), { type: "module" })
worker.onmessage = (event: MessageEvent<Response>) => {
const request = pending.get(event.data.id)
if (!request) return
pending.delete(event.data.id)
if (event.data.error) {
request.reject(new Error(event.data.error))
return
}
next.onerror = (event) => {
const error = new Error(event.message)
pending.forEach((request) => request.reject(error))
pending.clear()
next.terminate()
worker = undefined
workerLoad = undefined
}
worker = next
return next
})()
return workerLoad
request.resolve(event.data.data)
}
worker.onerror = (event) => {
const error = new Error(event.message)
pending.forEach((request) => request.reject(error))
pending.clear()
worker?.terminate()
worker = undefined
}
return worker
}

View file

@ -3,7 +3,6 @@ import type { FileDiffInfo } from "@opencode-ai/client/promise"
type Response = { id: number; data?: FileDiffInfo[]; error?: string }
let worker: Worker | undefined
let workerLoad: Promise<Worker> | undefined
let nextID = 0
const pending = new Map<number, { resolve: (value: FileDiffInfo[]) => void; reject: (error: Error) => void }>()
let lastInput = 0
@ -19,43 +18,31 @@ export function decodeVcsDiff(buffer: ArrayBuffer) {
const id = ++nextID
return new Promise<FileDiffInfo[]>((resolve, reject) => {
pending.set(id, { resolve, reject })
void getWorker()
.then((worker) => worker.postMessage({ id, buffer }, [buffer]))
.catch((error) => {
pending.delete(id)
reject(error instanceof Error ? error : new Error(String(error)))
})
getWorker().postMessage({ id, buffer }, [buffer])
})
}
function getWorker() {
if (worker) return Promise.resolve(worker)
if (workerLoad) return workerLoad
workerLoad = (async () => {
const { default: workerUrl } = await import("./vcs-diff-decoder.worker.ts?worker&url")
const next = new Worker(workerUrl, { type: "module" })
next.onmessage = (event: MessageEvent<Response>) => {
const request = pending.get(event.data.id)
if (!request) return
pending.delete(event.data.id)
if (event.data.error) {
request.reject(new Error(event.data.error))
return
}
resolveWhenInputIdle(request.resolve, event.data.data ?? [])
if (worker) return worker
worker = new Worker(new URL("./vcs-diff-decoder.worker.ts", import.meta.url), { type: "module" })
worker.onmessage = (event: MessageEvent<Response>) => {
const request = pending.get(event.data.id)
if (!request) return
pending.delete(event.data.id)
if (event.data.error) {
request.reject(new Error(event.data.error))
return
}
next.onerror = (event) => {
const error = new Error(event.message)
pending.forEach((request) => request.reject(error))
pending.clear()
next.terminate()
worker = undefined
workerLoad = undefined
}
worker = next
return next
})()
return workerLoad
resolveWhenInputIdle(request.resolve, event.data.data ?? [])
}
worker.onerror = (event) => {
const error = new Error(event.message)
pending.forEach((request) => request.reject(error))
pending.clear()
worker?.terminate()
worker = undefined
}
return worker
}
function resolveWhenInputIdle(resolve: (value: FileDiffInfo[]) => void, value: FileDiffInfo[], initial = true) {