diff options
Diffstat (limited to 'app/node_modules/okservices/oks3')
| -rw-r--r-- | app/node_modules/okservices/oks3/index.js | 145 | ||||
| -rw-r--r-- | app/node_modules/okservices/oks3/package.json | 16 | ||||
| -rw-r--r-- | app/node_modules/okservices/oks3/upload.js | 79 |
3 files changed, 240 insertions, 0 deletions
diff --git a/app/node_modules/okservices/oks3/index.js b/app/node_modules/okservices/oks3/index.js new file mode 100644 index 0000000..cc40b71 --- /dev/null +++ b/app/node_modules/okservices/oks3/index.js @@ -0,0 +1,145 @@ +var upload = require("./upload") +var multer = require('multer') + +// Hack to prevent this god-forsaken module from crashing our shit +var d = require('domain').create() +d.on('error', function (err) { + console.log(err) + console.error('Stupid error in S3 upload. Upload probably prematurely canceled') +}) + +function OKS3(options) { + if (!(this instanceof OKS3)) return new OKS3(options); + options = options || {}; + if (!options.express) + throw new Error('Express not provided to OKS3'); + if (!options.s3) + throw new Error('S3 configuration not provided to OKS3'); + + if (!options.s3.image) options.s3.image = {} + if (!options.s3.audio) options.s3.audio = {} + if (!options.s3.video) options.s3.video = {} + + // Make sure maxbytes property is there - it can be a number, + // or zero/undefined (for no maximum upload size) + if (options.s3.maxbytes) { + if (! ('maxbytes' in options.s3.image)) + options.s3.image.maxbytes = options.s3.maxbytes + if (! ('maxbytes' in options.s3.video)) + options.s3.video.maxbytes = options.s3.maxbytes + if (! ('maxbytes' in options.s3.audio)) + options.s3.audio.maxbytes = options.s3.maxbytes + } + if (typeof options.s3.image.allowed !== "boolean") + options.s3.image.allowed = true + if (typeof options.s3.video.allowed !== "boolean") + options.s3.video.allowed = false + if (typeof options.s3.audio.allowed !== "boolean") + options.s3.audio.allowed = false + + upload.init({ + key: options.s3.key, + secret: options.s3.secret, + bucket: options.s3.bucket, + }) + + var express = options.express; + + var router = express.Router(); + + var mult = multer() + + router.post('/image', mult.single('image'), function(req, res) { + d.run(function () { + + if (! options.s3.image.allowed) { + return res.status(500).json({ error: "Image uploading not permitted" }) + } + + upload.put({ + file: req.file, + preserveFilename: options.s3.image.preserveFilename, + dirname: options.s3.dirname, + types: { + 'image/gif': 'gif', + 'image/jpeg': 'jpg', + 'image/jpg': 'jpg', + 'image/png': 'png', + }, + unacceptable: function(err){ + res.json({ error: err }) + }, + success: function(url){ + res.json({ url: url }) + } + }) + + }); + }); + + router.post('/audio', mult.single('audio'), function(req, res) { + d.run(function () { + + if (! options.s3.image.allowed) { + return res.status(500).json({ error: "Audio uploading not permitted" }) + } + + upload.put({ + file: req.file, + preserveFilename: options.s3.audio.preserveFilename, + dirname: options.s3.dirname, + types: { + 'audio/mp3': 'mp3', + 'audio/mpeg': 'mp3', + 'audio/wav': 'wav', + 'audio/flac': 'flac', + }, + unacceptable: function(err){ + res.json({ error: err }) + }, + success: function(url){ + res.json({ url: url }) + } + }) + + }); + }); + + router.post('/video', mult.single('video'), function(req, res) { + d.run(function () { + + if (! options.s3.image.allowed) { + return res.status(500).json({ error: "Video uploading not permitted" }) + } + + upload.put({ + file: req.file, + preserveFilename: options.s3.video.preserveFilename, + dirname: options.s3.dirname, + types: { + 'video/mp4': 'mp4', + 'video/webm': 'webm', + }, + unacceptable: function(err){ + res.json({ error: err }) + }, + success: function(url){ + res.json({ url: url }) + } + }) + + }); + }); + + function preserveFilename (stream, cb){ + cb(null, stream.filename) + } + + this._middleware = router; +} + +OKS3.prototype.middleware = function() { + return this._middleware; +}; + +module.exports = OKS3 diff --git a/app/node_modules/okservices/oks3/package.json b/app/node_modules/okservices/oks3/package.json new file mode 100644 index 0000000..61da414 --- /dev/null +++ b/app/node_modules/okservices/oks3/package.json @@ -0,0 +1,16 @@ +{ + "name": "oks3", + "version": "1.0.0", + "description": "s3 wassup", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "OKFocus", + "license": "None", + "dependencies": { + "knox": "^0.9.2", + "multer": "^1.1.0", + "node-uuid": "^1.4.7" + } +} diff --git a/app/node_modules/okservices/oks3/upload.js b/app/node_modules/okservices/oks3/upload.js new file mode 100644 index 0000000..517d5f7 --- /dev/null +++ b/app/node_modules/okservices/oks3/upload.js @@ -0,0 +1,79 @@ + +var knox = require('knox') +var uuid = require('node-uuid') + +var s3 + +var acceptableuploadTypes = { + 'image/gif': 'gif', + 'image/jpeg': 'jpg', + 'image/jpg': 'jpg', + 'image/png': 'png', +} + +module.exports = {} + +module.exports.init = function (opt){ + s3 = knox.createClient({ + key: opt.key, + secret: opt.secret, + bucket: opt.bucket, + }) +} + +module.exports.put = function (opt) { + var filename + var err + var now = new Date() + + var file = opt.file + + var types = opt.types || acceptableuploadTypes + var extension = types[file.mimetype] + + if (opt.preserveFilename) { + filename = file.originalname + } + else { + filename = uuid.v1() + "." + extension; + } + + var remote_path = "/" + opt.dirname + "/" + filename + + if (! extension) { + err = "Unacceptable filetype." + } + else if (opt.maxSize && file.size > opt.maxSize) { + err = "File too large. Uploads can be a maximum of " + opt.maxSize + " bytes." + } + + if (err) { + console.error(">>>", err) + opt.unacceptable && opt.unacceptable(err) + return + } + + opt.acceptable && opt.acceptable(err) + + // console.log("upload >", remote_path) + s3.putBuffer(file.buffer, remote_path, { + 'Content-Length': file.size, + 'Content-Type': file.mimetype, + 'x-amz-acl': 'public-read' + }, function(err, s3res) { + if (err || s3res.statusCode !== 200) { + console.error(err); + if (s3res && s3res.resume) { + s3res.resume() + } + return; + } + + var file_url = s3res.url || s3res.req.url + + opt.success && opt.success(file_url) + }).on('error', function(err, s3res){ + console.error(err) + s3res && s3res.resume && s3res.resume() + }) +} |
