import type { NextApiResponse } from 'next' import type { ProxyUploadResponse } from './types' export function handleProxyResponse(params: { res: NextApiResponse; response: ProxyUploadResponse; targetEndpoint: string }): void { if (params.response.statusCode < 200 || params.response.statusCode >= 300) { respondNonOk({ res: params.res, response: params.response, targetEndpoint: params.targetEndpoint }) return } if (isHtmlResponse(params.response.body)) { respondHtml({ res: params.res, response: params.response, targetEndpoint: params.targetEndpoint }) return } const parseResult = parseJsonSafe(params.response.body) if (!parseResult.ok) { console.error('NIP-95 proxy JSON parse error:', { targetEndpoint: params.targetEndpoint, bodyPreview: params.response.body.substring(0, 100) }) params.res.status(500).json({ error: 'Invalid upload response: Invalid JSON response. The endpoint may not be a valid NIP-95 upload endpoint.' }) return } params.res.status(200).json(parseResult.value) } function respondNonOk(params: { res: NextApiResponse; response: ProxyUploadResponse; targetEndpoint: string }): void { const errorText = params.response.body.substring(0, 200) console.error('NIP-95 proxy response error:', { targetEndpoint: params.targetEndpoint, finalUrl: params.response.finalUrl, status: params.response.statusCode, statusText: params.response.statusMessage, errorText, }) params.res.status(params.response.statusCode).json({ error: buildUserFriendlyHttpError(params.response.statusCode, params.response.statusMessage, errorText) }) } function buildUserFriendlyHttpError(statusCode: number, statusMessage: string, errorText: string): string { if (statusCode === 401) { return 'Authentication required. This endpoint requires authorization headers.' } if (statusCode === 403) { return 'Access forbidden. This endpoint may require authentication or have restrictions.' } if (statusCode === 405) { return 'Method not allowed. This endpoint may not support POST requests or the URL may be incorrect.' } if (statusCode === 413) { return 'File too large. The file exceeds the maximum size allowed by this endpoint.' } if (statusCode >= 500) { return `Server error (${statusCode}). The endpoint server encountered an error.` } return errorText || `Upload failed: ${statusCode} ${statusMessage}` } export function isHtmlResponse(body: string): boolean { const trimmedBody = body.trim() return trimmedBody.startsWith(']*>([^<]+)<\/title>/i)?.[1] } function readHtmlH1(body: string): string | undefined { return body.match(/