From 01a8b56cf232b8b7bc1e398ef1a161abf08ed443 Mon Sep 17 00:00:00 2001 From: Christian Stocker Date: Tue, 2 Aug 2016 08:22:35 +0200 Subject: [PATCH 1/7] use latest imagemin and other package upgrades --- lib/optim.js | 35 +++++++++++++++++------------------ package.json | 7 ++++--- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/optim.js b/lib/optim.js index 3873e4c..c7ff0e5 100644 --- a/lib/optim.js +++ b/lib/optim.js @@ -1,7 +1,7 @@ var aws = require('aws-sdk'); var s3 = new aws.S3({ apiVersion: '2006-03-01' }); -var Imagemin = require('imagemin'); -var optipng = require('imagemin-optipng'); +var imagemin = require('imagemin'); +var imageminOptipng = require('imagemin-optipng'); var async = require('async'); var acl = process.env.UPLOAD_ACL || 'public-read'; @@ -9,14 +9,14 @@ var uploadBucket = process.env.UPLOAD_BUCKET; var pngLevel = +process.env.PNG_OPTIM_LEVEL || 7; var skipSize = +process.env.MAX_FILE_SIZE || -1; -exports.optim = function(event, context) { +exports.optim = function(event, context, callback) { var bucket = event.Records[0].s3.bucket.name; var key = event.Records[0].s3.object.key; if(!/\.png$/.test(key)){ console.log('Not a PNG'); - return setImmediate(function(){ context.done(); }); + return setImmediate(function(){ callback(null, 'Not a PNG'); }); } key = require('querystring').parse('a=' + key).a; @@ -31,7 +31,7 @@ exports.optim = function(event, context) { if(data.Metadata && data.Metadata.optimized) { console.log('Image is already optimized. Skipping.'); - return cb('skip'); + // return cb('skip'); } if(data.ContentLength){ @@ -57,28 +57,25 @@ exports.optim = function(event, context) { }, function(meta, obj, cb){ - new Imagemin() - .src(obj.Body) - .use(optipng({ optimizationLevel: pngLevel })) - .run(function(err, files){ - if(err) return cb(err); - - console.log('Optimized! Final file size is ' + files[0].contents.length + ' bytes'); - - cb(null, meta, obj, files[0]) + imagemin.buffer(obj.Body, {use: [imageminOptipng({optimizationLevel: pngLevel})]}).then(buf => { + console.log('Optimized! Final file size is ' + buf.length + ' bytes'); + cb(null, meta, obj, buf) + }).catch(err => { + callback(err) }); }, - function(meta, obj, file, cb){ + function(meta, obj, body, cb){ meta.Metadata.optimized = 'yes'; s3.putObject({ ACL: acl, Bucket: uploadBucket || bucket, Key: key, - Body: file.contents, + Body: body, ContentType: obj.ContentType, - Metadata: meta.Metadata + Metadata: meta.Metadata, + StorageClass: meta.StorageClass }, function(err){ if(err) return cb(err); @@ -90,6 +87,8 @@ exports.optim = function(event, context) { if(err === 'skip'){ err = null; } - context.done(err); + callback(err); + console.log(err); + //context.done(err); }); }; diff --git a/package.json b/package.json index b69ad40..d378280 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,11 @@ }, "dependencies": { "async": "^1.5.0", - "imagemin": "^3.2.0", - "imagemin-optipng": "^4.3.0" + "imagemin": "^5.2.0", + "imagemin-optipng": "^5.1.0", + "imagemin-jpegoptim": "^5.0.0" }, "devDependencies": { - "node-lambda": "^0.7.1" + "node-lambda": "^0.8.6" } } From 7161aef15eab9be6514ab68035d944b38c99e9ac Mon Sep 17 00:00:00 2001 From: Christian Stocker Date: Tue, 2 Aug 2016 08:38:02 +0200 Subject: [PATCH 2/7] add jpgegoptim --- lib/optim.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/optim.js b/lib/optim.js index c7ff0e5..e25b4c5 100644 --- a/lib/optim.js +++ b/lib/optim.js @@ -2,6 +2,8 @@ var aws = require('aws-sdk'); var s3 = new aws.S3({ apiVersion: '2006-03-01' }); var imagemin = require('imagemin'); var imageminOptipng = require('imagemin-optipng'); +var imageminJpegoptim = require('imagemin-jpegoptim'); + var async = require('async'); var acl = process.env.UPLOAD_ACL || 'public-read'; @@ -14,8 +16,8 @@ exports.optim = function(event, context, callback) { var bucket = event.Records[0].s3.bucket.name; var key = event.Records[0].s3.object.key; - if(!/\.png$/.test(key)){ - console.log('Not a PNG'); + if(!/\.png$/.test(key) && !/\.jpg$/.test(key)){ + console.log('Not a PNG or JPG'); return setImmediate(function(){ callback(null, 'Not a PNG'); }); } @@ -31,7 +33,7 @@ exports.optim = function(event, context, callback) { if(data.Metadata && data.Metadata.optimized) { console.log('Image is already optimized. Skipping.'); - // return cb('skip'); + return cb('skip'); } if(data.ContentLength){ @@ -57,7 +59,14 @@ exports.optim = function(event, context, callback) { }, function(meta, obj, cb){ - imagemin.buffer(obj.Body, {use: [imageminOptipng({optimizationLevel: pngLevel})]}).then(buf => { + var plugin + if(/\.png$/.test(key)){ + plugin = imageminOptipng({optimizationLevel: pngLevel}); + } else { + plugin = imageminJpegoptim({progressive: true}); + } + + imagemin.buffer(obj.Body, {use: [plugin]}).then(buf => { console.log('Optimized! Final file size is ' + buf.length + ' bytes'); cb(null, meta, obj, buf) }).catch(err => { From 017dfab8326bc0b3860a8104225f800de0bc5fd7 Mon Sep 17 00:00:00 2001 From: Christian Stocker Date: Tue, 2 Aug 2016 08:50:00 +0200 Subject: [PATCH 3/7] don't upload if file is not smaller --- lib/optim.js | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/lib/optim.js b/lib/optim.js index e25b4c5..f0e5795 100644 --- a/lib/optim.js +++ b/lib/optim.js @@ -75,22 +75,32 @@ exports.optim = function(event, context, callback) { }, function(meta, obj, body, cb){ - meta.Metadata.optimized = 'yes'; - - s3.putObject({ - ACL: acl, - Bucket: uploadBucket || bucket, - Key: key, - Body: body, - ContentType: obj.ContentType, - Metadata: meta.Metadata, - StorageClass: meta.StorageClass - }, function(err){ - if(err) return cb(err); - - console.log('done!'); - cb(); - }); + var oriSize = obj.Body.length + var newSize = body.length + var percent = Math.round((1 - (newSize / oriSize)) * 10000) / 100; + console.log('File was optimzed from ' + oriSize + ' bytes to ' + newSize + ' bytes. ' + percent + '%.') + + if (newSize < oriSize) { + meta.Metadata.optimized = 'yes'; + + s3.putObject({ + ACL: acl, + Bucket: uploadBucket || bucket, + Key: key, + Body: body, + ContentType: obj.ContentType, + Metadata: meta.Metadata, + StorageClass: meta.StorageClass + }, function (err) { + if (err) return cb(err); + + console.log('done!'); + callback(null, 'File was optimzed from ' + oriSize + ' bytes to ' + newSize + ' bytes. ' + percent + '%.') + }); + } else { + console.log("Optimized file was not smaller than original file. Not uploading.") + callback(null, "Optimized file was not smaller than original file. Not uploading.") + } } ], function(err){ if(err === 'skip'){ From 91682b5cfe7fd8ba22954cf921e592cb6fd6fdea Mon Sep 17 00:00:00 2001 From: Christian Stocker Date: Tue, 2 Aug 2016 13:29:37 +0200 Subject: [PATCH 4/7] correct percentage --- lib/optim.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optim.js b/lib/optim.js index f0e5795..a751cb5 100644 --- a/lib/optim.js +++ b/lib/optim.js @@ -77,7 +77,7 @@ exports.optim = function(event, context, callback) { function(meta, obj, body, cb){ var oriSize = obj.Body.length var newSize = body.length - var percent = Math.round((1 - (newSize / oriSize)) * 10000) / 100; + var percent = Math.round(((oriSize - newSize) / oriSize) * 10000) / 100; console.log('File was optimzed from ' + oriSize + ' bytes to ' + newSize + ' bytes. ' + percent + '%.') if (newSize < oriSize) { From ac179c76520ddeecddbcca76f22cff352302e93c Mon Sep 17 00:00:00 2001 From: Christian Stocker Date: Tue, 2 Aug 2016 13:57:49 +0200 Subject: [PATCH 5/7] output filename in logs --- lib/optim.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optim.js b/lib/optim.js index a751cb5..ac7d2ff 100644 --- a/lib/optim.js +++ b/lib/optim.js @@ -78,7 +78,7 @@ exports.optim = function(event, context, callback) { var oriSize = obj.Body.length var newSize = body.length var percent = Math.round(((oriSize - newSize) / oriSize) * 10000) / 100; - console.log('File was optimzed from ' + oriSize + ' bytes to ' + newSize + ' bytes. ' + percent + '%.') + console.log('File ' + key + ' was optimzed from ' + oriSize + ' bytes to ' + newSize + ' bytes. ' + percent + '%.') if (newSize < oriSize) { meta.Metadata.optimized = 'yes'; From 592f8fdde9868a9214ec715dfd4e5fba05861a13 Mon Sep 17 00:00:00 2001 From: Christian Stocker Date: Tue, 2 Aug 2016 13:25:34 +0200 Subject: [PATCH 6/7] install correct jpegoptim for aws --- bin/jpegoptim.aws | Bin 0 -> 89677 bytes post_install.sh | 3 +++ 2 files changed, 3 insertions(+) create mode 100755 bin/jpegoptim.aws create mode 100755 post_install.sh diff --git a/bin/jpegoptim.aws b/bin/jpegoptim.aws new file mode 100755 index 0000000000000000000000000000000000000000..94eb573708f18e4b34ea3ca790c0377a58b1f5df GIT binary patch literal 89677 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 literal 0 HcmV?d00001 diff --git a/post_install.sh b/post_install.sh new file mode 100755 index 0000000..19b9f7c --- /dev/null +++ b/post_install.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# for aws lambda, we need a different jpegoptim than produced on ubuntu +cp bin/jpegoptim.aws node_modules/jpegoptim-bin/vendor/jpegoptim \ No newline at end of file From 0fecbbaeb7480ddba47a543f08b5c8a5db5929d3 Mon Sep 17 00:00:00 2001 From: Christian Stocker Date: Tue, 2 Aug 2016 13:26:48 +0200 Subject: [PATCH 7/7] add event and context.json --- context.json | 1 + event.json | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 context.json create mode 100644 event.json diff --git a/context.json b/context.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/context.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/event.json b/event.json new file mode 100644 index 0000000..c7b0490 --- /dev/null +++ b/event.json @@ -0,0 +1,38 @@ +{ + "Records": [ + { + "eventVersion": "2.0", + "eventTime": "1970-01-01T00:00:00.000Z", + "requestParameters": { + "sourceIPAddress": "127.0.0.1" + }, + "s3": { + "configurationId": "testConfigRule", + "object": { + "eTag": "0123456789abcdef0123456789abcdef", + "sequencer": "0A1B2C3D4E5F678901", + "key": "foo/bar/3/e/f/e/3efed655ff1a21cb60bba97cd3c2296877fb8a5a.jpg", + "size": 1024 + }, + "bucket": { + "arn": "arn:aws:s3:::bucket", + "name": "bucket", + "ownerIdentity": { + "principalId": "EXAMPLE" + } + }, + "s3SchemaVersion": "1.0" + }, + "responseElements": { + "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH", + "x-amz-request-id": "EXAMPLE123456789" + }, + "awsRegion": "eu-central-1", + "eventName": "ObjectCreated:Put", + "userIdentity": { + "principalId": "EXAMPLE" + }, + "eventSource": "aws:s3" + } + ] +} \ No newline at end of file