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);
 	}
 }