feat: improved analytics
This commit is contained in:
@@ -25,6 +25,12 @@ export class UmamiAnalyticsService implements AnalyticsService {
|
||||
private websiteId?: string;
|
||||
private endpoint: string;
|
||||
private logger: LoggerService;
|
||||
private serverContext?: {
|
||||
userAgent?: string;
|
||||
language?: string;
|
||||
referrer?: string;
|
||||
ip?: string;
|
||||
};
|
||||
|
||||
constructor(
|
||||
private readonly options: UmamiAnalyticsServiceOptions,
|
||||
@@ -43,6 +49,19 @@ export class UmamiAnalyticsService implements AnalyticsService {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the server-side context for the current request.
|
||||
* This allows the service to use real request headers for tracking.
|
||||
*/
|
||||
setServerContext(context: {
|
||||
userAgent?: string;
|
||||
language?: string;
|
||||
referrer?: string;
|
||||
ip?: string;
|
||||
}) {
|
||||
this.serverContext = context;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method to send the payload to Umami API.
|
||||
*/
|
||||
@@ -63,8 +82,8 @@ export class UmamiAnalyticsService implements AnalyticsService {
|
||||
website: this.websiteId,
|
||||
hostname: isClient ? window.location.hostname : 'server',
|
||||
screen: isClient ? `${window.screen.width}x${window.screen.height}` : undefined,
|
||||
language: isClient ? navigator.language : undefined,
|
||||
referrer: isClient ? document.referrer : undefined,
|
||||
language: isClient ? navigator.language : this.serverContext?.language,
|
||||
referrer: isClient ? document.referrer : this.serverContext?.referrer,
|
||||
...data,
|
||||
};
|
||||
|
||||
@@ -74,13 +93,28 @@ export class UmamiAnalyticsService implements AnalyticsService {
|
||||
const controller = new AbortController();
|
||||
const timeoutId = setTimeout(() => controller.abort(), 10000); // 10s timeout
|
||||
|
||||
const headers: Record<string, string> = {
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
|
||||
// Set User-Agent
|
||||
if (isClient) {
|
||||
headers['User-Agent'] = navigator.userAgent;
|
||||
} else if (this.serverContext?.userAgent) {
|
||||
headers['User-Agent'] = this.serverContext.userAgent;
|
||||
} else {
|
||||
headers['User-Agent'] = 'KLZ-Server-Proxy';
|
||||
}
|
||||
|
||||
// Forward client IP if available (Umami must be configured to trust this)
|
||||
if (this.serverContext?.ip) {
|
||||
headers['X-Forwarded-For'] = this.serverContext.ip;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(`${this.endpoint}/api/send`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'User-Agent': isClient ? navigator.userAgent : 'KLZ-Server',
|
||||
},
|
||||
headers,
|
||||
body: JSON.stringify({ type, payload }),
|
||||
keepalive: true,
|
||||
signal: controller.signal,
|
||||
|
||||
Reference in New Issue
Block a user