From 37157f7291feacd5830cd04b40ac7e3e1499e1b2 Mon Sep 17 00:00:00 2001 From: Victor Adossi Date: Mon, 24 Aug 2026 16:24:21 +0000 Subject: [PATCH] fix(p2-shim): correct TCP socket state transitions --- .../preview2-shim/src/io/worker-socket-tcp.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/preview2-shim/src/io/worker-socket-tcp.ts b/packages/preview2-shim/src/io/worker-socket-tcp.ts index 7ca8381ee..76a9c42af 100644 --- a/packages/preview2-shim/src/io/worker-socket-tcp.ts +++ b/packages/preview2-shim/src/io/worker-socket-tcp.ts @@ -9,7 +9,6 @@ import { pollStateReady, verifyPollsDroppedForDrop, } from "./worker-thread.js"; -import process from "node:process"; import { convertSocketError, ipSocketAddress, @@ -31,8 +30,6 @@ import { import { Server, Socket as TcpSocket } from "node:net"; import { IpSocketAddress } from "../../types/interfaces/wasi-sockets-network.js"; -const win = process.platform === "win32"; - interface PendingAccept { tcpSocket: TcpSocket | null; err: Error | null; @@ -89,7 +86,15 @@ export function socketTcpFinish(id: number, fromState, toState) { futureDispose(socket.future, false); socket.future = null; if (tag === "err") { - socket.state = SOCKET_STATE_CLOSED; + // A failed bind does not consume the socket. In particular, callers may + // retry after `address-in-use` with another address or port. + if (fromState === SOCKET_STATE_BIND) { + socket.server = null; + socket.localAddress = null; + socket.state = SOCKET_STATE_INIT; + } else { + socket.state = SOCKET_STATE_CLOSED; + } throw val; } else { socket.state = toState; @@ -340,11 +345,7 @@ export function socketTcpShutdown(id: number, _shutdownType) { if (socket.state !== SOCKET_STATE_CONNECTION) { throw "invalid-state"; } - if (win && socket.tcpSocket?.destroySoon) { - socket.tcpSocket.destroySoon(); - } else { - socket.tcpSocket?.destroy(); - } + socket.tcpSocket?.destroy(); } export function socketTcpSetKeepAlive(id: number, { keepAlive, keepAliveIdleTime }) {