fix(opencode): preserve websocket api errors (#30321)

This commit is contained in:
Aiden Cline
2026-06-01 23:23:51 -05:00
committed by GitHub
parent 497ff36e91
commit 1b85d55a0e
3 changed files with 127 additions and 6 deletions
+11 -4
View File
@@ -97,9 +97,9 @@ export function createWebSocketFetch(options?: CreateWebSocketFetchOptions) {
maxConnectionAge,
init?.signal,
)
let resolveFirstEvent: (started: boolean) => void = () => {}
let resolveFirstEvent: (event: boolean | OpenAIWebSocket.WrappedError) => void = () => {}
let rejectFirstEvent: (error: Error) => void = () => {}
const firstEvent = new Promise<boolean>((resolve, reject) => {
const firstEvent = new Promise<boolean | OpenAIWebSocket.WrappedError>((resolve, reject) => {
resolveFirstEvent = resolve
rejectFirstEvent = reject
})
@@ -108,7 +108,7 @@ export function createWebSocketFetch(options?: CreateWebSocketFetchOptions) {
body,
idleTimeout,
signal: init?.signal ?? undefined,
onFirstEvent: () => resolveFirstEvent(true),
onFirstEvent: (error) => resolveFirstEvent(error ?? true),
onTerminal: (event) => {
entry.busy = false
entry.lastUsedAt = Date.now()
@@ -140,7 +140,14 @@ export function createWebSocketFetch(options?: CreateWebSocketFetchOptions) {
throw error
},
})
if (await firstEvent) return response
const first = await firstEvent
if (first !== false) {
if (first === true || first.status < 200 || first.status > 599) return response
return new Response(first.body, {
status: first.status,
headers: { "content-type": "application/json", ...first.headers },
})
}
if (!entry.fallback) return response
log.debug("http fallback", { key, reason: "websocket_retries_exhausted" })
return httpFetch(input, httpInit)