websocket.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.WebSocketClientTransport = void 0;
  4. const types_js_1 = require("../types.js");
  5. const SUBPROTOCOL = 'mcp';
  6. /**
  7. * Client transport for WebSocket: this will connect to a server over the WebSocket protocol.
  8. */
  9. class WebSocketClientTransport {
  10. constructor(url) {
  11. this._url = url;
  12. }
  13. start() {
  14. if (this._socket) {
  15. throw new Error('WebSocketClientTransport already started! If using Client class, note that connect() calls start() automatically.');
  16. }
  17. return new Promise((resolve, reject) => {
  18. this._socket = new WebSocket(this._url, SUBPROTOCOL);
  19. this._socket.onerror = event => {
  20. const error = 'error' in event ? event.error : new Error(`WebSocket error: ${JSON.stringify(event)}`);
  21. reject(error);
  22. this.onerror?.(error);
  23. };
  24. this._socket.onopen = () => {
  25. resolve();
  26. };
  27. this._socket.onclose = () => {
  28. this.onclose?.();
  29. };
  30. this._socket.onmessage = (event) => {
  31. let message;
  32. try {
  33. message = types_js_1.JSONRPCMessageSchema.parse(JSON.parse(event.data));
  34. }
  35. catch (error) {
  36. this.onerror?.(error);
  37. return;
  38. }
  39. this.onmessage?.(message);
  40. };
  41. });
  42. }
  43. async close() {
  44. this._socket?.close();
  45. }
  46. send(message) {
  47. return new Promise((resolve, reject) => {
  48. if (!this._socket) {
  49. reject(new Error('Not connected'));
  50. return;
  51. }
  52. this._socket?.send(JSON.stringify(message));
  53. resolve();
  54. });
  55. }
  56. }
  57. exports.WebSocketClientTransport = WebSocketClientTransport;
  58. //# sourceMappingURL=websocket.js.map