dnf-api
Version:
던전 앤 파이터 API
96 lines (84 loc) • 2.87 kB
text/typescript
import consola from "consola";
import querystring from "query-string";
import { request } from "undici";
import type * as model from "../model";
import * as Util from "./";
const apiUrl = new URL("https://api.neople.co.kr");
// const client = new Client("https://api.neople.co.kr", {
// connectTimeout: Util.Config.timeout,
// // allowH2: true,
// });
const sender = async <T>(path: string, method: "GET" | "POST", query: any) => {
apiUrl.pathname = path;
apiUrl.search = querystring.stringify(query);
const res = await request<model.IDnfResponse<T>>(apiUrl.href, {
method,
});
return res;
};
const showUrl = (url: string): string => {
if (Util.config.key) {
return url?.replace(Util.config.key, Util.config.hideKeyText);
} else {
return url;
}
};
// biome-ignore lint/complexity/noStaticOnlyClass: <explanation>
export default class Request {
public static UriBuilder(...args: any[]): string {
return args.join("/");
}
public static QueryBuilder(query: string[] | number[]): string {
const qString: string[] = [];
for (const key in query) {
qString.push(`${key}:${query[key]},`);
}
return qString.join(",");
}
/**
* 던전앤파이터 API 서버에 응답을 요청하는 함수 입니다.
* 해당 함수를 직접 호출 하는것을 권장하지 않습니다.
*
* @param {object} opt (요청을 보낼 Parameter값)
* @returns
*/
public static async Request<T>(
opt: any = {},
method: "GET" | "POST" = "GET"
): Promise<model.IDnfResponse<T>> {
if (!Util.config.key || Util.config.key === "") {
consola.error("Please change to your api key. ");
}
if (opt.params === undefined) opt.params = {};
if (opt.params.q) opt.params.q = Request.QueryBuilder(opt.params.q);
if (opt.params.sort)
opt.params.sort = Request.QueryBuilder(opt.params.sort);
opt.params.apikey = Util.config.key;
if (Util.config.showURL)
consola.log(
"request url:",
showUrl(`${opt.base}?${querystring.stringify(opt.params)}`)
);
const res = await sender<T>(opt.base, method, opt.params);
if (res.statusCode !== 200) {
const resBody = (await res.body.json()) as model.IDnfResponse<T>;
const error: model.IDnfErrorResponse = {
url: showUrl(opt.url ?? ""),
status: res.statusCode || 0,
statusText: "",
code: resBody.error?.code || "",
message: resBody.error?.message || "",
};
return { error };
} else {
const resBody = (await res.body.json()) as T;
return {
data: resBody,
};
}
}
public static makeItemQuery(query: any) {
// return JSON.stringify(query).replace(/\"|\{|\}/gi, "");
return encodeURI(query);
}
}