@nuxthub/core
Version:
Build full-stack Nuxt applications on Cloudflare, with zero configuration.
56 lines (55 loc) • 1.68 kB
JavaScript
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 }
});
}
};
}