Skip to content

Commit 8f4075e

Browse files
committed
fix: add logging for file-descriptor debugging
1 parent abf8e7a commit 8f4075e

File tree

3 files changed

+397
-35
lines changed

3 files changed

+397
-35
lines changed

src/routes/api/uploadthing.ts

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,51 @@
11
import { createFileRoute } from '@tanstack/react-router'
22
import { createRouteHandler } from 'uploadthing/server'
3+
import { logUploadthingProbe } from '~/utils/prod-diagnostics.server'
34
import { uploadRouter } from '~/server/uploadthing'
45

56
const handlers = createRouteHandler({ router: uploadRouter })
67

8+
async function handleUploadthingRequest(
9+
method: 'GET' | 'POST',
10+
request: Request,
11+
): Promise<Response> {
12+
const url = new URL(request.url)
13+
const startedAt = Date.now()
14+
15+
logUploadthingProbe(method, 'start', {
16+
pathname: url.pathname,
17+
search: url.search,
18+
userAgent: request.headers.get('user-agent') ?? 'unknown',
19+
})
20+
21+
try {
22+
const response = await handlers(request)
23+
logUploadthingProbe(method, 'end', {
24+
pathname: url.pathname,
25+
status: response.status,
26+
durationMs: Date.now() - startedAt,
27+
})
28+
return response
29+
} catch (error) {
30+
const errorMessage = error instanceof Error ? error.message : String(error)
31+
const errorStack = error instanceof Error ? error.stack : undefined
32+
logUploadthingProbe(method, 'error', {
33+
pathname: url.pathname,
34+
durationMs: Date.now() - startedAt,
35+
errorMessage,
36+
errorStack,
37+
})
38+
throw error
39+
}
40+
}
41+
742
export const Route = createFileRoute('/api/uploadthing')({
843
server: {
944
handlers: {
10-
GET: async ({ request }: { request: Request }) => handlers(request),
11-
POST: async ({ request }: { request: Request }) => handlers(request),
45+
GET: async ({ request }: { request: Request }) =>
46+
handleUploadthingRequest('GET', request),
47+
POST: async ({ request }: { request: Request }) =>
48+
handleUploadthingRequest('POST', request),
1249
},
1350
},
1451
})

src/server.ts

Lines changed: 58 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,66 @@
11
import './instrument.server.mjs'
22

33
import handler, { createServerEntry } from '@tanstack/react-start/server-entry'
4+
import {
5+
installProductionFetchProbe,
6+
installProductionProcessProbe,
7+
logRequestEnd,
8+
logRequestError,
9+
logRequestStart,
10+
runWithRequestDiagnostics,
11+
} from '~/utils/prod-diagnostics.server'
12+
13+
installProductionFetchProbe()
14+
installProductionProcessProbe()
415

516
export default createServerEntry({
617
async fetch(request) {
7-
const url = new URL(request.url)
8-
9-
// Redirect to markdown version if AI/LLM requests text/markdown for doc pages
10-
const acceptHeader = request.headers.get('Accept') || ''
11-
if (
12-
acceptHeader.includes('text/markdown') &&
13-
url.pathname.includes('/docs/') &&
14-
!url.pathname.endsWith('.md')
15-
) {
16-
return new Response(null, {
17-
status: 303,
18-
headers: {
19-
Location: `${url.pathname}.md`,
20-
},
21-
})
22-
}
23-
24-
const response = await handler.fetch(request)
25-
26-
// Add COOP/COEP headers for /builder route (required for WebContainer)
27-
if (url.pathname === '/builder' || url.pathname.startsWith('/builder/')) {
28-
const newHeaders = new Headers(response.headers)
29-
newHeaders.set('Cross-Origin-Opener-Policy', 'same-origin')
30-
newHeaders.set('Cross-Origin-Embedder-Policy', 'require-corp')
31-
32-
return new Response(response.body, {
33-
status: response.status,
34-
statusText: response.statusText,
35-
headers: newHeaders,
36-
})
37-
}
38-
39-
return response
18+
return runWithRequestDiagnostics(request, async (context) => {
19+
const url = new URL(request.url)
20+
logRequestStart(context)
21+
22+
try {
23+
const acceptHeader = request.headers.get('Accept') || ''
24+
if (
25+
acceptHeader.includes('text/markdown') &&
26+
url.pathname.includes('/docs/') &&
27+
!url.pathname.endsWith('.md')
28+
) {
29+
logRequestEnd(context, 303, { redirectToMarkdown: true })
30+
return new Response(null, {
31+
status: 303,
32+
headers: {
33+
Location: `${url.pathname}.md`,
34+
},
35+
})
36+
}
37+
38+
const response = await handler.fetch(request)
39+
40+
if (
41+
url.pathname === '/builder' ||
42+
url.pathname.startsWith('/builder/')
43+
) {
44+
const newHeaders = new Headers(response.headers)
45+
newHeaders.set('Cross-Origin-Opener-Policy', 'same-origin')
46+
newHeaders.set('Cross-Origin-Embedder-Policy', 'require-corp')
47+
48+
logRequestEnd(context, response.status, {
49+
builderIsolatedHeaders: true,
50+
})
51+
return new Response(response.body, {
52+
status: response.status,
53+
statusText: response.statusText,
54+
headers: newHeaders,
55+
})
56+
}
57+
58+
logRequestEnd(context, response.status)
59+
return response
60+
} catch (error) {
61+
logRequestError(context, error)
62+
throw error
63+
}
64+
})
4065
},
4166
})

0 commit comments

Comments
 (0)