browser-meshblu-http
Version:
Meshblu Client for the Browser
140 lines (113 loc) • 5.02 kB
text/coffeescript
qs = require 'qs'
SrvFailover = require 'srv-failover'
superagent = require 'superagent'
URL = require 'url'
_ = {
defaults: require 'lodash/defaults'
dropRight: require 'lodash/dropRight'
each: require 'lodash/each'
isEmpty: require 'lodash/isEmpty'
join: require 'lodash/join'
minBy: require 'lodash/minBy'
pick: require 'lodash/pick'
split: require 'lodash/split'
takeRight: require 'lodash/takeRight'
toLower: require 'lodash/toLower'
}
discardReturn = require './discard-return.coffee'
class MeshbluRequest
constructor: (options={}) ->
{
service
domain
secure
resolveSrv
} = options
return unless resolveSrv
protocol = 'http'
protocol = 'https' if secure
= new SrvFailover {domain, service, protocol}
delete: (pathname, options, callback) =>
requestOptions = _.pick(options, 'uuid', 'token', 'bearerToken', 'headers')
requestOptions.pathname = pathname
query = qs.stringify options.query
pathname, (error, baseUri) =>
return callback error if error?
get: (pathname, options, callback) =>
requestOptions = _.pick(options, 'uuid', 'token', 'bearerToken', 'headers')
requestOptions.pathname = pathname
query = qs.stringify options.query
pathname, (error, baseUri) =>
return callback error if error?
patch: (pathname, options, callback) =>
requestOptions = _.pick(options, 'uuid', 'token', 'bearerToken', 'headers')
requestOptions.pathname = pathname
body = options.body
pathname, (error, baseUri) =>
return callback error if error?
post: (pathname, options, callback) =>
requestOptions = _.pick(options, 'uuid', 'token', 'bearerToken', 'headers')
requestOptions.pathname = pathname
body = options.body
pathname, (error, baseUri) =>
return callback error if error?
put: (pathname, options, callback) =>
requestOptions = _.pick(options, 'uuid', 'token', 'bearerToken', 'headers')
requestOptions.pathname = pathname
body = options.body
pathname, (error, baseUri) =>
return callback error if error?
_doRequest: ({method, baseUri, requestOptions, query, body}, callback) =>
.query(query).send(body).end (error, response)=>
if error?.crossDomain
return
_handleResponse: (callback) => (error, response) =>
return callback error if error?
return callback null if response.notFound
return callback new Error 'Invalid Response Code' unless response.ok
return callback null, response.body
_inBrowser: => window?
_request: (method, baseUri, {pathname, uuid, token, bearerToken, headers}) =>
method = _.toLower method
theRequest = superagent[method]( baseUri, pathname)
theRequest.auth uuid, token if uuid? && token?
theRequest.set('Authorization', "Bearer #{bearerToken}") if bearerToken?
theRequest.set('x-meshblu-service-name', ) if ?
theRequest.accept('application/json')
theRequest.set('Content-Type', 'application/json')
_.each headers, (value, key) =>
theRequest.set key, value
return theRequest
_resolveBaseUrl: (pathname, cb) =>
callback = discardReturn cb
return callback null, URL.format {, , } unless ?
.resolveUrl (error, baseUrl) =>
return callback error if error?
return callback null, baseUrl if
superagent.options().end (error) =>
if error?# || response.statusCode != 204
.markBadUrl baseUrl, ttl: 60000
return pathname, callback
return callback null, baseUrl
_retrySrvRequest: (error, options, callback) =>
return callback error unless ?
{method, baseUri, requestOptions, query, body} = options
.markBadUrl baseUri, ttl: 60000
.resolveUrl (error, baseUri) =>
return callback error if error?
return {method, baseUri, requestOptions, query, body}, callback
_url: (baseUri, pathname) =>
{protocol, hostname, port} = URL.parse baseUri
return URL.format({ hostname, protocol, port, pathname })
module.exports = MeshbluRequest