UNPKG

@nuxthub/core

Version:

Build full-stack Nuxt applications on Cloudflare, with zero configuration.

56 lines (55 loc) 1.68 kB
import { ofetch } from "ofetch"; import { joinURL } from "ufo"; import { createError } from "h3"; import { requireNuxtHubFeature } from "../../../utils/features.js"; import { getCloudflareAccessHeaders } from "../../../utils/cloudflareAccess.js"; import { useRuntimeConfig } from "#imports"; const _datasets = {}; function getAnalyticsBinding(name = "ANALYTICS") { return process.env[name] || globalThis.__env__?.[name] || globalThis[name]; } function _useDataset(name = "ANALYTICS") { if (_datasets[name]) { return _datasets[name]; } const binding = getAnalyticsBinding(); if (binding) { _datasets[name] = binding; return _datasets[name]; } throw createError(`Missing Cloudflare ${name} binding (Analytics Engine)`); } export function hubAnalytics() { requireNuxtHubFeature("analytics"); const hub = useRuntimeConfig().hub; const binding = getAnalyticsBinding(); if (hub.remote && hub.projectUrl && !binding) { const cfAccessHeaders = getCloudflareAccessHeaders(hub.cloudflareAccess); return proxyHubAnalytics(hub.projectUrl, hub.projectSecretKey || hub.userToken, cfAccessHeaders); } const dataset = _useDataset(); return { put(data) { dataset.writeDataPoint(data); return true; } }; } export function proxyHubAnalytics(projectUrl, secretKey, headers) { requireNuxtHubFeature("analytics"); const analyticsAPI = ofetch.create({ baseURL: joinURL(projectUrl, "/api/_hub/analytics"), headers: { Authorization: `Bearer ${secretKey}`, ...headers } }); return { async put(data) { return analyticsAPI("/", { method: "PUT", body: { data } }); } }; }