UNPKG

cosmic-analytics

Version:

Lightweight analytics for Cosmic projects

1 lines 4.3 kB
{"version":3,"sources":["../../src/server/edge.ts"],"sourcesContent":["import type { NextRequest } from 'next/server';\nimport type { PageViewEvent } from '../types';\n\ninterface EdgeAnalyticsConfig {\n projectId: string;\n apiEndpoint?: string;\n sendInDevelopment?: boolean;\n}\n\n/**\n * Track page view from edge runtime (middleware)\n */\nexport async function trackPageViewEdge(\n request: NextRequest,\n config: EdgeAnalyticsConfig\n): Promise<void> {\n const { \n projectId, \n apiEndpoint = 'https://api.cosmic.new/analytics',\n sendInDevelopment = false \n } = config;\n \n if (!projectId) {\n console.warn('Cosmic Analytics Edge: projectId is required');\n return;\n }\n \n // Check if we're in development mode\n const isDevelopment = process.env.NODE_ENV === 'development';\n \n // Skip analytics in development unless explicitly enabled\n if (isDevelopment && !sendInDevelopment) {\n console.log('Cosmic Analytics Edge: Disabled in development mode. Set sendInDevelopment: true to enable.');\n return;\n }\n \n const url = request.url;\n const userAgent = request.headers.get('user-agent') || '';\n const referrer = request.headers.get('referer') || '';\n const acceptLanguage = request.headers.get('accept-language') || '';\n \n // Extract primary language\n const language = acceptLanguage.split(',')[0]?.split(';')[0] || 'en';\n \n // Generate session ID from cookies or create new one\n const sessionCookie = request.cookies.get('cosmic_session_id');\n const sessionId = sessionCookie?.value || `edge-${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n \n const event: PageViewEvent = {\n event: 'pageview',\n projectId,\n sessionId,\n url,\n title: '', // Title not available in edge runtime\n referrer: referrer || 'direct',\n timestamp: Date.now(),\n language,\n userAgent,\n };\n \n try {\n await fetch(`${apiEndpoint}/track`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Forwarded-For': request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || '',\n 'X-Real-IP': request.headers.get('x-real-ip') || '',\n },\n body: JSON.stringify({ events: [event] }),\n });\n } catch (error) {\n console.error('Cosmic Analytics Edge: Failed to track page view', error);\n }\n}\n\n/**\n * Extract geo information from request headers\n */\nexport function getGeoInfo(request: NextRequest): {\n country?: string;\n region?: string;\n city?: string;\n} {\n return {\n country: request.headers.get('x-vercel-ip-country') || request.headers.get('cf-ipcountry') || undefined,\n region: request.headers.get('x-vercel-ip-country-region') || request.headers.get('cf-region') || undefined,\n city: request.headers.get('x-vercel-ip-city') || request.headers.get('cf-city') || undefined,\n };\n} "],"mappings":";AAYA,eAAsB,kBACpB,SACA,QACe;AACf,QAAM;AAAA,IACJ;AAAA,IACA,cAAc;AAAA,IACd,oBAAoB;AAAA,EACtB,IAAI;AAEJ,MAAI,CAAC,WAAW;AACd,YAAQ,KAAK,8CAA8C;AAC3D;AAAA,EACF;AAGA,QAAM,gBAAgB,QAAQ,IAAI,aAAa;AAG/C,MAAI,iBAAiB,CAAC,mBAAmB;AACvC,YAAQ,IAAI,6FAA6F;AACzG;AAAA,EACF;AAEA,QAAM,MAAM,QAAQ;AACpB,QAAM,YAAY,QAAQ,QAAQ,IAAI,YAAY,KAAK;AACvD,QAAM,WAAW,QAAQ,QAAQ,IAAI,SAAS,KAAK;AACnD,QAAM,iBAAiB,QAAQ,QAAQ,IAAI,iBAAiB,KAAK;AAGjE,QAAM,WAAW,eAAe,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AAGhE,QAAM,gBAAgB,QAAQ,QAAQ,IAAI,mBAAmB;AAC7D,QAAM,YAAY,eAAe,SAAS,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AAE3G,QAAM,QAAuB;AAAA,IAC3B,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA;AAAA,IACP,UAAU,YAAY;AAAA,IACtB,WAAW,KAAK,IAAI;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAM,GAAG,WAAW,UAAU;AAAA,MAClC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,mBAAmB,QAAQ,QAAQ,IAAI,iBAAiB,KAAK,QAAQ,QAAQ,IAAI,WAAW,KAAK;AAAA,QACjG,aAAa,QAAQ,QAAQ,IAAI,WAAW,KAAK;AAAA,MACnD;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,oDAAoD,KAAK;AAAA,EACzE;AACF;AAKO,SAAS,WAAW,SAIzB;AACA,SAAO;AAAA,IACL,SAAS,QAAQ,QAAQ,IAAI,qBAAqB,KAAK,QAAQ,QAAQ,IAAI,cAAc,KAAK;AAAA,IAC9F,QAAQ,QAAQ,QAAQ,IAAI,4BAA4B,KAAK,QAAQ,QAAQ,IAAI,WAAW,KAAK;AAAA,IACjG,MAAM,QAAQ,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,QAAQ,IAAI,SAAS,KAAK;AAAA,EACrF;AACF;","names":[]}