Skip to content

Commit 1a8357b

Browse files
committed
lint: use typed-error idioms in fallback error handling
1 parent afa2c9a commit 1a8357b

2 files changed

Lines changed: 16 additions & 15 deletions

File tree

packages/plugins/mcp/src/sdk/connection.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,11 @@ export const createMcpConnector = (input: ConnectorInput): McpConnector => {
351351
// error), which used to misclassify an expired token as a generic
352352
// connection failure. Propagate it as-is instead.
353353
return connectStreamableHttp.pipe(
354-
Effect.catch((error) => {
355-
if (Predicate.isTagged(error, "McpOAuthReauthorizationRequired")) return Effect.fail(error);
356-
if (error.httpStatus === 401 || error.httpStatus === 403) return Effect.fail(error);
354+
Effect.catch((failure) => {
355+
if (Predicate.isTagged(failure, "McpOAuthReauthorizationRequired")) {
356+
return Effect.fail(failure);
357+
}
358+
if (failure.httpStatus === 401 || failure.httpStatus === 403) return Effect.fail(failure);
357359
// When the fallback ALSO fails, the streamable-http failure is the
358360
// interesting one: most modern servers don't serve legacy SSE at all
359361
// (GET → 405), so reporting only "Failed connecting via sse" points
@@ -362,16 +364,16 @@ export const createMcpConnector = (input: ConnectorInput): McpConnector => {
362364
return connectSse.pipe(
363365
Effect.catch(
364366
(
365-
sseError,
367+
sseFailure,
366368
): Effect.Effect<never, McpConnectionError | McpOAuthReauthorizationRequired> => {
367-
if (Predicate.isTagged(sseError, "McpOAuthReauthorizationRequired")) {
368-
return Effect.fail(sseError);
369+
if (Predicate.isTagged(sseFailure, "McpOAuthReauthorizationRequired")) {
370+
return Effect.fail(sseFailure);
369371
}
370372
return Effect.fail(
371373
new McpConnectionError({
372374
transport: "streamable-http",
373-
message: `${error.message}; SSE fallback also failed: ${sseError.message}`,
374-
...(error.httpStatus === undefined ? {} : { httpStatus: error.httpStatus }),
375+
message: `${failure.message}; SSE fallback also failed: ${sseFailure.message}`,
376+
...(failure.httpStatus === undefined ? {} : { httpStatus: failure.httpStatus }),
375377
}),
376378
);
377379
},

packages/plugins/mcp/src/sdk/plugin.test.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -408,18 +408,17 @@ describe("mcpPlugin", () => {
408408
),
409409
);
410410

411-
const error = yield* createMcpConnector({
411+
const failure = yield* createMcpConnector({
412412
transport: "remote",
413413
endpoint: "https://internal.example/mcp",
414414
httpClientLayer,
415415
}).pipe(Effect.flip);
416416

417-
if (!Predicate.isTagged(error, "McpConnectionError")) {
418-
throw new TypeError(`expected McpConnectionError, got ${error._tag}`);
419-
}
420-
expect(error.message).toContain("streamable-http");
421-
expect(error.message).toContain("SSE fallback also failed");
422-
expect(error.httpStatus).toBe(500);
417+
expect(Predicate.isTagged(failure, "McpConnectionError")).toBe(true);
418+
if (!Predicate.isTagged(failure, "McpConnectionError")) return;
419+
expect(failure.message).toContain("streamable-http");
420+
expect(failure.message).toContain("SSE fallback also failed");
421+
expect(failure.httpStatus).toBe(500);
423422
}),
424423
);
425424

0 commit comments

Comments
 (0)