Skip to content

Commit 5d0f321

Browse files
committed
chore(analytics): server composable (WIP)
1 parent c2850a0 commit 5d0f321

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { AnalyticsEngineDataPoint } from '@cloudflare/workers-types/experimental'
2+
3+
export default eventHandler(async (event) => {
4+
const { data } = await readValidatedBody(event, z.object({
5+
data: z.custom<AnalyticsEngineDataPoint>()
6+
}).parse)
7+
8+
await useAnalytics().put(data)
9+
10+
return true
11+
})

server/utils/analytics.ts

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import type { AnalyticsEngineDataPoint, AnalyticsEngineDataset } from '@cloudflare/workers-types/experimental'
2+
import { ofetch } from 'ofetch'
3+
import { joinURL } from 'ufo'
4+
5+
const _datasets: Record<string, AnalyticsEngineDataset> = {}
6+
7+
function _useDataset() {
8+
const name = 'ANALYTICS'
9+
if (_datasets[name]) {
10+
return _datasets[name]
11+
}
12+
13+
// @ts-ignore
14+
const binding = process.env[name] || globalThis.__env__?.[name] || globalThis[name]
15+
if (binding) {
16+
_datasets[name] = binding as AnalyticsEngineDataset
17+
return _datasets[name]
18+
}
19+
throw createError(`Missing Cloudflare ${name} binding (Analytics Engine)`)
20+
}
21+
22+
export function useAnalytics() {
23+
if (import.meta.dev && process.env.NUXT_HUB_URL) {
24+
return useProxyAnalytics(process.env.NUXT_HUB_URL, process.env.NUXT_HUB_SECRET_KEY)
25+
}
26+
const dataset = _useDataset()
27+
28+
return {
29+
put(data: AnalyticsEngineDataPoint) {
30+
dataset.writeDataPoint(data)
31+
return true
32+
}
33+
}
34+
}
35+
36+
export function useProxyAnalytics(projectUrl: string, secretKey?: string) {
37+
const analyticsAPI = ofetch.create({
38+
baseURL: joinURL(projectUrl, '/api/_hub/analytics'),
39+
headers: {
40+
Authorization: `Bearer ${secretKey}`
41+
}
42+
})
43+
44+
return {
45+
async put(data: AnalyticsEngineDataPoint) {
46+
return analyticsAPI<boolean>('/', {
47+
method: 'PUT',
48+
body: { data }
49+
})
50+
}
51+
}
52+
}

0 commit comments

Comments
 (0)