Skip to content

Commit fa2bf93

Browse files
feat: add timeout handling for API requests in ComparatorPanel
1 parent 4d2b9de commit fa2bf93

1 file changed

Lines changed: 26 additions & 4 deletions

File tree

src/lib/components/ComparatorPanel.svelte

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,19 +245,36 @@
245245
error = undefined;
246246
247247
const endpoint = endpoints.find((e) => e.id === selectedEndpoint);
248-
if (!endpoint) return;
248+
if (!endpoint) {
249+
loading = false;
250+
return;
251+
}
249252
253+
let timeoutId: number | undefined = undefined;
254+
let didTimeout = false;
250255
try {
251256
const url1 = buildUrl(server1Base, endpoint, params);
252257
const url2 = buildUrl(server2Base, endpoint, params);
253258
254-
const response = await fetch('/api/proxy', {
259+
const timeoutPromise = new Promise((_, reject) => {
260+
timeoutId = window.setTimeout(() => {
261+
didTimeout = true;
262+
reject(new Error('Request timed out after 5 seconds'));
263+
}, 5000);
264+
});
265+
266+
const fetchPromise = fetch('/api/proxy', {
255267
method: 'POST',
256268
headers: { 'Content-Type': 'application/json' },
257269
body: JSON.stringify({ url1, url2 })
258270
});
259271
260-
const data = await response.json();
272+
const response = await Promise.race([fetchPromise, timeoutPromise]);
273+
if (didTimeout) return;
274+
275+
if (timeoutId !== undefined) clearTimeout(timeoutId);
276+
277+
const data = await (response as Response).json();
261278
262279
if (data.error) {
263280
error = data.error;
@@ -269,8 +286,13 @@
269286
270287
await logWatchedKeys(data.response1, data.response2);
271288
} catch (e) {
272-
error = e instanceof Error ? e.message : 'Unknown error';
289+
if (didTimeout) {
290+
error = 'Request timed out. Please try again.';
291+
} else {
292+
error = e instanceof Error ? e.message : 'Unknown error';
293+
}
273294
} finally {
295+
if (timeoutId !== undefined) clearTimeout(timeoutId);
274296
loading = false;
275297
}
276298
}

0 commit comments

Comments
 (0)