Skip to content

Commit d9b7a4d

Browse files
committed
feat(server): add data collection from timezone and client hints header
1 parent b3651ba commit d9b7a4d

3 files changed

Lines changed: 48 additions & 32 deletions

File tree

packages/analytics/src/server/client-hints.ts

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import type { AnalyticsEvent, IgnoredMetrics } from "./interfaces";
2+
3+
export function parseViewportWidth(headers: Headers) {
4+
const width = headers.get("Sec-CH-Viewport-Width") ?? headers.get("Viewport-Width");
5+
6+
return width ? Number.parseInt(width, 10) : undefined;
7+
}
8+
9+
export function parseViewportHeight(headers: Headers) {
10+
const height = headers.get("Sec-CH-Viewport-Height") ?? headers.get("Viewport-Height");
11+
12+
return height ? Number.parseInt(height, 10) : undefined;
13+
}
14+
15+
export function parseLanguage(headers: Headers) {
16+
return headers.get("Sec-CH-Lang") ?? headers.get("Lang") ?? undefined;
17+
}
18+
19+
export function parseTimezone(headers: Headers) {
20+
return headers.get("X-Vercel-IP-Timezone") ?? headers.get("CloudFront-Viewer-Time-Zone") ?? undefined;
21+
}
22+
23+
export function parseUserAgent(headers: Headers) {
24+
return headers.get("User-Agent") ?? "";
25+
}
26+
27+
export function parseHeaders(headers: Headers, ignoredMetrics: IgnoredMetrics) {
28+
return {
29+
ua: !ignoredMetrics.userAgent ? parseUserAgent(headers) : "",
30+
31+
viewport_width: !ignoredMetrics.viewportSize ? parseViewportWidth(headers) : undefined,
32+
viewport_height: !ignoredMetrics.viewportSize ? parseViewportHeight(headers) : undefined,
33+
34+
language: !ignoredMetrics.language ? parseLanguage(headers) : undefined,
35+
timezone: !ignoredMetrics.timezone ? parseTimezone(headers) : undefined,
36+
} satisfies Partial<AnalyticsEvent>;
37+
}

packages/analytics/src/server/simple-analytics.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { NextRequest } from "next/server";
44
import type { AnalyticsEvent, AnalyticsPageview } from "./interfaces";
55
import type { AnalyticsMetadata } from "../interfaces";
66
import { isDoNotTrackEnabled } from "./utils";
7+
import { parseHeaders } from "./headers";
78

89
type ServerContext = { request: Request } | { headers: Headers };
910

@@ -18,17 +19,17 @@ export async function trackEvent(
1819
eventName: string,
1920
options: TrackEventOptions,
2021
) {
21-
const headers =
22-
"request" in options ? options.request.headers : options.headers;
23-
2422
const hostname = options.hostname ?? process.env.SIMPLE_ANALYTICS_HOSTNAME;
2523

2624
if (!hostname) {
2725
console.error("No hostname provided for Simple Analytics");
2826
return;
2927
}
3028

29+
const headers = "request" in options ? options.request.headers : options.headers;
30+
3131
if (isDoNotTrackEnabled(headers) && !options.collectDnt) {
32+
console.log("Do not track enabled, not tracking event");
3233
return;
3334
}
3435

@@ -37,9 +38,11 @@ export async function trackEvent(
3738
hostname,
3839
event: eventName,
3940
metadata: options.metadata,
40-
ua: headers.get("user-agent") ?? "",
41+
...(parseHeaders(headers, {})),
4142
};
4243

44+
console.log("Tracking event", payload);
45+
4346
const response = await fetch("https://queue.simpleanalyticscdn.com/events", {
4447
method: "POST",
4548
headers: {
@@ -95,6 +98,7 @@ export async function trackPageview(options: TrackPageviewOptions) {
9598
}
9699

97100
if (isDoNotTrackEnabled(headers) && !options.collectDnt) {
101+
console.log("Do not track enabled, not tracking pageview");
98102
return;
99103
}
100104

@@ -105,9 +109,11 @@ export async function trackPageview(options: TrackPageviewOptions) {
105109
hostname,
106110
event: "pageview",
107111
path,
108-
ua: headers.get("user-agent") ?? "",
112+
...(parseHeaders(headers, {})),
109113
};
110114

115+
console.log("Tracking pageview", payload);
116+
111117
const response = await fetch("https://queue.simpleanalyticscdn.com/events", {
112118
method: "POST",
113119
headers: {

0 commit comments

Comments
 (0)