Skip to content

Instantly share code, notes, and snippets.

@engina
Created August 10, 2016 19:01
Show Gist options
  • Save engina/512943f4968205e696b80876b68c9147 to your computer and use it in GitHub Desktop.
Save engina/512943f4968205e696b80876b68c9147 to your computer and use it in GitHub Desktop.
const RateLimiter = require('limiter').RateLimiter;
var limiters = {};
function getLimiter(accessToken) {
let limiter = limiters[accessToken] = limiters[accessToken] || new RateLimiter(10, 'second');
return limiter;
}
function download(accessToken, src, dst) {
return new Promise((resolve, reject) => {
getLimiter(accessToken).removeTokens(1, function() {
let dl = https.request({
method: 'POST',
hostname: 'content.dropboxapi.com',
port: 443,
path: '/2/files/download',
agent: myAgent,
headers: {
'Authorization' : 'Bearer ' + accessToken,
'Dropbox-API-Arg': JSON.stringify({path: src})
}
}, function(resp) {
if (resp.statusCode !== 200) {
log.info('ERROR: Download failed for ', resp.statusCode, src, dst, resp.headers);
return reject(new Error('Dropbox return bad HTTP code for download', resp.statusCode));
}
let parent = path.dirname(dst);
fse.mkdirp(parent, function(err) {
if (err) {
log.error('Could not create directory', parent, err);
return reject('Could not create directory');
}
let dstStrm = fs.createWriteStream(dst);
resp.pipe(dstStrm);
resp.on('error', e => {
reject(new Error('Download read stream error', e));
});
resp.on('end', () => {
dstStrm.destroy();
log.info('dl complete', dstStrm.bytesWritten, resp.headers['content-length']);
resolve(resp);
});
});
});
dl.end();
});
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment