|
| 1 | +# Changelog |
1 | 2 |
|
2 | | -### 2026-05-26 |
| 3 | +The format is based on [Keep a Changelog](https://keepachangelog.com/). |
3 | 4 |
|
4 | | -- client/udp.js refactors |
5 | | - 1. Mismatched ids are dropped and the listener keeps waiting — stray packets no longer crash the process. |
6 | | - 2. Sender filtering. Reject any packet whose rinfo.port isn't the configured resolver port; additionally enforce rinfo.address when dns is an IP literal (using net.isIP). |
7 | | - 3. Defensive Packet.parse. Wrapped in try/catch so a malformed stray packet doesn't reject the promise — it's dropped with a debug log. |
8 | | - 4. Timeout. New timeout option (default 10s, set 0 to disable). On expiry the promise rejects with code: 'ETIMEDOUT'. Timer is .unref()-ed so it never holds the event loop open. |
9 | | - 5. Full 16-bit transaction IDs. query.header.id = crypto.randomInt(0x10000), 6.5× the keyspace and uses a CSPRNG. |
10 | | - 6. Proper cleanup. Single cleanup() clears the timer, removes both listeners, and closes the socket; settled guard prevents double-resolve/reject from racing message + timeout. |
11 | | - 7. Error event handled. Socket errors now reject the promise instead of going unhandled. |
| 5 | +### Unreleased |
12 | 6 |
|
| 7 | +- test: split tests into 3 files, add 45 new tests |
| 8 | +- feat(client/doh): HTTP/2 transport #89 |
| 9 | +- feat(client/tcp): DNS-over-TLS support #88 |
| 10 | +- feat(packet): IPv6 subnet support in `EDNS.ECS.decode` |
| 11 | +- feat(client/udp): configurable `timeout` (default 10s, `0` disables); rejects with `ETIMEDOUT` |
| 12 | +- fix(client/udp): drop mismatched-id packets instead of crashing |
| 13 | +- fix(client/udp): reject packets from non-resolver senders (port + IP literal via `net.isIP`) |
| 14 | +- fix(client/udp): defensive `Packet.parse` — malformed strays are dropped, not rejected |
| 15 | +- fix(client/udp): full 16-bit transaction ids via `crypto.randomInt` |
| 16 | +- fix(client/udp): single cleanup with settled-guard; socket `error` is handled |
| 17 | +- fix(client/tcp): empty response when server reply is async |
| 18 | +- fix(client/doh): enforce RFC 8484 `dns` query parameter, drop invalid pathname auto-completion #95 |
| 19 | +- fix(server/udp): more resilient `udp4` default |
| 20 | +- fix(packet): guard against ERR_BUFFER_OUT_OF_BOUNDS on malformed requests |
| 21 | +- change(api): `resolve()` and UDP client take an options object (was `clientIp` positional) #84 |
| 22 | +- dep(eslint): upgrade to v10 |
| 23 | +- ci: modernize GitHub Actions workflows; add release.yml |
| 24 | + |
| 25 | +### 2.1.0 - 2024-06-26 |
| 26 | + |
| 27 | +- feat(packet): DNSKEY record support |
| 28 | +- feat(packet): RRSIG record support (decode only) |
| 29 | +- feat(packet): `flatMap` support |
| 30 | +- fix(packet): ensure compressed IPv6 is valid #70 |
| 31 | +- doc(README): correct `server.listen` options |
0 commit comments