From eacb5fea9f0311aa4897872d4619e69cd73f78f8 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Fri, 14 May 2021 12:56:43 +0900 Subject: [PATCH] wip --- src/acct.ts | 14 ++++++++++++ src/api.ts | 66 ++++++++++++++++++++++++++++++----------------------- 2 files changed, 51 insertions(+), 29 deletions(-) create mode 100644 src/acct.ts diff --git a/src/acct.ts b/src/acct.ts new file mode 100644 index 000000000..04ce78045 --- /dev/null +++ b/src/acct.ts @@ -0,0 +1,14 @@ +export type Acct = { + username: string; + host: string | null; +}; + +export function parse(acct: string): Acct { + if (acct.startsWith('@')) acct = acct.substr(1); + const split = acct.split('@', 2); + return { username: split[0], host: split[1] || null }; +} + +export function render(acct: Acct): string { + return acct.host == null ? acct.username : `${acct.username}@${acct.host}`; +} diff --git a/src/api.ts b/src/api.ts index 49b3eea19..87f862994 100644 --- a/src/api.ts +++ b/src/api.ts @@ -1,42 +1,50 @@ import { Endpoints } from './endpoints'; +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(body.error); + } + }).catch(reject); + }); + + return promise; +} + export class APIClient { public i: { token: string; } | null = null; - private apiUrl: string; + private origin: string; constructor(opts: { - apiUrl: APIClient['apiUrl']; + origin: APIClient['origin']; }) { - this.apiUrl = opts.apiUrl; + this.origin = opts.origin; } public request<E extends keyof Endpoints>( - endpoint: E, data: Endpoints[E]['req'] = {}, token?: string | null | undefined + 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 (this.i) (data as Record<string, any>).i = this.i.token; - if (token !== undefined) (data as Record<string, any>).i = token; - - // Send request - fetch(endpoint.indexOf('://') > -1 ? endpoint : `${this.apiUrl}/${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(body.error); - } - }).catch(reject); - }); - - return promise; + return request(this.origin, endpoint, data, credential === undefined ? this.i?.token : credential); } }