88 lines
1.9 KiB
TypeScript
88 lines
1.9 KiB
TypeScript
import { NextRequest } from "next/server";
|
|
import { ServerConfig, getIP } from "../../common";
|
|
|
|
export const urlParamApikeyName = "key";
|
|
|
|
export const REQUEST_TIMEOUT_MS = 60000;
|
|
|
|
export const makeBearer = (s: string) => `Bearer ${s.trim()}`;
|
|
export const validString = (x?: string): x is string =>
|
|
Boolean(x && x.length > 0);
|
|
|
|
export function ensureProperEnding(str: string) {
|
|
if (str.startsWith("[") && !str.endsWith("]")) {
|
|
return str + "]";
|
|
}
|
|
return str;
|
|
}
|
|
|
|
export function auth(req: NextRequest, serverConfig: ServerConfig) {
|
|
let apiKey = req.nextUrl.searchParams.get(urlParamApikeyName);
|
|
|
|
const { hideUserApiKey, googleApiKey } = serverConfig;
|
|
|
|
console.log("[User IP] ", getIP(req));
|
|
console.log("[Time] ", new Date().toLocaleString());
|
|
|
|
if (hideUserApiKey && apiKey) {
|
|
return {
|
|
error: true,
|
|
message: "you are not allowed to access with your own api key",
|
|
};
|
|
}
|
|
|
|
if (apiKey) {
|
|
console.log("[Auth] use user api key");
|
|
return {
|
|
error: false,
|
|
apiKey,
|
|
};
|
|
}
|
|
|
|
if (googleApiKey) {
|
|
console.log("[Auth] use system api key");
|
|
return {
|
|
error: false,
|
|
apiKey: googleApiKey,
|
|
};
|
|
}
|
|
|
|
console.log("[Auth] admin did not provide an api key");
|
|
return {
|
|
error: true,
|
|
message: `missing api key`,
|
|
};
|
|
}
|
|
|
|
export function getTimer() {
|
|
const controller = new AbortController();
|
|
|
|
// make a fetch request
|
|
const requestTimeoutId = setTimeout(
|
|
() => controller.abort(),
|
|
REQUEST_TIMEOUT_MS,
|
|
);
|
|
|
|
return {
|
|
...controller,
|
|
clear: () => {
|
|
clearTimeout(requestTimeoutId);
|
|
},
|
|
};
|
|
}
|
|
|
|
export function parseResp(res: any) {
|
|
if (res?.promptFeedback?.blockReason) {
|
|
// being blocked
|
|
throw new Error(
|
|
"Message is being blocked for reason: " + res.promptFeedback.blockReason,
|
|
);
|
|
}
|
|
return {
|
|
message:
|
|
res.candidates?.at(0)?.content?.parts?.at(0)?.text ||
|
|
res.error?.message ||
|
|
"",
|
|
};
|
|
}
|