Tengo un problema extraño. Recientemente cambié de XHR a buscar en un intento de implementar la transmisión de contenido descargado directamente en el sistema de archivos. Noté una ralentización considerable entre escribir una respuesta.blob para transmitir y canalizar la respuesta.cuerpo directamente a ella. Aquí hay una primera versión, que es rápida:
exports.httpDownloadImpl = url => headers => body => writableStream => left => right => { return async function () { try { const response = await fetch(url, { method: 'POST', headers, body }); const blob = await response.blob(); await writableStream.write(blob); await writableStream.close(); return right({}); } catch(err) { return left(err.message); } } }Esto se completa en unos pocos segundos para un archivo de 11 MB. La última versión tarda hasta 3 minutos en completarse:
exports.httpDownloadImpl = url => headers => body => writableStream => left => right => { return async function () { try { const response = await fetch(url, { method: 'POST', headers, body }); await response.body.pipeTo(writableStream, { preventAbort: true, preventCancel: true, preventClose: true }); await writableStream.close(); return right({}); } catch(err) { return left(err.message); } } }Sospecho que la última versión puede ser más lenta, ya que estamos interactuando con un sistema de archivos muchas veces en lugar de mantener la respuesta en la RAM, pero no tan lenta. ¿Tienes alguna idea de qué puede causar esto?
Editar: también noté en devtools que a veces funciona bien, canaliza el archivo hasta completarlo, a veces la solicitud se "cuelga" después de un segundo (es decir, el tamaño de la carga útil y el tiempo de respuesta no aumentan) a veces después de unos segundos ... Es bastante no determinista en realidad. Y cuando cierro Chrome mientras tanto, los registros del servidor muestran que el cliente cerró la conexión, por lo que la conexión está realmente abierta, solo se cuelga durante unos minutos y luego, de repente, informa que se completó.