openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
1,020 lines (1,016 loc) • 38.2 kB
HTML
<html lang="en">
<head>
<title>Code coverage report for src/tasks.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</a> tasks.coffee
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">23.58% </span>
<span class="quiet">Statements</span>
<span class='fraction'>29/123</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/14</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/36</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">23.58% </span>
<span class="quiet">Lines</span>
<span class='fraction'>29/123</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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319</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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-yes">1x</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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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></td><td class="text"><pre class="prettyprint lang-js">TaskModel = require('./model/tasks').Task
Channel = require('./model/channels').Channel
Q = require("q")
logger = require("winston")
config = require("./config/config")
config.rerun = config.get('rerun')
http = require 'http'
TransactionModel = require("./model/transactions").Transaction
net = require "net"
rerunMiddleware = require "./middleware/rerunUpdateTransactionTask"
live = false
activeTasks = 0
findAndProcessAQueuedTask = <span class="fstat-no" title="function not covered" ></span>->
TaskModel.findOneAndUpdate { status: 'Queued' }, { status: 'Processing' }, { 'new': true }, <span class="fstat-no" title="function not covered" >(</span>err, task) ->
if err
logger.error "An error occurred while looking for rerun tasks: #{err}"
else if task
<span class="cstat-no" title="statement not covered" > activeTasks++</span>
<span class="cstat-no" title="statement not covered" > processNextTaskRound task, <span class="fstat-no" title="function not covered" >(</span>err) -></span>
<span class="cstat-no" title="statement not covered" ></span> logger.error "An error occurred while processing rerun task #{task._id}: #{err}" if err
<span class="cstat-no" title="statement not covered" > activeTasks--</span>
# task has finished its current round, pick up the next one
if live then findAndProcessAQueuedTask()
# task has started processing, pick up the next one
<span class="cstat-no" title="statement not covered" > if live then findAndProcessAQueuedTask()</span>
rerunTaskProcessor = <span class="fstat-no" title="function not covered" ></span>->
if live
<span class="cstat-no" title="statement not covered" > findAndProcessAQueuedTask()</span>
setTimeout rerunTaskProcessor, config.rerun.processor.pollPeriodMillis
exports.start = <span class="fstat-no" title="function not covered" >(</span>callback) ->
<span class="cstat-no" title="statement not covered" > live = t</span>rue
<span class="cstat-no" title="statement not covered" > setTimeout rerunTaskProcessor, config.rerun.processor.pollPeriodMillis</span>
<span class="cstat-no" title="statement not covered" > logger.info "Started rerun task processor"</span>
callback()
exports.stop = <span class="fstat-no" title="function not covered" >(</span>callback) ->
<span class="cstat-no" title="statement not covered" > live = f</span>alse
<span class="cstat-no" title="statement not covered" > waitForActiveTasks = <span class="fstat-no" title="function not covered" ></span>-</span>>
if activeTasks > 0
setTimeout waitForActiveTasks, 100
else
<span class="cstat-no" title="statement not covered" > logger.info "Stopped rerun task processor"</span>
callback()
waitForActiveTasks()
exports.isRunning = <span class="fstat-no" title="function not covered" ></span>-> live
finalizeTaskRound = <span class="fstat-no" title="function not covered" >(</span>task, callback) ->
# get latest status in case it has been changed
TaskModel.findOne { _id: task._id }, { status: 1 }, <span class="fstat-no" title="function not covered" >(</span>err, result) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err if err
# Only queue the task if still in 'Processing'
# (the status could have been changed to paused or cancelled)
if result.status is 'Processing' and task.remainingTransactions isnt 0
<span class="cstat-no" title="statement not covered" > task.status = '</span>Queued'
<span class="cstat-no" title="statement not covered" > logger.info "Round completed for rerun task ##{task._id} - #{task.remainingTransactions} transactions remaining"</span>
else
<span class="cstat-no" title="statement not covered" > if task.remainingTransactions is 0</span>
<span class="cstat-no" title="statement not covered" > task.status = '</span>Completed'
<span class="cstat-no" title="statement not covered" > task.completedDate = new D</span>ate()
<span class="cstat-no" title="statement not covered" > logger.info "Round completed for rerun task ##{task._id} - Task completed"</span>
else
<span class="cstat-no" title="statement not covered" > task.status = result.s</span>tatus
<span class="cstat-no" title="statement not covered" > logger.info "Round completed for rerun task ##{task._id} - Task has been #{result.status}"</span>
task.save <span class="fstat-no" title="function not covered" >(</span>err) -> callback err
# Process a task.
#
# Tasks are processed in rounds:
# Each round consists of processing n transactions where n is between 1 and the task's batchSize,
# depending on how many transactions are left to process.
#
# When a round completes, the task will be marked as 'Queued' if it still has transactions remaining.
# The next available core instance will then pick up the task again for the next round.
#
# This model allows the instance the get updated information regarding the task in between rounds:
# i.e. if the server has been stopped, if the task has been paused, etc.
processNextTaskRound = <span class="fstat-no" title="function not covered" >(</span>task, callback) ->
<span class="cstat-no" title="statement not covered" > logger.debug "Processing next task round: total transactions = #{task.totalTransactions}, remainingTransactions = #{task.remainingTransactions}"</span>
<span class="cstat-no" title="statement not covered" > promises = [</span>]
<span class="cstat-no" title="statement not covered" > nextI = task.transactions.length - task.r</span>emainingTransactions
<span class="cstat-no" title="statement not covered" > for transaction in task.transactions[nextI ... nextI+task.batchSize]</span>
do <span class="fstat-no" title="function not covered" >(</span>transaction) ->
<span class="cstat-no" title="statement not covered" > defer = Q</span>.defer()
<span class="cstat-no" title="statement not covered" > rerunTransaction transaction.tid, task._id, <span class="fstat-no" title="function not covered" >(</span>err, response) -></span>
if err
<span class="cstat-no" title="statement not covered" > transaction.tstatus = '</span>Failed'
<span class="cstat-no" title="statement not covered" > transaction.error = e</span>rr
<span class="cstat-no" title="statement not covered" > logger.error "An error occurred while rerunning transaction #{transaction.tid} for task #{task._id}: #{err}"</span>
else if response?.status is 'Failed'
<span class="cstat-no" title="statement not covered" > transaction.tstatus = '</span>Failed'
<span class="cstat-no" title="statement not covered" > transaction.error = response.m</span>essage
<span class="cstat-no" title="statement not covered" > logger.error "An error occurred while rerunning transaction #{transaction.tid} for task #{task._id}: #{err}"</span>
else
<span class="cstat-no" title="statement not covered" > transaction.tstatus = 'Completed'</span>
<span class="cstat-no" title="statement not covered" > task.remainingTransactions--</span>
defer.resolve()
<span class="cstat-no" title="statement not covered" > transaction.tstatus = '</span>Processing'
promises.push defer.promise
(Q.all promises).then <span class="fstat-no" title="function not covered" ></span>->
# Save task once transactions have been updated
task.save <span class="fstat-no" title="function not covered" >(</span>err) ->
if err?
<span class="cstat-no" title="statement not covered" > logger.error "Failed to save current task while processing round: taskID=#{task._id}, err=#{err}", err</span>
finalizeTaskRound task, callback
rerunTransaction = <span class="fstat-no" title="function not covered" >(</span>transactionID, taskID, callback) ->
rerunGetTransaction transactionID, <span class="fstat-no" title="function not covered" >(</span>err, transaction) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err if err
# setup the option object for the HTTP Request
Channel.findById transaction.channelID, <span class="fstat-no" title="function not covered" >(</span>err, channel) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err if err
<span class="cstat-no" title="statement not covered" > logger.info "Rerunning #{channel.type} transaction"</span>
if channel.type is 'http' or channel.type is 'polling'
<span class="cstat-no" title="statement not covered" > rerunSetHTTPRequestOptions transaction, taskID, <span class="fstat-no" title="function not covered" >(</span>err, options) -></span>
<span class="cstat-no" title="statement not covered" ></span> return callback err if err
# Run the HTTP Request with details supplied in options object
rerunHttpRequestSend options, transaction, <span class="fstat-no" title="function not covered" >(</span>err, HTTPResponse) ->
<span class="cstat-no" title="statement not covered" > return c</span>allback err, HTTPResponse
if channel.type is 'tcp' or channel.type is 'tls'
rerunTcpRequestSend channel, transaction, <span class="fstat-no" title="function not covered" >(</span>err, TCPResponse) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err if err
# Update original
ctx =
parentID : transaction._id
transactionId : transactionID
transactionStatus: TCPResponse.status
taskID : taskID
rerunMiddleware.updateOriginalTransaction ctx, <span class="fstat-no" title="function not covered" >(</span>err) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err if err
rerunMiddleware.updateTask ctx, callback
rerunGetTransaction = <span class="fstat-no" title="function not covered" >(</span>transactionID, callback) ->
TransactionModel.findById transactionID, <span class="fstat-no" title="function not covered" >(</span>err, transaction) ->
if not transaction?
<span class="cstat-no" title="statement not covered" > return callback (new Error "Transaction #{transactionID} could not be found"), null</span>
# check if 'canRerun' property is false - reject the rerun
if not transaction.canRerun
<span class="cstat-no" title="statement not covered" > err = new E</span>rror "Transaction #{transactionID} cannot be rerun as there isn't enough information about the request"
<span class="cstat-no" title="statement not covered" > return callback err, null</span>
# send the transactions data in callback
<span class="cstat-no" title="statement not covered" > return c</span>allback null, transaction
#####################################
# Construct HTTP options to be sent #
#####################################
rerunSetHTTPRequestOptions = <span class="fstat-no" title="function not covered" >(</span>transaction, taskID, callback) ->
if transaction == null
<span class="cstat-no" title="statement not covered" > err = new E</span>rror "An empty Transaction object was supplied. Aborting HTTP options configuration"
<span class="cstat-no" title="statement not covered" > return callback err, null</span>
<span class="cstat-no" title="statement not covered" > logger.info('Rerun Transaction #' + transaction._id + ' - HTTP Request options being configured')</span>
options =
hostname: config.rerun.host
port: config.rerun.httpPort
path: transaction.request.path
method: transaction.request.method
headers: transaction.request.headers
if transaction.clientID
<span class="cstat-no" title="statement not covered" > options.headers.clientID = transaction.clientID</span>
<span class="cstat-no" title="statement not covered" > options.headers.parentID = transaction._</span>id
<span class="cstat-no" title="statement not covered" > options.headers.taskID = t</span>askID
if transaction.request.querystring
<span class="cstat-no" title="statement not covered" > options.path += "?"+transaction.request.querystring</span>
<span class="cstat-no" title="statement not covered" > return c</span>allback null, options
#####################################
# Construct HTTP options to be sent #
#####################################
#####################################
# Function for sending HTTP Request #
#####################################
rerunHttpRequestSend = <span class="fstat-no" title="function not covered" >(</span>options, transaction, callback) ->
if options == null
<span class="cstat-no" title="statement not covered" > err = new E</span>rror "An empty 'Options' object was supplied. Aborting HTTP Send Request"
<span class="cstat-no" title="statement not covered" > return callback err, null</span>
if transaction == null
<span class="cstat-no" title="statement not covered" > err = new E</span>rror "An empty 'Transaction' object was supplied. Aborting HTTP Send Request"
<span class="cstat-no" title="statement not covered" > return callback err, null</span>
response =
body: ''
transaction: {}
<span class="cstat-no" title="statement not covered" > logger.info('Rerun Transaction #' + transaction._id + ' - HTTP Request is being sent...')</span>
<span class="cstat-no" title="statement not covered" > req = h</span>ttp.request options, <span class="fstat-no" title="function not covered" >(</span>res) ->
<span class="cstat-no" title="statement not covered" > res.on "data", <span class="fstat-no" title="function not covered" >(</span>chunk) -></span>
# response data
response.body += chunk
res.on "end", <span class="fstat-no" title="function not covered" >(</span>err) ->
if err
<span class="cstat-no" title="statement not covered" > response.transaction.status = "Failed"</span>
else
<span class="cstat-no" title="statement not covered" > response.transaction.status = "Completed"</span>
<span class="cstat-no" title="statement not covered" > response.status = res.s</span>tatusCode
<span class="cstat-no" title="statement not covered" > response.message = res.s</span>tatusMessage
<span class="cstat-no" title="statement not covered" > response.headers = res.h</span>eaders
<span class="cstat-no" title="statement not covered" > response.timestamp = new D</span>ate
<span class="cstat-no" title="statement not covered" > logger.info('Rerun Transaction #' + transaction._id + ' - HTTP Response has been captured')</span>
callback null, response
<span class="cstat-no" title="statement not covered" > req.on "error", <span class="fstat-no" title="function not covered" >(</span>err) -></span>
# update the status of the transaction that was processed to indicate it failed to process
<span class="cstat-no" title="statement not covered" ></span> response.transaction.status = "Failed" if err
<span class="cstat-no" title="statement not covered" > response.status = 5</span>00
<span class="cstat-no" title="statement not covered" > response.message = "</span>Internal Server Error"
<span class="cstat-no" title="statement not covered" > response.timestamp = new D</span>ate
callback null, response
# write data to request body
if transaction.request.method == "POST" || transaction.request.method == "PUT"
<span class="cstat-no" title="statement not covered" > req.write transaction.request.body</span>
req.end()
rerunTcpRequestSend = <span class="fstat-no" title="function not covered" >(</span>channel, transaction, callback) ->
response =
body: ''
transaction: {}
<span class="cstat-no" title="statement not covered" > client = new n</span>et.Socket()
<span class="cstat-no" title="statement not covered" > client.connect channel.tcpPort, channel.tcpHost, <span class="fstat-no" title="function not covered" ></span>-></span>
<span class="cstat-no" title="statement not covered" > logger.info "Rerun Transaction #{transaction._id}: TCP connection established"</span>
<span class="cstat-no" title="statement not covered" > client.end transaction.request.body</span>
return
<span class="cstat-no" title="statement not covered" > client.on "data", <span class="fstat-no" title="function not covered" >(</span>data) -></span>
response.body += data
<span class="cstat-no" title="statement not covered" > client.on "end" , <span class="fstat-no" title="function not covered" >(</span>data) -></span>
<span class="cstat-no" title="statement not covered" > response.status = 2</span>00
<span class="cstat-no" title="statement not covered" > response.transaction.status = "</span>Completed"
<span class="cstat-no" title="statement not covered" > response.message = '</span>'
<span class="cstat-no" title="statement not covered" > response.headers = {</span>}
<span class="cstat-no" title="statement not covered" > response.timestamp = new D</span>ate
<span class="cstat-no" title="statement not covered" > logger.info('Rerun Transaction #' + transaction._id + ' - TCP Response has been captured')</span>
<span class="cstat-no" title="statement not covered" > callback null, response</span>
return
client.on "error" , <span class="fstat-no" title="function not covered" >(</span>err) ->
# update the status of the transaction that was processed to indicate it failed to process
<span class="cstat-no" title="statement not covered" ></span> response.transaction.status = "Failed" if err
<span class="cstat-no" title="statement not covered" > response.status = 5</span>00
<span class="cstat-no" title="statement not covered" > response.message = "</span>Internal Server Error"
<span class="cstat-no" title="statement not covered" > response.timestamp = new D</span>ate
callback err, response
#########################################################
# Export these functions when in the "test" environment #
#########################################################
if process.env.NODE_ENV == "test"
exports.rerunGetTransaction = rerunGetTransaction
exports.rerunSetHTTPRequestOptions = rerunSetHTTPRequestOptions
exports.rerunHttpRequestSend = rerunHttpRequestSend
exports.rerunTcpRequestSend = rerunTcpRequestSend
exports.findAndProcessAQueuedTask = findAndProcessAQueuedTask
</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>