(buffer: Buffer)
| 43 | } |
| 44 | |
| 45 | async parseBuffer(buffer: Buffer): Promise<FileParseResult> { |
| 46 | try { |
| 47 | const bufferSize = buffer.length |
| 48 | logger.info( |
| 49 | `Parsing XLSX buffer, size: ${bufferSize} bytes (${(bufferSize / 1024 / 1024).toFixed(2)} MB)` |
| 50 | ) |
| 51 | |
| 52 | if (!buffer || buffer.length === 0) { |
| 53 | throw new Error('Empty buffer provided') |
| 54 | } |
| 55 | |
| 56 | assertOoxmlArchiveWithinLimits(buffer) |
| 57 | |
| 58 | const workbook = XLSX.read(buffer, { |
| 59 | type: 'buffer', |
| 60 | dense: true, // Use dense mode for better memory efficiency |
| 61 | sheetStubs: false, // Don't create stub cells |
| 62 | }) |
| 63 | |
| 64 | return this.processWorkbook(workbook) |
| 65 | } catch (error) { |
| 66 | logger.error('XLSX buffer parsing error:', error) |
| 67 | throw new Error(`Failed to parse XLSX buffer: ${(error as Error).message}`) |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | private processWorkbook(workbook: XLSX.WorkBook): FileParseResult { |
| 72 | const sheetNames = workbook.SheetNames |
no test coverage detected