From c8b7ea81336c9e8d3e394e67a1ae5036f417a150 Mon Sep 17 00:00:00 2001 From: Tobias Lins Date: Tue, 8 Aug 2023 13:11:52 +0200 Subject: [PATCH] Improved server side events (#92) * Add more error logs * rename to withSessionContext * Throw error when no headers are found * update version * Update packages/web/src/server/index.ts Co-authored-by: Chris <7249920+chriswdmr@users.noreply.github.com> * Update packages/web/src/server/index.ts Co-authored-by: Chris <7249920+chriswdmr@users.noreply.github.com> --------- Co-authored-by: Chris <7249920+chriswdmr@users.noreply.github.com> --- apps/nextjs/app/api/edge/route.ts | 5 ++--- apps/nextjs/app/api/serverless/route.ts | 5 ++--- packages/web/package.json | 2 +- packages/web/src/server/index.ts | 21 +++++++++++++++++---- packages/web/src/server/request-context.ts | 2 +- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/apps/nextjs/app/api/edge/route.ts b/apps/nextjs/app/api/edge/route.ts index 45ed8d8..3c2ef21 100644 --- a/apps/nextjs/app/api/edge/route.ts +++ b/apps/nextjs/app/api/edge/route.ts @@ -1,5 +1,4 @@ -import { track } from '@vercel/analytics/server'; -import { withRequestContext } from '@vercel/analytics/server'; +import { withSessionContext, track } from '@vercel/analytics/server'; export const runtime = 'edge'; @@ -12,4 +11,4 @@ async function handler() { return new Response('OK'); } -export const GET = withRequestContext(handler); +export const GET = withSessionContext(handler); diff --git a/apps/nextjs/app/api/serverless/route.ts b/apps/nextjs/app/api/serverless/route.ts index 16a520b..9014bb1 100644 --- a/apps/nextjs/app/api/serverless/route.ts +++ b/apps/nextjs/app/api/serverless/route.ts @@ -1,5 +1,4 @@ -import { withRequestContext, track } from '@vercel/analytics/server'; -import { NextRequest } from 'next/server'; +import { withSessionContext, track } from '@vercel/analytics/server'; async function handler() { await track('Serverless Event', { @@ -9,4 +8,4 @@ async function handler() { return new Response('OK'); } -export const GET = withRequestContext(handler); +export const GET = withSessionContext(handler); diff --git a/packages/web/package.json b/packages/web/package.json index f894502..a8bd700 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@vercel/analytics", - "version": "1.1.0-beta.2", + "version": "1.1.0-beta.3", "description": "Gain real-time traffic insights with Vercel Web Analytics", "keywords": [ "analytics", diff --git a/packages/web/src/server/index.ts b/packages/web/src/server/index.ts index 84d0e98..6f09f97 100644 --- a/packages/web/src/server/index.ts +++ b/packages/web/src/server/index.ts @@ -3,7 +3,7 @@ import type { AllowedPropertyValues } from '../types'; import type { StorageData } from './request-context'; -export { withRequestContext } from './request-context'; +export { withSessionContext } from './request-context'; const ENDPOINT = process.env.VERCEL_URL || process.env.VERCEL_ANALYTICS_URL; const ENV = process.env.NODE_ENV; @@ -80,10 +80,22 @@ export async function track( const hasHeaders = Boolean(headers); - // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + if (!hasHeaders) { + throw new Error( + 'No session context found. Wrap your API route handler with `withSessionContext` or pass `request` or `headers` to the `track` function.', + ); + } + + if (!ENDPOINT) { + throw new Error( + '`process.env.VERCEL_URL` is not defined in your environment variables.', + ); + } + const promise = fetch(`https://${ENDPOINT}/_vercel/insights/event`, { headers: { 'content-type': 'application/json', + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- The throwing is temporary until we add support for non Vercel hosted environments ...(hasHeaders ? { 'user-agent': tmp['user-agent'] as string, @@ -97,9 +109,10 @@ export async function track( body: JSON.stringify(body), method: 'POST', }).catch((err: unknown) => { - if (!(err instanceof Error)) return; - if ('response' in err) { + if (err instanceof Error && 'response' in err) { console.error(err.response); + } else { + console.error(err); } }); diff --git a/packages/web/src/server/request-context.ts b/packages/web/src/server/request-context.ts index b7ebbf9..cf61079 100644 --- a/packages/web/src/server/request-context.ts +++ b/packages/web/src/server/request-context.ts @@ -4,7 +4,7 @@ export interface StorageData { request: Request; } -export const withRequestContext = +export const withSessionContext = (next: (req: any, res: any) => Promise) => async (request: T, secondParam: Response): Promise => { const asyncLocalStorage = new AsyncLocalStorage();