mirror of
https://github.com/Radiquum/AniX.git
synced 2025-09-07 06:53:54 +05:00
feat/api-prox: add index and health pages
This commit is contained in:
parent
033b7fdea5
commit
ec938960cb
4 changed files with 146 additions and 6 deletions
1
api-prox/src/config.json
Normal file
1
api-prox/src/config.json
Normal file
|
@ -0,0 +1 @@
|
|||
{"appVersion": "0.0.1"}
|
|
@ -1,9 +1,60 @@
|
|||
import { Hono } from 'hono'
|
||||
import { Hono } from "hono";
|
||||
import { asciiHTML, separatorHTML } from "./utils/info.js";
|
||||
import config from "./config.json" with { type: "json" };
|
||||
|
||||
const app = new Hono()
|
||||
const app = new Hono();
|
||||
|
||||
app.get('/', (c) => {
|
||||
return c.text('Hello Hono!')
|
||||
})
|
||||
app.get("/", (c) => {
|
||||
return c.html(`
|
||||
<!Doctype html>
|
||||
<html lang="en" style="font-family: monospace; background-color: black; color: white;">
|
||||
<head></head>
|
||||
<body>
|
||||
<style>
|
||||
ul{list-style:none;padding-left:1rem;font-size:16px}
|
||||
p{font-size:14px}
|
||||
li::before{content:">";color:white;display:inline-block;width:1.25rem;margin-left:-1rem;margin-bottom:0.25rem;}
|
||||
a,a:visited{color:white;}
|
||||
a:hover{color:gray;}
|
||||
</style>
|
||||
<script>
|
||||
window.onload = () => {deploy_url.textContent = window.location;}
|
||||
</script>
|
||||
${asciiHTML()}
|
||||
${separatorHTML()}
|
||||
<p>To get started, modify your apk to use <span id="deploy_url">unknown</span>[endpoint] or deploy the AniX web client</p>
|
||||
${separatorHTML()}
|
||||
<ul>
|
||||
<li>Developer: <a href="https://wah.su/radiquum">Radiquum</a></li>
|
||||
<li>Repository: <a href="https://github.com/Radiquum/AniX">https://github.com/Radiquum/AniX</a></li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
`);
|
||||
});
|
||||
|
||||
export default app
|
||||
app.get("/health", (c) => {
|
||||
return c.html(`
|
||||
<!Doctype html>
|
||||
<html lang="en" style="font-family: monospace; background-color: black; color: white;">
|
||||
<head></head>
|
||||
<body>
|
||||
<style>
|
||||
p{font-size:14px;margin-bottom:-0.5rem;}
|
||||
a,a:visited{color:white;}
|
||||
a:hover{color:gray;}
|
||||
</style>
|
||||
${asciiHTML()}
|
||||
${separatorHTML()}
|
||||
<p id="status">Status: OK</p>
|
||||
<p>Version: ${config.appVersion}</p>
|
||||
</body>
|
||||
</html>
|
||||
`);
|
||||
});
|
||||
|
||||
app.get("/health/json", (c) => {
|
||||
return c.json({"status": "OK", "version": config.appVersion});
|
||||
});
|
||||
|
||||
export default app;
|
||||
|
|
27
api-prox/src/utils/info.ts
Normal file
27
api-prox/src/utils/info.ts
Normal file
|
@ -0,0 +1,27 @@
|
|||
// ___ _ __ ___ ____ ____ ____
|
||||
// / | ____ (_) ______ ______/ /_ / | / __ \/ _/ / __ \_________ _ ____ __
|
||||
// / /| | / __ \/ / |/_/ __ `/ ___/ __/ / /| | / /_/ // / / /_/ / ___/ __ \| |/_/ / / /
|
||||
// / ___ |/ / / / /> </ /_/ / / / /_ / ___ |/ ____// / / ____/ / / /_/ /> </ /_/ /
|
||||
// /_/ |_/_/ /_/_/_/|_|\__,_/_/ \__/ /_/ |_/_/ /___/ /_/ /_/ \____/_/|_|\__, /
|
||||
// /____/
|
||||
|
||||
export function asciiHTML() {
|
||||
const stringBuilder = [];
|
||||
stringBuilder.push(`<pre>`);
|
||||
stringBuilder.push(" ___ _ __ ___ ____ ____ ____ ")
|
||||
stringBuilder.push(" / | ____ (_) ______ ______/ /_ / | / __ \\/ _/ / __ \\_________ _ ____ __")
|
||||
stringBuilder.push(" / /| | / __ \\/ / |/_/ __ `/ ___/ __/ / /| | / /_/ // / / /_/ / ___/ __ \\| |/_/ / / /")
|
||||
stringBuilder.push(" / ___ |/ / / / /> </ /_/ / / / /_ / ___ |/ ____// / / ____/ / / /_/ /> </ /_/ /")
|
||||
stringBuilder.push("/_/ |_/_/ /_/_/_/|_|\\__,_/_/ \\__/ /_/ |_/_/ /___/ /_/ /_/ \\____/_/|_|\\__, /")
|
||||
stringBuilder.push(" /____/")
|
||||
stringBuilder.push(`</pre>`);
|
||||
return stringBuilder.join("\n");
|
||||
}
|
||||
|
||||
export function separatorHTML() {
|
||||
const stringBuilder = [];
|
||||
stringBuilder.push(`<pre>`);
|
||||
stringBuilder.push("-".repeat(92))
|
||||
stringBuilder.push(`</pre>`);
|
||||
return stringBuilder.join("\n");
|
||||
}
|
61
api-prox/src/utils/tryCatch.ts
Normal file
61
api-prox/src/utils/tryCatch.ts
Normal file
|
@ -0,0 +1,61 @@
|
|||
type Success<T> = {
|
||||
data: T;
|
||||
error: null;
|
||||
};
|
||||
|
||||
type Failure<E> = {
|
||||
data: null;
|
||||
error: E;
|
||||
};
|
||||
|
||||
type Result<T, E = Error> = Success<T> | Failure<E>;
|
||||
|
||||
export async function tryCatch<T, E = Error>(
|
||||
promise: Promise<T>
|
||||
): Promise<Result<T, E>> {
|
||||
try {
|
||||
const data = await promise;
|
||||
return { data, error: null };
|
||||
} catch (error) {
|
||||
return { data: null, error: error as E };
|
||||
}
|
||||
}
|
||||
|
||||
function generateError(message: string, code: number) {
|
||||
return {message: message, code: code}
|
||||
}
|
||||
|
||||
export async function tryCatchAPI<T, E = Error>(
|
||||
promise: Promise<any>
|
||||
): Promise<Result<object | null, object | null>> {
|
||||
const { data, error }: Awaited<Result<Response | null, Error | null>> = await tryCatch(promise);
|
||||
if (!data || error) return { data: null, error: error };
|
||||
|
||||
if (
|
||||
data.headers.get("content-length") &&
|
||||
Number(data.headers.get("content-length")) == 0
|
||||
) {
|
||||
return {
|
||||
data: null,
|
||||
error: generateError("Not Found", 404),
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const body: Awaited<any> = await data.json();
|
||||
if (body.code != 0) {
|
||||
return {
|
||||
data: null,
|
||||
error: generateError("Anixart API Error", body.code),
|
||||
};
|
||||
}
|
||||
return {
|
||||
data: body,
|
||||
error: null,
|
||||
};
|
||||
} catch {
|
||||
return { data: null, error: generateError("failed to parse json", 500) }
|
||||
}
|
||||
|
||||
return { data: null, error: generateError("tryCatch.ts: unreachable", 500) }
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue