Library name
teeny-request
Versions
teeny-request 11.0.1 (also 10.x), node-fetch 3.3.2, Node.js 22.22.1
Description
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
const http = require('node:http')
const { teenyRequest } = require('teeny-request')
// The server accepts the request and never sends response headers.
const server = http.createServer(() => {})
server.listen(0, () => {
const url = `http://127.0.0.1:${server.address().port}/`
const startedAt = 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).
Library name
teeny-request
Versions
teeny-request 11.0.1 (also 10.x), node-fetch 3.3.2, Node.js 22.22.1
Description
requestToFetchOptionscopiesreqOpts.timeoutinto thenode-fetchoptions.node-fetch3 removed thetimeoutoption, 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
timeoutto teeny-request. For example,@google-cloud/storagesetstimeout: 60000as 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
Output with teeny-request 11.0.1 (node-fetch 3.3.2):
Output with teeny-request 9.0.0 (node-fetch 2.7.0):
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)tofetch. 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/storagedownload never errors).