var fs = require('fs') var Promise = require('bluebird') var request = require('request') var progress = require('request-progress') var temp = require('temp') module.exports = function download(url, options) { var resolver = Promise.defer() var path = temp.path(options) function errorListener(err) { resolver.reject(err) } function progressListener(state) { if (state.total !== null) { resolver.progress({ lengthComputable: true , loaded: state.received , total: state.total }) } else { resolver.progress({ lengthComputable: false , loaded: state.received , total: state.received }) } } function closeListener() { resolver.resolve({ path: path }) } resolver.progress({ percent: 0 }) try { var req = progress(request(url), { throttle: 100 // Throttle events, not upload speed }) .on('progress', progressListener) resolver.promise.finally(function() { req.removeListener('progress', progressListener) }) var save = req.pipe(fs.createWriteStream(path)) .on('error', errorListener) .on('close', closeListener) resolver.promise.finally(function() { save.removeListener('error', errorListener) save.removeListener('close', closeListener) }) } catch (err) { resolver.reject(err) } return resolver.promise }