UNPKG

mcp-use

Version:

A utility library for integrating Model Context Protocol (MCP) with LangChain, Zod, and related tools. Provides helpers for schema conversion, event streaming, and SDK usage.

68 lines (67 loc) 2.32 kB
import WS from 'ws'; import { logger } from '../logging.js'; import { ConnectionManager } from './base.js'; export class WebSocketConnectionManager extends ConnectionManager { url; headers; _ws = null; /** * @param url The WebSocket URL to connect to. * @param headers Optional headers to include in the connection handshake. */ constructor(url, headers = {}) { super(); this.url = url; this.headers = headers; } /** Establish a WebSocket connection and wait until it is open. */ async establishConnection() { logger.debug(`Connecting to WebSocket: ${this.url}`); return new Promise((resolve, reject) => { const ws = new WS(this.url, { headers: this.headers }); this._ws = ws; const onOpen = () => { // eslint-disable-next-line ts/no-use-before-define cleanup(); logger.debug('WebSocket connected successfully'); resolve(ws); }; const onError = (err) => { // eslint-disable-next-line ts/no-use-before-define cleanup(); logger.error(`Failed to connect to WebSocket: ${err}`); reject(err); }; const cleanup = () => { ws.off('open', onOpen); ws.off('error', onError); }; // Register listeners (browser vs Node API differences handled) ws.on('open', onOpen); ws.on('error', onError); }); } /** Cleanly close the WebSocket connection. */ async closeConnection(connection) { logger.debug('Closing WebSocket connection'); return new Promise((resolve) => { const onClose = () => { connection.off('close', onClose); this._ws = null; resolve(); }; if (connection.readyState === WS.CLOSED) { onClose(); return; } connection.on('close', onClose); try { connection.close(); } catch (e) { logger.warn(`Error closing WebSocket connection: ${e}`); onClose(); } }); } }