@incdevco/framework
Version:
node.js lambda framework
129 lines (74 loc) • 2.52 kB
JavaScript
var crypto = require('crypto');
var AWS = require('aws-sdk');
var es = require('event-stream');
var gutil = require('gulp-util');
var Promise = require('bluebird');
var defaultContentType = 'application/octet-stream';
var pluginName = 'upload-lambda-packages';
module.exports = function (config) {
'use strict';
var prefix;
var promise = Promise.resolve(true);
var s3;
config = config || {};
config.packages = config.packages || {};
defaultContentType = config.defaultContentType
|| defaultContentType;
prefix = config.prefix || 'lambda-packages/';
s3 = config.s3 || new AWS.S3();
return es.map(function (file, done) {
var md5Hash = crypto.createHash('md5')
.update(file.contents)
.digest('hex');
var eTag = '"' + md5Hash + '"';
var key = prefix + file.path.replace(file.base, '');
var s3ObjectVersion;
s3.headObject({
Bucket: config.bucket,
Key: key
}).promise()
.then(function (result) {
s3ObjectVersion = result.VersionId;
if (eTag === result.ETag) {
// no file change, do not upload
//gutil.log('not changed', key);
return false;
} else {
// file has changed, upload
//gutil.log('uploading', key);
return true;
}
}, function (exception) {
if (exception.code === 'NotFound') {
return true;
}
throw exception;
})
.then(function (upload) {
if (upload) {
promise = promise.then(function () {
return s3.putObject({
Body: file.contents,
Bucket: config.bucket,
Key: key
}).promise()
.then(function (result) {
s3ObjectVersion = result.VersionId;
gutil.log('uploaded', key, result.VersionId);
return true;
});
});
return promise;
} else {
return false;
}
})
.then(function () {
var name = key.split('/')[1].replace('.zip', '');
config.packages[name] = config.packages[name] || {};
config.packages[name].S3ObjectVersion = s3ObjectVersion;
done();
})
.catch(done);
});
};