summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/api.ts73
1 files changed, 35 insertions, 38 deletions
diff --git a/src/api.ts b/src/api.ts
index 3399d57e30..0a106ae914 100644
--- a/src/api.ts
+++ b/src/api.ts
@@ -14,54 +14,51 @@ export function isAPIError(reason: any): reason is APIError {
return reason[MK_API_ERROR] === true;
}
-export function request<E extends keyof Endpoints>(
- origin: string,
- endpoint: E,
- data: Endpoints[E]['req'] = {},
- credential: string | null | undefined,
-): Promise<Endpoints[E]['res']> {
- const promise = new Promise<Endpoints[E]['res']>((resolve, reject) => {
- // Append a credential
- if (credential !== undefined) (data as Record<string, any>).i = credential;
-
- // Send request
- fetch(`${origin}/api/${endpoint}`, {
- method: 'POST',
- body: JSON.stringify(data),
- credentials: 'omit',
- cache: 'no-cache'
- }).then(async (res) => {
- const body = res.status === 204 ? null : await res.json();
-
- if (res.status === 200) {
- resolve(body);
- } else if (res.status === 204) {
- resolve(null);
- } else {
- reject({
- [MK_API_ERROR]: true,
- ...body.error
- });
- }
- }).catch(reject);
- });
-
- return promise;
-}
-
export class APIClient {
- public i: { token: string; } | null = null;
- private origin: string;
+ public origin: string;
+ public credential: string | null | undefined;
+ public fetch: (typeof fetch);
constructor(opts: {
origin: APIClient['origin'];
+ credential?: APIClient['credential'];
+ fetch?: APIClient['fetch'] | null | undefined;
}) {
this.origin = opts.origin;
+ this.credential = opts.credential;
+ this.fetch = opts.fetch || fetch;
}
public request<E extends keyof Endpoints>(
endpoint: E, data: Endpoints[E]['req'] = {}, credential?: string | null | undefined,
): Promise<Endpoints[E]['res']> {
- return request(this.origin, endpoint, data, credential === undefined ? this.i?.token : credential);
+ const promise = new Promise<Endpoints[E]['res']>((resolve, reject) => {
+ // Append a credential
+ if (this.credential) (data as Record<string, any>).i = this.credential;
+ if (credential) (data as Record<string, any>).i = credential;
+
+ // Send request
+ this.fetch(`${this.origin}/api/${endpoint}`, {
+ method: 'POST',
+ body: JSON.stringify(data),
+ credentials: 'omit',
+ cache: 'no-cache'
+ }).then(async (res) => {
+ const body = res.status === 204 ? null : await res.json();
+
+ if (res.status === 200) {
+ resolve(body);
+ } else if (res.status === 204) {
+ resolve(null);
+ } else {
+ reject({
+ [MK_API_ERROR]: true,
+ ...body.error
+ });
+ }
+ }).catch(reject);
+ });
+
+ return promise;
}
}