forked from zrwsk/resilient-eureka
-
Notifications
You must be signed in to change notification settings - Fork 0
/
eureka-middleware.js
50 lines (41 loc) · 1.34 KB
/
eureka-middleware.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const xml2js = require('xml2js')
function mapServersFromEurekaResponse (data, params) {
return data
.applications
.application
.filter(service => params.serviceName ? service.name[0] === params.serviceName : true)
.map(service => service.instance)
.reduce((flat, toFlatten) =>
flat.concat(toFlatten), [])
.filter(service => params.serviceVipAddress ? service.vipAddress[0] === params.serviceVipAddress : true)
.map(service => params.protocol || 'http' + '://' + service.ipAddr[0] + ':' + service.port[0]._)
}
function eurekaMiddleware (params) {
params = params || {}
function middleware (options, resilient) {
options.set('path', params.path || '/eureka/apps')
options.set('gzip', true)
return {
'in': function (err, res, next) {
if (err) return next()
xml2js.parseString(res.body, (err, result) => {
if (err) return next()
try {
res.data = mapServersFromEurekaResponse(result, params)
} catch (err) {
// fails silently
} finally {
next()
}
})
},
'out': function (options, next) {
next()
}
}
}
middleware.type = 'discovery'
return middleware
}
eurekaMiddleware.mapServersFromEurekaResponse = mapServersFromEurekaResponse
module.exports = eurekaMiddleware