Skip to content

Commit c6f3f40

Browse files
Fix all ESLint errors
- Remove unused imports and variables - Replace 'any' types with proper type guards - Add comments to empty catch blocks - Fix Response/Request type imports in logger - Use 'unknown' instead of 'any' for generic types - Remove unused createMcpServer and setSessionOwner imports All ESLint checks now pass. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent e13aefc commit c6f3f40

File tree

5 files changed

+41
-38
lines changed

5 files changed

+41
-38
lines changed

src/handlers/shttp.integration.test.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { jest } from '@jest/globals';
22
import { Request, Response } from 'express';
3-
import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
3+
import { JSONRPCMessage, JSONRPCResponse } from '@modelcontextprotocol/sdk/types.js';
44
import { MockRedisClient, setRedisClient } from '../redis.js';
55
import { handleStreamableHTTP } from './shttp.js';
66
import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
7-
import { randomUUID } from 'crypto';
7+
// import { randomUUID } from 'crypto'; // Currently unused but may be needed for future tests
88
import { shutdownSession } from '../services/redisTransport.js';
99

1010
describe('Streamable HTTP Handler Integration Tests', () => {
@@ -147,7 +147,6 @@ describe('Streamable HTTP Handler Integration Tests', () => {
147147
});
148148

149149
it('should handle cleanup errors gracefully', async () => {
150-
const sessionId = randomUUID();
151150
const initRequest: JSONRPCMessage = {
152151
jsonrpc: '2.0',
153152
id: 'init-1',
@@ -176,7 +175,6 @@ describe('Streamable HTTP Handler Integration Tests', () => {
176175
)?.[1] as (() => Promise<void>) | undefined;
177176

178177
// Simulate error during cleanup
179-
const originalSimulateError = mockRedis.simulateError.bind(mockRedis);
180178

181179
// Cleanup should not throw error even if Redis operations fail
182180
if (finishHandler) {
@@ -240,7 +238,7 @@ describe('Streamable HTTP Handler Integration Tests', () => {
240238
let sessionId: string | undefined;
241239

242240
if (jsonCalls.length > 0) {
243-
const response = jsonCalls[0][0] as any;
241+
const response = jsonCalls[0][0] as JSONRPCResponse;
244242
if (response?.result?._meta?.sessionId) {
245243
sessionId = response.result._meta.sessionId;
246244
}
@@ -254,11 +252,11 @@ describe('Streamable HTTP Handler Integration Tests', () => {
254252
try {
255253
// SSE data format: "data: {...}\n\n"
256254
const jsonStr = data.replace(/^data: /, '').trim();
257-
const parsed = JSON.parse(jsonStr) as any;
255+
const parsed = JSON.parse(jsonStr) as JSONRPCResponse;
258256
if (parsed?.result?._meta?.sessionId) {
259257
sessionId = parsed.result._meta.sessionId;
260258
}
261-
} catch (e) {
259+
} catch {
262260
// Not valid JSON, continue
263261
}
264262
}
@@ -344,7 +342,7 @@ describe('Streamable HTTP Handler Integration Tests', () => {
344342
// Check JSON responses
345343
const jsonCalls = (mockRes.json as jest.Mock).mock.calls;
346344
if (jsonCalls.length > 0) {
347-
const response = jsonCalls[0][0] as any;
345+
const response = jsonCalls[0][0] as JSONRPCResponse;
348346
if (response?.result?._meta?.sessionId) {
349347
sessionId = response.result._meta.sessionId;
350348
}
@@ -357,11 +355,13 @@ describe('Streamable HTTP Handler Integration Tests', () => {
357355
if (typeof data === 'string' && data.includes('sessionId')) {
358356
try {
359357
const jsonStr = data.replace(/^data: /, '').trim();
360-
const parsed = JSON.parse(jsonStr) as any;
358+
const parsed = JSON.parse(jsonStr) as JSONRPCResponse;
361359
if (parsed?.result?._meta?.sessionId) {
362360
sessionId = parsed.result._meta.sessionId;
363361
}
364-
} catch (e) {}
362+
} catch {
363+
// Ignore JSON parse errors
364+
}
365365
}
366366
}
367367
}
@@ -442,7 +442,7 @@ describe('Streamable HTTP Handler Integration Tests', () => {
442442
// Check JSON responses
443443
const jsonCalls = (mockRes.json as jest.Mock).mock.calls;
444444
if (jsonCalls.length > 0) {
445-
const response = jsonCalls[0][0] as any;
445+
const response = jsonCalls[0][0] as JSONRPCResponse;
446446
if (response?.result?._meta?.sessionId) {
447447
actualSessionId = response.result._meta.sessionId;
448448
}
@@ -459,7 +459,9 @@ describe('Streamable HTTP Handler Integration Tests', () => {
459459
if (parsed?.result?._meta?.sessionId) {
460460
actualSessionId = parsed.result._meta.sessionId;
461461
}
462-
} catch (e) {}
462+
} catch {
463+
// Ignore JSON parse errors
464+
}
463465
}
464466
}
465467
}
@@ -658,8 +660,7 @@ describe('Streamable HTTP Handler Integration Tests', () => {
658660
await finishHandler2();
659661
}
660662

661-
// Track session 2 ID
662-
const session2Id = 'user2-session-id';
663+
// Track session 2 ID (placeholder for actual implementation)
663664

664665
// User 1 deletes their session
665666
jest.clearAllMocks();

src/services/redisTransport.integration.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import { MockRedisClient, setRedisClient } from '../redis.js';
44
import {
55
ServerRedisTransport,
66
redisRelayToMcpServer,
7-
shutdownSession,
8-
setSessionOwner
7+
shutdownSession
98
} from './redisTransport.js';
109
import { createMcpServer } from './mcp.js';
1110
import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';

src/services/redisTransport.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
isSessionOwnedBy
1313
} from './redisTransport.js';
1414
import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
15-
import { createMcpServer } from './mcp.js';
1615

1716
describe('Redis Transport', () => {
1817
let mockRedis: MockRedisClient;

src/services/redisTransport.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ function sendToMcpServer(sessionId: string, message: JSONRPCMessage, extra?: { a
2828
logger.debug('Sending message to MCP server via Redis', {
2929
sessionId,
3030
channel: toServerChannel,
31-
method: (message as any).method,
32-
id: (message as any).id
31+
method: ('method' in message ? message.method : undefined),
32+
id: ('id' in message ? message.id : undefined)
3333
});
3434

3535
const redisMessage: RedisMessage = { type: 'mcp', message, extra, options };
@@ -125,7 +125,7 @@ export async function redisRelayToMcpServer(sessionId: string, transport: Transp
125125
logger.debug('Relaying message from Redis to client', {
126126
sessionId,
127127
requestId,
128-
method: (redisMessage.message as any).method
128+
method: ('method' in redisMessage.message ? redisMessage.message.method : undefined)
129129
});
130130
await transport.send(redisMessage.message, redisMessage.options);
131131
}
@@ -148,7 +148,7 @@ export async function redisRelayToMcpServer(sessionId: string, transport: Transp
148148
logger.debug('Setting up response subscription', {
149149
sessionId,
150150
messageId: message.id,
151-
method: (message as any).method
151+
method: ('method' in message ? message.method : undefined)
152152
});
153153
await subscribe(message.id.toString());
154154
}
@@ -235,8 +235,8 @@ export class ServerRedisTransport implements Transport {
235235

236236
logger.debug('Received MCP message from client', {
237237
sessionId: this._sessionId,
238-
method: (redisMessage.message as any).method,
239-
id: (redisMessage.message as any).id
238+
method: ('method' in redisMessage.message ? redisMessage.message.method : undefined),
239+
id: ('id' in redisMessage.message ? redisMessage.message.id : undefined)
240240
});
241241

242242
this.onmessage?.(redisMessage.message, redisMessage.extra);
@@ -295,8 +295,8 @@ export class ServerRedisTransport implements Transport {
295295
logger.debug('Sending message to client', {
296296
sessionId: this._sessionId,
297297
channel,
298-
method: (message as any).method,
299-
id: (message as any).id,
298+
method: ('method' in message ? message.method : undefined),
299+
id: ('id' in message ? message.id : undefined),
300300
relatedRequestId
301301
});
302302

src/utils/logger.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AsyncLocalStorage } from 'async_hooks';
2-
import { Request } from 'express';
2+
import { Request, Response, NextFunction } from 'express';
33

44
// Severity levels as per Google Cloud Logging
55
export enum LogSeverity {
@@ -17,7 +17,11 @@ export enum LogSeverity {
1717
interface LogContext {
1818
trace?: string;
1919
spanId?: string;
20-
[key: string]: any;
20+
requestId?: string;
21+
userAgent?: string;
22+
method?: string;
23+
path?: string;
24+
[key: string]: string | undefined;
2125
}
2226

2327
interface StructuredLogEntry {
@@ -26,7 +30,7 @@ interface StructuredLogEntry {
2630
timestamp: string;
2731
'logging.googleapis.com/trace'?: string;
2832
'logging.googleapis.com/spanId'?: string;
29-
[key: string]: any;
33+
[key: string]: unknown;
3034
}
3135

3236
class StructuredLogger {
@@ -73,7 +77,7 @@ class StructuredLogger {
7377
* Create Express middleware for request context
7478
*/
7579
middleware() {
76-
return (req: Request, res: any, next: any) => {
80+
return (req: Request, res: Response, next: NextFunction) => {
7781
const context = this.extractTraceContext(req);
7882
this.runWithContext(context, () => {
7983
next();
@@ -84,7 +88,7 @@ class StructuredLogger {
8488
/**
8589
* Log a structured message
8690
*/
87-
private log(severity: LogSeverity, message: string, metadata?: Record<string, any>) {
91+
private log(severity: LogSeverity, message: string, metadata?: Record<string, unknown>) {
8892
const context = this.asyncLocalStorage.getStore() || {};
8993

9094
const entry: StructuredLogEntry = {
@@ -114,23 +118,23 @@ class StructuredLogger {
114118
}
115119

116120
// Convenience methods for different severity levels
117-
debug(message: string, metadata?: Record<string, any>) {
121+
debug(message: string, metadata?: Record<string, unknown>) {
118122
this.log(LogSeverity.DEBUG, message, metadata);
119123
}
120124

121-
info(message: string, metadata?: Record<string, any>) {
125+
info(message: string, metadata?: Record<string, unknown>) {
122126
this.log(LogSeverity.INFO, message, metadata);
123127
}
124128

125-
notice(message: string, metadata?: Record<string, any>) {
129+
notice(message: string, metadata?: Record<string, unknown>) {
126130
this.log(LogSeverity.NOTICE, message, metadata);
127131
}
128132

129-
warning(message: string, metadata?: Record<string, any>) {
133+
warning(message: string, metadata?: Record<string, unknown>) {
130134
this.log(LogSeverity.WARNING, message, metadata);
131135
}
132136

133-
error(message: string, error?: Error, metadata?: Record<string, any>) {
137+
error(message: string, error?: Error, metadata?: Record<string, unknown>) {
134138
const errorMetadata = {
135139
...metadata,
136140
error: error ? {
@@ -142,15 +146,15 @@ class StructuredLogger {
142146
this.log(LogSeverity.ERROR, message, errorMetadata);
143147
}
144148

145-
critical(message: string, metadata?: Record<string, any>) {
149+
critical(message: string, metadata?: Record<string, unknown>) {
146150
this.log(LogSeverity.CRITICAL, message, metadata);
147151
}
148152

149-
alert(message: string, metadata?: Record<string, any>) {
153+
alert(message: string, metadata?: Record<string, unknown>) {
150154
this.log(LogSeverity.ALERT, message, metadata);
151155
}
152156

153-
emergency(message: string, metadata?: Record<string, any>) {
157+
emergency(message: string, metadata?: Record<string, unknown>) {
154158
this.log(LogSeverity.EMERGENCY, message, metadata);
155159
}
156160

0 commit comments

Comments
 (0)