( userFile: UserFile, requestId: string )
| 307 | * raw text; binary files yield a short placeholder rather than corrupt bytes. |
| 308 | */ |
| 309 | const extractUserFileTextContent = async ( |
| 310 | userFile: UserFile, |
| 311 | requestId: string |
| 312 | ): Promise<string> => { |
| 313 | const { buffer } = await downloadServableFileFromStorage(userFile, requestId, logger, { |
| 314 | maxBytes: MAX_GET_CONTENT_FILE_BYTES, |
| 315 | }) |
| 316 | |
| 317 | const extension = getFileExtension(userFile.name) |
| 318 | if (extension && isSupportedFileType(extension)) { |
| 319 | try { |
| 320 | const result = await parseBuffer(buffer, extension) |
| 321 | return result.content ?? '' |
| 322 | } catch (error) { |
| 323 | logger.warn('Falling back to raw text after parser failure', { |
| 324 | name: userFile.name, |
| 325 | error: getErrorMessage(error, 'Unknown error'), |
| 326 | }) |
| 327 | } |
| 328 | } |
| 329 | |
| 330 | if (isLikelyTextBuffer(buffer)) { |
| 331 | return buffer.toString('utf-8') |
| 332 | } |
| 333 | |
| 334 | return `[Binary file: ${userFile.name} (${userFile.type || 'application/octet-stream'}, ${buffer.length} bytes). Cannot extract text content.]` |
| 335 | } |
| 336 | |
| 337 | export const POST = withRouteHandler(async (request: NextRequest) => { |
| 338 | const auth = await checkInternalAuth(request, { requireWorkflowId: false }) |
no test coverage detected