| var util = require('util') |
| var url = require('url') |
| |
| var syrup = require('stf-syrup') |
| var Promise = require('bluebird') |
| var request = require('request') |
| |
| var logger = require('../../../util/logger') |
| |
| module.exports = syrup.serial() |
| .define(function(options) { |
| var log = logger.createLogger('device:support:storage') |
| var plugin = Object.create(null) |
| |
| plugin.store = function(type, stream, meta) { |
| var resolver = Promise.defer() |
| |
| var args = { |
| url: url.resolve(options.storageUrl, util.format('s/upload/%s', type)) |
| } |
| |
| var req = request.post(args, function(err, res, body) { |
| if (err) { |
| log.error('Upload to "%s" failed', args.url, err.stack) |
| resolver.reject(err) |
| } |
| else if (res.statusCode !== 201) { |
| log.error('Upload to "%s" failed: HTTP %d', args.url, res.statusCode) |
| resolver.reject(new Error(util.format( |
| 'Upload to "%s" failed: HTTP %d' |
| , args.url |
| , res.statusCode |
| ))) |
| } |
| else { |
| try { |
| var result = JSON.parse(body) |
| log.info('Uploaded to "%s"', result.resources.file.href) |
| resolver.resolve(result.resources.file) |
| } |
| catch (err) { |
| log.error('Invalid JSON in response', err.stack, body) |
| resolver.reject(err) |
| } |
| } |
| }) |
| |
| req.form() |
| .append('file', stream, meta) |
| |
| return resolver.promise |
| } |
| |
| return plugin |
| }) |