1 | dns = require 'dns'
|
2 | _ = require 'lodash'
|
3 | request = require 'request'
|
4 | SrvFailover = require 'srv-failover'
|
5 | url = require 'url'
|
6 |
|
7 | class 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 |
|
58 | module.exports = MeshbluRequest
|