diff options
author | Yoshiya Hinosawa <stibium121@gmail.com> | 2024-09-08 12:22:18 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-08 12:22:18 +0900 |
commit | ce1d668929a91da2dc204f6bcc53afd5173c0a33 (patch) | |
tree | 2f240019e47fe3166e5f369c5aa36f1023313158 /ext/node/polyfills/internal_binding/tcp_wrap.ts | |
parent | 30687c786c37090ac0e4e2c3824b1b5cf313599f (diff) |
fix(ext/node): delay accept() call 2 ticks in net.Server#listen (#25481)
A workaround for the issue #25480
`Deno.Listener` can't be closed synchronously after `accept()` is
called. This PR delays the `accept` call 2 ticks (The listener callback
is called 1 tick later. So the 1 tick delay is not enough), and makes
`net.Server` capable of being closed synchronously.
This unblocks `npm:detect-port` and `npm:portfinder`
closes #18301
closes #25175
Diffstat (limited to 'ext/node/polyfills/internal_binding/tcp_wrap.ts')
-rw-r--r-- | ext/node/polyfills/internal_binding/tcp_wrap.ts | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/ext/node/polyfills/internal_binding/tcp_wrap.ts b/ext/node/polyfills/internal_binding/tcp_wrap.ts index 9897bccd0..4b57a7e1e 100644 --- a/ext/node/polyfills/internal_binding/tcp_wrap.ts +++ b/ext/node/polyfills/internal_binding/tcp_wrap.ts @@ -45,6 +45,7 @@ import { INITIAL_ACCEPT_BACKOFF_DELAY, MAX_ACCEPT_BACKOFF_DELAY, } from "ext:deno_node/internal_binding/_listen.ts"; +import { nextTick } from "ext:deno_node/_next_tick.ts"; /** The type of TCP socket. */ enum socketType { @@ -228,7 +229,14 @@ export class TCP extends ConnectionWrap { this.#port = address.port; this.#listener = listener; - this.#accept(); + + // TODO(kt3k): Delays the accept() call 2 ticks. Deno.Listener can't be closed + // synchronously when accept() is called. By delaying the accept() call, + // the user can close the server synchronously in the callback of listen(). + // This workaround enables `npm:detect-port` to work correctly. + // Remove these nextTick calls when the below issue resolved: + // https://github.com/denoland/deno/issues/25480 + nextTick(nextTick, () => this.#accept()); return 0; } |