import { join, ky } from "./deps.ts";
export interface UrlParam { name: string; callback?: string; permission: Array<string>;}
class UrlParametorError extends Error { constructor() { super("UrlParametorError"); }}
class AuthenticationError extends Error { constructor() { super("AuthenticationError"); }}
export class MiAuth {
private origin: string; private param: UrlParam; private session: string;
constructor(origin: string, param: UrlParam, session: string) { this.origin = origin; this.param = param; this.session = session; }
public authUrl(): string { const param = this.buildParam(this.param); const requestUrl = new URL(join("miauth", this.session), this.origin);
requestUrl.search = param; return requestUrl.toString(); }
public async getToken(): Promise<string> { const url = new URL( join("api", "miauth", this.session, "check"), this.origin, );
const data: Record<string, unknown> = await ky.post(url).json(); const token = String(data.token);
if (typeof data.token === "undefined") { throw new AuthenticationError(); }
return token; }
private buildParam(param: UrlParam): string { const urlParam: Record<string, string> = { name: param.name, callback: param.callback as string, permission: param.permission.join(", "), };
const convertdParam = new URLSearchParams();
Object.keys(urlParam).forEach((key) => { convertdParam.set(key, String(urlParam[key])); if (key != "callback") { if (typeof urlParam[key] === "undefined") { throw UrlParametorError; } } else { if (typeof urlParam[key] === "undefined") { convertdParam.delete("callback"); } } }); return convertdParam.toString(); }}
export function quickAuth(origin: string, param: UrlParam): MiAuth { const session = crypto.randomUUID(); return new MiAuth(origin, param, session);}