UNPKG

2 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 = 'http'
19 protocol = 'https' if secure
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 (error, baseUrl) =>
43 return callback error if error?
44
45 @request {baseUrl, uri, method: 'options'}, (error, response) =>
46 return @_retrySrvRequest(error, baseUrl, {method, uri, options}, callback) if error || response.statusCode != 204
47 return @request @_addDefaultOptions(options, {method, uri, baseUrl}), callback
48
49 _resolveBaseUrl: (callback) =>
50 return callback null, url.format {@protocol, @hostname, @port} unless @srvFailover?
51 @srvFailover.resolveUrl callback
52
53 _retrySrvRequest: (error, baseUrl, opts, callback) =>
54 return callback error unless @srvFailover?
55 @srvFailover.markBadUrl baseUrl, ttl: 60000
56 return @_doRequest opts, callback
57
58module.exports = MeshbluRequest