import type { JourneyRequestEvent } from './types'; export const MAX_CORRELATED_REQUESTS = 5; export const MAX_JOURNEY_CORRELATED_REQUESTS = 20; /** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */ export function sanitizeRequestCorrelation( value: JourneyRequestEvent ): JourneyRequestEvent | undefined { if ( !value || typeof value.rayId !== 'string' || !/^[a-f0-9]{16}(?:-[a-z]{3})?$/i.test(value.rayId) || !Number.isFinite(value.startedAtEpoch) || value.startedAtEpoch <= 0 || value.startedAtEpoch > 8.64e15 - 2 * 86_400_000 || !Number.isFinite(value.durationMs) || value.durationMs < 0 || value.durationMs > 86_400_000 || !Number.isInteger(value.status) || value.status < 100 || value.status > 599 ) { return undefined; } return { rayId: value.rayId.toLowerCase(), startedAtEpoch: Math.round(value.startedAtEpoch), durationMs: Math.round(value.durationMs), status: value.status, }; } /** Production monolith origins whose Ray IDs have been verified against the log data view. */ export function isMonolithLogOrigin(value: string): boolean { try { const url = new URL(value); return ( url.protocol === 'https:' && !url.port && !url.username && !url.password && (url.hostname === 'go.servicetitan.com' || /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:_[a-z0-9-]+)*\.eh\.go\.servicetitan\.com$/i.test( url.hostname )) ); } catch { return false; } }