Skip to content

Instantly share code, notes, and snippets.

@joshgillies
Last active October 1, 2015 01:55
Show Gist options
  • Save joshgillies/c5c19099a4a273b2877f to your computer and use it in GitHub Desktop.
Save joshgillies/c5c19099a4a273b2877f to your computer and use it in GitHub Desktop.
module['exports'] = function saveToS3 (hook) {
// require the following to get access to encoder/decoder
// should raise an issue about this?
// var JPEG = require('jpg-stream')
var JPEGEncoder = require('jpg-stream/encoder')
var JPEGDecoder = require('jpg-stream/decoder')
var after = require('after')
var AWS = require('aws-sdk')
var bl = require('bl')
console.log(JSON.stringify(hook.req.headers))
var req = require('request')
var res = hook.res
var resource = hook.params.resource
var headers = hook.params.headers || {}
if (!headers['last-modified']) {
return logAndEnd('Error: header \'last-modified\' not found in ' + JSON.stringify(headers))
}
//
// what happens if the resource is modified after this value has been set?
var timeStamp = generateISOString(headers['last-modified'])
AWS.config.update({
accessKeyId: hook.env.accessKeyId,
secretAccessKey: hook.env.secretAccessKey,
region: hook.env.region
})
var s3 = new AWS.S3({
apiVersion: hook.env.s3Version,
params: {
Bucket: hook.env.s3Bucket
}
})
s3.headObject({ Key: timeStamp + '--large.jpg' }, function checkObject (err, data) {
if (data) {
// Object exists, bail!
return logAndEnd('Object exists \'' + timeStamp + '--large.jpg\': ' + JSON.stringify(data))
}
if (err && err.statusCode !== 404) {
// Dunno, BAIL!
return logAndEnd('Error: ' + (err.message || err))
}
// Object doesn't exist, create it!
console.log('Fetching: ' + resource)
var imageData = req.get(resource)
var next = after(2, function done (err) {
logAndEnd(err ? 'Error: ' + (err.messsage || err) : 'Success: ' + timeStamp)
})
imageData.on('response', function (res) {
console.log('Info: response headers: ' + JSON.stringify(headers))
})
imageData.on('error', function (err) {
logAndEnd('Error: ' + (err.messsage || err))
})
imageData
.pipe(new JPEGDecoder)
.pipe(new JPEGEncoder({ quality: 90 }))
.pipe(bl(function (err, data) {
if (err) {
return logAndEnd('Error: ' + (err.messsage || err))
}
console.log('Info: encoded image data length ' + data.length)
s3.upload({ Key: 'latest.jpg', Metadata: { ref: timeStamp + '--large.jpg' }, ACL: 'public-read', Body: data }, function (err, data) {
if (data) {
console.log('Success: ' + JSON.stringify(data))
}
next(err)
})
s3.upload({ Key: timeStamp + '--large.jpg', ACL: 'public-read', Body: data }, function (err, data) {
if (data) {
console.log('Success: ' + JSON.stringify(data))
}
next(err)
})
}))
imageData
.pipe(bl(function (err, data) {
console.log(err ? 'Error: ' + (err.messsage || err) : 'Info: raw image data length ' + data.length)
}))
})
function generateISOString (dateString) {
try {
return (new Date(dateString)).toISOString()
} catch (err) {
logAndEnd(new Error(dateString + ' not a valid date. ' + err))
}
}
function logAndEnd (message) {
console.log(message)
res.end(message)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment