-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFetchCall.ts
More file actions
31 lines (25 loc) · 1.07 KB
/
FetchCall.ts
File metadata and controls
31 lines (25 loc) · 1.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import { Call, HttpRequest, Internals } from '@drizzle-http/core'
export class FetchCall implements Call<Response> {
constructor(private readonly baseUrl: URL, private readonly requestInit: RequestInit) {}
static requestInit(requestInit: RequestInit, request: HttpRequest, signal: AbortSignal): RequestInit {
return {
...requestInit,
method: request.method,
headers: new Headers([...request.headers.entries()]),
body: request.body as BodyInit,
signal: signal
}
}
execute(request: HttpRequest): Promise<Response> {
const url = !Internals.isAbsolute(request.url) ? new URL(request.url, this.baseUrl).href : request.url
const timeout = request.bodyTimeout ?? 30e3
const controller = new AbortController()
if (request.signal) {
;(request.signal as AbortSignal).addEventListener('abort', () => controller.abort())
}
const timer = setTimeout(() => controller.abort(), timeout)
return fetch(url, FetchCall.requestInit(this.requestInit, request, controller.signal)).finally(() =>
clearTimeout(timer)
)
}
}