about summary refs log tree commit diff
path: root/src/state/lib/api.ts
diff options
context:
space:
mode:
authorPaul Frazee <pfrazee@gmail.com>2022-12-05 13:25:04 -0600
committerPaul Frazee <pfrazee@gmail.com>2022-12-05 13:25:04 -0600
commitf27e32e54c3e6a6f7d156cf6c23c11778a7dd316 (patch)
tree484dbd281d938082c0de8ec3ba346ed8af839429 /src/state/lib/api.ts
parent59363181e1c72dcec3a86cf155f12a556e569b8f (diff)
downloadvoidsky-f27e32e54c3e6a6f7d156cf6c23c11778a7dd316.tar.zst
Ensure the UI always renders, even in bad network conditions (close #6)
Diffstat (limited to 'src/state/lib/api.ts')
-rw-r--r--src/state/lib/api.ts9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/state/lib/api.ts b/src/state/lib/api.ts
index 842905d1d..f17d0337c 100644
--- a/src/state/lib/api.ts
+++ b/src/state/lib/api.ts
@@ -12,6 +12,8 @@ import {APP_BSKY_GRAPH} from '../../third-party/api'
 import {RootStoreModel} from '../models/root-store'
 import {extractEntities} from '../../lib/strings'
 
+const TIMEOUT = 10e3 // 10s
+
 export function doPolyfill() {
   AtpApi.xrpc.fetch = fetchHandler
 }
@@ -175,10 +177,14 @@ async function fetchHandler(
     reqBody = JSON.stringify(reqBody)
   }
 
+  const controller = new AbortController()
+  const to = setTimeout(() => controller.abort(), TIMEOUT)
+
   const res = await fetch(reqUri, {
     method: reqMethod,
     headers: reqHeaders,
     body: reqBody,
+    signal: controller.signal,
   })
 
   const resStatus = res.status
@@ -197,6 +203,9 @@ async function fetchHandler(
       throw new Error('TODO: non-textual response body')
     }
   }
+
+  clearTimeout(to)
+
   return {
     status: resStatus,
     headers: resHeaders,