Skip to content

Commit 99a2476

Browse files
expose abort function
1 parent 04b3e6c commit 99a2476

File tree

2 files changed

+94
-6
lines changed

2 files changed

+94
-6
lines changed

index.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ function retryRequest(requestOpts, opts, callback) {
4141

4242
if (streamMode) {
4343
retryStream = through();
44+
retryStream.abort = resetStreams;
4445
}
4546

4647
makeRequest();
@@ -51,8 +52,11 @@ function retryRequest(requestOpts, opts, callback) {
5152

5253
function resetStreams() {
5354
cacheStream = null;
54-
requestStream.abort();
55-
requestStream.destroy();
55+
56+
if (requestStream) {
57+
requestStream.abort();
58+
requestStream.destroy();
59+
}
5660
}
5761

5862
function makeRequest() {
@@ -62,7 +66,7 @@ function retryRequest(requestOpts, opts, callback) {
6266
cacheStream = new StreamCache();
6367
requestStream = opts.request(requestOpts);
6468

65-
streamForward(requestStream)
69+
streamForward(requestStream, { events: ['response', 'complete'] })
6670
.on('error', onResponse)
6771
.on('response', onResponse.bind(null, null))
6872
.pipe(cacheStream);
@@ -97,8 +101,8 @@ function retryRequest(requestOpts, opts, callback) {
97101
// No more attempts need to be made, just continue on.
98102
if (streamMode) {
99103
streamForward(cacheStream)
100-
.on('error', resetStreams)
101-
.pipe(retryStream);
104+
.pipe(retryStream)
105+
.on('error', resetStreams);
102106
} else {
103107
callback(err, response, body);
104108
}

test.js

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
var assert = require('assert');
44
var retryRequest = require('./index.js');
5+
var through = require('through2');
56

67
describe('retry-request', function () {
78
var URI_404 = 'http://yahoo.com/theblahstore';
@@ -29,6 +30,89 @@ describe('retry-request', function () {
2930
done();
3031
});
3132
});
33+
34+
it('exposes an `abort` fuction to match request', function (done) {
35+
var retryStream = retryRequest(URI_NON_EXISTENT);
36+
37+
retryStream.on('error', function () {
38+
assert.equal(typeof retryStream.abort, 'function');
39+
done();
40+
});
41+
});
42+
43+
it('works on the last attempt', function (done) {
44+
var numAborts = 0;
45+
var numAttempts = 0;
46+
47+
var opts = {
48+
request: function () {
49+
numAttempts++;
50+
51+
var fakeRequestStream = through();
52+
fakeRequestStream.abort = function () {
53+
numAborts++;
54+
};
55+
56+
var response = numAttempts < 3 ? { statusCode: 503 } : { statusCode: 200 };
57+
setImmediate(function () {
58+
fakeRequestStream.emit('response', response);
59+
60+
setImmediate(function () {
61+
// They all emit 'complete', but the user's stream should only get
62+
// the last one.
63+
fakeRequestStream.emit('complete', numAttempts);
64+
});
65+
});
66+
67+
return fakeRequestStream;
68+
}
69+
};
70+
71+
retryRequest(URI_404, opts)
72+
.on('error', done)
73+
.on('complete', function (numAttempts) {
74+
assert.strictEqual(numAborts, 2);
75+
assert.deepEqual(numAttempts, 3);
76+
done();
77+
});
78+
});
79+
80+
it('never succeeds', function (done) {
81+
var numAborts = 0;
82+
var numAttempts = 0;
83+
84+
var opts = {
85+
request: function () {
86+
numAttempts++;
87+
88+
var fakeRequestStream = through();
89+
fakeRequestStream.abort = function () {
90+
numAborts++;
91+
};
92+
93+
var response = { statusCode: 503 };
94+
setImmediate(function () {
95+
fakeRequestStream.emit('response', response);
96+
97+
setImmediate(function () {
98+
// They all emit 'complete', but the user's stream should only get
99+
// the last one.
100+
fakeRequestStream.emit('complete', numAttempts);
101+
});
102+
});
103+
104+
return fakeRequestStream;
105+
}
106+
};
107+
108+
retryRequest(URI_404, opts)
109+
.on('error', done)
110+
.on('complete', function (numAttempts) {
111+
assert.strictEqual(numAborts, 2);
112+
assert.strictEqual(numAttempts, 3);
113+
done();
114+
});
115+
});
32116
});
33117

34118
describe('callbacks', function () {
@@ -59,7 +143,7 @@ describe('retry-request', function () {
59143
var shouldRetryFnCalled = false;
60144

61145
var opts = {
62-
retries: 1, // so that our retry function is only called once and
146+
retries: 1, // so that our retry function is only called once
63147

64148
shouldRetryFn: function () {
65149
shouldRetryFnCalled = true;

0 commit comments

Comments
 (0)