Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Leak and very long hanging when fetch throws ConnectTimeoutError(UND_ERR_CONNECT_TIMEOUT) #2362

Open
nikelborm opened this issue Oct 21, 2023 · 35 comments

Comments

@nikelborm
Copy link
Contributor

nikelborm commented Oct 21, 2023

Version

v21.0.0

Platform

Linux archhost 6.5.7-arch1-1 nodejs/node#1 SMP PREEMPT_DYNAMIC Tue, 10 Oct 2023 21:10:21 +0000 x86_64 GNU/Linux

Subsystem

No response

What steps will reproduce the bug?

  1. pull https://github.com/nikelborm/fetch_timeout_poc
  2. enable wifi and connect to network with internet
  3. connect to wireguard vpn with sending all trafic through this vpn server
  4. disable wifi
  5. run npm start

index.js

"use strict";

const startedAt = Date.now();
console.log('started fetch at: ', new Date(startedAt));

try {
  await fetch('https://jsonplaceholder.typicode.com/todos/1');
} catch (error) {
  console.log(error);
}

const finishedAt = Date.now();
console.log('finished fetch at: ', new Date(finishedAt))

console.log(`fetch took ${finishedAt - startedAt} ms`)

console.log('timestamp when script should finish: ', Date.now())

package.json

{
  "name": "poc",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "start": "node index.js; node -e \"console.log('timestamp when script actually finished: ', Date.now())\""
  }
}

How often does it reproduce? Is there a required condition?

It reproduces every time with described network configuration. No other condition. Same behavior in node v20.7.0 and v18.18.0

What is the expected behavior? Why is that the expected behavior?

Fetch waits 10 seconds, throws error UND_ERR_CONNECT_TIMEOUT. Then script exits immediately after it completed. Difference between timestamp when script should finish and timestamp when script actually finished should be near zero.

What do you see instead?

Fetch is being executed as expected. It kills itself after about 10 seconds and then returns control back to the script.
But the problem is that something in the background is still blocking node.js and does not allow process to exit. It just hangs waiting for something to be finished even if the script was completed.

started fetch at:  2023-10-21T00:37:09.239Z
TypeError: fetch failed
    at Object.fetch (node:internal/deps/undici/undici:11372:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async file:///home/nikel/projects/alarm/index.js:7:3 {
  cause: _ConnectTimeoutError: Connect Timeout Error
      at onConnectTimeout (node:internal/deps/undici/undici:6616:28)
      at node:internal/deps/undici/undici:6574:50
      at Immediate._onImmediate (node:internal/deps/undici/undici:6605:13)
      at process.processImmediate (node:internal/timers:478:21) {
    code: 'UND_ERR_CONNECT_TIMEOUT'
  }
}
finished fetch at:  2023-10-21T00:37:19.391Z
fetch took 10152 ms
timestamp when script should finish:  1697848639391
timestamp when script actually finished:  1697848749482

After all code in the script been executed it takes 110 seconds (1697848749482 - 1697848639391 = 110091) to exit from process.

But enabling wifi back (restoring internet connection) during process's hanging (after the moment fetch already failed and logged error) magically speeds up exit from process.

Additional information

Running completely offline

If we skip 2-3 steps and just run script offline we get other kind of error and expected behavior.

Following is being printed to console:

started fetch at:  2023-10-21T00:54:31.085Z
TypeError: fetch failed
    at Object.fetch (node:internal/deps/undici/undici:11372:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async file:///home/nikel/projects/alarm/index.js:7:3 {
  cause: Error: getaddrinfo EAI_AGAIN jsonplaceholder.typicode.com
      at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:118:26) {
    errno: -3001,
    code: 'EAI_AGAIN',
    syscall: 'getaddrinfo',
    hostname: 'jsonplaceholder.typicode.com'
  }
}
finished fetch at:  2023-10-21T00:54:31.250Z
fetch took 165 ms
timestamp when script should finish:  1697849671250
timestamp when script actually finished:  1697849671310

Difference between timestamp when script should finish and timestamp when script actually finished is 60 ms what is fine.

Running online

If we skip 4 step and just run script online we get no errors and expected behavior.

Following is being printed to console:

started fetch at:  2023-10-21T00:58:19.347Z
finished fetch at:  2023-10-21T00:58:19.995Z
fetch took 648 ms
timestamp when script should finish:  1697849899995
timestamp when script actually finished:  1697849900162

Difference between timestamp when script should finish and timestamp when script actually finished is 167 ms what also seems fine.

Running using node-fetch with described network configuration

If we install node-fetch with npm i node-fetch and then import it in the beginning using import fetch from 'node-fetch'; it will replace original fetch and will give us different behavior:

started fetch at:  2023-10-21T01:48:05.984Z
FetchError: request to https://jsonplaceholder.typicode.com/todos/1 failed, reason: getaddrinfo EAI_AGAIN jsonplaceholder.typicode.com
    at ClientRequest.<anonymous> (file:///home/nikel/projects/alarm/node_modules/node-fetch/src/index.js:108:11)
    at ClientRequest.emit (node:events:517:28)
    at TLSSocket.socketErrorListener (node:_http_client:501:9)
    at TLSSocket.emit (node:events:517:28)
    at emitErrorNT (node:internal/streams/destroy:151:8)
    at emitErrorCloseNT (node:internal/streams/destroy:116:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  type: 'system',
  errno: 'EAI_AGAIN',
  code: 'EAI_AGAIN',
  erroredSysCall: 'getaddrinfo'
}
finished fetch at:  2023-10-21T01:50:06.143Z
fetch took 120159 ms
timestamp when script should finish:  1697853006143
timestamp when script actually finished:  1697853006236

When fetch from node-fetch fails, it logs last few lines to console and script exits immediately. Difference between timestamp when script should finish and timestamp when script actually finished is 93 ms what also seems fine.

The interesting thing is that fetch from node-fetch throws the same error as error thrown by original fetch when vpn disabled and notebook completely offline.

fetch from node-fetch returns control after 120 seconds. Original fetch returns control after 10 seconds and then hangs in the background 110 seconds. Looks very suspicious (120 == 110 + 10).

@nikelborm nikelborm changed the title Leak and very long hanging when fetch throws ConnectTimeoutError(UND_ERR_CONNECT_TIMEOUT) Leak and very long hanging when fetch throws ConnectTimeoutError(UND_ERR_CONNECT_TIMEOUT) Oct 21, 2023
@bnoordhuis
Copy link
Member

Thanks for the bug report. Sanity check: does it finish more quickly when you start node with --no-network-family-autoselection?

@nikelborm
Copy link
Contributor Author

nikelborm commented Oct 21, 2023

No, it does not. With --no-network-family-autoselection flag I see the same behavior as described in What do you see instead?.

$ node --no-network-family-autoselection index.js; node -e "console.log('timestamp when script actually finished: ', Date.now())"

started fetch at:  2023-10-21T10:52:18.375Z
TypeError: fetch failed
    at Object.fetch (node:internal/deps/undici/undici:11372:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async file:///home/nikel/projects/fetch_timeout_poc/index.js:7:3 {
  cause: _ConnectTimeoutError: Connect Timeout Error
      at onConnectTimeout (node:internal/deps/undici/undici:6616:28)
      at node:internal/deps/undici/undici:6574:50
      at Immediate._onImmediate (node:internal/deps/undici/undici:6605:13)
      at process.processImmediate (node:internal/timers:478:21) {
    code: 'UND_ERR_CONNECT_TIMEOUT'
  }
}
finished fetch at:  2023-10-21T10:52:28.450Z
fetch took 10075 ms
timestamp when script should finish:  1697885548451
timestamp when script actually finished:  1697885658477

1697885658477 - 1697885548451 = 110026 ms
fetch returns control after 10 sec timeout and then happens 110 seconds delay until process finally exits.

Same results with --enable-network-family-autoselection also.

@bnoordhuis
Copy link
Member

cc @nodejs/undici

@nikelborm
Copy link
Contributor Author

nikelborm commented Oct 21, 2023

What cc @nodejs/undici means? Do I need to reopen this report in nodejs/undici github repo?

@ronag
Copy link
Member

ronag commented Oct 21, 2023

@nikelborm
Copy link
Contributor Author

nikelborm commented Oct 21, 2023

I don't think it related to garbage collection.
Both scripts below give the same results and behave as previously described.

Here I ignore the body as recommended in link you provided:

"use strict";

const startedAt = Date.now();
console.log('started fetch at: ', new Date(startedAt));

try {
  await fetch('https://jsonplaceholder.typicode.com/todos/1', { method: 'HEAD' });
} catch (error) {
  console.log(error);
}

const finishedAt = Date.now();
console.log('finished fetch at: ', new Date(finishedAt))

console.log(`fetch took ${finishedAt - startedAt} ms`)

console.log('timestamp when script should finish: ', Date.now())

Here I added code to work with body as recommended in link you provided, but this code will never be reached:

"use strict";

const startedAt = Date.now();
console.log('started fetch at: ', new Date(startedAt));

try {
  const res = await fetch('https://jsonplaceholder.typicode.com/todos/1');
  const data = await res.json();
  console.log(data);
} catch (error) {
  console.log(error);
}

const finishedAt = Date.now();
console.log('finished fetch at: ', new Date(finishedAt))

console.log(`fetch took ${finishedAt - startedAt} ms`)

console.log('timestamp when script should finish: ', Date.now())

@nikelborm
Copy link
Contributor Author

It fails before I can get any access to any data at all. Fetch fails itself. It does not return anything.

@nikelborm
Copy link
Contributor Author

Manually calling garbage collector also does not change anything

"use strict";

const startedAt = Date.now();
console.log('started fetch at: ', new Date(startedAt));

try {
  await fetch('https://jsonplaceholder.typicode.com/todos/1');
} catch (error) {
  console.log(error);
}
global.gc();
const finishedAt = Date.now();
console.log('finished fetch at: ', new Date(finishedAt))

console.log(`fetch took ${finishedAt - startedAt} ms`)

console.log('timestamp when script should finish: ', Date.now())
$ node --expose-gc index.js; node -e "console.log('timestamp when script actually finished: ', Date.now())"

started fetch at:  2023-10-21T13:23:37.371Z
TypeError: fetch failed
    at Object.fetch (node:internal/deps/undici/undici:11372:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async file:///home/nikel/projects/fetch_timeout_poc/index.js:7:3 {
  cause: _ConnectTimeoutError: Connect Timeout Error
      at onConnectTimeout (node:internal/deps/undici/undici:6616:28)
      at node:internal/deps/undici/undici:6574:50
      at Immediate._onImmediate (node:internal/deps/undici/undici:6605:13)
      at process.processImmediate (node:internal/timers:478:21) {
    code: 'UND_ERR_CONNECT_TIMEOUT'
  }
}
finished fetch at:  2023-10-21T13:23:47.488Z
fetch took 10117 ms
timestamp when script should finish:  1697894627488
timestamp when script actually finished:  1697894737556

1697894737556 - 1697894627488 = 110068

The problem is not in the fact that it throws error. The problem is that fetch after throwing an error keeps doing some stuff in the background.

@ronag

This comment has been minimized.

@nikelborm

This comment was marked as resolved.

@ronag
Copy link
Member

ronag commented Oct 21, 2023

@KhafraDev

@KhafraDev
Copy link
Member

does this happen with undici.request? Also, is there a repro that doesn't require a VPN/disabling wifi?

@nikelborm
Copy link
Contributor Author

After I installed undici, undici's request behaves the same.

"use strict";

import { request } from 'undici';

const startedAt = Date.now();
console.log('started request at: ', new Date(startedAt));

try {
  await request('https://jsonplaceholder.typicode.com/todos/1')
} catch (error) {
  console.log(error);
}

const finishedAt = Date.now();
console.log('finished request at: ', new Date(finishedAt))

console.log(`request took ${finishedAt - startedAt} ms`)

console.log('timestamp when script should finish: ', Date.now())
$ node index.js; node -e "console.log('timestamp when script actually finished: ', Date.now())"

started request at:  2023-10-21T13:58:09.244Z
ConnectTimeoutError: Connect Timeout Error
    at onConnectTimeout (/home/nikel/projects/fetch_timeout_poc/node_modules/undici/lib/core/connect.js:186:24)
    at /home/nikel/projects/fetch_timeout_poc/node_modules/undici/lib/core/connect.js:133:46
    at Immediate._onImmediate (/home/nikel/projects/fetch_timeout_poc/node_modules/undici/lib/core/connect.js:174:9)
    at process.processImmediate (node:internal/timers:478:21) {
  code: 'UND_ERR_CONNECT_TIMEOUT'
}
finished request at:  2023-10-21T13:58:19.294Z
request took 10050 ms
timestamp when script should finish:  1697896699294
timestamp when script actually finished:  1697896809347

1697896809347 - 1697896699294 = 110053

I am not a network engineer unfortunately, so my chances to create reproducible environment are low, but I'll do my best with docker-compose.

@KhafraDev KhafraDev transferred this issue from nodejs/node Oct 21, 2023
@metcoder95
Copy link
Member

Could it be the socket still refd and not cleared by then; anyhow is quite hard to reproduce and it kinda seems edgy; maybe if there's a way to reproduce it easily

@nikelborm
Copy link
Contributor Author

I wasn't lucky recently so I was not able to create reproducible environment with docker which you can easily deploy on your machine. But I'm open to run any steps you'll ask me to debug this, or schedule a meeting to figure it out.

@metcoder95
Copy link
Member

You can give it a try to why-is-node-running and you might have something; I would consider this mostly an edge case unless is easier to reproduce

@nikelborm
Copy link
Contributor Author

nikelborm commented Oct 26, 2023

I was able to reproduce it consistently in QEMU VMs. Previously I disabled wi-fi to get this error, but even that is not needed now. I just broke credentials a bit in wireguard config and basically got the same effect. JS script in vm always throws the same error with or without internet on the host machine. By the way in VM there is node v21.1.0 and it behaves same as v21.0.0 in context of this bug.

QEMU VM approach

  1. download compressed qemu vm disk image I've built after following steps from QEMU VM approach from scratch
  2. install zstd and qemu
  3. run zstd -d archlinux.qcow2.zst to decompress it on host
  4. create and run new QEMU vm in UEFI mode with mounted archlinux.qcow2 disk
  5. in vm login into root user with 0000 password
  6. in vm run cd fetch_timeout_poc/; npm start

QEMU VM approach from scratch

  1. install qemu
  2. download latest arch iso
  3. create and run new QEMU vm with mounted arch.iso in UEFI mode and set boot priority to booting from cd-rom first
  4. in vm when will options to boot from installation media be presented, choose the first one
  5. in vm run following commands one-by-one
    git clone https://github.com/nikelborm/fetch_timeout_poc.git;
    archinstall --silent --config ./fetch_timeout_poc/vm.archinstall.user_configuration.json --creds ./fetch_timeout_poc/vm.archinstall.user_credentials.json;
    reboot;
  6. in vm login into newly installed arch with root user and 0000 password
  7. in vm run following commands one-by-one
    touch .bashrc;
    echo '. .bashrc' > .profile;
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash;
    git clone https://github.com/nikelborm/fetch_timeout_poc.git;
    cp ./fetch_timeout_poc/vm.wg.conf /etc/wireguard/wg0.conf;
    . .bashrc;
    nvm list-remote;
    nvm i 21;
    systemctl enable [email protected];
    systemctl start [email protected];
    cd fetch_timeout_poc/;
    npm start

To copy files between vm and host:

  1. on receiving side run netcat -l -p 1234 > /destination.file
  2. on sending side run cat /source.file | netcat 192.168.___.___ 1234
  3. on sending side press Ctrl + C

To fix internet (make internet work fine) in vm run wg-quick down wg0
To break internet (return conditions where bug appears) in vm run wg-quick up wg0

@nikelborm
Copy link
Contributor Author

nikelborm commented Oct 26, 2023

@metcoder95
Also I've got some info from why-is-node-running. Here are logs after the moment fetch returned control back to code, but before the moment node exited (node for some reason keeps waiting for something).
With why-is-node-running i get the same traces in my host arch and in my arch vm.

Screenshot from 2023-10-26 06-54-46

@nikelborm
Copy link
Contributor Author

nikelborm commented Oct 26, 2023

Also, is there a repro that doesn't require a VPN/disabling wifi?
@KhafraDev

I don't know any other way to simulate such network environment. If we remove internet completely, fetch throws completely different error (getaddrinfo EAI_AGAIN jsonplaceholder.typicode.com). If we wont touch anything internet will work fine without any errors at all. So this is the only way I happened to find to reproduce the error.

I don't see options to reproduce it on the server because it's kinda stupid to break internet to make tests and immediately lose access to the machine after that

VM is a perfect candidate

@nikelborm
Copy link
Contributor Author

nikelborm commented Oct 26, 2023

Looking at the output of why-is-node-running I can make an assumption that this code probably hanging the process. Or maybe something else. Who knows... (not me certainly)

TLSWRAP from deps/undici/undici.js:6793

socket = tls.connect({
  highWaterMark: 16384,
  // TLS in node can't have bigger HWM anyway...
  ...options,
  servername,
  session,
  localAddress,
  // TODO(HTTP/2): Add support for h2c
  ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"],
  socket: httpSocket,
  // upgrade socket connection
  port: port || 443,
  host: hostname
});

DNSCHANNEL from dns/utils.js:80

  [kInitializeHandle](timeout, tries) {
    const { ChannelWrap } = lazyBinding();
    this._handle = new ChannelWrap(timeout, tries);
  }

@metcoder95
Copy link
Member

If you reduce the connectTimeout (timeout on the socket opts), does it has different outcome?

@nikelborm
Copy link
Contributor Author

Increasing timeout here from 10000 ms to 45000 ms, produces following results: ~45s of waiting, returning control back to the code, process hanging for ~75 seconds. Same 120 seconds of waiting

decreasing from 10000 to 5000, produces following results: ~5s of waiting, returning control back to the code, process hanging for ~115 seconds. Same 120 seconds of waiting.

@nikelborm
Copy link
Contributor Author

looks like the issue is much more interesting that it might seem.
Basically the problem is inside tls.connect

"use strict";
import { connect } from 'tls';
const startedAt = Date.now();
console.log('started fetch at: ', new Date(startedAt));

try {
const timeout = 2000; // ms
  const asd = connect({
    highWaterMark: 16384,
    path: undefined,
    servername: 'jsonplaceholder.typicode.com',
    session: null,
    localAddress: null,
    ALPNProtocols: [ 'http/1.1' ],
    socket: undefined,
    port: 443,
    host: 'jsonplaceholder.typicode.com'
  });
  asd.addListener('OCSPResponse', (...args) => console.log('OCSPResponse', ...args))
  asd.addListener('keylog', (...args) => console.log('keylog', ...args))
  asd.addListener('secureConnect', (...args) => console.log('secureConnect', ...args))
  asd.addListener('session', (...args) => console.log('session', ...args))
  asd.addListener('close', (...args) => console.log('close', ...args))
  asd.addListener('connect', (...args) => console.log('connect', ...args))
  asd.addListener('data', (...args) => console.log('data', ...args))
  asd.addListener('drain', (...args) => console.log('drain', ...args))
  asd.addListener('end', (...args) => console.log('end', ...args))
  asd.addListener('error', (...args) => console.log('error', ...args))
  asd.addListener('lookup', (...args) => console.log('lookup', ...args))
  asd.addListener('ready', (...args) => console.log('ready', ...args))
  asd.addListener('timeout', (...args) => console.log('timeout', ...args))
  setTimeout(() => {
    asd.destroy();
    // asd.drop()
    // asd.resetAndDestroy();
    //   asd.unref()
    //   asd.emit('close', true)
    //   asd.emit('error', true)
    //   asd.emit('drain', true)
    //   asd.emit('close', true)
  }, timeout)
} catch (error) {
  console.log(error);
}

const finishedAt = Date.now();
console.log('finished fetch at: ', new Date(finishedAt))

console.log(`fetch took ${finishedAt - startedAt} ms`)

console.log('timestamp when script should finish: ', Date.now())

I made few experiments in undici code and found that everything fine there
when timeout happened, it tries to destroy the socket but that does not lead to anything.

There is currently no way to finish tls socket that stuck in resolving domain. it simply ignores call of destroy() method or resetAndDestroy()

@metcoder95
Copy link
Member

Then I would assume this is somehow expected; replicating this in local without network interruptions it usually results in extra 2s of waiting. I'm betting this has to do with a combination of several factors:

  1. It flushes to the fd whatever is buffered before closing the connection
  2. The TCP termination is a 4 way handshake. Initiator sends FIN packet (possibly followed by buffered data), recipient receives and signals the app and sends back a FIN packet (also possibly followed by buffered data), then initiator sends back FIN-ACK, and waits for recipient to sent back FIN-ACK.

If you add network interruption, the initiator will send a first FIN packet, and wait for a FIN-ACK until a timeout occurs (which it seems to be what's happening).

@volfcan
Copy link

volfcan commented Dec 21, 2023

downgrading node version with nvm solved for me

@waldi
Copy link

waldi commented Feb 20, 2024

downgrading node version with nvm solved for me

to which version?

@yourmoonlight
Copy link

Hi guys, got same problem here, how to solve this?

@mcollina
Copy link
Member

update to latest undici, it should solve this.

@75lb
Copy link

75lb commented Aug 24, 2024

I think I'm experiencing the same issue. Running this single statement on Node v22.6.0 with zero dependencies installed throws The operation was aborted due to timeout as expected yet continues to keep the node process hanging for 30 seconds.

await fetch('https://registry.npmjs.orgBROKEN/', { signal: AbortSignal.timeout(500) })

The fetch was intentionally aborted by the user (me) - therefore, the expected behaviour is for the node process to complete, not hang.

@Uzlopak
Copy link
Contributor

Uzlopak commented Aug 24, 2024

I will have a look at it.

@Uzlopak
Copy link
Contributor

Uzlopak commented Aug 25, 2024

@75lb I can not reporduce this.

@75lb
Copy link

75lb commented Aug 25, 2024

Odd.. Here is my reproduction code, literally a one-liner in an empty directory.

I'm on mac OS 14.6.1 using iTerm2. More version details in this screen, in the time output you can see the real duration was ~30s.

Screenshot 2024-08-25 at 21 34 21

@metcoder95
Copy link
Member

As @Uzlopak, cannot reproduce it. Request is aborted and connection terminated after the AbortSignal.timeout expires.

@75lb
Copy link

75lb commented Nov 12, 2024

Odd.. Here is my reproduction code, literally a one-liner in an empty directory.

Just out of curiosity, I re-tried my reproducation case - I was unable to reproduce the issue in Node v23.1, 22.11 and 22.7 (the version which failed, previously). I now see this immediate error (instead of the 30s timeout mentioned before):

$ node index.mjs
node:internal/deps/undici/undici:13392
      Error.captureStackTrace(err);
            ^

TypeError: fetch failed
    at node:internal/deps/undici/undici:13392:13
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async file:///Users/lloyd/Documents/tmp/undici-issue-2362/index.mjs:1:1 {
  [cause]: Error: getaddrinfo ENOTFOUND registry.npmjs.orgbroken
      at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:120:26) {
    errno: -3008,
    code: 'ENOTFOUND',
    syscall: 'getaddrinfo',
    hostname: 'registry.npmjs.orgbroken'
  }
}

Node.js v23.1.0

Since first raising the issue in August, the only things that have changed are upgrading macOS and changing Wifi network. So, I'm still not clear what the root cause of my previous timeout issue was..

@jeffreys-cat
Copy link

Have the same problem, in the nextjs13.5/nextjs14, i got

TypeError: fetch failed
    at node:internal/deps/undici/undici:12618:11
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runNextTicks (node:internal/process/task_queues:64:3)
    at process.processImmediate (node:internal/timers:447:9)
    at process.callbackTrampoline (node:internal/async_hooks:128:17) {
  cause: ConnectTimeoutError: Connect Timeout Error
      at onConnectTimeout (node:internal/deps/undici/undici:7760:28)
      at node:internal/deps/undici/undici:7716:50
      at Immediate._onImmediate (node:internal/deps/undici/undici:7748:13)
      at process.processImmediate (node:internal/timers:476:21)
      at process.callbackTrampoline (node:internal/async_hooks:128:17) {
    code: 'UND_ERR_CONNECT_TIMEOUT'
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests