Преглед изворни кода

fix(mcp): use Effect.timeoutOrElse for transport connect timeout

Replace withTimeout (Promise.race) with Effect.timeoutOrElse so that
fiber interruption properly triggers acquireUseRelease cleanup. The
Promise.race approach left the underlying connect promise dangling,
which prevented the release function from running on some platforms.
Kit Langton пре 4 месеци
родитељ
комит
e4fbf5c657
1 измењених фајлова са 11 додато и 7 уклоњено
  1. 11 7
      packages/opencode/src/mcp/index.ts

+ 11 - 7
packages/opencode/src/mcp/index.ts

@@ -209,14 +209,18 @@ export namespace MCP {
   const connectTransport = (transport: Transport, timeout: number) =>
     Effect.acquireUseRelease(
       Effect.succeed(transport),
-      (t) =>
-        Effect.tryPromise({
-          try: () => {
-            const client = new Client({ name: "opencode", version: Installation.VERSION })
-            return withTimeout(client.connect(t), timeout).then(() => client)
-          },
+      (t) => {
+        const client = new Client({ name: "opencode", version: Installation.VERSION })
+        return Effect.tryPromise({
+          try: () => client.connect(t).then(() => client),
           catch: (e) => (e instanceof Error ? e : new Error(String(e))),
-        }),
+        }).pipe(
+          Effect.timeoutOrElse({
+            duration: `${timeout} millis`,
+            onTimeout: () => Effect.fail(new Error(`Operation timed out after ${timeout}ms`)),
+          }),
+        )
+      },
       (t, exit) =>
         Exit.isFailure(exit)
           ? Effect.tryPromise(() => t.close()).pipe(Effect.ignore)