65 lines
2.1 KiB
TypeScript
65 lines
2.1 KiB
TypeScript
import { SignJWT } from "jose";
|
|
|
|
export const TEST_MANAGEMENT_JWT_SECRET = "test-management-jwt-secret";
|
|
|
|
function appendCookie(existingCookieHeader: string | null, cookie: string): string {
|
|
if (!existingCookieHeader) return cookie;
|
|
return `${existingCookieHeader}; ${cookie}`;
|
|
}
|
|
|
|
export async function createManagementSessionToken(
|
|
secret = process.env.JWT_SECRET || TEST_MANAGEMENT_JWT_SECRET
|
|
): Promise<string> {
|
|
process.env.JWT_SECRET = secret;
|
|
|
|
return new SignJWT({ authenticated: true })
|
|
.setProtectedHeader({ alg: "HS256" })
|
|
.setIssuedAt()
|
|
.setExpirationTime("1h")
|
|
.sign(new TextEncoder().encode(secret));
|
|
}
|
|
|
|
export async function createManagementSessionHeaders(headers?: HeadersInit): Promise<Headers> {
|
|
const requestHeaders = new Headers(headers);
|
|
const token = await createManagementSessionToken();
|
|
requestHeaders.set("cookie", appendCookie(requestHeaders.get("cookie"), `auth_token=${token}`));
|
|
return requestHeaders;
|
|
}
|
|
|
|
export async function makeManagementSessionRequest(
|
|
url: string,
|
|
options: {
|
|
method?: string;
|
|
token?: string;
|
|
headers?: HeadersInit;
|
|
body?: BodyInit | Record<string, unknown> | unknown[] | number | boolean | null;
|
|
} = {}
|
|
): Promise<Request> {
|
|
const { method = "GET", token, headers, body } = options;
|
|
const requestHeaders = await createManagementSessionHeaders(headers);
|
|
|
|
if (token) {
|
|
requestHeaders.set("authorization", `Bearer ${token}`);
|
|
}
|
|
|
|
const isFormData = typeof FormData !== "undefined" && body instanceof FormData;
|
|
const isUrlSearchParams =
|
|
typeof URLSearchParams !== "undefined" && body instanceof URLSearchParams;
|
|
const isStringBody = typeof body === "string";
|
|
const shouldSerializeJson =
|
|
body !== undefined && !isFormData && !isUrlSearchParams && !isStringBody;
|
|
|
|
if (body !== undefined && !requestHeaders.has("content-type") && !isFormData) {
|
|
requestHeaders.set(
|
|
"content-type",
|
|
isUrlSearchParams ? "application/x-www-form-urlencoded;charset=UTF-8" : "application/json"
|
|
);
|
|
}
|
|
|
|
return new Request(url, {
|
|
method,
|
|
headers: requestHeaders,
|
|
body: shouldSerializeJson ? JSON.stringify(body) : body,
|
|
});
|
|
}
|