32 lines
1.0 KiB
TypeScript
32 lines
1.0 KiB
TypeScript
if (process.env.NODE_ENV !== "test")
|
|
require("server-only");
|
|
import { headers } from "next/headers";
|
|
import { createRequestId } from "@/lib/server/errors";
|
|
|
|
function parseForwardedIp(value: string | null): string | null {
|
|
if (!value) return null;
|
|
const first = value.split(",")[0]?.trim();
|
|
if (!first) return null;
|
|
return first.slice(0, 64);
|
|
}
|
|
|
|
function sanitizeRequestId(value: string | null) {
|
|
if (!value) return null;
|
|
const trimmed = value.trim();
|
|
if (!trimmed) return null;
|
|
const normalized = trimmed.slice(0, 96).replace(/[^a-zA-Z0-9._:-]/g, "");
|
|
return normalized || null;
|
|
}
|
|
|
|
export async function getRequestMeta() {
|
|
const headerStore = await headers();
|
|
const forwardedRequestId = sanitizeRequestId(headerStore.get("x-request-id"));
|
|
const requestId = forwardedRequestId || createRequestId();
|
|
const ip = parseForwardedIp(headerStore.get("x-forwarded-for")) || parseForwardedIp(headerStore.get("x-real-ip"));
|
|
return {
|
|
requestId,
|
|
ip,
|
|
userAgent: headerStore.get("user-agent")
|
|
};
|
|
}
|