Handle anonymous users
Overview
Setup
input User {
id: String!
anonymousId: String!
name: String!
email: String!
}import { NextRequest, NextResponse } from "next/server";
import { cookies } from "next/headers";
import {
RequestCookies,
ResponseCookies,
} from "next/dist/compiled/@edge-runtime/cookies";
const anonymousIdCookieName = "hypertuneAnonymousId";
export async function getAnonymousId(): Promise<string | null> {
const cookieStore = await cookies();
return cookieStore.get(anonymousIdCookieName)?.value ?? null;
}
export function setAnonymousIdIfNeeded(
request: NextRequest,
response: NextResponse,
): void {
if (request.cookies.get(anonymousIdCookieName)) {
return;
}
const newAnonymousId = crypto.randomUUID();
response.cookies.set({
name: anonymousIdCookieName,
value: newAnonymousId,
path: "/",
});
addResponseCookiesToRequest(request, response);
}
function addResponseCookiesToRequest(
request: NextRequest,
response: NextResponse,
): void {
mutateRequestHeaders(request, response, (newRequestHeaders) => {
const setCookies = new ResponseCookies(response.headers);
const newRequestCookies = new RequestCookies(newRequestHeaders);
setCookies.getAll().forEach((cookie) => newRequestCookies.set(cookie));
});
}
const xMiddlewareOverrideHeadersHeaderName = "x-middleware-override-headers";
const xMiddlewareRequestHeaderNamePrefix = "x-middleware-request-";
function mutateRequestHeaders(
request: NextRequest,
response: NextResponse,
mutate: (newRequestHeaders: Headers) => void,
): void {
const newRequestHeaders = new Headers(request.headers);
// Add existing request header overrides to new request headers
response.headers.forEach((value, key) => {
if (key.toLowerCase().startsWith(xMiddlewareRequestHeaderNamePrefix)) {
const originalName = key.slice(xMiddlewareRequestHeaderNamePrefix.length);
newRequestHeaders.set(originalName, value);
}
});
mutate(newRequestHeaders);
const dummyResponse = NextResponse.next({
request: { headers: newRequestHeaders },
});
// Add request header overrides to response
dummyResponse.headers.forEach((value, key) => {
if (
key === xMiddlewareOverrideHeadersHeaderName ||
key.toLowerCase().startsWith(xMiddlewareRequestHeaderNamePrefix)
) {
response.headers.set(key, value);
}
});
}Last updated