Commit cc93f1f8 authored by Aaron Harder's avatar Aaron Harder

Initial commit


Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

var _=require("lodash");
var s3=require("s3");
var _url=require("url");
var fs = require("fs");
var confPath = "siteConfig.environment.imageOptimizer.s3-backing";
var pluginId = "img-opt-s3-renditions";
module.exports=function s3BackedRenditions(config, $){
var s3conf = _.get($, confPath);
var timeOfLastEmailError = new Date(1971,4,15,11,30);
throw new Error(`'${pluginId}' plugin installed, but missing needed config at: ${confPath}`)
var s3client = s3.createClient({
multipartUploadThreshold: 20971520, // this is the default (20 MB)
multipartUploadSize: 15728640, // this is the default (15 MB)
s3Options: {
accessKeyId: s3conf.accessKeyId,
secretAccessKey: s3conf.secretAccessKey,
region: s3conf.region || ""
return {
checkForRendition: (params, cb)=>{
var lastModifiedTime;
var downloader = s3client.downloadFile({
Bucket: s3conf.bucket,
Key: params.renditionPath
downloader.on("httpHeaders", (statusCode, headers)=>{
lastModifiedTime = Date.parse(headers["last-modified"])
downloader.on("end", ()=>{
fs.utimes(params.renditionPathOnDisk, lastModifiedTime, lastModifiedTime, ()=>{"Got s3 rendition", params.renditionPath);
cb(null, lastModifiedTime);
downloader.on("error", function(err){
var msg;
if(err && err.message){
msg = `Error downloading rendition from S3 bucket ${s3conf.bucket}. Please check config at: ${confPath}`;
emailErrorOccasionally(params.emailError, msg);
log.error(msg, err.message);
msg = `Error downloading rendition from S3 bucket. ${err.message}`;
msg=`Unknown S3 download error.`;
uploadRendition: (params)=>{
var uploader = s3client.uploadFile({
Bucket: s3conf.bucket,
Key: params.renditionPath
uploader.on("error", function(err){
var msg = `Error uploading rendition to S3 bucket ${s3conf.bucket}. Please check config at: ${confPath}`;
emailErrorOccasionally(params.emailError, msg);
function emailErrorOccasionally(emailError, msg){
var secondsSinceLastEmail = (timeOfLastEmailError-(new Date()))/1000;
if(secondsSinceLastEmail > 1800){
emailError({subject: "S3 Rendition Error", text: msg});
timeOfLastEmailError=new Date();
\ No newline at end of file
\ No newline at end of file
// JSHint Default Configuration File (as on JSHint website)
// See for more details
"maxerr" : 50, // {int} Maximum error before stopping
// Enforcing
"bitwise" : false, // true: Prohibit bitwise operators (&, |, ^, etc.)
"camelcase" : false, // true: Identifiers must be in camelCase
"curly" : false, // true: Require {} for every new block or scope
"eqeqeq" : true, // true: Require triple equals (===) for comparison
"forin" : true, // true: Require filtering loops with obj.hasOwnProperty()
"immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`
"indent" : false, // {int} Number of spaces to use for indentation
"latedef" : false, // true: Require variables/functions to be defined before being used
"newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()`
"noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
"noempty" : true, // true: Prohibit use of empty blocks
"nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment)
"plusplus" : false, // true: Prohibit use of `++` & `--`
"quotmark" : "single", // Quotation mark consistency:
// false : do nothing (default)
// true : ensure whatever is used is consistent
// "single" : require single quotes
// "double" : require double quotes
"undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
"unused" : true, // true: Require all defined variables be used
"strict" : false, // true: Requires all functions run in ES5 Strict Mode
"maxparams" : false, // {int} Max number of formal params allowed per function
"maxdepth" : false, // {int} Max depth of nested blocks (within functions)
"maxstatements" : false, // {int} Max number statements per function
"maxcomplexity" : false, // {int} Max cyclomatic complexity per function
"maxlen" : false, // {int} Max number of characters per line
// Relaxing
"asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
"boss" : false, // true: Tolerate assignments where comparisons would be expected
"debug" : false, // true: Allow debugger statements e.g. browser breakpoints.
"eqnull" : false, // true: Tolerate use of `== null`
"es5" : false, // true: Allow ES5 syntax (ex: getters and setters)
"esnext" : false, // true: Allow (ES6) syntax (ex: `const`)
"moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
// (ex: `for each`, multiple try/catch, function expression…)
"evil" : false, // true: Tolerate use of `eval` and `new Function()`
"expr" : false, // true: Tolerate `ExpressionStatement` as Programs
"funcscope" : false, // true: Tolerate defining variables inside control statements
"globalstrict" : false, // true: Allow global "use strict" (also enables 'strict')
"iterator" : false, // true: Tolerate using the `__iterator__` property
"lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
"laxbreak" : false, // true: Tolerate possibly unsafe line breakings
"laxcomma" : false, // true: Tolerate comma-first style coding
"loopfunc" : false, // true: Tolerate functions being defined in loops
"multistr" : false, // true: Tolerate multi-line strings
"proto" : false, // true: Tolerate using the `__proto__` property
"scripturl" : false, // true: Tolerate script-targeted URLs
"shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
"sub" : true, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
"supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;`
"validthis" : false, // true: Tolerate using this in a non-constructor function
// Environments
"browser" : true, // Web Browser (window, document, etc)
"node" : true, // Node.js
"nonstandard" : true, // Widely adopted globals (escape, unescape, etc)
// Custom Globals
"globals" : {} // additional predefined global variables
# Contributing to the AWS SDK for JavaScript
We work hard to provide a high-quality and useful SDK, and we greatly value
feedback and contributions from our community. Whether it's a bug report,
new feature, correction, or additional documentation, we welcome your issues
and pull requests. Please read through this document before submitting any
issues or pull requests to ensure we have all the necessary information to
effectively respond to your bug report or contribution.
## Filing Bug Reports
You can file bug reports against the SDK on the [GitHub issues][issues] page.
If you are filing a report for a bug or regression in the SDK, it's extremely
helpful to provide as much information as possible when opening the original
issue. This helps us reproduce and investigate the possible bug without having
to wait for this extra information to be provided. Please read the following
guidelines prior to filing a bug report.
1. Search through existing [issues][] to ensure that your specific issue has
not yet been reported. If it is a common issue, it is likely there is
already a bug report for your problem.
2. Ensure that you have tested the latest version of the SDK. Although you
may have an issue against an older version of the SDK, we cannot provide
bug fixes for old versions. It's also possible that the bug may have been
fixed in the latest release.
3. Provide as much information about your environment, SDK version, and
relevant dependencies as possible. For example, let us know what version