import { createHash, randomBytes, timingSafeEqual } from "node:crypto"; import type { FastifyRequest } from "fastify"; export const SESSION_COOKIE = "companion_session"; export const CSRF_COOKIE = "companion_csrf"; export function randomToken(bytes = 32): string { return randomBytes(bytes).toString("base64url"); } export function hashToken(token: string): string { return createHash("sha256").update(token).digest("hex"); } export function safeEqual(left: string, right: string): boolean { const leftBuffer = Buffer.from(left); const rightBuffer = Buffer.from(right); return leftBuffer.length === rightBuffer.length && timingSafeEqual(leftBuffer, rightBuffer); } export function clientAddress(request: FastifyRequest): string { return request.ip.slice(0, 64); }