History

lint: use typed-error idioms in fallback error handling

Rhys Sullivan committed 4 months ago

Commit 1a8357b1 parent afa2c9a2 files · +16 −15Browse files

Unified · Split

2 files
  1. packages/plugins/mcp/src/sdk/connection.ts +10 −8
  2. packages/plugins/mcp/src/sdk/plugin.test.ts +6 −7
packages/plugins/mcp/src/sdk/connection.ts+10−8
@@ -351,9 +351,11 @@ export const createMcpConnector = (input: ConnectorInput): McpConnector => { · 350 unmodified lines
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 => { · 2 unmodified lines
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+6−7
@@ -408,18 +408,17 @@ describe("mcpPlugin", () => { · 407 unmodified lines
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