From b6d261994facd3152ad699fcd8a79d078e5ddf0a Mon Sep 17 00:00:00 2001 From: Aari Date: Fri, 14 Aug 2026 09:38:19 +0800 Subject: [PATCH] Respect zero Node socket open timeouts --- .changeset/zero-node-socket-timeout.md | 5 +++++ packages/platform/node-shared/src/NodeSocket.ts | 2 +- packages/platform/node/test/NodeSocket.test.ts | 13 +++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .changeset/zero-node-socket-timeout.md diff --git a/.changeset/zero-node-socket-timeout.md b/.changeset/zero-node-socket-timeout.md new file mode 100644 index 00000000000..8123778659e --- /dev/null +++ b/.changeset/zero-node-socket-timeout.md @@ -0,0 +1,5 @@ +--- +"@effect/platform-node-shared": patch +--- + +Respect zero-duration open timeouts when opening Node sockets. diff --git a/packages/platform/node-shared/src/NodeSocket.ts b/packages/platform/node-shared/src/NodeSocket.ts index 702521c59cb..8c09daeefe0 100644 --- a/packages/platform/node-shared/src/NodeSocket.ts +++ b/packages/platform/node-shared/src/NodeSocket.ts @@ -135,7 +135,7 @@ export const fromDuplex = ( }) ) conn = yield* Scope.provide(open, scope).pipe( - options?.openTimeout ? + options?.openTimeout !== undefined ? Effect.timeoutOrElse({ duration: options.openTimeout, orElse: () => diff --git a/packages/platform/node/test/NodeSocket.test.ts b/packages/platform/node/test/NodeSocket.test.ts index 943aa758eb6..996418c088f 100644 --- a/packages/platform/node/test/NodeSocket.test.ts +++ b/packages/platform/node/test/NodeSocket.test.ts @@ -79,6 +79,19 @@ describe("Socket", () => { assert.strictEqual(output, "HelloWorld") })) + it.live("respects a zero open timeout", () => + Effect.gen(function*() { + const socket = yield* NodeSocket.fromDuplex(Effect.never, { openTimeout: 0 }) + const error = yield* socket.runRaw(() => {}).pipe( + Effect.flip, + Effect.timeout("1 second") + ) + assert.strictEqual(error.reason._tag, "SocketOpenError") + if (error.reason._tag === "SocketOpenError") { + assert.strictEqual(error.reason.kind, "Timeout") + } + })) + describe("WebSocket", () => { const url = `ws://localhost:1234`