UNPKG

1.94 kBtext/coffeescriptView Raw
1dns = require 'dns'
2_ = require 'lodash'
3request = require 'request'
4SrvFailover = require 'srv-failover'
5url = require 'url'
6
7class MeshbluRequest
8 constructor: (options={}, dependencies={}) ->
9 {@dns, @request} = dependencies
10
11 @request ?= request
12
13 @requestOptions = options.request
14 {@protocol, @hostname, @port} = options
15 {service, domain, secure, resolveSrv} = options
16
17 return unless resolveSrv
18 protocol = 'https'
19 protocol = 'http' if secure == false
20
21 @srvFailover = new SrvFailover {service, domain, protocol}, {dns: dependencies.dns ? dns}
22
23 delete: (uri, options, callback) =>
24 @_doRequest {method: 'delete', uri, options}, callback
25
26 get: (uri, options, callback) =>
27 @_doRequest {method: 'get', uri, options}, callback
28
29 patch: (uri, options, callback) =>
30 @_doRequest {method: 'patch', uri, options}, callback
31
32 post: (uri, options, callback) =>
33 @_doRequest {method: 'post', uri, options}, callback
34
35 put: (uri, options, callback) =>
36 @_doRequest {method: 'put', uri, options}, callback
37
38 _addDefaultOptions: (options, {method, uri, baseUrl}) =>
39 _.defaults {}, options, @requestOptions, {method, uri, baseUrl}
40
41 _doRequest: ({method, uri, options}, callback) =>
42 @_resolveBaseUrl uri, (error, baseUrl) =>
43 return callback error if error?
44 return @request @_addDefaultOptions(options, {method, uri, baseUrl}), callback
45
46 _resolveBaseUrl: (uri, callback) =>
47 return callback null, url.format {@protocol, @hostname, @port} unless @srvFailover?
48
49 @srvFailover.resolveUrl (error, baseUrl) =>
50 return callback error if error?
51
52 @request {baseUrl, uri, method: 'options'}, (error, response) =>
53 if error? || response.statusCode != 204
54 @srvFailover.markBadUrl baseUrl, ttl: 60000
55 return @_resolveBaseUrl uri, callback
56 return callback null, baseUrl
57
58module.exports = MeshbluRequest