-
Notifications
You must be signed in to change notification settings - Fork 10
/
request.ts
57 lines (48 loc) · 1.27 KB
/
request.ts
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import type { RequestInit } from 'node-fetch'
import fetch from 'node-fetch'
export enum RequestMethod {
POST = 'POST',
}
/**
* {@link https://www.braze.com/docs/api/errors/#server-responses}
*/
export interface ServerResponse {
message: string
errors?: string[]
}
export class ResponseError extends Error {
status: number
errors?: ServerResponse['errors']
constructor(message: string, status: number, errors?: ServerResponse['errors']) {
super(message)
this.status = status
this.errors = errors
}
}
export type RequestURL = string
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export type RequestBody = Record<string, any>
export type RequestOptions = RequestInit
/**
* Makes a request.
*
* @param url - Request endpoint.
* @param body - Request body.
* @param options - Request options.
* @returns - Response.
*/
export async function request<Response extends ServerResponse>(
url: RequestURL,
body?: RequestBody,
options?: RequestOptions,
): Promise<Response> {
const response = await fetch(url, {
body: body ? JSON.stringify(body) : undefined,
...options,
})
const data: Response = await response.json()
if (response.ok) {
return data
}
throw new ResponseError(data.message, response.status, data.errors)
}