J'ai écrit une fonction assez simple qui télécharge une image à partir d'une URL donnée, la redimensionne et l'upload sur S3 (en utilisant 'gm' et 'knox'), je n'ai aucune idée si je fais la lecture d'un stream vers un buffer correctement. (tout fonctionne, mais est-ce que c'est la bonne façon de faire ?)
De plus, j'aimerais comprendre quelque chose à propos de la boucle événementielle, comment puis-je savoir qu'une invocation de la fonction ne fuira rien ou ne changera pas la variable 'buf' pour une autre invocation déjà en cours (ou bien ce scénario est impossible parce que les callbacks sont des fonctions anonymes ?)
var http = require('http');
var https = require('https');
var s3 = require('./s3');
var gm = require('gm');
module.exports.processImageUrl = function(imageUrl, filename, callback) {
var client = http;
if (imageUrl.substr(0, 5) == 'https') { client = https; }
client.get(imageUrl, function(res) {
if (res.statusCode != 200) {
return callback(new Error('HTTP Response code ' + res.statusCode));
}
gm(res)
.geometry(1024, 768, '>')
.stream('jpg', function(err, stdout, stderr) {
if (!err) {
var buf = new Buffer(0);
stdout.on('data', function(d) {
buf = Buffer.concat([buf, d]);
});
stdout.on('end', function() {
var headers = {
'Content-Length': buf.length
, 'Content-Type': 'Image/jpeg'
, 'x-amz-acl': 'public-read'
};
s3.putBuffer(buf, '/img/d/' + filename + '.jpg', headers, function(err, res) {
if(err) {
return callback(err);
} else {
return callback(null, res.client._httpMessage.url);
}
});
});
} else {
callback(err);
}
});
}).on('error', function(err) {
callback(err);
});
};