UNPKG

muppet

Version:

Toolkit for building MCPs on Honojs

2 lines (1 loc) 1.83 kB
"use strict";var i=Object.defineProperty;var a=(t,e)=>i(t,"name",{value:e,configurable:!0});var c=require("@modelcontextprotocol/sdk/types.js"),h=require("hono/streaming"),d=require("hono/adapter");class S{static{a(this,"SSEHonoTransport")}constructor(e,r){this._endpoint=e,this._sessionId=r??crypto.randomUUID()}connectWithStream(e){this.stream=e}async start(){if(this._stream)throw new Error("SSEServerTransport already started! If using Server class, note that connect() calls start() automatically.");await this.stream.writeSSE({data:`${encodeURI(this._endpoint)}?sessionId=${this._sessionId}`,event:"endpoint"}),this._stream=this.stream}async handlePostMessage(e,r){if(!this._stream)throw new Error("SSE connection not established");const s=r??await e.req.json();await this.handleMessage(typeof s=="string"?JSON.parse(s):s)}async handleMessage(e){let r;try{r=c.JSONRPCMessageSchema.parse(e)}catch(s){throw this.onerror?.(s),s}this.onmessage?.(r)}async close(){this._stream?.close(),this._stream=void 0,this.onclose?.()}async send(e){if(!this._stream)throw new Error("Not connected");this._stream.writeSSE({data:JSON.stringify(e),event:"message"})}get sessionId(){return this._sessionId}}const m=a(async(t,e,r)=>{try{await e(t)}catch(s){s instanceof Error&&r?(await r(s,t),await t.writeSSE({event:"error",data:s.message})):console.error(s)}},"run"),l=new WeakMap,w=a((t,e,r)=>{const{readable:s,writable:o}=new TransformStream,n=new h.SSEStreamingApi(o,s);return l.set(n.responseReadable,t),t.header("Transfer-Encoding","chunked"),t.header("Content-Type","text/event-stream"),t.header("Cache-Control","no-cache"),t.header("Connection","keep-alive"),d.getRuntimeKey()==="workerd"&&t.header("Content-Encoding","Identity"),m(n,e,r),t.newResponse(n.responseReadable)},"streamSSE");exports.SSEHonoTransport=S,exports.streamSSE=w;