mission-control/src/lib/session-cookie.ts

48 lines
1.6 KiB
TypeScript

import type { ResponseCookie } from 'next/dist/compiled/@edge-runtime/cookies'
export const MC_SESSION_COOKIE_NAME = '__Host-mc-session'
export const LEGACY_MC_SESSION_COOKIE_NAME = 'mc-session'
const MC_SESSION_COOKIE_NAMES = [MC_SESSION_COOKIE_NAME, LEGACY_MC_SESSION_COOKIE_NAME] as const
export function getMcSessionCookieName(isSecureRequest: boolean): string {
return isSecureRequest ? MC_SESSION_COOKIE_NAME : LEGACY_MC_SESSION_COOKIE_NAME
}
export function isRequestSecure(request: Request): boolean {
return request.headers.get('x-forwarded-proto') === 'https'
|| new URL(request.url).protocol === 'https:'
}
export function parseMcSessionCookieHeader(cookieHeader: string): string | null {
if (!cookieHeader) return null
for (const cookieName of MC_SESSION_COOKIE_NAMES) {
const match = cookieHeader.match(new RegExp(`(?:^|;\\s*)${cookieName}=([^;]*)`))
if (match) {
return decodeURIComponent(match[1])
}
}
return null
}
function envFlag(name: string): boolean | undefined {
const raw = process.env[name]
if (raw === undefined) return undefined
const v = String(raw).trim().toLowerCase()
if (v === '1' || v === 'true' || v === 'yes' || v === 'on') return true
if (v === '0' || v === 'false' || v === 'no' || v === 'off') return false
return undefined
}
export function getMcSessionCookieOptions(input: { maxAgeSeconds: number; isSecureRequest?: boolean }): Partial<ResponseCookie> {
const secureEnv = envFlag('MC_COOKIE_SECURE')
const secure = secureEnv ?? input.isSecureRequest ?? false
return {
httpOnly: true,
secure,
sameSite: 'strict',
maxAge: input.maxAgeSeconds,
path: '/',
}
}