import { CORRELATION_ID_HEADER, type RequestLike, SESSION_ID_HEADER, } from './type'; export const requestHeadersToCapture = ['user-agent']; export function getCorrelationId(request?: RequestLike) { if (!request?.headers) return undefined; return ( request.headers.get(CORRELATION_ID_HEADER) || request.headers.get('fi-correlation-id') || request.headers.get('x-correlation-id') || request.headers.get('correlation-id') || request.headers.get('x-transaction-id') || request.headers.get('transaction-id') || request.headers.get('cf-ray') || request.headers.get('cf-request-id') || request.headers.get('request-id') || undefined ); } export function getSessionId(request?: RequestLike) { if (!request?.headers) return undefined; return ( request.headers.get(SESSION_ID_HEADER) || request.headers.get('fi-session-id') || request.headers.get('x-session-id') || request.headers.get('session-id') || undefined ); } export function getEnvironment(env?: Record) { if (env?.NODE_ENV) return env?.NODE_ENV; return env?.IS_LOCAL_DEV ? 'development' : 'production'; } function getHeaderMap( headers: any | undefined // allowlist: string[] = [] ) { if (!headers) { return {}; } return [...headers].reduce((acc, [headerKey, headerValue]) => { if (headerKey) { acc[headerKey.toLowerCase()] = headerValue; } return acc; }, {}); } export type RequestContext = { url?: { pathname: string; search: string; host: string; full: string; }; headers?: Record; method?: string; cloudflare?: Record; body?: any; }; export function requestToContext( request?: RequestLike & { cf?: any; body?: any }, body?: any ): RequestContext { if (!request) return {}; const cf: Record = {}; if (request?.cf) { // delete does not work so we copy into a new object for (const [key, value] of Object.entries(request.cf)) { if (key !== 'tlsClientAuth' && key !== 'tlsExportedAuthenticator') { cf[key] = value; } } } const context: RequestContext = { headers: getHeaderMap(request?.headers), method: request?.method, cloudflare: cf as any, body: body && typeof body === 'object' ? JSON.stringify(body) : body || undefined, }; if (request?.url) { const url = new URL(request.url); context.url = { pathname: url.pathname, search: url.search, host: url.host, full: request.url, }; } if (context.headers?.['x-workflow-id']) (context as any).workflowId = context.headers['x-workflow-id']; if (context.headers?.['x-activity-attempt']) (context as any).activityAttempt = context.headers['x-activity-attempt']; return context; }