Give up a connect after connectTimeout instead of waiting the OS out
Mirror / push (push) Successful in 4s
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 22s
Test / test (20) (pull_request) Successful in 18s
Test / test (22) (pull_request) Successful in 18s
Test / test (24) (pull_request) Successful in 19s
Test / test (26) (pull_request) Successful in 27s

This commit is contained in:
2026-09-20 00:42:09 +02:00
parent d874448273
commit 17447bbe3a
8 changed files with 175 additions and 33 deletions
+5 -10
View File
@@ -179,16 +179,11 @@ the rewrite, for a dependency added later. Maintainer's call, 2026-09-14.
## Worth doing, not blocking
- [ ] **Give up a connect after `connectTimeout` instead of waiting the OS out.** `openSocket()` in
`client.ts` settles only on `connect`/`secureConnect`, a socket `error`, or the caller's
`signal`, and `reconnect-loop.ts` times nothing but its backoff — so a host that drops SYNs
stalls every attempt for the OS TCP timeout, around 130 s on Linux at the default
`tcp_syn_retries`, and `reconnect.fromStart` cannot retry what never returns. The option aborts
the socket and returns the ordinary connect failure; absent, the wait stays exactly 0.5.0's, so
a call passing no options is unchanged (goal 6). Whether a later major makes it a default is
the open half. Found comparing 0.5.0 with the seven `larvitsmpp` forks, 2026-09-20 —
[SwiftHero/larvitsmpp](https://github.com/SwiftHero/larvitsmpp) added a 10 s connect timeout in
2017, and it is the one fork change with no equivalent here.
- [ ] **Decide whether a later major gives `connectTimeout` a default.** The option ships absent, so
a call passing none waits the OS out as 0.5.0 did — the half the option deliberately left open.
A default is a breaking change for anyone relying on that wait, and the minor is the breaking
unit until 1.0.0. Needs a number an operator would recognise, where SwiftHero's fork picked
10 s.
- [ ] **A send the codec will refuse waits for a link and a window slot first.** `refuse()` in
`outgoing-requests.ts` runs `misuse()` and the abort check before the wait, precisely so a call