+13
src/cache.ts
+13
src/cache.ts
···
1836
}
1837
1838
/**
1839
+
* Gets total count of unique user agents
1840
+
* @returns Total count of unique user agents
1841
+
*/
1842
+
async getUserAgentCount(): Promise<number> {
1843
+
const result = this.db
1844
+
.query(
1845
+
`SELECT COUNT(*) as count FROM user_agent_stats WHERE user_agent IS NOT NULL`,
1846
+
)
1847
+
.get() as { count: number };
1848
+
return result?.count || 0;
1849
+
}
1850
+
1851
+
/**
1852
* Gets referer stats from cumulative stats table
1853
* @returns Referer host data sorted by hits
1854
*/
+8
-8
src/dashboard.html
+8
-8
src/dashboard.html
···
736
}
737
738
const stats = await statsRes.json();
739
-
const userAgents = await uaRes.json();
740
const referers = await refRes.json();
741
742
// Update stats cards
743
document.getElementById('totalRequests').textContent = formatNumber(stats.totalRequests || 0);
744
document.getElementById('avgResponseTime').textContent = formatMs(stats.averageResponseTime);
745
document.getElementById('uptime').textContent = stats.uptime ? `${stats.uptime.toFixed(1)}%` : '-';
746
-
document.getElementById('uniqueAgents').textContent = formatNumber(userAgents.length || 0);
747
748
// Update chart
749
currentTrafficData = trafficData;
750
initChart(trafficData);
751
752
// Update user agents and referers
753
-
allUserAgents = userAgents;
754
-
renderTrafficSources(userAgents, referers);
755
updateLastUpdated();
756
757
} catch (e) {
···
894
return;
895
}
896
const stats = await statsRes.json();
897
-
const userAgents = await uaRes.json();
898
const referers = await refRes.json();
899
900
document.getElementById('totalRequests').textContent = formatNumber(stats.totalRequests || 0);
901
document.getElementById('avgResponseTime').textContent = formatMs(stats.averageResponseTime);
902
document.getElementById('uptime').textContent = stats.uptime ? `${stats.uptime.toFixed(1)}%` : '-';
903
-
document.getElementById('uniqueAgents').textContent = formatNumber(userAgents.length || 0);
904
905
currentTrafficData = trafficData;
906
initChart(trafficData);
907
-
allUserAgents = userAgents;
908
-
renderTrafficSources(userAgents, referers);
909
updateLastUpdated();
910
showLoading(false);
911
});
···
736
}
737
738
const stats = await statsRes.json();
739
+
const uaData = await uaRes.json();
740
const referers = await refRes.json();
741
742
// Update stats cards
743
document.getElementById('totalRequests').textContent = formatNumber(stats.totalRequests || 0);
744
document.getElementById('avgResponseTime').textContent = formatMs(stats.averageResponseTime);
745
document.getElementById('uptime').textContent = stats.uptime ? `${stats.uptime.toFixed(1)}%` : '-';
746
+
document.getElementById('uniqueAgents').textContent = formatNumber(uaData.totalCount || 0);
747
748
// Update chart
749
currentTrafficData = trafficData;
750
initChart(trafficData);
751
752
// Update user agents and referers
753
+
allUserAgents = uaData.userAgents;
754
+
renderTrafficSources(uaData.userAgents, referers);
755
updateLastUpdated();
756
757
} catch (e) {
···
894
return;
895
}
896
const stats = await statsRes.json();
897
+
const uaData = await uaRes.json();
898
const referers = await refRes.json();
899
900
document.getElementById('totalRequests').textContent = formatNumber(stats.totalRequests || 0);
901
document.getElementById('avgResponseTime').textContent = formatMs(stats.averageResponseTime);
902
document.getElementById('uptime').textContent = stats.uptime ? `${stats.uptime.toFixed(1)}%` : '-';
903
+
document.getElementById('uniqueAgents').textContent = formatNumber(uaData.totalCount || 0);
904
905
currentTrafficData = trafficData;
906
initChart(trafficData);
907
+
allUserAgents = uaData.userAgents;
908
+
renderTrafficSources(uaData.userAgents, referers);
909
updateLastUpdated();
910
showLoading(false);
911
});
+5
-2
src/handlers/index.ts
+5
-2
src/handlers/index.ts
···
309
_request,
310
recordAnalytics,
311
) => {
312
+
const [userAgents, totalCount] = await Promise.all([
313
+
cache.getUserAgents(),
314
+
cache.getUserAgentCount(),
315
+
]);
316
await recordAnalytics(200);
317
+
return Response.json({ userAgents, totalCount });
318
};
319
320
export const handleGetReferers: RouteHandlerWithAnalytics = async (
+13
-7
src/routes/api-routes.ts
+13
-7
src/routes/api-routes.ts
···
418
{
419
summary: "Get user agents statistics",
420
description:
421
-
"Cumulative list of user agents accessing the service with hit counts",
422
tags: ["Analytics"],
423
responses: Object.fromEntries([
424
apiResponse(200, "User agents data retrieved successfully", {
425
-
type: "array",
426
-
items: {
427
-
type: "object",
428
-
properties: {
429
-
userAgent: { type: "string", example: "Mozilla/5.0..." },
430
-
hits: { type: "number", example: 123 },
431
},
432
},
433
}),
434
]),
···
418
{
419
summary: "Get user agents statistics",
420
description:
421
+
"Cumulative list of user agents accessing the service with hit counts (top 50) and total unique count",
422
tags: ["Analytics"],
423
responses: Object.fromEntries([
424
apiResponse(200, "User agents data retrieved successfully", {
425
+
type: "object",
426
+
properties: {
427
+
userAgents: {
428
+
type: "array",
429
+
items: {
430
+
type: "object",
431
+
properties: {
432
+
userAgent: { type: "string", example: "Mozilla/5.0..." },
433
+
hits: { type: "number", example: 123 },
434
+
},
435
+
},
436
},
437
+
totalCount: { type: "number", example: 150 },
438
},
439
}),
440
]),