cosmic-analytics
Version:
Lightweight analytics for Cosmic projects
61 lines • 2.15 kB
JavaScript
// 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