forked from openstf/stf
-
Notifications
You must be signed in to change notification settings - Fork 621
Expand file tree
/
Copy pathindex.js
More file actions
164 lines (143 loc) · 4.51 KB
/
Copy pathindex.js
File metadata and controls
164 lines (143 loc) · 4.51 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/**
* Copyright © 2019-2024 contains code contributed by Orange SA, authors: Denis Barbaron - Licensed under the Apache license 2.0
**/
var http = require('http')
var path = require('path')
var events = require('events')
var express = require('express')
var swaggerExpress = require('autodesk-forks-swagger-express-mw')
var swaggerUi = require('@targetprocess/swagger-tools/middleware/swagger-ui')
var cookieSession = require('cookie-session')
var Promise = require('bluebird')
var _ = require('lodash')
var logger = require('../../util/logger')
var zmqutil = require('../../util/zmqutil')
var srv = require('../../util/srv')
var lifecycle = require('../../util/lifecycle')
var wireutil = require('../../wire/util')
var MetricsCollector = require('../../util/metrics-collector')
module.exports = function(options) {
var log = logger.createLogger('api')
var app = express()
var server = http.createServer(app)
var channelRouter = new events.EventEmitter()
var push = zmqutil.socket('push')
Promise.map(options.endpoints.push, function(endpoint) {
return srv.resolve(endpoint).then(function(records) {
return srv.attempt(records, function(record) {
log.info('Sending output to "%s"', record.url)
push.connect(record.url)
return Promise.resolve(true)
})
})
})
.catch(function(err) {
log.fatal('Unable to connect to push endpoint', err)
lifecycle.fatal()
})
// Input
var sub = zmqutil.socket('sub')
Promise.map(options.endpoints.sub, function(endpoint) {
return srv.resolve(endpoint).then(function(records) {
return srv.attempt(records, function(record) {
log.info('Receiving input from "%s"', record.url)
sub.connect(record.url)
return Promise.resolve(true)
})
})
})
.catch(function(err) {
log.fatal('Unable to connect to sub endpoint', err)
lifecycle.fatal()
})
var pushdev = zmqutil.socket('push')
Promise.map(options.endpoints.pushdev, function(endpoint) {
return srv.resolve(endpoint).then(function(records) {
return srv.attempt(records, function(record) {
log.info('Sending output to "%s"', record.url)
pushdev.connect(record.url)
return Promise.resolve(true)
})
})
})
.catch(function(err) {
log.fatal('Unable to connect to pushdev endpoint', err)
lifecycle.fatal()
})
var subdev = zmqutil.socket('sub')
Promise.map(options.endpoints.subdev, function(endpoint) {
return srv.resolve(endpoint).then(function(records) {
return srv.attempt(records, function(record) {
log.info('Receiving input from "%s"', record.url)
subdev.connect(record.url)
return Promise.resolve(true)
})
})
})
.catch(function(err) {
log.fatal('Unable to connect to subdev endpoint', err)
lifecycle.fatal()
})
// Establish always-on channels
;[wireutil.global].forEach(function(channel) {
log.info('Subscribing to permanent channel "%s"', channel)
sub.subscribe(channel)
subdev.subscribe(channel)
})
sub.on('message', function(channel, data) {
channelRouter.emit(channel.toString(), channel, data)
})
subdev.on('message', function(channel, data) {
channelRouter.emit(channel.toString(), channel, data)
})
// Swagger Express Config
var config = {
appRoot: __dirname
, swaggerFile: path.resolve(__dirname, 'swagger', 'api_v1.yaml')
}
swaggerExpress.create(config, function(err, swaggerExpress) {
if (err) {
throw err
}
app.use(swaggerUi(swaggerExpress.runner.swagger))
swaggerExpress.register(app)
})
// Adding options in request, so that swagger controller
// can use it.
app.use(function(req, res, next) {
var reqOptions = _.merge(options, {
push: push
, sub: sub
, channelRouter: channelRouter
, pushdev: pushdev
, subdev: subdev
})
req.options = reqOptions
next()
})
// TODO: Remove this once frontend is stateless
app.use(cookieSession({
name: options.ssid
, keys: [options.secret]
}))
app.disable('x-powered-by')
// Initialize metrics collection
const metricsCollector = new MetricsCollector({
interval: 30000 // Collect metrics every 30 seconds
})
metricsCollector.start()
lifecycle.observe(function() {
// Stop metrics collection on shutdown
metricsCollector.stop()
;[push, sub, pushdev, subdev].forEach(function(sock) {
try {
sock.close()
}
catch (err) {
// No-op
}
})
})
server.listen(options.port)
log.info('Listening on port %d', options.port)
}