43 lines
1.1 KiB
JavaScript
43 lines
1.1 KiB
JavaScript
export const VISITOR_COOKIE_NAME = "arena_visitor_id";
|
|
export const VISITOR_COOKIE_MAX_AGE_SECONDS = 60 * 60 * 24 * 365 * 2;
|
|
|
|
export function readVisitorCookie(request) {
|
|
return readCookie(request, VISITOR_COOKIE_NAME);
|
|
}
|
|
|
|
export function writeVisitorCookie(reply, visitorId, { secure = false } = {}) {
|
|
const secureFlag = secure ? "; Secure" : "";
|
|
|
|
reply.header(
|
|
"Set-Cookie",
|
|
`${VISITOR_COOKIE_NAME}=${encodeURIComponent(visitorId)}; Path=/; Max-Age=${VISITOR_COOKIE_MAX_AGE_SECONDS}; SameSite=Lax; HttpOnly${secureFlag}`,
|
|
);
|
|
}
|
|
|
|
export function isValidVisitorId(value) {
|
|
return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(
|
|
value,
|
|
);
|
|
}
|
|
|
|
function readCookie(request, name) {
|
|
const cookieHeader = request.headers.cookie;
|
|
|
|
if (!cookieHeader) {
|
|
return "";
|
|
}
|
|
|
|
const cookies = cookieHeader.split(";").map((cookie) => cookie.trim());
|
|
const matchedCookie = cookies.find((cookie) => cookie.startsWith(`${name}=`));
|
|
|
|
if (!matchedCookie) {
|
|
return "";
|
|
}
|
|
|
|
try {
|
|
return decodeURIComponent(matchedCookie.slice(name.length + 1));
|
|
} catch {
|
|
return "";
|
|
}
|
|
}
|