{"version":3,"sources":["../src/transport.ts","../src/types.ts","../src/client.ts"],"names":["EventEmitter","net","os","ConnectionState","BaseJSONRPCClient","BaseJSONRPCError"],"mappings":"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","file":"index.cjs","sourcesContent":["import { EventEmitter } from 'node:events';\r\nimport * as net from 'node:net';\r\nimport * as os from 'node:os';\r\nimport type { Transport } from '@gnana997/node-jsonrpc/transport';\r\n\r\nexport interface IPCTransportConfig {\r\n  /**\r\n   * Socket path for IPC connection\r\n   * - Unix/Linux/Mac: Path to Unix socket (e.g., '/tmp/myapp.sock')\r\n   * - Windows: Named pipe name (e.g., '\\\\\\\\.\\\\pipe\\\\myapp') or simple name (e.g., 'myapp')\r\n   */\r\n  socketPath: string;\r\n\r\n  /**\r\n   * Connection timeout in milliseconds\r\n   * @default 10000 (10 seconds)\r\n   */\r\n  connectionTimeout?: number;\r\n\r\n  /**\r\n   * Enable debug logging\r\n   * @default false\r\n   */\r\n  debug?: boolean;\r\n}\r\n\r\n/**\r\n * IPC Transport implementation for JSON-RPC over Unix sockets and Windows named pipes\r\n *\r\n * Implements the Transport interface from @gnana997/node-jsonrpc for IPC communication.\r\n * Handles platform-specific socket path normalization and line-delimited message framing.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { JSONRPCClient } from '@gnana997/node-jsonrpc';\r\n * import { IPCTransport } from 'node-ipc-jsonrpc';\r\n *\r\n * const transport = new IPCTransport({ socketPath: 'myapp' });\r\n * const client = new JSONRPCClient({ transport });\r\n *\r\n * await client.connect();\r\n * const result = await client.request('method', params);\r\n * ```\r\n */\r\nexport class IPCTransport extends EventEmitter implements Transport {\r\n  private config: Required<IPCTransportConfig>;\r\n  private socket: net.Socket | null = null;\r\n  private buffer = '';\r\n  private connected = false;\r\n\r\n  constructor(config: IPCTransportConfig) {\r\n    super();\r\n    this.config = {\r\n      socketPath: config.socketPath,\r\n      connectionTimeout: config.connectionTimeout ?? 10000,\r\n      debug: config.debug ?? false,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Connect to the IPC server\r\n   */\r\n  async connect(): Promise<void> {\r\n    if (this.connected) {\r\n      this.log('Already connected');\r\n      return;\r\n    }\r\n\r\n    this.log('Connecting to', this.config.socketPath);\r\n\r\n    return new Promise((resolve, reject) => {\r\n      const socket = new net.Socket();\r\n      this.socket = socket;\r\n\r\n      const timeout = setTimeout(() => {\r\n        socket.destroy();\r\n        this.connected = false;\r\n        reject(new Error(`Connection timeout after ${this.config.connectionTimeout}ms`));\r\n      }, this.config.connectionTimeout);\r\n\r\n      socket.on('connect', () => {\r\n        clearTimeout(timeout);\r\n        this.connected = true;\r\n        this.log('Connected');\r\n        resolve();\r\n      });\r\n\r\n      socket.on('data', (data) => {\r\n        this.handleData(data);\r\n      });\r\n\r\n      socket.on('error', (error) => {\r\n        clearTimeout(timeout);\r\n        this.log('Socket error:', error.message);\r\n        this.emit('error', error);\r\n      });\r\n\r\n      socket.on('close', () => {\r\n        this.log('Socket closed');\r\n        this.connected = false;\r\n        this.emit('close');\r\n      });\r\n\r\n      socket.on('end', () => {\r\n        this.log('Connection ended');\r\n        this.connected = false;\r\n        this.emit('close');\r\n      });\r\n\r\n      // Connect to socket\r\n      const socketPath = this.normalizeSocketPath(this.config.socketPath);\r\n      socket.connect(socketPath);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Disconnect from the IPC server\r\n   */\r\n  async disconnect(): Promise<void> {\r\n    if (!this.socket) {\r\n      return;\r\n    }\r\n\r\n    this.log('Disconnecting');\r\n    this.socket.destroy();\r\n    this.socket = null;\r\n    this.connected = false;\r\n    this.buffer = '';\r\n  }\r\n\r\n  /**\r\n   * Send a message to the server\r\n   */\r\n  send(message: string): void {\r\n    if (!this.socket || !this.connected) {\r\n      this.emit('error', new Error('Cannot send - not connected'));\r\n      return;\r\n    }\r\n\r\n    try {\r\n      this.log('Sending:', message);\r\n      this.socket.write(`${message}\\n`);\r\n    } catch (error) {\r\n      this.emit('error', error as Error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if connected\r\n   */\r\n  isConnected(): boolean {\r\n    return this.connected && this.socket !== null && !this.socket.destroyed;\r\n  }\r\n\r\n  /**\r\n   * Normalize socket path for platform\r\n   * @private\r\n   */\r\n  private normalizeSocketPath(path: string): string {\r\n    if (os.platform() === 'win32') {\r\n      // If it's already a named pipe path, return as-is\r\n      if (path.startsWith('\\\\\\\\.\\\\pipe\\\\') || path.startsWith('\\\\\\\\?\\\\pipe\\\\')) {\r\n        return path;\r\n      }\r\n\r\n      // If it's an absolute Windows path (contains drive letter), use as-is for Unix socket\r\n      // Windows 10+ supports Unix domain sockets at file paths\r\n      if (path.includes(':') || path.startsWith('\\\\') || path.startsWith('/')) {\r\n        return path;\r\n      }\r\n\r\n      // For simple names (no path separators), convert to named pipe\r\n      // This matches the Go server behavior with winio\r\n      return `\\\\\\\\.\\\\pipe\\\\${path}`;\r\n    }\r\n\r\n    // Unix/Linux/Mac socket path normalization\r\n    // If already has directory separator, keep it\r\n    if (path.includes('/')) {\r\n      return path;\r\n    }\r\n\r\n    // If has .sock extension, prepend /tmp/\r\n    if (path.endsWith('.sock')) {\r\n      return `/tmp/${path}`;\r\n    }\r\n\r\n    // Simple name - convert to /tmp/{name}.sock\r\n    return `/tmp/${path}.sock`;\r\n  }\r\n\r\n  /**\r\n   * Handle incoming data from socket\r\n   * Implements line-delimited JSON framing\r\n   * @private\r\n   */\r\n  private handleData(data: Buffer): void {\r\n    this.buffer += data.toString();\r\n\r\n    // Process complete JSON lines\r\n    let newlineIndex: number;\r\n    while ((newlineIndex = this.buffer.indexOf('\\n')) !== -1) {\r\n      const line = this.buffer.slice(0, newlineIndex).trim();\r\n      this.buffer = this.buffer.slice(newlineIndex + 1);\r\n\r\n      if (line.length === 0) continue;\r\n\r\n      this.log('Received:', line);\r\n      this.emit('message', line);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Debug logging\r\n   * @private\r\n   */\r\n  private log(...args: unknown[]): void {\r\n    if (this.config.debug) {\r\n      console.log('[IPCTransport]', ...args);\r\n    }\r\n  }\r\n}\r\n","/**\n * JSON-RPC 2.0 Types\n */\n\n/** JSON-RPC 2.0 Request */\nexport interface JSONRPCRequest {\n  jsonrpc?: '2.0';\n  method: string;\n  params?: unknown;\n  id: string | number;\n}\n\n/** JSON-RPC 2.0 Response (success) */\nexport interface JSONRPCResponse {\n  jsonrpc?: '2.0';\n  result: unknown;\n  error?: never;\n  id: string | number;\n}\n\n/** JSON-RPC 2.0 Error object */\nexport interface JSONRPCError {\n  code: number;\n  message: string;\n  data?: unknown;\n}\n\n/** JSON-RPC 2.0 Response (error) */\nexport interface JSONRPCErrorResponse {\n  jsonrpc?: '2.0';\n  result?: never;\n  error: JSONRPCError;\n  id: string | number;\n}\n\n/** JSON-RPC 2.0 Notification (no response expected) */\nexport interface JSONRPCNotification {\n  jsonrpc?: '2.0';\n  method: string;\n  params?: unknown;\n  id?: never;\n}\n\n/** Union of all possible JSON-RPC messages */\nexport type JSONRPCMessage =\n  | JSONRPCRequest\n  | JSONRPCResponse\n  | JSONRPCErrorResponse\n  | JSONRPCNotification;\n\n/**\n * Client Configuration Options\n */\nexport interface ClientConfig {\n  /**\n   * IPC socket path\n   * - Unix/Mac: absolute path (e.g., '/tmp/myapp.sock')\n   * - Windows: named pipe name (e.g., 'myapp') -> will be converted to '\\\\.\\pipe\\myapp'\n   * - Or full Windows pipe path (e.g., '\\\\\\\\.\\\\pipe\\\\myapp')\n   */\n  socketPath: string;\n\n  /**\n   * Connection timeout in milliseconds\n   * @default 10000 (10 seconds)\n   */\n  connectionTimeout?: number;\n\n  /**\n   * Request timeout in milliseconds\n   * @default 30000 (30 seconds)\n   */\n  requestTimeout?: number;\n\n  /**\n   * Enable debug logging\n   * @default false\n   */\n  debug?: boolean;\n\n  /**\n   * Auto-reconnect on connection loss\n   * @default false\n   */\n  autoReconnect?: boolean;\n\n  /**\n   * Maximum reconnection attempts\n   * @default 3\n   */\n  maxReconnectAttempts?: number;\n\n  /**\n   * Delay between reconnection attempts in milliseconds\n   * @default 1000\n   */\n  reconnectDelay?: number;\n}\n\n/**\n * Connection Events\n *\n * Event parameter arrays for EventEmitter\n */\nexport interface ClientEvents {\n  /** Fired when connected to the server */\n  connected: [];\n\n  /** Fired when disconnected from the server */\n  disconnected: [];\n\n  /** Fired when a connection error occurs */\n  error: [error: Error];\n\n  /** Fired when a notification is received from the server */\n  notification: [method: string, params: unknown];\n\n  /** Fired on reconnection attempt */\n  reconnecting: [attempt: number];\n}\n\n/**\n * Pending Request\n */\nexport interface PendingRequest {\n  resolve: (result: unknown) => void;\n  reject: (error: Error) => void;\n  timeout: NodeJS.Timeout;\n}\n\n/**\n * Connection State\n */\nexport enum ConnectionState {\n  DISCONNECTED = 'disconnected',\n  CONNECTING = 'connecting',\n  CONNECTED = 'connected',\n  RECONNECTING = 'reconnecting',\n  CLOSED = 'closed',\n}\n","import { EventEmitter } from 'node:events';\r\nimport { JSONRPCError as BaseJSONRPCError } from '@gnana997/node-jsonrpc';\r\nimport { JSONRPCClient as BaseJSONRPCClient } from '@gnana997/node-jsonrpc/client';\r\nimport { IPCTransport } from './transport.js';\r\nimport type {\r\n  ClientConfig,\r\n  ClientEvents,\r\n  ConnectionState,\r\n  JSONRPCError as IJSONRPCError,\r\n} from './types.js';\r\nimport { ConnectionState as State } from './types.js';\r\n\r\n/**\r\n * JSON-RPC Error class\r\n * Extends Error with JSON-RPC error properties\r\n */\r\nexport class JSONRPCError extends Error implements IJSONRPCError {\r\n  code: number;\r\n  data?: unknown;\r\n\r\n  constructor(error: IJSONRPCError) {\r\n    super(error.message);\r\n    this.name = 'JSONRPCError';\r\n    this.code = error.code;\r\n    this.data = error.data;\r\n\r\n    // Maintain proper stack trace\r\n    if (Error.captureStackTrace) {\r\n      Error.captureStackTrace(this, JSONRPCError);\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * JSON-RPC Client for IPC communication over Unix sockets/Named Pipes\r\n *\r\n * This is a wrapper around @gnana997/node-jsonrpc's JSONRPCClient that provides\r\n * IPC-specific transport and maintains backward compatibility with the original API.\r\n *\r\n * @example\r\n * ```typescript\r\n * const client = new JSONRPCClient({ socketPath: '/tmp/myapp.sock' });\r\n *\r\n * // Connect\r\n * await client.connect();\r\n *\r\n * // Send request\r\n * const result = await client.request('search', { query: 'test' });\r\n *\r\n * // Listen for notifications\r\n * client.on('notification', (method, params) => {\r\n *   console.log('Received:', method, params);\r\n * });\r\n *\r\n * // Disconnect\r\n * await client.disconnect();\r\n * ```\r\n */\r\nexport class JSONRPCClient extends EventEmitter<ClientEvents> {\r\n  private config: Required<ClientConfig>;\r\n  private transport: IPCTransport;\r\n  private client: BaseJSONRPCClient;\r\n  private state: ConnectionState = State.DISCONNECTED;\r\n  private reconnectAttempts = 0;\r\n\r\n  constructor(config: ClientConfig) {\r\n    super();\r\n    this.config = {\r\n      socketPath: config.socketPath,\r\n      connectionTimeout: config.connectionTimeout ?? 10000,\r\n      requestTimeout: config.requestTimeout ?? 30000,\r\n      debug: config.debug ?? false,\r\n      autoReconnect: config.autoReconnect ?? false,\r\n      maxReconnectAttempts: config.maxReconnectAttempts ?? 3,\r\n      reconnectDelay: config.reconnectDelay ?? 1000,\r\n    };\r\n\r\n    // Create IPC transport\r\n    this.transport = new IPCTransport({\r\n      socketPath: this.config.socketPath,\r\n      connectionTimeout: this.config.connectionTimeout,\r\n      debug: this.config.debug,\r\n    });\r\n\r\n    // Create JSON-RPC client with IPC transport\r\n    this.client = new BaseJSONRPCClient({\r\n      transport: this.transport,\r\n      requestTimeout: this.config.requestTimeout,\r\n      debug: this.config.debug,\r\n    });\r\n\r\n    // Forward events from underlying client\r\n    this.setupEventForwarding();\r\n  }\r\n\r\n  /**\r\n   * Setup event forwarding from underlying client to this wrapper\r\n   * @private\r\n   */\r\n  private setupEventForwarding(): void {\r\n    // Forward connected event\r\n    this.client.on('connected', () => {\r\n      this.state = State.CONNECTED;\r\n      this.reconnectAttempts = 0;\r\n      this.emit('connected');\r\n    });\r\n\r\n    // Forward disconnected event\r\n    this.client.on('disconnected', () => {\r\n      const wasConnected = this.state === State.CONNECTED;\r\n      this.state = State.DISCONNECTED;\r\n      this.emit('disconnected');\r\n\r\n      // Auto-reconnect if enabled and was previously connected\r\n      if (\r\n        wasConnected &&\r\n        this.config.autoReconnect &&\r\n        this.reconnectAttempts < this.config.maxReconnectAttempts\r\n      ) {\r\n        this.reconnectAttempts++;\r\n        this.state = State.RECONNECTING;\r\n        this.emit('reconnecting', this.reconnectAttempts);\r\n\r\n        setTimeout(() => {\r\n          this.connect().catch((error) => {\r\n            if (this.config.debug) {\r\n              console.log('[JSONRPCClient] Reconnection failed:', error.message);\r\n            }\r\n          });\r\n        }, this.config.reconnectDelay);\r\n      }\r\n    });\r\n\r\n    // Forward notification event\r\n    this.client.on('notification', (method, params) => {\r\n      this.emit('notification', method, params);\r\n    });\r\n\r\n    // Forward error event\r\n    this.client.on('error', (error) => {\r\n      this.emit('error', error);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Connect to the IPC server\r\n   */\r\n  async connect(): Promise<void> {\r\n    if (this.state === State.CONNECTED) {\r\n      if (this.config.debug) {\r\n        console.log('[JSONRPCClient] Already connected');\r\n      }\r\n      return;\r\n    }\r\n\r\n    if (this.state === State.CONNECTING) {\r\n      throw new Error('Connection already in progress');\r\n    }\r\n\r\n    this.state = State.CONNECTING;\r\n    try {\r\n      await this.client.connect();\r\n      // Ensure state is updated and event is emitted\r\n      // Event handler may have already set state to CONNECTED\r\n      if (this.client.isConnected()) {\r\n        if ((this.state as ConnectionState) !== State.CONNECTED) {\r\n          this.state = State.CONNECTED;\r\n          this.reconnectAttempts = 0;\r\n          this.emit('connected');\r\n        }\r\n      }\r\n    } catch (error) {\r\n      this.state = State.DISCONNECTED;\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Disconnect from the IPC server\r\n   */\r\n  async disconnect(): Promise<void> {\r\n    if (this.state === State.DISCONNECTED || this.state === State.CLOSED) {\r\n      return;\r\n    }\r\n\r\n    const wasConnected = this.state === State.CONNECTED;\r\n    this.state = State.CLOSED;\r\n    await this.client.disconnect();\r\n\r\n    // Emit disconnected event if we were connected\r\n    if (wasConnected) {\r\n      this.emit('disconnected');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Send a JSON-RPC request and wait for response\r\n   */\r\n  async request<TResult = unknown>(method: string, params?: unknown): Promise<TResult> {\r\n    try {\r\n      return await this.client.request<TResult>(method, params);\r\n    } catch (error) {\r\n      throw this.transformError(error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Send a JSON-RPC notification (no response expected)\r\n   */\r\n  notify(method: string, params?: unknown): void {\r\n    try {\r\n      this.client.notify(method, params);\r\n    } catch (error) {\r\n      throw this.transformError(error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Transform errors from underlying client to maintain backward compatibility\r\n   * @private\r\n   */\r\n  private transformError(error: unknown): Error {\r\n    if (!(error instanceof Error)) {\r\n      return error as Error;\r\n    }\r\n\r\n    // Convert BaseJSONRPCError to local JSONRPCError for backward compatibility\r\n    if (error instanceof BaseJSONRPCError) {\r\n      return new JSONRPCError({\r\n        code: error.code,\r\n        message: error.message,\r\n        data: error.data,\r\n      });\r\n    }\r\n\r\n    // Transform error messages to match original client\r\n    let message = error.message;\r\n\r\n    // \"Client not connected\" → \"Not connected\"\r\n    if (message === 'Client not connected') {\r\n      message = 'Not connected';\r\n    }\r\n\r\n    // \"Request N timed out after Xms\" → \"Request timeout after Xms\"\r\n    const timeoutMatch = message.match(/Request \\d+ timed out after (\\d+)ms/);\r\n    if (timeoutMatch) {\r\n      message = `Request timeout after ${timeoutMatch[1]}ms`;\r\n    }\r\n\r\n    // Create a new error with the transformed message\r\n    const transformedError = new Error(message);\r\n    transformedError.name = error.name;\r\n    transformedError.stack = error.stack;\r\n    return transformedError;\r\n  }\r\n\r\n  /**\r\n   * Get current connection state\r\n   */\r\n  getState(): ConnectionState {\r\n    return this.state;\r\n  }\r\n\r\n  /**\r\n   * Check if connected\r\n   */\r\n  isConnected(): boolean {\r\n    return this.state === State.CONNECTED;\r\n  }\r\n}\r\n"]}