UNPKG

1.52 kBJavaScriptView Raw
1var retries = require('./retries');
2
3
4/**
5 * Add to the request prototype.
6 */
7
8module.exports = function (superagent) {
9 var Request = superagent.Request;
10 Request.prototype.retry = retry;
11 return superagent;
12};
13
14
15/**
16 * Export retries for extending
17 */
18
19module.exports.retries = retries;
20
21
22/**
23 * Sets the amount of times to retry the request
24 * @param {Number} count
25 */
26
27function retry (retries) {
28
29 var self = this
30 , oldEnd = this.end;
31
32 retries = retries || 1;
33
34 this.end = function (fn) {
35 var timeout = this._timeout;
36
37 function attemptRetry () {
38 return oldEnd.call(self, function (err, res) {
39 if (!retries || !shouldRetry(err, res)) return fn && fn(err, res);
40
41 reset(self, timeout);
42
43 retries--;
44 return attemptRetry();
45 });
46 }
47
48 return attemptRetry();
49 };
50
51 return this;
52}
53
54
55/**
56 * HACK: Resets the internal state of a request.
57 */
58
59function reset (request, timeout) {
60 var headers = request.req._headers;
61 var path = request.req.path;
62
63 request.req.abort();
64 request.called = false;
65 request.timeout(timeout);
66 delete request.req;
67 delete request._timer;
68
69 for (var k in headers) {
70 request.set(k, headers[k]);
71 }
72
73 if (!request.qs) {
74 request.req.path = path;
75 }
76}
77
78
79/**
80 * Determine whether we should retry based upon common error conditions
81 * @param {Error} err
82 * @param {Response} res
83 * @return {Boolean}
84 */
85
86function shouldRetry (err, res) {
87 return retries.some(function (check) { return check(err, res); });
88}