You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
teeny-request: the timeout option is ignored since 10.0.0 (node-fetch 3 has no timeout option) #9514
requestToFetchOptions copies reqOpts.timeout into the node-fetch options. node-fetch 3 removed the timeout option, so the value is silently ignored, and a request to a server that never responds waits forever.
This is a regression from teeny-request 10.0.0, which moved from node-fetch 2 to node-fetch 3. With teeny-request 9.0.0 (node-fetch 2.7.0), the same request fails after the timeout.
It affects every library that passes timeout to teeny-request. For example, @google-cloud/storage sets timeout: 60000 as a default for all requests (nodejs-common/util.js). Since storage 8.0.1, which depends on teeny-request ^11, that timeout has no effect.
Reproduction
consthttp=require('node:http')const{ teenyRequest }=require('teeny-request')// The server accepts the request and never sends response headers.constserver=http.createServer(()=>{})server.listen(0,()=>{consturl=`http://127.0.0.1:${server.address().port}/`conststartedAt=Date.now()teenyRequest({uri: url,timeout: 1000},(err)=>{console.log(`callback after ${Date.now()-startedAt} ms:`,err?.message)process.exit(0)})setTimeout(()=>{console.log(`no callback after ${Date.now()-startedAt} ms`)process.exit(1)},5000)})
Output with teeny-request 11.0.1 (node-fetch 3.3.2):
no callback after 5010 ms
Output with teeny-request 9.0.0 (node-fetch 2.7.0):
callback after 1003 ms: network timeout at: http://127.0.0.1:50922/
Expected behavior
The request fails after about 1000 ms, as it does with teeny-request 9.x.
One possible fix is to pass signal: AbortSignal.timeout(reqOpts.timeout) to fetch. That limits the total request time, which would cut off long streaming downloads, so streaming requests may need a socket idle timeout on the agent instead. In node-fetch 2, the timeout stopped at the response headers for a streamed body.
Related: #9515 (a stalled @google-cloud/storage download never errors).
Activity