Last active
October 1, 2015 01:55
-
-
Save joshgillies/c5c19099a4a273b2877f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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