Three files. Bindings first, then mount the handler, then drop in the tracker and the dashboard.
1 Bind the stores
// wrangler.jsonc
"analytics_engine_datasets": [
{ "binding": "ANALYTICS", "dataset": "my_events" }
],
"r2_buckets": [
{ "binding": "RECORDINGS", "bucket_name": "my-recordings" }
]
// secrets: CF_ACCOUNT_ID, CF_ANALYTICS_TOKEN, LAKE_KEY
2 Mount the lake
import { createLake, keyAuth } from '@qemuguest/lake';
export default {
async fetch(req, env) {
const lake = createLake({
authorize: keyAuth(env.LAKE_KEY),
analytics: env.ANALYTICS,
recordings: env.RECORDINGS,
ae: {
accountId: env.CF_ACCOUNT_ID,
apiToken: env.CF_ANALYTICS_TOKEN,
dataset: 'my_events',
},
});
return (await lake.fetch(req)) ?? app(req, env);
},
};
3 Track and look
import { createTracker } from '@qemuguest/lake/client';
const lake = createTracker({ endpoint: '/lake' });
lake.track('page_view');
lake.startHeartbeat();
lake.startRecorder();
import {
LakeDashboard, sqlDashboard,
registerBuiltinDataSources, registerBuiltinTransforms,
} from '@qemuguest/lake/dashboard';
registerBuiltinDataSources({
baseUrl: '/lake',
headers: { Authorization: `Bearer ${key}` },
});
registerBuiltinTransforms();
<LakeDashboard dashboard={sqlDashboard} />