11import { createLogger } from '@sim/logger'
22import { getSessionCookie } from 'better-auth/cookies'
33import { type NextRequest , NextResponse } from 'next/server'
4+ import { isProfoundEnabled , sendToProfound } from './lib/analytics/profound'
45import { isAuthDisabled , isHosted } from './lib/core/config/feature-flags'
56import { generateRuntimeCSP } from './lib/core/security/csp'
67
@@ -144,47 +145,47 @@ export async function proxy(request: NextRequest) {
144145 const hasActiveSession = isAuthDisabled || ! ! sessionCookie
145146
146147 const redirect = handleRootPathRedirects ( request , hasActiveSession )
147- if ( redirect ) return redirect
148+ if ( redirect ) return track ( request , redirect )
148149
149150 if ( url . pathname === '/login' || url . pathname === '/signup' ) {
150151 if ( hasActiveSession ) {
151- return NextResponse . redirect ( new URL ( '/workspace' , request . url ) )
152+ return track ( request , NextResponse . redirect ( new URL ( '/workspace' , request . url ) ) )
152153 }
153154 const response = NextResponse . next ( )
154155 response . headers . set ( 'Content-Security-Policy' , generateRuntimeCSP ( ) )
155- return response
156+ return track ( request , response )
156157 }
157158
158159 // Chat pages are publicly accessible embeds — CSP is set in next.config.ts headers
159160 if ( url . pathname . startsWith ( '/chat/' ) ) {
160- return NextResponse . next ( )
161+ return track ( request , NextResponse . next ( ) )
161162 }
162163
163164 // Allow public access to template pages for SEO
164165 if ( url . pathname . startsWith ( '/templates' ) ) {
165- return NextResponse . next ( )
166+ return track ( request , NextResponse . next ( ) )
166167 }
167168
168169 if ( url . pathname . startsWith ( '/workspace' ) ) {
169170 // Allow public access to workspace template pages - they handle their own redirects
170171 if ( url . pathname . match ( / ^ \/ w o r k s p a c e \/ [ ^ / ] + \/ t e m p l a t e s / ) ) {
171- return NextResponse . next ( )
172+ return track ( request , NextResponse . next ( ) )
172173 }
173174
174175 if ( ! hasActiveSession ) {
175- return NextResponse . redirect ( new URL ( '/login' , request . url ) )
176+ return track ( request , NextResponse . redirect ( new URL ( '/login' , request . url ) ) )
176177 }
177- return NextResponse . next ( )
178+ return track ( request , NextResponse . next ( ) )
178179 }
179180
180181 const invitationRedirect = handleInvitationRedirects ( request , hasActiveSession )
181- if ( invitationRedirect ) return invitationRedirect
182+ if ( invitationRedirect ) return track ( request , invitationRedirect )
182183
183184 const workspaceInvitationRedirect = handleWorkspaceInvitationAPI ( request , hasActiveSession )
184- if ( workspaceInvitationRedirect ) return workspaceInvitationRedirect
185+ if ( workspaceInvitationRedirect ) return track ( request , workspaceInvitationRedirect )
185186
186187 const securityBlock = handleSecurityFiltering ( request )
187- if ( securityBlock ) return securityBlock
188+ if ( securityBlock ) return track ( request , securityBlock )
188189
189190 const response = NextResponse . next ( )
190191 response . headers . set ( 'Vary' , 'User-Agent' )
@@ -193,6 +194,16 @@ export async function proxy(request: NextRequest) {
193194 response . headers . set ( 'Content-Security-Policy' , generateRuntimeCSP ( ) )
194195 }
195196
197+ return track ( request , response )
198+ }
199+
200+ /**
201+ * Sends request data to Profound analytics (fire-and-forget) and returns the response.
202+ */
203+ function track ( request : NextRequest , response : NextResponse ) : NextResponse {
204+ if ( isProfoundEnabled ( ) ) {
205+ sendToProfound ( request , response . status )
206+ }
196207 return response
197208}
198209
0 commit comments