Tengo una API Express que tiene alguna funcionalidad de descarga, implementada al canalizar una transmisión desde una llamada de fetch a res . Quiero registrar la cantidad de datos descargados, para poder rastrear los datos utilizados por cuenta. Mi implementación actual es:
let bytesSent = 0 res.set({ 'content-length': contentLength, 'content-type': contentType, 'content-disposition': `attachment;filename="${filename}"`, }) download.body.pipe(res) download.body.on('data', (chunk) => { bytesSent += chunk.byteLength }) download.body.on('error', next) res.on('close', async () => { // Store bytesSent })El problema con esto es (creo) que está rastreando los datos descargados de la fuente y no tiene en cuenta las restricciones de ancho de banda del cliente. Por ejemplo, si descargo un archivo de 180 MB pero cancelo la descarga en el cliente de 20 MB, todavía registra 100-180 MB.
¿Cómo puedo rastrear la cantidad de datos realmente descargados por el cliente, en lugar de los descargados/almacenados en búfer por la llamada de búsqueda?
Puede intentar "decorar" la función res.write en sí misma y registrar los bytes que pasan por allí. Algo como:
const origResWrite = res.write.bind(res); res.write = (chunk, encoding, callback) => { // Store byteLength of chunk somewhere - here we just log it console.log("Writing bytes of size", Buffer.byteLength(chunk)); origResWrite(chunk, encoding, callback); } download.body.pipe(res);