2024-05-15 17:39:44 +02:00
|
|
|
import ipaddr from "ipaddr.js";
|
|
|
|
|
|
|
|
import { createStream } from "../stream/manage.js";
|
2024-08-08 18:34:54 +02:00
|
|
|
import { apiSchema } from "./schema.js";
|
2024-05-15 17:39:44 +02:00
|
|
|
|
|
|
|
export function createResponse(responseType, responseData) {
|
2024-08-03 09:51:09 +02:00
|
|
|
const internalError = (code) => {
|
2024-05-15 17:55:14 +02:00
|
|
|
return {
|
|
|
|
status: 500,
|
|
|
|
body: {
|
|
|
|
status: "error",
|
2024-08-03 09:51:09 +02:00
|
|
|
error: {
|
|
|
|
code: code || "Internal Server Error",
|
|
|
|
},
|
2024-05-15 17:55:14 +02:00
|
|
|
critical: true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-15 17:39:44 +02:00
|
|
|
try {
|
|
|
|
let status = 200,
|
|
|
|
response = {};
|
2024-08-03 09:51:09 +02:00
|
|
|
|
2024-08-06 16:45:04 +02:00
|
|
|
if (responseType === "error") {
|
|
|
|
status = 400;
|
2024-05-15 17:39:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (responseType) {
|
|
|
|
case "error":
|
2024-08-03 09:51:09 +02:00
|
|
|
response = {
|
|
|
|
error: {
|
2024-08-06 17:30:18 +02:00
|
|
|
code: responseData?.code,
|
2024-08-03 09:51:09 +02:00
|
|
|
context: responseData?.context,
|
2024-08-06 16:45:04 +02:00
|
|
|
}
|
2024-08-03 09:51:09 +02:00
|
|
|
}
|
|
|
|
break;
|
2024-05-15 17:39:44 +02:00
|
|
|
case "redirect":
|
|
|
|
response = {
|
2024-08-06 17:30:18 +02:00
|
|
|
url: responseData?.u,
|
2024-05-15 17:39:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "stream":
|
|
|
|
response = {
|
2024-08-03 09:51:09 +02:00
|
|
|
url: createStream(responseData),
|
2024-05-15 17:39:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "picker":
|
|
|
|
response = {
|
2024-08-06 17:30:18 +02:00
|
|
|
picker: responseData?.picker,
|
|
|
|
audio: responseData?.u
|
2024-05-15 17:39:44 +02:00
|
|
|
}
|
|
|
|
break;
|
2024-08-06 17:30:18 +02:00
|
|
|
|
2024-08-03 09:51:09 +02:00
|
|
|
case "critical":
|
2024-08-06 17:30:18 +02:00
|
|
|
return internalError(responseData?.code);
|
|
|
|
|
2024-08-03 09:51:09 +02:00
|
|
|
default:
|
2024-05-15 17:39:44 +02:00
|
|
|
throw "unreachable"
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
status,
|
|
|
|
body: {
|
|
|
|
status: responseType,
|
|
|
|
...response
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch {
|
2024-05-15 17:55:14 +02:00
|
|
|
return internalError()
|
2024-05-15 17:39:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-15 19:03:33 +02:00
|
|
|
export function normalizeRequest(request) {
|
2024-08-08 19:43:04 +02:00
|
|
|
return apiSchema.safeParseAsync(request).catch(() => (
|
|
|
|
{ success: false }
|
|
|
|
));
|
2024-05-15 17:39:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export function getIP(req) {
|
|
|
|
const strippedIP = req.ip.replace(/^::ffff:/, '');
|
|
|
|
const ip = ipaddr.parse(strippedIP);
|
|
|
|
if (ip.kind() === 'ipv4') {
|
|
|
|
return strippedIP;
|
|
|
|
}
|
|
|
|
|
|
|
|
const prefix = 56;
|
|
|
|
const v6Bytes = ip.toByteArray();
|
|
|
|
v6Bytes.fill(0, prefix / 8);
|
|
|
|
|
|
|
|
return ipaddr.fromByteArray(v6Bytes).toString();
|
|
|
|
}
|