{"version":3,"sources":["../src/middleware.ts","../src/batch.ts","../src/error.ts","../src/logger.ts","../src/utils/idGenerator.ts","../src/utils/typeGuards.ts","../src/client.ts","../src/server.ts"],"names":["results","EventEmitter"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n  JSONRPCError,\n  JSONRPCNotification,\n  JSONRPCRequest,\n  JSONRPCResponse,\n  Middleware,\n} from './types.js';\n\n/**\n * Execute a middleware chain for a specific phase\n *\n * @param middlewares - Array of middleware to execute\n * @param phase - Which middleware hook to execute\n * @param data - The data to pass through the chain\n * @returns The potentially modified data after all middleware execution\n */\nexport async function executeMiddlewareChain<T>(\n  middlewares: Middleware[],\n  phase: keyof Middleware,\n  data: T\n): Promise<T> {\n  let result = data;\n\n  for (const middleware of middlewares) {\n    const handler = middleware[phase];\n    if (handler) {\n      // Call the middleware handler with the current result\n      const modified = await (handler as any).call(middleware, result);\n      if (modified !== undefined) {\n        result = modified;\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Logging Middleware\n * Logs all requests, responses, errors, and notifications\n */\nexport class LoggingMiddleware implements Middleware {\n  constructor(\n    private logger: {\n      log: (message: string, ...args: any[]) => void;\n    } = console\n  ) {}\n\n  onRequest(request: JSONRPCRequest): JSONRPCRequest {\n    this.logger.log('[JSON-RPC Request]', {\n      id: request.id,\n      method: request.method,\n      params: request.params,\n    });\n    return request;\n  }\n\n  onResponse(response: JSONRPCResponse): JSONRPCResponse {\n    this.logger.log('[JSON-RPC Response]', {\n      id: response.id,\n      result: response.result,\n    });\n    return response;\n  }\n\n  onError(error: JSONRPCError): JSONRPCError {\n    this.logger.log('[JSON-RPC Error]', {\n      code: error.code,\n      message: error.message,\n      data: error.data,\n    });\n    return error;\n  }\n\n  onNotification(notification: JSONRPCNotification): void {\n    this.logger.log('[JSON-RPC Notification]', {\n      method: notification.method,\n      params: notification.params,\n    });\n  }\n}\n\n/**\n * Metrics Middleware\n * Tracks timing and counts for requests/responses\n */\nexport class MetricsMiddleware implements Middleware {\n  private requestTimes = new Map<string | number, number>();\n\n  constructor(\n    private onMetric?: (metric: {\n      type: 'request' | 'response' | 'error' | 'notification';\n      method?: string;\n      duration?: number;\n      success?: boolean;\n    }) => void\n  ) {}\n\n  onRequest(request: JSONRPCRequest): JSONRPCRequest {\n    this.requestTimes.set(request.id, Date.now());\n    this.onMetric?.({\n      type: 'request',\n      method: request.method,\n    });\n    return request;\n  }\n\n  onResponse(response: JSONRPCResponse): JSONRPCResponse {\n    const startTime = this.requestTimes.get(response.id);\n    if (startTime) {\n      const duration = Date.now() - startTime;\n      this.requestTimes.delete(response.id);\n      this.onMetric?.({\n        type: 'response',\n        duration,\n        success: true,\n      });\n    }\n    return response;\n  }\n\n  onError(error: JSONRPCError): JSONRPCError {\n    this.onMetric?.({\n      type: 'error',\n      success: false,\n    });\n    return error;\n  }\n\n  onNotification(notification: JSONRPCNotification): void {\n    this.onMetric?.({\n      type: 'notification',\n      method: notification.method,\n    });\n  }\n}\n\n/**\n * Validation Middleware\n * Validates request/response structures\n */\nexport class ValidationMiddleware implements Middleware {\n  onRequest(request: JSONRPCRequest): JSONRPCRequest {\n    if (request.jsonrpc !== '2.0') {\n      throw new Error('Invalid JSON-RPC version');\n    }\n    if (typeof request.method !== 'string' || request.method.length === 0) {\n      throw new Error('Invalid method name');\n    }\n    if (!('id' in request)) {\n      throw new Error('Request must have an id');\n    }\n    return request;\n  }\n\n  onResponse(response: JSONRPCResponse): JSONRPCResponse {\n    if (response.jsonrpc !== '2.0') {\n      throw new Error('Invalid JSON-RPC version');\n    }\n    if (!('result' in response)) {\n      throw new Error('Response must have a result');\n    }\n    if (!('id' in response)) {\n      throw new Error('Response must have an id');\n    }\n    return response;\n  }\n}\n\n/**\n * Transform Middleware\n * Allows custom transformation of requests/responses\n */\nexport class TransformMiddleware implements Middleware {\n  constructor(\n    private transforms: {\n      request?: (request: JSONRPCRequest) => JSONRPCRequest | Promise<JSONRPCRequest>;\n      response?: (response: JSONRPCResponse) => JSONRPCResponse | Promise<JSONRPCResponse>;\n      error?: (error: JSONRPCError) => JSONRPCError | Promise<JSONRPCError>;\n      notification?: (notification: JSONRPCNotification) => void | Promise<void>;\n    }\n  ) {}\n\n  async onRequest(request: JSONRPCRequest): Promise<JSONRPCRequest> {\n    if (this.transforms.request) {\n      return this.transforms.request(request);\n    }\n    return request;\n  }\n\n  async onResponse(response: JSONRPCResponse): Promise<JSONRPCResponse> {\n    if (this.transforms.response) {\n      return this.transforms.response(response);\n    }\n    return response;\n  }\n\n  async onError(error: JSONRPCError): Promise<JSONRPCError> {\n    if (this.transforms.error) {\n      return this.transforms.error(error);\n    }\n    return error;\n  }\n\n  async onNotification(notification: JSONRPCNotification): Promise<void> {\n    if (this.transforms.notification) {\n      await this.transforms.notification(notification);\n    }\n  }\n}\n","import { executeMiddlewareChain } from './middleware.js';\nimport type { Transport } from './transport.js';\nimport type {\n  BatchExecutionMode,\n  BatchOptions,\n  JSONRPCBatchRequest,\n  Middleware,\n  PendingRequest,\n} from './types.js';\nimport type { IDGenerator } from './utils/idGenerator.js';\n\n/**\n * Batch Request Item\n * Internal representation of a request in a batch\n */\ninterface BatchRequestItem {\n  method: string;\n  params?: any;\n}\n\n/**\n * Batch Request Builder\n *\n * Allows building and executing a batch of JSON-RPC requests.\n * Supports both parallel and sequential execution modes.\n *\n * @example\n * ```typescript\n * const batch = client.batch();\n * batch.add('add', { a: 1, b: 2 });\n * batch.add('subtract', { minuend: 10, subtrahend: 5 });\n *\n * // Execute in parallel (default)\n * const [sum, difference] = await batch.execute();\n *\n * // Execute sequentially\n * const results = await batch.execute({ mode: 'sequential' });\n * ```\n */\nexport class BatchRequest {\n  private items: BatchRequestItem[] = [];\n  private transport: Transport;\n  private idGenerator: IDGenerator;\n  private pendingRequests: Map<string | number, PendingRequest>;\n  private middleware?: Middleware[];\n  private defaultTimeout: number;\n\n  constructor(\n    transport: Transport,\n    idGenerator: IDGenerator,\n    pendingRequests: Map<string | number, PendingRequest>,\n    middleware?: Middleware[],\n    defaultTimeout = 30000\n  ) {\n    this.transport = transport;\n    this.idGenerator = idGenerator;\n    this.pendingRequests = pendingRequests;\n    this.middleware = middleware;\n    this.defaultTimeout = defaultTimeout;\n  }\n\n  /**\n   * Add a request to the batch\n   *\n   * @param method - Method name to call\n   * @param params - Method parameters\n   * @returns This BatchRequest instance for chaining\n   *\n   * @example\n   * ```typescript\n   * batch.add('add', { a: 1, b: 2 })\n   *      .add('subtract', { minuend: 10, subtrahend: 5 });\n   * ```\n   */\n  add(method: string, params?: any): this {\n    this.items.push({ method, params });\n    return this;\n  }\n\n  /**\n   * Execute the batch request\n   *\n   * @param options - Batch execution options\n   * @returns Promise that resolves with an array of results\n   * @throws JSONRPCError if any request fails (in sequential mode, stops at first error)\n   *\n   * @example Parallel execution (default)\n   * ```typescript\n   * const results = await batch.execute();\n   * // Results may include errors mixed with successes\n   * ```\n   *\n   * @example Sequential execution\n   * ```typescript\n   * const results = await batch.execute({ mode: 'sequential' });\n   * // Stops at first error\n   * ```\n   *\n   * @example With timeout\n   * ```typescript\n   * const results = await batch.execute({ timeout: 5000 });\n   * ```\n   */\n  async execute<TResult = any>(options?: BatchOptions): Promise<TResult[]> {\n    if (this.items.length === 0) {\n      throw new Error('Cannot execute empty batch');\n    }\n\n    const mode: BatchExecutionMode = options?.mode ?? 'parallel';\n    const timeout = options?.timeout ?? this.defaultTimeout;\n    const signal = options?.signal;\n\n    // Build batch request with IDs\n    const batchRequest: JSONRPCBatchRequest = this.items.map((item) => ({\n      jsonrpc: '2.0',\n      method: item.method,\n      params: item.params,\n      id: this.idGenerator.next(),\n    }));\n\n    // Apply batch request middleware\n    let processedBatch = batchRequest;\n    if (this.middleware && this.middleware.length > 0) {\n      processedBatch = await executeMiddlewareChain(\n        this.middleware,\n        'onBatchRequest',\n        batchRequest\n      );\n    }\n\n    // Send batch request\n    const messageStr = JSON.stringify(processedBatch);\n    this.transport.send(messageStr);\n\n    // Track all pending requests\n    const promises: Promise<TResult>[] = processedBatch.map((request) =>\n      this.trackPendingRequest<TResult>(request.id, timeout, signal)\n    );\n\n    // Execute based on mode\n    if (mode === 'parallel') {\n      // Parallel: all requests execute concurrently\n      // Use Promise.allSettled to get all results (including errors)\n      const results = await Promise.allSettled(promises);\n      return results.map((result) => {\n        if (result.status === 'fulfilled') {\n          return result.value;\n        }\n        // Re-throw the error for this specific request\n        throw result.reason;\n      });\n    }\n    // Sequential: execute one by one, stop at first error\n    const results: TResult[] = [];\n    for (const promise of promises) {\n      const result = await promise;\n      results.push(result);\n    }\n    return results;\n  }\n\n  /**\n   * Get the number of requests in this batch\n   */\n  get length(): number {\n    return this.items.length;\n  }\n\n  /**\n   * Track a pending request and return a promise\n   * @private\n   */\n  private trackPendingRequest<T>(\n    id: string | number,\n    timeout: number,\n    signal?: AbortSignal\n  ): Promise<T> {\n    return new Promise<T>((resolve, reject) => {\n      // Setup timeout\n      const timeoutHandle = setTimeout(() => {\n        this.pendingRequests.delete(id);\n        reject(new Error(`Request ${id} timed out after ${timeout}ms`));\n      }, timeout);\n\n      // Create pending request entry\n      const pending: PendingRequest = {\n        resolve: resolve as (result: any) => void,\n        reject,\n        timeout: timeoutHandle,\n      };\n\n      // Handle AbortSignal if provided\n      if (signal) {\n        const abortHandler = () => {\n          this.pendingRequests.delete(id);\n          clearTimeout(timeoutHandle);\n          reject(new Error('Request aborted'));\n        };\n\n        if (signal.aborted) {\n          // Already aborted\n          abortHandler();\n          return;\n        }\n\n        signal.addEventListener('abort', abortHandler, { once: true });\n      }\n\n      // Store pending request\n      this.pendingRequests.set(id, pending);\n    });\n  }\n}\n","import type { JSONRPCError as IJSONRPCError } from './types.js';\n\n/**\n * JSON-RPC Error class\n * Extends Error with JSON-RPC error properties\n *\n * Standard JSON-RPC 2.0 error codes:\n * - -32700: Parse error (invalid JSON)\n * - -32600: Invalid Request (not a valid JSON-RPC request)\n * - -32601: Method not found\n * - -32602: Invalid params\n * - -32603: Internal error\n * - -32000 to -32099: Server error (implementation-defined)\n */\nexport class JSONRPCError extends Error implements IJSONRPCError {\n  code: number;\n  data?: any;\n\n  constructor(code: number, message: string, data?: any);\n  constructor(error: IJSONRPCError);\n  constructor(codeOrError: number | IJSONRPCError, message?: string, data?: any) {\n    if (typeof codeOrError === 'object') {\n      // Constructor with error object\n      super(codeOrError.message);\n      this.code = codeOrError.code;\n      this.data = codeOrError.data;\n    } else {\n      // Constructor with individual parameters\n      super(message!);\n      this.code = codeOrError;\n      this.data = data;\n    }\n\n    this.name = 'JSONRPCError';\n\n    // Maintain proper stack trace for debugging\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, JSONRPCError);\n    }\n  }\n\n  /**\n   * Standard JSON-RPC 2.0 error codes\n   */\n  static readonly PARSE_ERROR = -32700;\n  static readonly INVALID_REQUEST = -32600;\n  static readonly METHOD_NOT_FOUND = -32601;\n  static readonly INVALID_PARAMS = -32602;\n  static readonly INTERNAL_ERROR = -32603;\n\n  /**\n   * Server error range: -32000 to -32099\n   * Reserved for implementation-defined server errors\n   */\n  static readonly SERVER_ERROR_MIN = -32000;\n  static readonly SERVER_ERROR_MAX = -32099;\n\n  /**\n   * Create a parse error\n   */\n  static parseError(data?: any): JSONRPCError {\n    return new JSONRPCError(\n      JSONRPCError.PARSE_ERROR,\n      'Parse error: Invalid JSON was received by the server',\n      data\n    );\n  }\n\n  /**\n   * Create an invalid request error\n   */\n  static invalidRequest(data?: any): JSONRPCError {\n    return new JSONRPCError(\n      JSONRPCError.INVALID_REQUEST,\n      'Invalid Request: The JSON sent is not a valid Request object',\n      data\n    );\n  }\n\n  /**\n   * Create a method not found error\n   */\n  static methodNotFound(method: string): JSONRPCError {\n    return new JSONRPCError(JSONRPCError.METHOD_NOT_FOUND, `Method not found: ${method}`, {\n      method,\n    });\n  }\n\n  /**\n   * Create an invalid params error\n   */\n  static invalidParams(message?: string, data?: any): JSONRPCError {\n    return new JSONRPCError(\n      JSONRPCError.INVALID_PARAMS,\n      message || 'Invalid params: Invalid method parameter(s)',\n      data\n    );\n  }\n\n  /**\n   * Create an internal error\n   */\n  static internalError(message?: string, data?: any): JSONRPCError {\n    return new JSONRPCError(\n      JSONRPCError.INTERNAL_ERROR,\n      message || 'Internal error: Internal JSON-RPC error',\n      data\n    );\n  }\n\n  /**\n   * Create a custom server error\n   * Code must be in the range -32000 to -32099\n   */\n  static serverError(code: number, message: string, data?: any): JSONRPCError {\n    if (code < JSONRPCError.SERVER_ERROR_MIN || code > JSONRPCError.SERVER_ERROR_MAX) {\n      throw new Error(\n        `Server error code must be between ${JSONRPCError.SERVER_ERROR_MIN} and ${JSONRPCError.SERVER_ERROR_MAX}`\n      );\n    }\n    return new JSONRPCError(code, message, data);\n  }\n\n  /**\n   * Convert to JSON-RPC error object\n   */\n  toJSON(): IJSONRPCError {\n    return {\n      code: this.code,\n      message: this.message,\n      ...(this.data !== undefined && { data: this.data }),\n    };\n  }\n}\n","/**\n * Log levels\n */\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error';\n\n/**\n * Logger interface\n */\nexport interface Logger {\n  trace(message: string, ...args: any[]): void;\n  debug(message: string, ...args: any[]): void;\n  info(message: string, ...args: any[]): void;\n  warn(message: string, ...args: any[]): void;\n  error(message: string, ...args: any[]): void;\n}\n\n/**\n * Logger format\n */\nexport type LogFormat = 'pretty' | 'json';\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n  /**\n   * Minimum log level to output\n   * @default 'info'\n   */\n  level?: LogLevel;\n\n  /**\n   * Output format\n   * @default 'pretty'\n   */\n  format?: LogFormat;\n\n  /**\n   * Custom prefix for all log messages\n   * @default '[JSON-RPC]'\n   */\n  prefix?: string;\n\n  /**\n   * Whether to include timestamps\n   * @default true\n   */\n  timestamp?: boolean;\n}\n\n/**\n * Create a logger with the specified configuration\n *\n * @param config - Logger configuration\n * @returns Logger instance\n *\n * @example\n * ```typescript\n * const logger = createLogger({ level: 'debug', format: 'json' });\n * logger.debug('Request sent', { id: 1, method: 'test' });\n * ```\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n  const { level = 'info', format = 'pretty', prefix = '[JSON-RPC]', timestamp = true } = config;\n\n  const levels: LogLevel[] = ['trace', 'debug', 'info', 'warn', 'error'];\n  const minLevelIndex = levels.indexOf(level);\n\n  const shouldLog = (logLevel: LogLevel): boolean => {\n    return levels.indexOf(logLevel) >= minLevelIndex;\n  };\n\n  const formatMessage = (logLevel: LogLevel, message: string, ...args: any[]): string | object => {\n    if (format === 'json') {\n      return {\n        timestamp: timestamp ? new Date().toISOString() : undefined,\n        level: logLevel,\n        message,\n        data: args.length > 0 ? args : undefined,\n      };\n    }\n\n    // Pretty format\n    const parts: string[] = [];\n\n    if (timestamp) {\n      parts.push(`[${new Date().toISOString()}]`);\n    }\n\n    parts.push(prefix);\n    parts.push(`[${logLevel.toUpperCase()}]`);\n    parts.push(message);\n\n    return parts.join(' ');\n  };\n\n  const log = (\n    logLevel: LogLevel,\n    consoleFn: (...args: any[]) => void,\n    message: string,\n    ...args: any[]\n  ): void => {\n    if (!shouldLog(logLevel)) {\n      return;\n    }\n\n    const formatted = formatMessage(logLevel, message, ...args);\n\n    if (format === 'json') {\n      consoleFn(JSON.stringify(formatted));\n    } else {\n      consoleFn(formatted, ...args);\n    }\n  };\n\n  return {\n    trace: (message: string, ...args: any[]) => {\n      log('trace', console.log, message, ...args);\n    },\n\n    debug: (message: string, ...args: any[]) => {\n      log('debug', console.log, message, ...args);\n    },\n\n    info: (message: string, ...args: any[]) => {\n      log('info', console.log, message, ...args);\n    },\n\n    warn: (message: string, ...args: any[]) => {\n      log('warn', console.warn, message, ...args);\n    },\n\n    error: (message: string, ...args: any[]) => {\n      log('error', console.error, message, ...args);\n    },\n  };\n}\n\n/**\n * No-op logger that does nothing\n * Useful for disabling logging\n */\nexport const noopLogger: Logger = {\n  trace: () => {},\n  debug: () => {},\n  info: () => {},\n  warn: () => {},\n  error: () => {},\n};\n\n/**\n * Default logger instance with info level and pretty format\n */\nexport const defaultLogger = createLogger();\n","/**\n * ID Generator for JSON-RPC requests\n * Generates monotonically increasing numeric IDs\n *\n * Note: This is NOT cryptographically secure.\n * For security-sensitive applications, consider using UUIDs or other secure ID generation.\n */\nexport class IDGenerator {\n  private currentId: number;\n\n  /**\n   * Create a new ID generator\n   * @param startId - Starting ID (default: 0)\n   */\n  constructor(startId = 0) {\n    this.currentId = startId;\n  }\n\n  /**\n   * Generate the next ID\n   * @returns Next numeric ID\n   */\n  next(): number {\n    return ++this.currentId;\n  }\n\n  /**\n   * Get the current ID without incrementing\n   * @returns Current ID\n   */\n  current(): number {\n    return this.currentId;\n  }\n\n  /**\n   * Reset the ID generator to a specific value\n   * @param value - Value to reset to (default: 0)\n   */\n  reset(value = 0): void {\n    this.currentId = value;\n  }\n}\n\n/**\n * Default ID generator instance\n * Can be used if you don't need multiple independent sequences\n */\nexport const defaultIDGenerator = new IDGenerator();\n","import type {\n  JSONRPCBatch,\n  JSONRPCErrorResponse,\n  JSONRPCMessage,\n  JSONRPCNotification,\n  JSONRPCRequest,\n  JSONRPCResponse,\n} from '../types.js';\n\n/**\n * Type guard to check if a message is a JSON-RPC request\n * Request has: jsonrpc, method, params (optional), id\n */\nexport function isRequest(message: any): message is JSONRPCRequest {\n  return (\n    message &&\n    typeof message === 'object' &&\n    message.jsonrpc === '2.0' &&\n    typeof message.method === 'string' &&\n    'id' in message &&\n    (typeof message.id === 'string' || typeof message.id === 'number')\n  );\n}\n\n/**\n * Type guard to check if a message is a JSON-RPC success response\n * Response has: jsonrpc, result, id (no error field)\n */\nexport function isResponse(message: any): message is JSONRPCResponse {\n  return (\n    message &&\n    typeof message === 'object' &&\n    message.jsonrpc === '2.0' &&\n    'result' in message &&\n    !('error' in message) &&\n    'id' in message\n  );\n}\n\n/**\n * Type guard to check if a message is a JSON-RPC error response\n * Error response has: jsonrpc, error, id (no result field)\n */\nexport function isErrorResponse(message: any): message is JSONRPCErrorResponse {\n  return (\n    message &&\n    typeof message === 'object' &&\n    message.jsonrpc === '2.0' &&\n    'error' in message &&\n    message.error !== undefined &&\n    typeof message.error === 'object' &&\n    typeof message.error.code === 'number' &&\n    typeof message.error.message === 'string' &&\n    'id' in message\n  );\n}\n\n/**\n * Type guard to check if a message is a JSON-RPC notification\n * Notification has: jsonrpc, method, params (optional)\n * Notification does NOT have an id field\n */\nexport function isNotification(message: any): message is JSONRPCNotification {\n  return (\n    message &&\n    typeof message === 'object' &&\n    message.jsonrpc === '2.0' &&\n    typeof message.method === 'string' &&\n    !('id' in message) // Key difference: no id field\n  );\n}\n\n/**\n * Type guard to check if a message is any valid JSON-RPC message\n */\nexport function isJSONRPCMessage(message: any): message is JSONRPCMessage {\n  return (\n    isRequest(message) || isResponse(message) || isErrorResponse(message) || isNotification(message)\n  );\n}\n\n/**\n * Type guard to check if a value is a batch request (array of requests)\n */\nexport function isBatchRequest(value: any): value is JSONRPCRequest[] {\n  return Array.isArray(value) && value.length > 0 && value.every(isRequest);\n}\n\n/**\n * Type guard to check if a value is a batch (array of requests and/or notifications)\n * Per JSON-RPC 2.0 spec, a batch can contain requests, notifications, or both\n */\nexport function isBatch(value: any): value is JSONRPCBatch {\n  return (\n    Array.isArray(value) &&\n    value.length >= 0 && // Allow empty arrays to be handled specially by server\n    value.every((item) => isRequest(item) || isNotification(item))\n  );\n}\n\n/**\n * Type guard to check if a value is a batch response (array of responses)\n */\nexport function isBatchResponse(\n  value: any\n): value is Array<JSONRPCResponse | JSONRPCErrorResponse> {\n  return (\n    Array.isArray(value) &&\n    value.length > 0 &&\n    value.every((item) => isResponse(item) || isErrorResponse(item))\n  );\n}\n","import { EventEmitter } from 'node:events';\nimport { BatchRequest } from './batch.js';\nimport { JSONRPCError } from './error.js';\nimport { type Logger, createLogger, noopLogger } from './logger.js';\nimport { executeMiddlewareChain } from './middleware.js';\nimport type { Transport } from './transport.js';\nimport type {\n  JSONRPCBatchResponse,\n  JSONRPCClientConfig,\n  JSONRPCMessage,\n  JSONRPCNotification,\n  JSONRPCRequest,\n  JSONRPCResponse,\n  Middleware,\n  PendingRequest,\n  RequestOptions,\n} from './types.js';\nimport { IDGenerator } from './utils/idGenerator.js';\nimport {\n  isBatchResponse,\n  isErrorResponse,\n  isNotification,\n  isResponse,\n} from './utils/typeGuards.js';\n\n/**\n * JSON-RPC 2.0 Client\n *\n * A transport-agnostic client for making JSON-RPC 2.0 requests.\n * The client handles:\n * - Request/response ID matching\n * - Request timeouts\n * - Notification handling\n * - Middleware execution\n * - Request cancellation (AbortSignal)\n * - Batch requests\n *\n * The client does NOT handle:\n * - Connection management (delegate to Transport)\n * - Message buffering/framing (delegate to Transport)\n * - Auto-reconnection (Transport or wrapper's responsibility)\n *\n * @example\n * ```typescript\n * import { JSONRPCClient } from '@gnana997/node-jsonrpc';\n * import { MyTransport } from './my-transport';\n *\n * const client = new JSONRPCClient({\n *   transport: new MyTransport(),\n * });\n *\n * await client.connect();\n *\n * const result = await client.request('subtract', { minuend: 42, subtrahend: 23 });\n * console.log(result); // 19\n *\n * client.on('notification', (method, params) => {\n *   console.log('Server notification:', method, params);\n * });\n * ```\n *\n * @fires connected - When transport connects\n * @fires disconnected - When transport disconnects\n * @fires error - When a transport error occurs\n * @fires notification - When a notification is received (method, params)\n */\nexport class JSONRPCClient extends EventEmitter {\n  private transport: Transport;\n  private pendingRequests = new Map<string | number, PendingRequest>();\n  private idGenerator = new IDGenerator();\n  private config: Required<Omit<JSONRPCClientConfig, 'transport' | 'middleware'>> & {\n    middleware: JSONRPCClientConfig['middleware'];\n  };\n  private logger: Logger;\n\n  /**\n   * Create a new JSON-RPC client\n   *\n   * @param config - Client configuration\n   */\n  constructor(config: JSONRPCClientConfig) {\n    super();\n\n    this.transport = config.transport;\n\n    // Apply defaults\n    this.config = {\n      requestTimeout: 30000,\n      debug: false,\n      middleware: [],\n      ...config,\n    };\n\n    this.logger = this.config.debug ? createLogger({ level: 'debug' }) : noopLogger;\n\n    this.setupTransportListeners();\n  }\n\n  /**\n   * Setup listeners for transport events\n   * @private\n   */\n  private setupTransportListeners(): void {\n    // Handle messages from transport\n    this.transport.on('message', (message: string) => {\n      this.handleRawMessage(message);\n    });\n\n    // Forward connection events\n    this.transport.on('connect', () => {\n      this.logger.debug('Transport connected');\n      this.emit('connected');\n    });\n\n    // Handle disconnect - cleanup pending requests\n    this.transport.on('disconnect', () => {\n      this.logger.debug('Transport disconnected');\n      this.cleanupPendingRequests();\n      this.emit('disconnected');\n    });\n\n    // Forward transport errors\n    this.transport.on('error', (error: Error) => {\n      this.logger.error('Transport error:', error.message);\n      this.emit('error', error);\n    });\n  }\n\n  /**\n   * Connect to the remote endpoint\n   * Delegates to the transport\n   *\n   * @returns Promise that resolves when connected\n   */\n  async connect(): Promise<void> {\n    return this.transport.connect();\n  }\n\n  /**\n   * Disconnect from the remote endpoint\n   * Delegates to the transport\n   *\n   * @returns Promise that resolves when disconnected\n   */\n  async disconnect(): Promise<void> {\n    return this.transport.disconnect();\n  }\n\n  /**\n   * Check if connected\n   * Delegates to the transport\n   *\n   * @returns true if connected, false otherwise\n   */\n  isConnected(): boolean {\n    return this.transport.isConnected();\n  }\n\n  /**\n   * Make a JSON-RPC request and wait for the response\n   *\n   * @param method - Method name to call\n   * @param params - Method parameters\n   * @param options - Request options (timeout, signal)\n   * @returns Promise that resolves with the result\n   * @throws JSONRPCError if server returns an error\n   * @throws Error if request times out or is aborted\n   *\n   * @example\n   * ```typescript\n   * const result = await client.request('subtract', { minuend: 42, subtrahend: 23 });\n   * ```\n   *\n   * @example With timeout\n   * ```typescript\n   * const result = await client.request('slowMethod', {}, { timeout: 5000 });\n   * ```\n   *\n   * @example With cancellation\n   * ```typescript\n   * const controller = new AbortController();\n   * const promise = client.request('longOperation', {}, { signal: controller.signal });\n   *\n   * // Cancel the request\n   * controller.abort();\n   * ```\n   */\n  async request<TResult = any>(\n    method: string,\n    params?: any,\n    options?: RequestOptions\n  ): Promise<TResult> {\n    if (!this.isConnected()) {\n      throw new Error('Client not connected');\n    }\n\n    const id = this.idGenerator.next();\n\n    let request: JSONRPCRequest = {\n      jsonrpc: '2.0',\n      method,\n      params,\n      id,\n    };\n\n    // Apply request middleware\n    if (this.config.middleware && this.config.middleware.length > 0) {\n      request = await executeMiddlewareChain(this.config.middleware, 'onRequest', request);\n    }\n\n    this.logger.debug('Sending request:', { id, method, params });\n\n    // Send via transport (transport handles framing)\n    const messageStr = JSON.stringify(request);\n    this.transport.send(messageStr);\n\n    // Track pending request and return promise\n    return this.trackPendingRequest<TResult>(\n      id,\n      options?.timeout ?? this.config.requestTimeout,\n      options?.signal\n    );\n  }\n\n  /**\n   * Send a JSON-RPC notification (no response expected)\n   *\n   * @param method - Method name\n   * @param params - Method parameters\n   *\n   * @example\n   * ```typescript\n   * client.notify('update', { status: 'ready' });\n   * ```\n   */\n  notify(method: string, params?: any): void {\n    if (!this.isConnected()) {\n      throw new Error('Client not connected');\n    }\n\n    const notification: JSONRPCNotification = {\n      jsonrpc: '2.0',\n      method,\n      params,\n    };\n\n    this.logger.debug('Sending notification:', { method, params });\n\n    const messageStr = JSON.stringify(notification);\n    this.transport.send(messageStr);\n  }\n\n  /**\n   * Add middleware to the client\n   * Middleware is executed in the order it's added\n   *\n   * @param middleware - Middleware to add\n   *\n   * @example\n   * ```typescript\n   * import { LoggingMiddleware } from '@gnana997/node-jsonrpc';\n   *\n   * client.use(new LoggingMiddleware());\n   * ```\n   */\n  use(middleware: Middleware): void {\n    if (!this.config.middleware) {\n      this.config.middleware = [];\n    }\n    this.config.middleware.push(middleware);\n  }\n\n  /**\n   * Create a batch request\n   * Returns a BatchRequest object that can be used to send multiple requests at once\n   *\n   * @returns BatchRequest builder instance\n   *\n   * @example\n   * ```typescript\n   * const batch = client.batch();\n   * batch.add('add', { a: 1, b: 2 });\n   * batch.add('subtract', { minuend: 10, subtrahend: 5 });\n   *\n   * // Execute in parallel (default)\n   * const [sum, difference] = await batch.execute();\n   * console.log(sum, difference); // 3, 5\n   *\n   * // Execute sequentially\n   * const results = await batch.execute({ mode: 'sequential' });\n   * ```\n   */\n  batch(): BatchRequest {\n    return new BatchRequest(\n      this.transport,\n      this.idGenerator,\n      this.pendingRequests,\n      this.config.middleware,\n      this.config.requestTimeout\n    );\n  }\n\n  /**\n   * Handle raw message string from transport\n   * @private\n   */\n  private async handleRawMessage(messageStr: string): Promise<void> {\n    let message: JSONRPCMessage | JSONRPCBatchResponse;\n\n    try {\n      message = JSON.parse(messageStr);\n    } catch (error) {\n      this.logger.error('Failed to parse message:', messageStr);\n      this.emit('error', new Error('Invalid JSON received'));\n      return;\n    }\n\n    // Handle batch response\n    if (isBatchResponse(message)) {\n      await this.handleBatchResponse(message);\n      return;\n    }\n\n    // Handle single message\n    if (isResponse(message) || isErrorResponse(message)) {\n      await this.handleResponse(message);\n    } else if (isNotification(message)) {\n      await this.handleNotification(message);\n    } else {\n      this.logger.warn('Received unknown message type:', message);\n    }\n  }\n\n  /**\n   * Handle a response or error response\n   * @private\n   */\n  private async handleResponse(\n    response: JSONRPCResponse | { jsonrpc: '2.0'; error: any; id: string | number | null }\n  ): Promise<void> {\n    const pending = this.pendingRequests.get(response.id!);\n\n    if (!pending) {\n      this.logger.warn('Received response for unknown request:', response.id);\n      return;\n    }\n\n    // Remove from pending and clear timeout\n    this.pendingRequests.delete(response.id!);\n    clearTimeout(pending.timeout);\n\n    // Handle error response\n    if (isErrorResponse(response)) {\n      let error = new JSONRPCError(response.error);\n\n      // Apply error middleware\n      if (this.config.middleware && this.config.middleware.length > 0) {\n        const modifiedError = await executeMiddlewareChain(\n          this.config.middleware,\n          'onError',\n          error.toJSON()\n        );\n        error = new JSONRPCError(modifiedError);\n      }\n\n      this.logger.debug('Received error response:', {\n        id: response.id,\n        code: error.code,\n        message: error.message,\n      });\n\n      pending.reject(error);\n      return;\n    }\n\n    // Handle success response\n    let finalResponse = response as JSONRPCResponse;\n\n    // Apply response middleware\n    if (this.config.middleware && this.config.middleware.length > 0) {\n      finalResponse = await executeMiddlewareChain(\n        this.config.middleware,\n        'onResponse',\n        finalResponse\n      );\n    }\n\n    this.logger.debug('Received response:', { id: finalResponse.id });\n\n    pending.resolve(finalResponse.result);\n  }\n\n  /**\n   * Handle a notification from the server\n   * @private\n   */\n  private async handleNotification(notification: JSONRPCNotification): Promise<void> {\n    this.logger.debug('Received notification:', {\n      method: notification.method,\n      params: notification.params,\n    });\n\n    // Apply notification middleware\n    if (this.config.middleware && this.config.middleware.length > 0) {\n      await executeMiddlewareChain(this.config.middleware, 'onNotification', notification);\n    }\n\n    // Emit notification event\n    this.emit('notification', notification.method, notification.params);\n  }\n\n  /**\n   * Handle a batch response\n   * @private\n   */\n  private async handleBatchResponse(batchResponse: JSONRPCBatchResponse): Promise<void> {\n    this.logger.debug('Received batch response with', batchResponse.length, 'items');\n\n    // Apply batch response middleware\n    let finalBatchResponse = batchResponse;\n    if (this.config.middleware && this.config.middleware.length > 0) {\n      finalBatchResponse = await executeMiddlewareChain(\n        this.config.middleware,\n        'onBatchResponse',\n        batchResponse\n      );\n    }\n\n    // Process each response in the batch\n    for (const response of finalBatchResponse) {\n      // Each response is either a success or error response\n      // Delegate to the single response handler\n      await this.handleResponse(response);\n    }\n  }\n\n  /**\n   * Track a pending request and return a promise\n   * @private\n   */\n  private trackPendingRequest<T>(\n    id: string | number,\n    timeout: number,\n    signal?: AbortSignal\n  ): Promise<T> {\n    return new Promise<T>((resolve, reject) => {\n      // Setup timeout\n      const timeoutHandle = setTimeout(() => {\n        this.pendingRequests.delete(id);\n        reject(new Error(`Request ${id} timed out after ${timeout}ms`));\n      }, timeout);\n\n      // Create pending request entry\n      const pending: PendingRequest = {\n        resolve: resolve as (result: any) => void,\n        reject,\n        timeout: timeoutHandle,\n      };\n\n      // Handle AbortSignal if provided\n      if (signal) {\n        const abortHandler = () => {\n          this.pendingRequests.delete(id);\n          clearTimeout(timeoutHandle);\n          reject(new Error('Request aborted'));\n        };\n\n        if (signal.aborted) {\n          // Already aborted\n          abortHandler();\n          return;\n        }\n\n        signal.addEventListener('abort', abortHandler, { once: true });\n      }\n\n      // Store pending request\n      this.pendingRequests.set(id, pending);\n    });\n  }\n\n  /**\n   * Clean up all pending requests (called on disconnect)\n   * @private\n   */\n  private cleanupPendingRequests(): void {\n    for (const [id, pending] of this.pendingRequests) {\n      this.logger.debug('Cleaning up pending request:', id);\n      clearTimeout(pending.timeout);\n      pending.reject(new Error('Client disconnected'));\n    }\n    this.pendingRequests.clear();\n    this.logger.debug('Cleaned up pending requests');\n  }\n\n  /**\n   * Get the number of pending requests\n   * Useful for monitoring\n   */\n  getPendingRequestCount(): number {\n    return this.pendingRequests.size;\n  }\n}\n","import { EventEmitter } from 'node:events';\nimport { JSONRPCError } from './error.js';\nimport { type Logger, createLogger, noopLogger } from './logger.js';\nimport { executeMiddlewareChain } from './middleware.js';\nimport type { Transport, TransportServer } from './transport.js';\nimport type {\n  Handler,\n  JSONRPCBatch,\n  JSONRPCBatchRequest,\n  JSONRPCBatchResponse,\n  JSONRPCErrorResponse,\n  JSONRPCMessage,\n  JSONRPCNotification,\n  JSONRPCRequest,\n  JSONRPCResponse,\n  JSONRPCServerConfig,\n  Middleware,\n  RequestContext,\n} from './types.js';\nimport { isBatch, isNotification, isRequest } from './utils/typeGuards.js';\n\n/**\n * JSON-RPC 2.0 Server\n *\n * A transport-agnostic server for handling JSON-RPC 2.0 requests.\n * The server handles:\n * - Method registration and routing\n * - Request processing and response generation\n * - Multi-client connection management\n * - Broadcasting notifications to all clients\n * - Middleware execution\n *\n * The server does NOT handle:\n * - Connection lifecycle (delegate to TransportServer)\n * - Message buffering/framing (delegate to Transport)\n *\n * @example\n * ```typescript\n * import { JSONRPCServer } from '@gnana997/node-jsonrpc';\n * import { MyTransportServer } from './my-transport';\n *\n * const server = new JSONRPCServer({\n *   transportServer: new MyTransportServer(),\n * });\n *\n * server.registerMethod('add', async (params) => {\n *   return params.a + params.b;\n * });\n *\n * server.registerMethod('subtract', async (params) => {\n *   return params.minuend - params.subtrahend;\n * });\n *\n * await server.listen();\n * ```\n *\n * @fires notification - When a notification is received from a client (method, params, transport)\n * @fires error - When an error occurs\n */\nexport class JSONRPCServer extends EventEmitter {\n  private transportServer: TransportServer;\n  private methods = new Map<string, Handler>();\n  private connections = new Set<Transport>();\n  private config: Required<\n    Omit<JSONRPCServerConfig, 'transportServer' | 'middleware' | 'onConnection' | 'onDisconnection'>\n  > & {\n    middleware: JSONRPCServerConfig['middleware'];\n    onConnection?: JSONRPCServerConfig['onConnection'];\n    onDisconnection?: JSONRPCServerConfig['onDisconnection'];\n  };\n  private logger: Logger;\n\n  /**\n   * Create a new JSON-RPC server\n   *\n   * @param config - Server configuration\n   */\n  constructor(config: JSONRPCServerConfig) {\n    super();\n\n    this.transportServer = config.transportServer;\n\n    // Apply defaults\n    this.config = {\n      debug: false,\n      middleware: [],\n      ...config,\n    };\n\n    this.logger = this.config.debug ? createLogger({ level: 'debug' }) : noopLogger;\n\n    this.setupTransportServerListeners();\n  }\n\n  /**\n   * Setup listeners for transport server events\n   * @private\n   */\n  private setupTransportServerListeners(): void {\n    // Handle new client connections\n    this.transportServer.on('connection', (transport: Transport) => {\n      this.handleConnection(transport);\n    });\n\n    // Handle server errors\n    this.transportServer.on('error', (error: Error) => {\n      this.logger.error('Transport server error:', error.message);\n      this.emit('error', error);\n    });\n\n    // Handle server close\n    this.transportServer.on('close', () => {\n      this.logger.debug('Transport server closed');\n    });\n  }\n\n  /**\n   * Start listening for connections\n   * Delegates to the transport server\n   *\n   * @returns Promise that resolves when listening\n   */\n  async listen(): Promise<void> {\n    await this.transportServer.listen();\n    this.logger.info('Server listening');\n  }\n\n  /**\n   * Stop listening for new connections\n   * Optionally close all active connections\n   *\n   * @param options - Close options\n   * @returns Promise that resolves when closed\n   */\n  async close(options?: { closeConnections?: boolean }): Promise<void> {\n    // Close all active connections if requested\n    if (options?.closeConnections) {\n      const promises: Promise<void>[] = [];\n      for (const transport of this.connections) {\n        promises.push(transport.disconnect());\n      }\n      await Promise.all(promises);\n      this.connections.clear();\n    }\n\n    await this.transportServer.close();\n    this.logger.info('Server closed');\n  }\n\n  /**\n   * Register a method handler\n   *\n   * @param name - Method name\n   * @param handler - Handler function\n   *\n   * @example\n   * ```typescript\n   * server.registerMethod('add', async (params) => {\n   *   return params.a + params.b;\n   * });\n   * ```\n   *\n   * @example With context\n   * ```typescript\n   * server.registerMethod('notify_client', async (params, context) => {\n   *   // Send notification back to this client\n   *   server.notify(context.transport, 'update', { status: 'processing' });\n   *   return { success: true };\n   * });\n   * ```\n   */\n  registerMethod(name: string, handler: Handler): void {\n    if (this.methods.has(name)) {\n      this.logger.warn(`Method '${name}' already registered, overwriting`);\n    }\n    this.methods.set(name, handler);\n    this.logger.debug(`Registered method: ${name}`);\n  }\n\n  /**\n   * Unregister a method handler\n   *\n   * @param name - Method name to remove\n   * @returns true if method was removed, false if not found\n   */\n  unregisterMethod(name: string): boolean {\n    const removed = this.methods.delete(name);\n    if (removed) {\n      this.logger.debug(`Unregistered method: ${name}`);\n    }\n    return removed;\n  }\n\n  /**\n   * Get a list of all registered method names\n   *\n   * @returns Array of method names\n   */\n  getMethods(): string[] {\n    return Array.from(this.methods.keys());\n  }\n\n  /**\n   * Check if a method is registered\n   *\n   * @param name - Method name\n   * @returns true if method is registered\n   */\n  hasMethod(name: string): boolean {\n    return this.methods.has(name);\n  }\n\n  /**\n   * Add middleware to the server\n   * Middleware is executed in the order it's added\n   *\n   * @param middleware - Middleware to add\n   *\n   * @example\n   * ```typescript\n   * import { LoggingMiddleware } from '@gnana997/node-jsonrpc';\n   *\n   * server.use(new LoggingMiddleware());\n   * ```\n   */\n  use(middleware: Middleware): void {\n    if (!this.config.middleware) {\n      this.config.middleware = [];\n    }\n    this.config.middleware.push(middleware);\n  }\n\n  /**\n   * Send a notification to a specific client\n   *\n   * @param transport - Client transport to send to\n   * @param method - Notification method name\n   * @param params - Notification parameters\n   *\n   * @example\n   * ```typescript\n   * server.notify(clientTransport, 'update', { status: 'ready' });\n   * ```\n   */\n  notify(transport: Transport, method: string, params?: any): void {\n    if (!transport.isConnected()) {\n      this.logger.warn('Attempted to notify disconnected client');\n      return;\n    }\n\n    const notification: JSONRPCNotification = {\n      jsonrpc: '2.0',\n      method,\n      params,\n    };\n\n    this.logger.debug('Sending notification to client:', { method, params });\n\n    const messageStr = JSON.stringify(notification);\n    transport.send(messageStr);\n  }\n\n  /**\n   * Broadcast a notification to all connected clients\n   *\n   * @param method - Notification method name\n   * @param params - Notification parameters\n   * @returns Number of clients the notification was sent to\n   *\n   * @example\n   * ```typescript\n   * const count = server.broadcast('serverStatus', { status: 'ready' });\n   * console.log(`Sent to ${count} clients`);\n   * ```\n   */\n  broadcast(method: string, params?: any): number {\n    let count = 0;\n\n    for (const transport of this.connections) {\n      if (transport.isConnected()) {\n        this.notify(transport, method, params);\n        count++;\n      }\n    }\n\n    this.logger.debug(`Broadcast to ${count} clients:`, { method, params });\n\n    return count;\n  }\n\n  /**\n   * Get the number of active client connections\n   *\n   * @returns Number of connected clients\n   */\n  getConnectionCount(): number {\n    return this.connections.size;\n  }\n\n  /**\n   * Handle a new client connection\n   * @private\n   */\n  private handleConnection(transport: Transport): void {\n    this.connections.add(transport);\n    this.logger.debug(`Client connected. Total connections: ${this.connections.size}`);\n\n    // Call onConnection hook if provided\n    if (this.config.onConnection) {\n      this.config.onConnection(transport);\n    }\n\n    // Listen for messages from this client\n    transport.on('message', (message: string) => {\n      this.handleRawMessage(message, transport);\n    });\n\n    // Handle client disconnect\n    transport.on('disconnect', () => {\n      this.connections.delete(transport);\n      this.logger.debug(`Client disconnected. Total connections: ${this.connections.size}`);\n\n      // Call onDisconnection hook if provided\n      if (this.config.onDisconnection) {\n        this.config.onDisconnection(transport);\n      }\n    });\n\n    // Handle transport errors\n    transport.on('error', (error: Error) => {\n      this.logger.error('Client transport error:', error.message);\n      this.emit('error', error);\n    });\n  }\n\n  /**\n   * Handle raw message string from a client transport\n   * @private\n   */\n  private async handleRawMessage(messageStr: string, transport: Transport): Promise<void> {\n    let message: JSONRPCMessage | JSONRPCBatchRequest;\n\n    try {\n      message = JSON.parse(messageStr);\n    } catch (error) {\n      this.logger.error('Failed to parse message:', messageStr);\n      // Send parse error to client\n      this.sendErrorResponse(transport, null, JSONRPCError.parseError());\n      return;\n    }\n\n    // Handle batch (requests and/or notifications)\n    if (isBatch(message)) {\n      await this.handleBatchRequest(message, transport);\n      return;\n    }\n\n    // Handle single message\n    if (isRequest(message)) {\n      await this.handleRequest(message, transport);\n    } else if (isNotification(message)) {\n      await this.handleNotification(message, transport);\n    } else {\n      this.logger.warn('Received unknown message type:', message);\n      this.sendErrorResponse(transport, null, JSONRPCError.invalidRequest());\n    }\n  }\n\n  /**\n   * Handle a JSON-RPC request from a client\n   * @private\n   */\n  private async handleRequest(request: JSONRPCRequest, transport: Transport): Promise<void> {\n    this.logger.debug('Received request:', {\n      id: request.id,\n      method: request.method,\n      params: request.params,\n    });\n\n    // Apply request middleware\n    let processedRequest = request;\n    if (this.config.middleware && this.config.middleware.length > 0) {\n      try {\n        processedRequest = await executeMiddlewareChain(\n          this.config.middleware,\n          'onRequest',\n          request\n        );\n      } catch (error) {\n        this.logger.error('Request middleware error:', error);\n        this.sendErrorResponse(\n          transport,\n          request.id,\n          JSONRPCError.internalError('Middleware error')\n        );\n        return;\n      }\n    }\n\n    // Check if method exists\n    const handler = this.methods.get(processedRequest.method);\n    if (!handler) {\n      this.sendErrorResponse(\n        transport,\n        processedRequest.id,\n        JSONRPCError.methodNotFound(processedRequest.method)\n      );\n      return;\n    }\n\n    // Build request context\n    const context: RequestContext = {\n      method: processedRequest.method,\n      requestId: processedRequest.id,\n      transport,\n    };\n\n    try {\n      // Call handler\n      const result = await handler(processedRequest.params, context);\n\n      // Build response\n      let response: JSONRPCResponse = {\n        jsonrpc: '2.0',\n        result,\n        id: processedRequest.id,\n      };\n\n      // Apply response middleware\n      if (this.config.middleware && this.config.middleware.length > 0) {\n        response = await executeMiddlewareChain(this.config.middleware, 'onResponse', response);\n      }\n\n      this.logger.debug('Sending response:', { id: response.id });\n\n      // Send response\n      const messageStr = JSON.stringify(response);\n      transport.send(messageStr);\n    } catch (error: any) {\n      this.logger.error('Handler error:', error);\n\n      // Send error response\n      const jsonRpcError =\n        error instanceof JSONRPCError\n          ? error\n          : JSONRPCError.internalError(error.message, {\n              stack: error.stack,\n            });\n\n      this.sendErrorResponse(transport, processedRequest.id, jsonRpcError);\n    }\n  }\n\n  /**\n   * Handle a notification from a client\n   * @private\n   */\n  private async handleNotification(\n    notification: JSONRPCNotification,\n    transport: Transport\n  ): Promise<void> {\n    this.logger.debug('Received notification:', {\n      method: notification.method,\n      params: notification.params,\n    });\n\n    // Apply notification middleware\n    if (this.config.middleware && this.config.middleware.length > 0) {\n      try {\n        await executeMiddlewareChain(this.config.middleware, 'onNotification', notification);\n      } catch (error) {\n        this.logger.error('Notification middleware error:', error);\n        // Notifications don't send responses, so just log\n      }\n    }\n\n    // Emit notification event\n    this.emit('notification', notification.method, notification.params, transport);\n  }\n\n  /**\n   * Handle a batch from a client (can contain requests and/or notifications)\n   * @private\n   */\n  private async handleBatchRequest(\n    batchRequest: JSONRPCBatch,\n    transport: Transport\n  ): Promise<void> {\n    this.logger.debug('Received batch request with', batchRequest.length, 'items');\n\n    // Per JSON-RPC 2.0 spec: empty batch is invalid\n    if (batchRequest.length === 0) {\n      this.sendErrorResponse(transport, null, JSONRPCError.invalidRequest());\n      return;\n    }\n\n    // Apply batch request middleware\n    let processedBatch = batchRequest;\n    if (this.config.middleware && this.config.middleware.length > 0) {\n      try {\n        processedBatch = await executeMiddlewareChain(\n          this.config.middleware,\n          'onBatchRequest',\n          batchRequest\n        );\n      } catch (error) {\n        this.logger.error('Batch request middleware error:', error);\n        this.sendErrorResponse(transport, null, JSONRPCError.internalError('Middleware error'));\n        return;\n      }\n    }\n\n    // Process all requests in parallel\n    const responsePromises = processedBatch.map(async (item) => {\n      // Handle notifications separately (no response)\n      if (isNotification(item)) {\n        await this.handleNotification(item, transport);\n        return null; // No response for notifications\n      }\n\n      // Handle regular requests - return the response\n      if (isRequest(item)) {\n        return this.processRequestForBatch(item, transport);\n      }\n\n      // Invalid item in batch\n      return {\n        jsonrpc: '2.0' as const,\n        error: JSONRPCError.invalidRequest().toJSON(),\n        id: null,\n      };\n    });\n\n    const responses = await Promise.all(responsePromises);\n\n    // Filter out null responses (from notifications)\n    const batchResponse: JSONRPCBatchResponse = responses.filter(\n      (r): r is JSONRPCResponse | JSONRPCErrorResponse => r !== null\n    );\n\n    // Per JSON-RPC 2.0 spec: if all requests were notifications, don't send a response\n    if (batchResponse.length === 0) {\n      this.logger.debug('Batch contained only notifications, not sending response');\n      return;\n    }\n\n    // Apply batch response middleware\n    let finalBatchResponse = batchResponse;\n    if (this.config.middleware && this.config.middleware.length > 0) {\n      finalBatchResponse = await executeMiddlewareChain(\n        this.config.middleware,\n        'onBatchResponse',\n        batchResponse\n      );\n    }\n\n    // Send batch response\n    this.logger.debug('Sending batch response with', finalBatchResponse.length, 'items');\n    const messageStr = JSON.stringify(finalBatchResponse);\n    transport.send(messageStr);\n  }\n\n  /**\n   * Process a single request within a batch and return the response\n   * @private\n   */\n  private async processRequestForBatch(\n    request: JSONRPCRequest,\n    transport: Transport\n  ): Promise<JSONRPCResponse | JSONRPCErrorResponse> {\n    try {\n      // Apply request middleware\n      let processedRequest = request;\n      if (this.config.middleware && this.config.middleware.length > 0) {\n        processedRequest = await executeMiddlewareChain(\n          this.config.middleware,\n          'onRequest',\n          request\n        );\n      }\n\n      // Check if method exists\n      const handler = this.methods.get(processedRequest.method);\n      if (!handler) {\n        return {\n          jsonrpc: '2.0',\n          error: JSONRPCError.methodNotFound(processedRequest.method).toJSON(),\n          id: processedRequest.id,\n        };\n      }\n\n      // Build request context\n      const context: RequestContext = {\n        method: processedRequest.method,\n        requestId: processedRequest.id,\n        transport,\n      };\n\n      // Call handler\n      const result = await handler(processedRequest.params, context);\n\n      // Build response\n      let response: JSONRPCResponse = {\n        jsonrpc: '2.0',\n        result,\n        id: processedRequest.id,\n      };\n\n      // Apply response middleware\n      if (this.config.middleware && this.config.middleware.length > 0) {\n        response = await executeMiddlewareChain(this.config.middleware, 'onResponse', response);\n      }\n\n      return response;\n    } catch (error: any) {\n      const jsonRpcError =\n        error instanceof JSONRPCError\n          ? error\n          : JSONRPCError.internalError(error.message, {\n              stack: error.stack,\n            });\n\n      return {\n        jsonrpc: '2.0',\n        error: jsonRpcError.toJSON(),\n        id: request.id,\n      };\n    }\n  }\n\n  /**\n   * Send an error response to a client\n   * @private\n   */\n  private sendErrorResponse(\n    transport: Transport,\n    id: string | number | null,\n    error: JSONRPCError\n  ): void {\n    const errorResponse: JSONRPCErrorResponse = {\n      jsonrpc: '2.0',\n      error: error.toJSON(),\n      id,\n    };\n\n    this.logger.debug('Sending error response:', {\n      id,\n      code: error.code,\n      message: error.message,\n    });\n\n    const messageStr = JSON.stringify(errorResponse);\n    transport.send(messageStr);\n  }\n}\n"]}