Skip to content

Commit 733e1f2

Browse files
committed
request timeout for fetch
1 parent bb35686 commit 733e1f2

4 files changed

Lines changed: 18 additions & 18 deletions

File tree

lib/helper/GraphQL.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,11 @@ class GraphQL extends Helper {
8989
this.debugSection('Request', JSON.stringify(request))
9090

9191
let response
92-
const controller = new AbortController()
93-
const id = setTimeout(() => controller.abort(), timeout)
94-
9592
const url = request.url ? (request.baseURL ? request.baseURL + request.url : request.url) : request.baseURL
9693
const fetchOptions = {
9794
method: request.method || 'POST',
9895
headers: request.headers || {},
99-
signal: controller.signal,
96+
signal: AbortSignal.timeout(timeout),
10097
}
10198

10299
if (request.data) {
@@ -111,7 +108,6 @@ class GraphQL extends Helper {
111108

112109
try {
113110
const fetchResponse = await fetch(url, fetchOptions)
114-
clearTimeout(id)
115111

116112
const headers = {}
117113
fetchResponse.headers.forEach((value, key) => {
@@ -143,8 +139,7 @@ class GraphQL extends Helper {
143139
this.debugSection('Response', `Response error. Status code: ${fetchResponse.status}`)
144140
}
145141
} catch (err) {
146-
clearTimeout(id)
147-
if (err.name === 'AbortError') {
142+
if (err.name === 'TimeoutError' || err.name === 'AbortError') {
148143
throw new Error(`Request timed out after ${timeout}ms`)
149144
}
150145
throw err

lib/helper/REST.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ class REST extends Helper {
182182

183183
const _debugRequest = { ...request }
184184
const timeout = request.timeout || this.options.timeout
185+
request.timeout = timeout
185186

186187
if (this.headers && this.headers.auth) {
187188
request.auth = this.headers.auth
@@ -227,14 +228,11 @@ class REST extends Helper {
227228
}
228229

229230
let response
230-
const controller = new AbortController()
231-
const id = setTimeout(() => controller.abort(), timeout)
232-
233231
const url = request.url ? (request.baseURL ? request.baseURL + request.url : request.url) : request.baseURL
234232
const fetchOptions = {
235233
method: request.method || 'GET',
236234
headers: request.headers || {},
237-
signal: controller.signal,
235+
signal: AbortSignal.timeout(timeout),
238236
}
239237

240238
if (request.data) {
@@ -258,7 +256,6 @@ class REST extends Helper {
258256

259257
try {
260258
const fetchResponse = await fetch(url, fetchOptions)
261-
clearTimeout(id)
262259

263260
const headers = {}
264261
fetchResponse.headers.forEach((value, key) => {
@@ -294,8 +291,7 @@ class REST extends Helper {
294291
}
295292
}
296293
} catch (err) {
297-
clearTimeout(id)
298-
if (err.name === 'AbortError') {
294+
if (err.name === 'TimeoutError' || err.name === 'AbortError') {
299295
throw new Error(`Request timed out after ${timeout}ms`)
300296
}
301297
throw err

lib/test-server.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ class TestServer {
125125
res.json(req.headers)
126126
})
127127

128+
this.app.get('/timeout', (req, res) => {
129+
const ms = parseInt(req.query.ms) || 5000
130+
setTimeout(() => res.json({ message: 'done' }), ms)
131+
})
132+
128133
this.app.post('/headers', (req, res) => {
129134
res.json(req.headers)
130135
})

test/rest/REST_test.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,14 @@ describe('REST', () => {
129129
response.data.name.should.eql('Vasya')
130130
})
131131

132-
it('should set timeout for the request', async () => {
133-
await I.setRequestTimeout(2000)
134-
const response = await I.sendGetRequest('/posts')
135-
response.config.timeout.should.eql(2000)
132+
it('should throw error when request times out', async () => {
133+
await I.setRequestTimeout(100)
134+
try {
135+
await I.sendGetRequest('/timeout?ms=500')
136+
throw new Error('Should have timed out')
137+
} catch (e) {
138+
e.message.should.contain('Request timed out after 100ms')
139+
}
136140
})
137141
})
138142

0 commit comments

Comments
 (0)