import { Job, HourJob } from '../models/job'; import { getDataForHour } from './userDataProvider'; import { saveFile } from './fileWriters'; import { uploadFile } from './uploadProviders'; import { Config } from '../types/config'; import { getLogger } from './logger'; import { maskSensitiveData } from './dataMasking'; export async function processAndUploadFile(job: Job, hourJob: HourJob, config: Config) { const logger = getLogger(); logger.info(`Processing file for ${job.date} ${hourJob.hour_range}`); try { // Get data for the hour (now with memory protection) const rawData = await getDataForHour(job.date, hourJob.hour_range); const dataCount = Array.isArray(rawData) ? rawData.length : 0; logger.debug(`Retrieved ${dataCount} records for ${hourJob.hour_range}`); // Memory usage monitoring const memUsage = process.memoryUsage(); const memUsedMB = Math.round(memUsage.heapUsed / 1024 / 1024); logger.info(`💾 Memory usage: ${memUsedMB}MB (processing ${dataCount} logs)`); // Apply sensitive data masking if enabled const data = config.dataMasking?.enabled ? maskSensitiveData(rawData, config.dataMasking) : rawData; // Memory protection: Check if data is too large if (dataCount > 1000) { logger.warn(`⚠️ Large dataset detected (${dataCount} logs). Consider implementing chunking for better performance.`); } // Save file locally first const filePath = await saveFile(job, hourJob, data, config.fileFormat || 'json', config); logger.debug(`File saved locally: ${filePath}`); // Upload to configured provider const uploadedPath = await uploadFile(filePath, config.uploadProvider, job, hourJob, config); logger.info(`File uploaded successfully: ${uploadedPath}`); // Update hour job with the uploaded path hourJob.file_path = uploadedPath; // Final memory check const finalMemUsage = process.memoryUsage(); const finalMemUsedMB = Math.round(finalMemUsage.heapUsed / 1024 / 1024); logger.info(`💾 Final memory usage: ${finalMemUsedMB}MB (processed ${dataCount} logs)`); return uploadedPath; } catch (error) { logger.error(`Error processing file for ${job.date} ${hourJob.hour_range}`, { error }); // Log memory usage on error for debugging const memUsage = process.memoryUsage(); const memUsedMB = Math.round(memUsage.heapUsed / 1024 / 1024); logger.error(`💾 Memory usage at error: ${memUsedMB}MB`); throw error; } }