Skip to content

Instantly share code, notes, and snippets.

@TaylorAckley
Last active February 18, 2017 00:41
Show Gist options
  • Save TaylorAckley/b10f2755d82eb5b33295a7f54903ad79 to your computer and use it in GitHub Desktop.
Save TaylorAckley/b10f2755d82eb5b33295a7f54903ad79 to your computer and use it in GitHub Desktop.
"use strict";
//npm install moment bluebird aws crypto fs-plus --save
const moment = require('moment');
const Promise = require('bluebird');
const AWS = require('aws-sdk');
const crypto = require('crypto');
const fs = require('fs-plus');
const appConfig = require('../config.js');
let s3 = {
getExpiryTime: function() {
let _date = new Date();
return '' + (_date.getFullYear()) + '-' + (_date.getMonth() + 1) + '-' +
(_date.getDate() + 1) + 'T' + (_date.getHours() + 3) + ':' + '00:00.000Z';
},
createS3Policy: function(contentType) {
return new Promise(function(resolve, reject) {
let date = new Date();
var s3Policy = {
'expiration': module.exports.aws.getExpiryTime(),
'conditions': [ //https://aws.amazon.com/articles/1434/
['starts-with', '$key', ''], {
'bucket': appConfig.AWS.AWS_BUCKET_NAME
}, {
'acl': 'private'
}, {
'success_action_status': '201'
},
["starts-with", "$Content-Type", ""],
["starts-with", "$filename", ""],
["content-length-range", 0, 1048576 * 10]
]
};
// stringify and encode the policy
let stringPolicy = JSON.stringify(s3Policy);
let base64Policy = new Buffer(stringPolicy, 'utf-8').toString('base64');
// sign the base64 encoded policy
let signature = crypto.createHmac('sha1', appConfig.AWS.AWS_SECRET_ACCESS_KEY)
.update(new Buffer(base64Policy, 'utf-8')).digest('base64');
// build the results object
let s3Credentials = {
s3Policy: base64Policy,
s3Signature: signature,
AWSAccessKeyId: appConfig.AWS.AWS_ACCESS_KEY_ID
};
// send it back
resolve(s3Credentials);
});
},
deleteS3Object: function(key) {
return new Promise(function(resolve, reject) {
if (!key) {
reject('Error, no key');
}
let s3 = new AWS.S3();
s3.deleteObjects({
Bucket: appConfig.AWS.AWS_BUCKET_NAME,
Delete: {
Objects: [{
Key: key
}]
}
}, function(err, data) {
if (err) {
console.log(err);
reject(err);
}
resolve(data);
});
});
},
upload: function(filepath, key) {
return new Promise(function(resolve, reject) {
let body = fs.createReadStream(filepath);
var s3obj = new AWS.S3({
params: {
Bucket: appConfig.AWS.AWS_BUCKET_NAME,
Key: key
}
});
s3obj.upload({ // upload the deliverable to S3
Body: body
})
.send(function(err, data) {
if (err) {
reject(err);
}
resolve(data);
});
});
},
getSignedUrl: function(key) {
return new Promise(function(resolve, reject) {
let s3 = new AWS.S3();
let url = s3.getSignedUrl('getObject', { // get a signed URL that will last for 20 minutes.
Bucket: appConfig.AWS.AWS_BUCKET_NAME,
Key: key
});
resolve(key);
});
},
download: function(filepath, key) {
return new Promise(function(resolve, reject) {
let s3 = new AWS.S3();
let params = {
Bucket: appConfig.AWS.AWS_BUCKET_NAME,
Key: key
};
let doc = fs.createWriteStream(filepath);
var data;
s3.getObject(params, (err, data) => {
data = data;
})
.createReadStream()
.pipe(doc);
doc.on('close', function() {
resolve(data);
});
});
}
};
module.exports = s3;
"use strict";
/** Common S3 functions. Expects certain AWS configuration variables to be present in config.js */
const moment = require('moment');
const Promise = require('bluebird');
const AWS = require('aws-sdk');
const crypto = require('crypto');
const fs = require('fs-plus');
const appConfig = require('../config.js');
let s3 = {
getExpiryTime: function() {
let _date = new Date();
return '' + (_date.getFullYear()) + '-' + (_date.getMonth() + 1) + '-' +
(_date.getDate() + 1) + 'T' + (_date.getHours() + 3) + ':' + '00:00.000Z';
},
createS3Policy: function(contentType, bucket) {
return new Promise(function(resolve, reject) {
let date = new Date();
var s3Policy = {
'expiration': module.exports.aws.getExpiryTime(),
'conditions': [ //https://aws.amazon.com/articles/1434/
['starts-with', '$key', ''], {
'bucket': bucket
}, {
'acl': 'private'
}, {
'success_action_status': '201'
},
["starts-with", "$Content-Type", ""],
["starts-with", "$filename", ""],
["content-length-range", 0, 1048576 * 10]
]
};
// stringify and encode the policy
let stringPolicy = JSON.stringify(s3Policy);
let base64Policy = new Buffer(stringPolicy, 'utf-8').toString('base64');
// sign the base64 encoded policy
let signature = crypto.createHmac('sha1', appConfig.AWS.AWS_SECRET_ACCESS_KEY)
.update(new Buffer(base64Policy, 'utf-8')).digest('base64');
// build the results object
let s3Credentials = {
s3Policy: base64Policy,
s3Signature: signature,
AWSAccessKeyId: appConfig.AWS.AWS_ACCESS_KEY_ID
};
// send it back
resolve(s3Credentials);
});
},
deleteS3Object: function(bucket, key) {
return new Promise(function(resolve, reject) {
if (!key) {
reject('Error, no key');
}
let s3 = new AWS.S3();
s3.deleteObjects({
Bucket: bucket,
Delete: {
Objects: [{
Key: key
}]
}
}, function(err, data) {
if (err) {
console.log(err);
reject(err);
}
resolve(data);
});
});
},
upload: function(body, bucket, key) {
return new Promise(function(resolve, reject) {
var s3obj = new AWS.S3({
params: {
Bucket: bucket,
Key: key
}
});
s3obj.upload({ // upload the deliverable to S3
Body: body
})
.send(function(err, data) {
if (err) {
reject(err);
}
resolve(data);
});
});
},
getSignedUrl: function(bucket, key) {
return new Promise(function(resolve, reject) {
let s3 = new AWS.S3();
let url = s3.getSignedUrl('getObject', { // get a signed URL that will last for 20 minutes.
Bucket: bucket,
Key: key
});
resolve(key);
});
},
download: function(bucket, key) {
return new Promise(function(resolve, reject) {
let s3 = new AWS.S3();
let params = {
Bucket: bucket,
Key: key
};
s3.getObject(params, (err, data) => {
resolve(data);
});
});
}
};
module.exports = s3;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment