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 = '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 |
|
58 | module.exports = MeshbluRequest
|