Skip to content
Snippets Groups Projects
Commit eacb5fea authored by syuilo's avatar syuilo
Browse files

wip

parent 92c170d5
No related branches found
No related tags found
No related merge requests found
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}`;
}
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);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment