@incdevco/framework
Version:
node.js lambda framework
121 lines (73 loc) • 2.49 kB
JavaScript
var crypto = require('crypto');
var AWS = require('aws-sdk');
var es = require('event-stream');
var gulp = require('gulp');
var gutil = require('gulp-util');
var mime = require('mime-types');
var defaultContentType = 'application/octet-stream';
var pluginName = 'upload-angular-package';
module.exports = function (config) {
'use strict';
var s3 = new AWS.S3();
config = config || {};
config.acl = config.acl || 'public-read';
config.cacheControl = config.cacheControl || 'max-age=0';
return es.map(function (client, done) {
var bucket = config.bucket;
var name = client.path.split('/').reverse()[1];
var src = client.path.replace('/index.html', '');
if (config.buckets) {
bucket = config.buckets[name] || config.bucket;
}
gulp.src(src + '/**/*')
.pipe(es.map(function (file, done) {
if (!file.contents) {
return done();
}
var eTag = '"' + crypto.createHash('md5').update(file.contents).digest('hex') + '"';
var key = file.path.replace(file.base, '');
s3.headObject({
Bucket: bucket,
Key: key
}).promise()
.then(function (result) {
if (eTag === result.ETag) {
return false;
} else {
return true;
}
}, function (exception) {
console.log(bucket, key, exception.code);
if (exception.code === 'NotFound') {
return true;
}
throw exception;
})
.then(function (upload) {
if (upload) {
gutil.log('uploading', bucket, key);
return s3.putObject({
Bucket: bucket,
Key: key,
ACL: config.acl,
Body: file.contents,
CacheControl: config.cacheControl,
ContentType: mime.lookup(file.path)
|| defaultContentType
}).promise()
.then(function () {
gutil.log('uploaded', bucket, key);
return true;
});
}
return false;
})
.then(function () {
done();
})
.catch(done);
}))
.on('error', done)
.on('end', done);
});
};