UNPKG

cosmic-analytics

Version:

Lightweight analytics for Cosmic projects

61 lines 2.15 kB
// src/server/edge.ts async function trackPageViewEdge(request, config) { const { projectId, apiEndpoint = "https://api.cosmic.new/analytics", sendInDevelopment = false } = config; if (!projectId) { console.warn("Cosmic Analytics Edge: projectId is required"); return; } const isDevelopment = process.env.NODE_ENV === "development"; if (isDevelopment && !sendInDevelopment) { console.log("Cosmic Analytics Edge: Disabled in development mode. Set sendInDevelopment: true to enable."); return; } const url = request.url; const userAgent = request.headers.get("user-agent") || ""; const referrer = request.headers.get("referer") || ""; const acceptLanguage = request.headers.get("accept-language") || ""; const language = acceptLanguage.split(",")[0]?.split(";")[0] || "en"; const sessionCookie = request.cookies.get("cosmic_session_id"); const sessionId = sessionCookie?.value || `edge-${Date.now()}-${Math.random().toString(36).substring(2, 15)}`; const event = { event: "pageview", projectId, sessionId, url, title: "", // Title not available in edge runtime referrer: referrer || "direct", timestamp: Date.now(), language, userAgent }; try { await fetch(`${apiEndpoint}/track`, { method: "POST", headers: { "Content-Type": "application/json", "X-Forwarded-For": request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || "", "X-Real-IP": request.headers.get("x-real-ip") || "" }, body: JSON.stringify({ events: [event] }) }); } catch (error) { console.error("Cosmic Analytics Edge: Failed to track page view", error); } } function getGeoInfo(request) { return { country: request.headers.get("x-vercel-ip-country") || request.headers.get("cf-ipcountry") || void 0, region: request.headers.get("x-vercel-ip-country-region") || request.headers.get("cf-region") || void 0, city: request.headers.get("x-vercel-ip-city") || request.headers.get("cf-city") || void 0 }; } export { getGeoInfo, trackPageViewEdge }; //# sourceMappingURL=index.mjs.map