openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
681 lines (680 loc) • 25.6 kB
HTML
<html lang="en">
<head>
<title>Code coverage report for src/middleware/events.coffee</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../../index.html">All files</a> / <a href="index.html">src/middleware</a> events.coffee
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">25% </span>
<span class="quiet">Statements</span>
<span class='fraction'>20/80</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">5% </span>
<span class="quiet">Branches</span>
<span class='fraction'>1/20</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/21</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">25.32% </span>
<span class="quiet">Lines</span>
<span class='fraction'>20/79</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">moment = require 'moment'
logger = require 'winston'
events = require '../model/events'
messageStore = require '../middleware/messageStore'
config = require '../config/config'
config.events = config.get('events')
if !config.events
# maybe we're using outdated config
<span class="cstat-no" title="statement not covered" > config.events = c</span>onfig.get('visualizer')
<span class="cstat-no" title="statement not covered" > config.events.normalizationBuffer = config.events.orchestrationTsBufferMillis</span>
enableTSNormalization = config.events.enableTSNormalization ? <span class="branch-1 cbranch-no" title="branch not covered" >false</span>
if enableTSNormalization is true
normalizationBuffer = 100
else
<span class="cstat-no" title="statement not covered" > normalizationBuffer = 0</span>
timestampAsMillis = <span class="fstat-no" title="function not covered" >(</span>ts) -> moment(new Date(ts)).valueOf()
# Determine the difference between baseTS and the earliest timestamp
# present in a collection of routes (buffered for normalization)
calculateEarliestRouteDiff = <span class="fstat-no" title="function not covered" >(</span>baseTS, routes) ->
<span class="cstat-no" title="statement not covered" > earliestTS = 0</span>
<span class="cstat-no" title="statement not covered" > for route in routes</span>
<span class="cstat-no" title="statement not covered" > ts = t</span>imestampAsMillis route.request.timestamp
i</span>f earliestTS < ts then <span class="cstat-no" title="statement not covered" >earliestTS = ts
<span class="cstat-no" title="statement not covered" > tsDiff = baseTS - e</span>arliestTS
<span class="cstat-no" title="statement not covered" > tsDiff += n</span>ormalizationBuffer
<span class="cstat-no" title="statement not covered" > return t</span>sDiff
determineStatusType = <span class="fstat-no" title="function not covered" >(</span>statusCode) ->
<span class="cstat-no" title="statement not covered" > status = '</span>success'
if 500 <= statusCode <= 599
<span class="cstat-no" title="statement not covered" > status = 'error'</span>
<span class="cstat-no" title="statement not covered" > return s</span>tatus
exports.saveEvents = saveEvents = <span class="fstat-no" title="function not covered" >(</span>trxEvents, callback) ->
<span class="cstat-no" title="statement not covered" > now = new D</span>ate
<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" > event.created = n</span>ow for event in trxEvents</span>
# bypass mongoose for quick batch inserts
# index needs to be ensured manually since the collection might not already exist
events.Event.collection.ensureIndex { created: 1 }, { expireAfterSeconds: 3600 }, <span class="fstat-no" title="function not covered" ></span>->
events.Event.collection.insert trxEvents, <span class="fstat-no" title="function not covered" >(</span>err) -> return if err then callback err else callback()
createRouteEvents = <span class="fstat-no" title="function not covered" >(</span>dst, transactionId, channel, route, type, tsAdjustment, autoRetryAttempt) ->
if route?.request?.timestamp? and route?.response?.timestamp?
<span class="cstat-no" title="statement not covered" > startTS = t</span>imestampAsMillis route.request.timestamp
<span class="cstat-no" title="statement not covered" > endTS = t</span>imestampAsMillis route.response.timestamp
if enableTSNormalization is true
<span class="cstat-no" title="statement not covered" > startTS = startTS + t</span>sAdjustment
<span class="cstat-no" title="statement not covered" > endTS = endTS + tsAdjustment</span>
i</span>f startTS > endTS then <span class="cstat-no" title="statement not covered" >startTS = endTS
<span class="cstat-no" title="statement not covered" > dst.push</span>
channelID: channel._id
transactionID: transactionId
normalizedTimestamp: startTS
type: type
event: 'start'
name: route.name
mediator: route.mediatorURN
autoRetryAttempt: autoRetryAttempt
dst.push
channelID: channel._id
transactionID: transactionId
normalizedTimestamp: endTS
type: type
event: 'end'
name: route.name
mediator: route.mediatorURN
status: route.response.status
statusType: determineStatusType route.response.status
autoRetryAttempt: autoRetryAttempt
createChannelStartEvent = <span class="fstat-no" title="function not covered" >(</span>dst, transactionId, requestTimestamp, channel, autoRetryAttempt) ->
dst.push
channelID: channel._id
transactionID: transactionId
normalizedTimestamp: timestampAsMillis requestTimestamp
type: 'channel'
event: 'start'
name: channel.name
autoRetryAttempt: autoRetryAttempt
createChannelEndEvent = <span class="fstat-no" title="function not covered" >(</span>dst, transactionId, requestTimestamp, channel, response, autoRetryAttempt) ->
<span class="cstat-no" title="statement not covered" > startTS = t</span>imestampAsMillis requestTimestamp
<span class="cstat-no" title="statement not covered" > endTS = t</span>imestampAsMillis response.timestamp
i</span>f endTS < startTS then <span class="cstat-no" title="statement not covered" >endTS = startTS
dst.push
channelID: channel._id
transactionID: transactionId
normalizedTimestamp: endTS + normalizationBuffer
type: 'channel'
event: 'end'
name: channel.name
status: response.status
statusType: determineStatusType response.status
autoRetryAttempt: autoRetryAttempt
createPrimaryRouteEvents = <span class="fstat-no" title="function not covered" >(</span>dst, transactionId, requestTimestamp, channel, routeName, mediatorURN, response, autoRetryAttempt) ->
<span class="cstat-no" title="statement not covered" > startTS = t</span>imestampAsMillis requestTimestamp
<span class="cstat-no" title="statement not covered" > dst.push</span>
channelID: channel._id
transactionID: transactionId
normalizedTimestamp: startTS
type: 'primary'
event: 'start'
name: routeName
mediator: mediatorURN
autoRetryAttempt: autoRetryAttempt
<span class="cstat-no" title="statement not covered" > endTS = t</span>imestampAsMillis response.timestamp
i</span>f endTS < startTS then <span class="cstat-no" title="statement not covered" >endTS = startTS
dst.push
channelID: channel._id
transactionID: transactionId
normalizedTimestamp: endTS + normalizationBuffer
type: 'primary'
event: 'end'
name: routeName
status: response.status
statusType: determineStatusType response.status
mediator: mediatorURN
autoRetryAttempt: autoRetryAttempt
createOrchestrationEvents = <span class="fstat-no" title="function not covered" >(</span>dst, transactionId, requestTimestamp, channel, orchestrations) ->
if requestTimestamp
<span class="cstat-no" title="statement not covered" > startTS = t</span>imestampAsMillis requestTimestamp
<span class="cstat-no" title="statement not covered" > tsDiff = calculateEarliestRouteDiff startTS, orchestrations</span>
<span class="cstat-no" title="statement not covered" > createRouteEvents dst, transactionId, channel, orch, 'orchestration', tsDiff for orch in orchestrations</span>
exports.createSecondaryRouteEvents = createSecondaryRouteEvents = <span class="fstat-no" title="function not covered" >(</span>dst, transactionId, requestTimestamp, channel, routes) ->
<span class="cstat-no" title="statement not covered" > startTS = t</span>imestampAsMillis requestTimestamp
<span class="cstat-no" title="statement not covered" > tsDiff = c</span>alculateEarliestRouteDiff startTS, routes
<span class="cstat-no" title="statement not covered" > for route in routes</span>
<span class="cstat-no" title="statement not covered" > createRouteEvents dst, transactionId, channel, route, 'route', tsDiff</span>
if route.orchestrations
# find TS difference
<span class="cstat-no" title="statement not covered" > tsDiff = c</span>alculateEarliestRouteDiff startTS, route.orchestrations
<span class="cstat-no" title="statement not covered" > createRouteEvents dst, transactionId, channel, orch, 'orchestration', tsDiff for orch in route.orchestrations</span>
exports.createTransactionEvents = <span class="fstat-no" title="function not covered" >(</span>dst, transaction, channel) ->
<span class="cstat-no" title="statement not covered" > getPrimaryRouteName = <span class="fstat-no" title="function not covered" ></span>(</span>) ->
<span class="cstat-no" title="statement not covered" > for r in channel.routes</span>
i</span>f r.primary then <span class="cstat-no" title="statement not covered" >return r.name
<span class="cstat-no" title="statement not covered" > return n</span>ull
<span class="cstat-no" title="statement not covered" > timestamp = if transaction.request?.timestamp then transaction.request.timestamp else new D</span>ate()
if transaction.request and transaction.response
<span class="cstat-no" title="statement not covered" > createPrimaryRouteEvents dst, transaction._id, timestamp, channel, getPrimaryRouteName(), null, transaction.response</span>
if transaction.orchestrations
<span class="cstat-no" title="statement not covered" > createOrchestrationEvents dst, transaction._id, timestamp, channel, transaction.orchestrations</span>
if transaction.routes
createSecondaryRouteEvents dst, transaction._id, timestamp, channel, transaction.routes
exports.koaMiddleware = <span class="fstat-no" title="function not covered" >(</span>next) ->
<span class="cstat-no" title="statement not covered" > ctx = t</span>his
<span class="cstat-no" title="statement not covered" > runAsync = <span class="fstat-no" title="function not covered" >(</span></span>method) ->
do <span class="fstat-no" title="function not covered" >(</span>ctx) ->
<span class="cstat-no" title="statement not covered" > f = <span class="fstat-no" title="function not covered" ></span>-</span>> method ctx, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.err err if err
setTimeout f, 0
<span class="cstat-no" title="statement not covered" > runAsync <span class="fstat-no" title="function not covered" >(</span>ctx, done) -></span>
<span class="cstat-no" title="statement not covered" > logger.debug "Storing channel start event for transaction: #{ctx.transactionId}"</span>
<span class="cstat-no" title="statement not covered" > trxEvents = [</span>]
<span class="cstat-no" title="statement not covered" > createChannelStartEvent trxEvents, ctx.transactionId, ctx.requestTimestamp, ctx.authorisedChannel, ctx.currentAttempt</span>
saveEvents trxEvents, done
<span class="cstat-no" title="statement not covered" > yield next</span>
runAsync <span class="fstat-no" title="function not covered" >(</span>ctx, done) ->
<span class="cstat-no" title="statement not covered" > logger.debug "Storing channel end and primary routes events for transaction: #{ctx.transactionId}"</span>
<span class="cstat-no" title="statement not covered" > trxEvents = [</span>]
<span class="cstat-no" title="statement not covered" > mediatorURN = ctx.mediatorResponse?['</span>x-mediator-urn']
<span class="cstat-no" title="statement not covered" > orchestrations = ctx.mediatorResponse?.o</span>rchestrations
<span class="cstat-no" title="statement not covered" > createPrimaryRouteEvents trxEvents, ctx.transactionId, ctx.requestTimestamp, ctx.authorisedChannel, ctx.primaryRoute.name, mediatorURN, ctx.response, ctx.currentAttempt</span>
if orchestrations
<span class="cstat-no" title="statement not covered" > createOrchestrationEvents trxEvents, ctx.transactionId, ctx.requestTimestamp, ctx.authorisedChannel, orchestrations, ctx.currentAttempt</span>
<span class="cstat-no" title="statement not covered" > createChannelEndEvent trxEvents, ctx.transactionId, ctx.requestTimestamp, ctx.authorisedChannel, ctx.response, ctx.currentAttempt</span>
saveEvents trxEvents, done
</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Mon Oct 10 2016 13:39:22 GMT+0200 (SAST)
</div>
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../../sorter.js"></script>
</body>
</html>