async function downloadAllDocuments(extractionId, documents, maxConcurrency = 5) {
const results = [];
const errors = [];
// Función para procesar documentos en lotes
async function processBatch(batch) {
const promises = batch.map(async (doc) => {
try {
// Descargar ambos formatos si están disponibles
const downloads = [];
for (const format of doc.availableFormats) {
const result = await downloadDocument(extractionId, doc.id, format);
downloads.push(result);
}
return { documentId: doc.id, downloads, success: true };
} catch (error) {
console.error(`Error descargando ${doc.id}:`, error.message);
errors.push({ documentId: doc.id, error: error.message });
return { documentId: doc.id, success: false, error: error.message };
}
});
return await Promise.all(promises);
}
// Procesar documentos en lotes para controlar concurrencia
for (let i = 0; i < documents.length; i += maxConcurrency) {
const batch = documents.slice(i, i + maxConcurrency);
console.log(`Procesando lote ${Math.floor(i / maxConcurrency) + 1}/${Math.ceil(documents.length / maxConcurrency)}`);
const batchResults = await processBatch(batch);
results.push(...batchResults);
// Pequeña pausa entre lotes para no sobrecargar el servidor
if (i + maxConcurrency < documents.length) {
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
console.log(`\n✅ Descarga completada:`);
console.log(` Exitosos: ${results.filter(r => r.success).length}`);
console.log(` Fallidos: ${errors.length}`);
return { results, errors };
}
// Uso con documentos de una extracción completada
const extractionStatus = await getExtractionStatus('JOB20250104123456789A');
if (extractionStatus.status === 'COMPLETED') {
const downloadResults = await downloadAllDocuments(
extractionStatus.publicId,
extractionStatus.documents,
3 // máximo 3 descargas simultáneas
);
console.log(`Documentos descargados: ${downloadResults.results.length}`);
}