Skip to content

Commit 903a908

Browse files
committed
Optimizes code to prevent memory leak, add error messages
1 parent 2e509ca commit 903a908

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

src/api/providers/fetchers/unbound.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export async function getUnboundModels(apiKey?: string | null): Promise<Record<s
4646
}
4747
} catch (error) {
4848
console.error(`Error fetching Unbound models: ${JSON.stringify(error, Object.getOwnPropertyNames(error), 2)}`)
49-
return {}
49+
throw new Error(`Failed to fetch Unbound models: ${error instanceof Error ? error.message : "Unknown error"}`)
5050
}
5151

5252
return models

webview-ui/src/components/settings/providers/Unbound.tsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useState } from "react"
1+
import { useCallback, useState, useRef } from "react"
22
import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
33
import { useQueryClient } from "@tanstack/react-query"
44

@@ -24,6 +24,10 @@ export const Unbound = ({ apiConfiguration, setApiConfigurationField, routerMode
2424
const [isInvalidKey, setIsInvalidKey] = useState<boolean>(false)
2525
const queryClient = useQueryClient()
2626

27+
// Add refs to store timer IDs
28+
const didRefetchTimerRef = useRef<NodeJS.Timeout>()
29+
const invalidKeyTimerRef = useRef<NodeJS.Timeout>()
30+
2731
const handleInputChange = useCallback(
2832
<K extends keyof ProviderSettings, E>(
2933
field: K,
@@ -42,18 +46,28 @@ export const Unbound = ({ apiConfiguration, setApiConfigurationField, routerMode
4246
apiConfiguration: apiConfiguration,
4347
})
4448

45-
const waitForStateUpdate = new Promise<void>((resolve) => {
49+
const waitForStateUpdate = new Promise<void>((resolve, reject) => {
50+
const timeoutId = setTimeout(() => {
51+
window.removeEventListener("message", messageHandler)
52+
reject(new Error("Timeout waiting for state update"))
53+
}, 10000) // 10 second timeout
54+
4655
const messageHandler = (event: MessageEvent) => {
4756
const message = event.data
4857
if (message.type === "state") {
58+
clearTimeout(timeoutId)
4959
window.removeEventListener("message", messageHandler)
5060
resolve()
5161
}
5262
}
5363
window.addEventListener("message", messageHandler)
5464
})
5565

56-
await waitForStateUpdate
66+
try {
67+
await waitForStateUpdate
68+
} catch (error) {
69+
console.error("Failed to save configuration:", error)
70+
}
5771
}, [apiConfiguration])
5872

5973
const requestModels = useCallback(async () => {
@@ -102,10 +116,10 @@ export const Unbound = ({ apiConfiguration, setApiConfigurationField, routerMode
102116

103117
if (requestModelsResult) {
104118
setDidRefetch(true)
105-
setTimeout(() => setDidRefetch(false), 2000)
119+
didRefetchTimerRef.current = setTimeout(() => setDidRefetch(false), 3000)
106120
} else {
107121
setIsInvalidKey(true)
108-
setTimeout(() => setIsInvalidKey(false), 2000)
122+
invalidKeyTimerRef.current = setTimeout(() => setIsInvalidKey(false), 3000)
109123
}
110124
}, [saveConfiguration, requestModels])
111125

0 commit comments

Comments
 (0)