@mcp-web/bridge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +311 -0
  3. package/dist/adapters/bun.d.ts +95 -0
  4. package/dist/adapters/bun.d.ts.map +1 -0
  5. package/dist/adapters/bun.js +286 -0
  6. package/dist/adapters/bun.js.map +1 -0
  7. package/dist/adapters/deno.d.ts +89 -0
  8. package/dist/adapters/deno.d.ts.map +1 -0
  9. package/dist/adapters/deno.js +249 -0
  10. package/dist/adapters/deno.js.map +1 -0
  11. package/dist/adapters/index.d.ts +21 -0
  12. package/dist/adapters/index.d.ts.map +1 -0
  13. package/dist/adapters/index.js +21 -0
  14. package/dist/adapters/index.js.map +1 -0
  15. package/dist/adapters/node.d.ts +112 -0
  16. package/dist/adapters/node.d.ts.map +1 -0
  17. package/dist/adapters/node.js +309 -0
  18. package/dist/adapters/node.js.map +1 -0
  19. package/dist/adapters/partykit.d.ts +153 -0
  20. package/dist/adapters/partykit.d.ts.map +1 -0
  21. package/dist/adapters/partykit.js +372 -0
  22. package/dist/adapters/partykit.js.map +1 -0
  23. package/dist/bridge.d.ts +38 -0
  24. package/dist/bridge.d.ts.map +1 -0
  25. package/dist/bridge.js +1004 -0
  26. package/dist/bridge.js.map +1 -0
  27. package/dist/core.d.ts +75 -0
  28. package/dist/core.d.ts.map +1 -0
  29. package/dist/core.js +1508 -0
  30. package/dist/core.js.map +1 -0
  31. package/dist/index.d.ts +38 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +42 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/runtime/index.d.ts +11 -0
  36. package/dist/runtime/index.d.ts.map +1 -0
  37. package/dist/runtime/index.js +9 -0
  38. package/dist/runtime/index.js.map +1 -0
  39. package/dist/runtime/scheduler.d.ts +69 -0
  40. package/dist/runtime/scheduler.d.ts.map +1 -0
  41. package/dist/runtime/scheduler.js +88 -0
  42. package/dist/runtime/scheduler.js.map +1 -0
  43. package/dist/runtime/types.d.ts +144 -0
  44. package/dist/runtime/types.d.ts.map +1 -0
  45. package/dist/runtime/types.js +82 -0
  46. package/dist/runtime/types.js.map +1 -0
  47. package/dist/schemas.d.ts +6 -0
  48. package/dist/schemas.d.ts.map +1 -0
  49. package/dist/schemas.js +6 -0
  50. package/dist/schemas.js.map +1 -0
  51. package/dist/types.d.ts +130 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +28 -0
  56. package/src/adapters/bun.ts +354 -0
  57. package/src/adapters/deno.ts +282 -0
  58. package/src/adapters/index.ts +28 -0
  59. package/src/adapters/node.ts +385 -0
  60. package/src/adapters/partykit.ts +482 -0
  61. package/src/bridge.test.ts +64 -0
  62. package/src/core.ts +2176 -0
  63. package/src/index.ts +90 -0
  64. package/src/limits.test.ts +436 -0
  65. package/src/remote-mcp.test.ts +770 -0
  66. package/src/runtime/index.ts +24 -0
  67. package/src/runtime/scheduler.ts +130 -0
  68. package/src/runtime/types.ts +229 -0
  69. package/src/schemas.ts +6 -0
  70. package/src/session-naming.test.ts +443 -0
  71. package/src/types.ts +180 -0
  72. package/tsconfig.json +12 -0
@@ -0,0 +1,286 @@
1
+ /**
2
+ * MCPWebBridgeBun - Bun adapter for the MCP Web Bridge.
3
+ *
4
+ * Uses Bun.serve() with built-in WebSocket support for a single-port server.
5
+ * Bun's server natively handles both HTTP and WebSocket on the same port.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // server.ts
10
+ * import { MCPWebBridgeBun } from '@mcp-web/bridge';
11
+ *
12
+ * const bridge = new MCPWebBridgeBun({
13
+ * name: 'My App',
14
+ * description: 'My awesome app',
15
+ * port: 3001,
16
+ * });
17
+ *
18
+ * // Bridge is now listening on ws://localhost:3001 and http://localhost:3001
19
+ * ```
20
+ *
21
+ * @example Production deployment
22
+ * ```typescript
23
+ * import { MCPWebBridgeBun } from '@mcp-web/bridge';
24
+ *
25
+ * const bridge = new MCPWebBridgeBun({
26
+ * name: 'Production Bridge',
27
+ * description: 'Production MCP Web bridge server',
28
+ * port: Number(process.env.PORT) || 3001,
29
+ * hostname: '0.0.0.0',
30
+ * });
31
+ *
32
+ * // Graceful shutdown
33
+ * process.on('SIGTERM', async () => {
34
+ * await bridge.close();
35
+ * process.exit(0);
36
+ * });
37
+ * ```
38
+ *
39
+ * @remarks
40
+ * This adapter requires Bun runtime (https://bun.sh).
41
+ * Bun's `Bun.serve()` provides excellent performance with native WebSocket support.
42
+ *
43
+ * Key features:
44
+ * - Single port for HTTP and WebSocket
45
+ * - Native TypeScript support
46
+ * - High performance HTTP and WebSocket handling
47
+ *
48
+ * @see https://bun.sh/docs/api/http
49
+ * @see https://bun.sh/docs/api/websockets
50
+ */
51
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
52
+ if (kind === "m") throw new TypeError("Private method is not writable");
53
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
54
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
55
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
56
+ };
57
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
58
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
59
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
60
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
61
+ };
62
+ var _MCPWebBridgeBun_core, _MCPWebBridgeBun_server, _MCPWebBridgeBun_port, _MCPWebBridgeBun_hostname;
63
+ import { MCPWebBridge } from '../core.js';
64
+ import { TimerScheduler } from '../runtime/scheduler.js';
65
+ import { isSSEResponse } from '../runtime/types.js';
66
+ /**
67
+ * Wraps a Bun ServerWebSocket in our runtime-agnostic interface.
68
+ */
69
+ function createBunWebSocketWrapper() {
70
+ const messageHandlers = new Set();
71
+ // biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
72
+ let wsSocket = null;
73
+ const wrapped = {
74
+ send(data) {
75
+ if (wsSocket?.readyState === 1) {
76
+ // OPEN
77
+ wsSocket.send(data);
78
+ }
79
+ },
80
+ close(code, reason) {
81
+ wsSocket?.close(code, reason);
82
+ },
83
+ get readyState() {
84
+ if (!wsSocket)
85
+ return 'CLOSED';
86
+ switch (wsSocket.readyState) {
87
+ case 0:
88
+ return 'CONNECTING';
89
+ case 1:
90
+ return 'OPEN';
91
+ case 2:
92
+ return 'CLOSING';
93
+ case 3:
94
+ default:
95
+ return 'CLOSED';
96
+ }
97
+ },
98
+ onMessage(handler) {
99
+ messageHandlers.add(handler);
100
+ },
101
+ offMessage(handler) {
102
+ messageHandlers.delete(handler);
103
+ },
104
+ };
105
+ return {
106
+ wrapped,
107
+ messageHandlers,
108
+ // biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
109
+ setSocket: (socket) => {
110
+ wsSocket = socket;
111
+ },
112
+ };
113
+ }
114
+ /**
115
+ * Wraps a Bun Request in our runtime-agnostic HttpRequest interface.
116
+ */
117
+ function wrapBunRequest(req) {
118
+ return {
119
+ method: req.method,
120
+ url: req.url,
121
+ headers: {
122
+ get(name) {
123
+ return req.headers.get(name);
124
+ },
125
+ },
126
+ text() {
127
+ return req.text();
128
+ },
129
+ };
130
+ }
131
+ /**
132
+ * Bun adapter for MCPWebBridge.
133
+ * Provides a single-port server using Bun.serve() with native WebSocket support.
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * const bridge = new MCPWebBridgeBun({
138
+ * name: 'My App',
139
+ * description: 'My app',
140
+ * port: 3001,
141
+ * });
142
+ * ```
143
+ */
144
+ export class MCPWebBridgeBun {
145
+ constructor(config) {
146
+ _MCPWebBridgeBun_core.set(this, void 0);
147
+ // biome-ignore lint/suspicious/noExplicitAny: Bun.Server type varies
148
+ _MCPWebBridgeBun_server.set(this, void 0);
149
+ _MCPWebBridgeBun_port.set(this, void 0);
150
+ _MCPWebBridgeBun_hostname.set(this, void 0);
151
+ __classPrivateFieldSet(this, _MCPWebBridgeBun_port, config.port ?? 3001, "f");
152
+ __classPrivateFieldSet(this, _MCPWebBridgeBun_hostname, config.hostname ?? '0.0.0.0', "f");
153
+ // Create the core with a timer-based scheduler
154
+ const scheduler = new TimerScheduler();
155
+ __classPrivateFieldSet(this, _MCPWebBridgeBun_core, new MCPWebBridge(config, scheduler), "f");
156
+ const handlers = __classPrivateFieldGet(this, _MCPWebBridgeBun_core, "f").getHandlers();
157
+ // Start Bun server with WebSocket support
158
+ // biome-ignore lint/suspicious/noExplicitAny: Bun global is runtime-specific
159
+ __classPrivateFieldSet(this, _MCPWebBridgeBun_server, globalThis.Bun.serve({
160
+ port: __classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f"),
161
+ hostname: __classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f"),
162
+ // Handle HTTP requests
163
+ fetch: async (req, server) => {
164
+ const url = new URL(req.url);
165
+ // Handle WebSocket upgrade
166
+ if (req.headers.get('upgrade')?.toLowerCase() === 'websocket') {
167
+ const sessionId = url.searchParams.get('session');
168
+ if (!sessionId) {
169
+ return new Response('Missing session parameter', { status: 400 });
170
+ }
171
+ const { wrapped, messageHandlers, setSocket } = createBunWebSocketWrapper();
172
+ const success = server.upgrade(req, {
173
+ data: {
174
+ sessionId,
175
+ wrapped,
176
+ // Store these for the websocket handlers
177
+ messageHandlers,
178
+ setSocket,
179
+ handlers,
180
+ url,
181
+ },
182
+ });
183
+ if (success) {
184
+ return undefined; // Bun handles the upgrade
185
+ }
186
+ return new Response('WebSocket upgrade failed', { status: 500 });
187
+ }
188
+ // Handle regular HTTP requests
189
+ const wrappedReq = wrapBunRequest(req);
190
+ const httpResponse = await handlers.onHttpRequest(wrappedReq);
191
+ // Check if this is an SSE response
192
+ if (isSSEResponse(httpResponse)) {
193
+ // Create a ReadableStream for SSE
194
+ const stream = new ReadableStream({
195
+ start(controller) {
196
+ // Create writer function that sends SSE-formatted data
197
+ const writer = (data) => {
198
+ controller.enqueue(new TextEncoder().encode(`data: ${data}\n\n`));
199
+ };
200
+ // Set up the SSE stream
201
+ httpResponse.setup(writer, () => {
202
+ controller.close();
203
+ });
204
+ // Keep connection alive with periodic comments
205
+ const keepAlive = setInterval(() => {
206
+ try {
207
+ controller.enqueue(new TextEncoder().encode(': keepalive\n\n'));
208
+ }
209
+ catch {
210
+ clearInterval(keepAlive);
211
+ }
212
+ }, 30000);
213
+ },
214
+ });
215
+ return new Response(stream, {
216
+ status: httpResponse.status,
217
+ headers: httpResponse.headers,
218
+ });
219
+ }
220
+ return new Response(httpResponse.body, {
221
+ status: httpResponse.status,
222
+ headers: httpResponse.headers,
223
+ });
224
+ },
225
+ // WebSocket handlers
226
+ websocket: {
227
+ // biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
228
+ open(ws) {
229
+ const data = ws.data;
230
+ // Connect the socket to the wrapper
231
+ data.setSocket(ws);
232
+ // Notify the bridge
233
+ data.handlers.onWebSocketConnect(data.sessionId, data.wrapped, data.url);
234
+ },
235
+ // biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
236
+ message(ws, message) {
237
+ const data = ws.data;
238
+ const str = typeof message === 'string' ? message : message.toString();
239
+ // Notify message handlers
240
+ for (const handler of data.messageHandlers) {
241
+ handler(str);
242
+ }
243
+ // Notify the bridge
244
+ data.handlers.onWebSocketMessage(data.sessionId, data.wrapped, str);
245
+ },
246
+ // biome-ignore lint/suspicious/noExplicitAny: Bun's ServerWebSocket type varies
247
+ close(ws) {
248
+ const data = ws.data;
249
+ data.handlers.onWebSocketClose(data.sessionId);
250
+ },
251
+ },
252
+ }), "f");
253
+ console.log(`🌉 MCP Web Bridge (Bun) listening on ${__classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f")}:${__classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f")}`);
254
+ console.log(` WebSocket: ws://${__classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f") === '0.0.0.0' ? 'localhost' : __classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f")}:${__classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f")}`);
255
+ console.log(` HTTP/MCP: http://${__classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f") === '0.0.0.0' ? 'localhost' : __classPrivateFieldGet(this, _MCPWebBridgeBun_hostname, "f")}:${__classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f")}`);
256
+ }
257
+ /**
258
+ * Get the underlying MCPWebBridge core instance.
259
+ */
260
+ get core() {
261
+ return __classPrivateFieldGet(this, _MCPWebBridgeBun_core, "f");
262
+ }
263
+ /**
264
+ * Get the bridge handlers for custom integrations.
265
+ */
266
+ getHandlers() {
267
+ return __classPrivateFieldGet(this, _MCPWebBridgeBun_core, "f").getHandlers();
268
+ }
269
+ /**
270
+ * Get the port the server is listening on.
271
+ */
272
+ get port() {
273
+ return __classPrivateFieldGet(this, _MCPWebBridgeBun_port, "f");
274
+ }
275
+ /**
276
+ * Gracefully shut down the bridge.
277
+ */
278
+ async close() {
279
+ // Stop the server
280
+ __classPrivateFieldGet(this, _MCPWebBridgeBun_server, "f")?.stop();
281
+ // Close the core (cleans up sessions, timers)
282
+ await __classPrivateFieldGet(this, _MCPWebBridgeBun_core, "f").close();
283
+ }
284
+ }
285
+ _MCPWebBridgeBun_core = new WeakMap(), _MCPWebBridgeBun_server = new WeakMap(), _MCPWebBridgeBun_port = new WeakMap(), _MCPWebBridgeBun_hostname = new WeakMap();
286
+ //# sourceMappingURL=bun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun.js","sourceRoot":"","sources":["../../src/adapters/bun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * MCPWebBridgeDeno - Deno adapter for the MCP Web Bridge.
3
+ *
4
+ * Uses Deno.serve() with WebSocket upgrade for a single-port server.
5
+ * Handles both HTTP requests and WebSocket connections on the same port.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // main.ts
10
+ * import { MCPWebBridgeDeno } from '@mcp-web/bridge';
11
+ *
12
+ * const bridge = new MCPWebBridgeDeno({
13
+ * name: 'My App',
14
+ * description: 'My awesome app',
15
+ * port: 3001,
16
+ * });
17
+ *
18
+ * // Bridge is now listening on ws://localhost:3001 and http://localhost:3001
19
+ * ```
20
+ *
21
+ * @example Deploy to Deno Deploy
22
+ * ```typescript
23
+ * // main.ts - Entry point for Deno Deploy
24
+ * import { MCPWebBridgeDeno } from '@mcp-web/bridge';
25
+ *
26
+ * new MCPWebBridgeDeno({
27
+ * name: 'My Production App',
28
+ * description: 'Production bridge server',
29
+ * // Port is typically provided by Deno Deploy via environment
30
+ * port: Number(Deno.env.get('PORT')) || 8000,
31
+ * });
32
+ * ```
33
+ *
34
+ * @remarks
35
+ * This adapter requires Deno runtime. It uses:
36
+ * - `Deno.serve()` for the HTTP server
37
+ * - `Deno.upgradeWebSocket()` for WebSocket connections
38
+ *
39
+ * For Deno Deploy, ensure your entry point is at the root of your repository
40
+ * or configure the entry point in your deployment settings.
41
+ *
42
+ * @see https://docs.deno.com/deploy/
43
+ * @see https://deno.land/api?s=Deno.serve
44
+ */
45
+ import type { MCPWebConfig } from '@mcp-web/types';
46
+ import { MCPWebBridge } from '../core.js';
47
+ /**
48
+ * Configuration for the Deno bridge adapter.
49
+ */
50
+ export interface MCPWebBridgeDenoConfig extends Omit<MCPWebConfig, 'bridgeUrl'> {
51
+ /** Port to listen on (default: 3001, or PORT env var on Deno Deploy) */
52
+ port?: number;
53
+ /** Hostname to bind to (default: '0.0.0.0') */
54
+ hostname?: string;
55
+ }
56
+ /**
57
+ * Deno adapter for MCPWebBridge.
58
+ * Provides a single-port server using Deno.serve() with WebSocket upgrade.
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * const bridge = new MCPWebBridgeDeno({
63
+ * name: 'My App',
64
+ * description: 'My app',
65
+ * port: 3001,
66
+ * });
67
+ * ```
68
+ */
69
+ export declare class MCPWebBridgeDeno {
70
+ #private;
71
+ constructor(config: MCPWebBridgeDenoConfig);
72
+ /**
73
+ * Get the underlying MCPWebBridge core instance.
74
+ */
75
+ get core(): MCPWebBridge;
76
+ /**
77
+ * Get the bridge handlers for custom integrations.
78
+ */
79
+ getHandlers(): import("../runtime/types.js").BridgeHandlers;
80
+ /**
81
+ * Get the port the server is listening on.
82
+ */
83
+ get port(): number;
84
+ /**
85
+ * Gracefully shut down the bridge.
86
+ */
87
+ close(): Promise<void>;
88
+ }
89
+ //# sourceMappingURL=deno.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno.d.ts","sourceRoot":"","sources":["../../src/adapters/deno.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK1C;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;IAC7E,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;;gBAMf,MAAM,EAAE,sBAAsB;IAuG1C;;OAEG;IACH,IAAI,IAAI,IAAI,YAAY,CAEvB;IAED;;OAEG;IACH,WAAW;IAIX;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * MCPWebBridgeDeno - Deno adapter for the MCP Web Bridge.
3
+ *
4
+ * Uses Deno.serve() with WebSocket upgrade for a single-port server.
5
+ * Handles both HTTP requests and WebSocket connections on the same port.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // main.ts
10
+ * import { MCPWebBridgeDeno } from '@mcp-web/bridge';
11
+ *
12
+ * const bridge = new MCPWebBridgeDeno({
13
+ * name: 'My App',
14
+ * description: 'My awesome app',
15
+ * port: 3001,
16
+ * });
17
+ *
18
+ * // Bridge is now listening on ws://localhost:3001 and http://localhost:3001
19
+ * ```
20
+ *
21
+ * @example Deploy to Deno Deploy
22
+ * ```typescript
23
+ * // main.ts - Entry point for Deno Deploy
24
+ * import { MCPWebBridgeDeno } from '@mcp-web/bridge';
25
+ *
26
+ * new MCPWebBridgeDeno({
27
+ * name: 'My Production App',
28
+ * description: 'Production bridge server',
29
+ * // Port is typically provided by Deno Deploy via environment
30
+ * port: Number(Deno.env.get('PORT')) || 8000,
31
+ * });
32
+ * ```
33
+ *
34
+ * @remarks
35
+ * This adapter requires Deno runtime. It uses:
36
+ * - `Deno.serve()` for the HTTP server
37
+ * - `Deno.upgradeWebSocket()` for WebSocket connections
38
+ *
39
+ * For Deno Deploy, ensure your entry point is at the root of your repository
40
+ * or configure the entry point in your deployment settings.
41
+ *
42
+ * @see https://docs.deno.com/deploy/
43
+ * @see https://deno.land/api?s=Deno.serve
44
+ */
45
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
46
+ if (kind === "m") throw new TypeError("Private method is not writable");
47
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
48
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
49
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
50
+ };
51
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
52
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
53
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
54
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
55
+ };
56
+ var _MCPWebBridgeDeno_core, _MCPWebBridgeDeno_controller, _MCPWebBridgeDeno_port, _MCPWebBridgeDeno_hostname;
57
+ import { MCPWebBridge } from '../core.js';
58
+ import { TimerScheduler } from '../runtime/scheduler.js';
59
+ import { isSSEResponse } from '../runtime/types.js';
60
+ /**
61
+ * Wraps a Deno WebSocket in our runtime-agnostic interface.
62
+ */
63
+ function wrapDenoWebSocket(socket) {
64
+ const messageHandlers = new Set();
65
+ socket.onmessage = (event) => {
66
+ const data = typeof event.data === 'string' ? event.data : event.data.toString();
67
+ for (const handler of messageHandlers) {
68
+ handler(data);
69
+ }
70
+ };
71
+ return {
72
+ send(data) {
73
+ if (socket.readyState === WebSocket.OPEN) {
74
+ socket.send(data);
75
+ }
76
+ },
77
+ close(code, reason) {
78
+ socket.close(code, reason);
79
+ },
80
+ get readyState() {
81
+ switch (socket.readyState) {
82
+ case WebSocket.CONNECTING:
83
+ return 'CONNECTING';
84
+ case WebSocket.OPEN:
85
+ return 'OPEN';
86
+ case WebSocket.CLOSING:
87
+ return 'CLOSING';
88
+ case WebSocket.CLOSED:
89
+ default:
90
+ return 'CLOSED';
91
+ }
92
+ },
93
+ onMessage(handler) {
94
+ messageHandlers.add(handler);
95
+ },
96
+ offMessage(handler) {
97
+ messageHandlers.delete(handler);
98
+ },
99
+ };
100
+ }
101
+ /**
102
+ * Wraps a Deno Request in our runtime-agnostic HttpRequest interface.
103
+ */
104
+ function wrapDenoRequest(req) {
105
+ return {
106
+ method: req.method,
107
+ url: req.url,
108
+ headers: {
109
+ get(name) {
110
+ return req.headers.get(name);
111
+ },
112
+ },
113
+ text() {
114
+ return req.text();
115
+ },
116
+ };
117
+ }
118
+ /**
119
+ * Deno adapter for MCPWebBridge.
120
+ * Provides a single-port server using Deno.serve() with WebSocket upgrade.
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const bridge = new MCPWebBridgeDeno({
125
+ * name: 'My App',
126
+ * description: 'My app',
127
+ * port: 3001,
128
+ * });
129
+ * ```
130
+ */
131
+ export class MCPWebBridgeDeno {
132
+ constructor(config) {
133
+ _MCPWebBridgeDeno_core.set(this, void 0);
134
+ _MCPWebBridgeDeno_controller.set(this, void 0);
135
+ _MCPWebBridgeDeno_port.set(this, void 0);
136
+ _MCPWebBridgeDeno_hostname.set(this, void 0);
137
+ // biome-ignore lint/suspicious/noExplicitAny: Deno global is runtime-specific
138
+ const Deno = globalThis.Deno;
139
+ const envPort = Deno?.env?.get?.('PORT');
140
+ __classPrivateFieldSet(this, _MCPWebBridgeDeno_port, config.port ?? (envPort ? Number(envPort) : 3001), "f");
141
+ __classPrivateFieldSet(this, _MCPWebBridgeDeno_hostname, config.hostname ?? '0.0.0.0', "f");
142
+ __classPrivateFieldSet(this, _MCPWebBridgeDeno_controller, new AbortController(), "f");
143
+ // Create the core with a timer-based scheduler
144
+ const scheduler = new TimerScheduler();
145
+ __classPrivateFieldSet(this, _MCPWebBridgeDeno_core, new MCPWebBridge(config, scheduler), "f");
146
+ const handlers = __classPrivateFieldGet(this, _MCPWebBridgeDeno_core, "f").getHandlers();
147
+ // Start Deno server
148
+ Deno.serve({
149
+ port: __classPrivateFieldGet(this, _MCPWebBridgeDeno_port, "f"),
150
+ hostname: __classPrivateFieldGet(this, _MCPWebBridgeDeno_hostname, "f"),
151
+ signal: __classPrivateFieldGet(this, _MCPWebBridgeDeno_controller, "f").signal,
152
+ onListen: ({ port, hostname }) => {
153
+ console.log(`🌉 MCP Web Bridge (Deno) listening on ${hostname}:${port}`);
154
+ console.log(` WebSocket: ws://${hostname === '0.0.0.0' ? 'localhost' : hostname}:${port}`);
155
+ console.log(` HTTP/MCP: http://${hostname === '0.0.0.0' ? 'localhost' : hostname}:${port}`);
156
+ },
157
+ }, async (req) => {
158
+ const url = new URL(req.url);
159
+ // Handle WebSocket upgrade
160
+ if (req.headers.get('upgrade')?.toLowerCase() === 'websocket') {
161
+ const sessionId = url.searchParams.get('session');
162
+ if (!sessionId) {
163
+ return new Response('Missing session parameter', { status: 400 });
164
+ }
165
+ const { socket, response } = Deno.upgradeWebSocket(req);
166
+ const wrapped = wrapDenoWebSocket(socket);
167
+ socket.onopen = () => {
168
+ handlers.onWebSocketConnect(sessionId, wrapped, url);
169
+ };
170
+ socket.onmessage = (event) => {
171
+ const data = typeof event.data === 'string' ? event.data : event.data.toString();
172
+ handlers.onWebSocketMessage(sessionId, wrapped, data);
173
+ };
174
+ socket.onclose = () => {
175
+ handlers.onWebSocketClose(sessionId);
176
+ };
177
+ socket.onerror = (error) => {
178
+ console.error(`WebSocket error for session ${sessionId}:`, error);
179
+ };
180
+ return response;
181
+ }
182
+ // Handle regular HTTP requests
183
+ const wrappedReq = wrapDenoRequest(req);
184
+ const httpResponse = await handlers.onHttpRequest(wrappedReq);
185
+ // Check if this is an SSE response
186
+ if (isSSEResponse(httpResponse)) {
187
+ // Create a ReadableStream for SSE
188
+ const stream = new ReadableStream({
189
+ start(controller) {
190
+ // Create writer function that sends SSE-formatted data
191
+ const writer = (data) => {
192
+ controller.enqueue(new TextEncoder().encode(`data: ${data}\n\n`));
193
+ };
194
+ // Set up the SSE stream
195
+ httpResponse.setup(writer, () => {
196
+ controller.close();
197
+ });
198
+ // Keep connection alive with periodic comments
199
+ const keepAlive = setInterval(() => {
200
+ try {
201
+ controller.enqueue(new TextEncoder().encode(': keepalive\n\n'));
202
+ }
203
+ catch {
204
+ clearInterval(keepAlive);
205
+ }
206
+ }, 30000);
207
+ },
208
+ });
209
+ return new Response(stream, {
210
+ status: httpResponse.status,
211
+ headers: httpResponse.headers,
212
+ });
213
+ }
214
+ return new Response(httpResponse.body, {
215
+ status: httpResponse.status,
216
+ headers: httpResponse.headers,
217
+ });
218
+ });
219
+ }
220
+ /**
221
+ * Get the underlying MCPWebBridge core instance.
222
+ */
223
+ get core() {
224
+ return __classPrivateFieldGet(this, _MCPWebBridgeDeno_core, "f");
225
+ }
226
+ /**
227
+ * Get the bridge handlers for custom integrations.
228
+ */
229
+ getHandlers() {
230
+ return __classPrivateFieldGet(this, _MCPWebBridgeDeno_core, "f").getHandlers();
231
+ }
232
+ /**
233
+ * Get the port the server is listening on.
234
+ */
235
+ get port() {
236
+ return __classPrivateFieldGet(this, _MCPWebBridgeDeno_port, "f");
237
+ }
238
+ /**
239
+ * Gracefully shut down the bridge.
240
+ */
241
+ async close() {
242
+ // Abort the server
243
+ __classPrivateFieldGet(this, _MCPWebBridgeDeno_controller, "f").abort();
244
+ // Close the core (cleans up sessions, timers)
245
+ await __classPrivateFieldGet(this, _MCPWebBridgeDeno_core, "f").close();
246
+ }
247
+ }
248
+ _MCPWebBridgeDeno_core = new WeakMap(), _MCPWebBridgeDeno_controller = new WeakMap(), _MCPWebBridgeDeno_port = new WeakMap(), _MCPWebBridgeDeno_hostname = new WeakMap();
249
+ //# sourceMappingURL=deno.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno.js","sourceRoot":"","sources":["../../src/adapters/deno.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Bridge adapters for different JavaScript runtimes.
3
+ *
4
+ * Each adapter wraps the core MCPWebBridge class and provides
5
+ * runtime-specific I/O implementations.
6
+ *
7
+ * Available adapters:
8
+ * - `MCPWebBridgeNode` - Node.js (production ready)
9
+ * - `MCPWebBridgeDeno` - Deno / Deno Deploy
10
+ * - `MCPWebBridgeBun` - Bun runtime
11
+ * - `MCPWebBridgeParty` / `createPartyKitBridge` - PartyKit / Cloudflare
12
+ */
13
+ export { Bridge, MCPWebBridgeNode } from './node.js';
14
+ export type { MCPWebBridgeNodeConfig, MCPWebBridgeNodeSSLConfig } from './node.js';
15
+ export { MCPWebBridgeDeno } from './deno.js';
16
+ export type { MCPWebBridgeDenoConfig } from './deno.js';
17
+ export { MCPWebBridgeBun } from './bun.js';
18
+ export type { MCPWebBridgeBunConfig } from './bun.js';
19
+ export { AlarmScheduler, createPartyKitBridge, MCPWebBridgeParty } from './partykit.js';
20
+ export type { MCPWebBridgePartyConfig } from './partykit.js';
21
+ //# sourceMappingURL=index.d.ts.map