fiddy/apps/web/lib/server/request.ts

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")
};
}