@modelcontextprotocol/sdk 1.8.0 → 1.10.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.
- package/README.md +339 -38
- package/dist/cjs/client/auth.d.ts +2 -1
- package/dist/cjs/client/auth.d.ts.map +1 -1
- package/dist/cjs/client/auth.js +3 -1
- package/dist/cjs/client/auth.js.map +1 -1
- package/dist/cjs/client/index.d.ts +49 -1
- package/dist/cjs/client/index.d.ts.map +1 -1
- package/dist/cjs/client/index.js +9 -4
- package/dist/cjs/client/index.js.map +1 -1
- package/dist/cjs/client/streamableHttp.d.ts +124 -0
- package/dist/cjs/client/streamableHttp.d.ts.map +1 -0
- package/dist/cjs/client/streamableHttp.js +353 -0
- package/dist/cjs/client/streamableHttp.js.map +1 -0
- package/dist/cjs/examples/client/simpleStreamableHttp.d.ts +2 -0
- package/dist/cjs/examples/client/simpleStreamableHttp.d.ts.map +1 -0
- package/dist/cjs/examples/client/simpleStreamableHttp.js +448 -0
- package/dist/cjs/examples/client/simpleStreamableHttp.js.map +1 -0
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.d.ts +2 -0
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.d.ts.map +1 -0
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.js +168 -0
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.js.map +1 -0
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.d.ts +2 -0
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.d.ts.map +1 -0
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.js +139 -0
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.js.map +1 -0
- package/dist/cjs/examples/server/simpleSseServer.d.ts +2 -0
- package/dist/cjs/examples/server/simpleSseServer.d.ts.map +1 -0
- package/dist/cjs/examples/server/simpleSseServer.js +148 -0
- package/dist/cjs/examples/server/simpleSseServer.js.map +1 -0
- package/dist/cjs/examples/server/simpleStreamableHttp.d.ts +2 -0
- package/dist/cjs/examples/server/simpleStreamableHttp.d.ts.map +1 -0
- package/dist/cjs/examples/server/simpleStreamableHttp.js +250 -0
- package/dist/cjs/examples/server/simpleStreamableHttp.js.map +1 -0
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.d.ts +2 -0
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.d.ts.map +1 -0
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.js +229 -0
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.js.map +1 -0
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.d.ts +2 -0
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.d.ts.map +1 -0
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.js +112 -0
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.js.map +1 -0
- package/dist/cjs/examples/shared/inMemoryEventStore.d.ts +31 -0
- package/dist/cjs/examples/shared/inMemoryEventStore.d.ts.map +1 -0
- package/dist/cjs/examples/shared/inMemoryEventStore.js +69 -0
- package/dist/cjs/examples/shared/inMemoryEventStore.js.map +1 -0
- package/dist/cjs/inMemory.d.ts +13 -3
- package/dist/cjs/inMemory.d.ts.map +1 -1
- package/dist/cjs/inMemory.js +9 -7
- package/dist/cjs/inMemory.js.map +1 -1
- package/dist/cjs/server/auth/handlers/token.d.ts.map +1 -1
- package/dist/cjs/server/auth/handlers/token.js +10 -5
- package/dist/cjs/server/auth/handlers/token.js.map +1 -1
- package/dist/cjs/server/auth/provider.d.ts +9 -1
- package/dist/cjs/server/auth/provider.d.ts.map +1 -1
- package/dist/cjs/server/auth/providers/proxyProvider.d.ts +43 -0
- package/dist/cjs/server/auth/providers/proxyProvider.d.ts.map +1 -0
- package/dist/cjs/server/auth/providers/proxyProvider.js +145 -0
- package/dist/cjs/server/auth/providers/proxyProvider.js.map +1 -0
- package/dist/cjs/server/auth/router.d.ts +6 -0
- package/dist/cjs/server/auth/router.d.ts.map +1 -1
- package/dist/cjs/server/auth/router.js +5 -4
- package/dist/cjs/server/auth/router.js.map +1 -1
- package/dist/cjs/server/auth/types.d.ts +5 -0
- package/dist/cjs/server/auth/types.d.ts.map +1 -1
- package/dist/cjs/server/index.d.ts +12 -0
- package/dist/cjs/server/index.d.ts.map +1 -1
- package/dist/cjs/server/mcp.d.ts +100 -19
- package/dist/cjs/server/mcp.d.ts.map +1 -1
- package/dist/cjs/server/mcp.js +154 -12
- package/dist/cjs/server/mcp.js.map +1 -1
- package/dist/cjs/server/sse.d.ts +10 -3
- package/dist/cjs/server/sse.d.ts.map +1 -1
- package/dist/cjs/server/sse.js +14 -5
- package/dist/cjs/server/sse.js.map +1 -1
- package/dist/cjs/server/streamableHttp.d.ts +146 -0
- package/dist/cjs/server/streamableHttp.d.ts.map +1 -0
- package/dist/cjs/server/streamableHttp.js +538 -0
- package/dist/cjs/server/streamableHttp.js.map +1 -0
- package/dist/cjs/shared/protocol.d.ts +31 -5
- package/dist/cjs/shared/protocol.d.ts.map +1 -1
- package/dist/cjs/shared/protocol.js +29 -19
- package/dist/cjs/shared/protocol.js.map +1 -1
- package/dist/cjs/shared/stdio.js +1 -1
- package/dist/cjs/shared/stdio.js.map +1 -1
- package/dist/cjs/shared/transport.d.ts +32 -3
- package/dist/cjs/shared/transport.d.ts.map +1 -1
- package/dist/cjs/shared/uriTemplate.d.ts +1 -0
- package/dist/cjs/shared/uriTemplate.d.ts.map +1 -1
- package/dist/cjs/shared/uriTemplate.js +3 -0
- package/dist/cjs/shared/uriTemplate.js.map +1 -1
- package/dist/cjs/types.d.ts +1990 -35
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/types.js +38 -4
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/client/auth.d.ts +2 -1
- package/dist/esm/client/auth.d.ts.map +1 -1
- package/dist/esm/client/auth.js +3 -1
- package/dist/esm/client/auth.js.map +1 -1
- package/dist/esm/client/index.d.ts +49 -1
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +9 -4
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/client/streamableHttp.d.ts +124 -0
- package/dist/esm/client/streamableHttp.d.ts.map +1 -0
- package/dist/esm/client/streamableHttp.js +348 -0
- package/dist/esm/client/streamableHttp.js.map +1 -0
- package/dist/esm/examples/client/simpleStreamableHttp.d.ts +2 -0
- package/dist/esm/examples/client/simpleStreamableHttp.d.ts.map +1 -0
- package/dist/esm/examples/client/simpleStreamableHttp.js +446 -0
- package/dist/esm/examples/client/simpleStreamableHttp.js.map +1 -0
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.d.ts +2 -0
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.d.ts.map +1 -0
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.js +166 -0
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.js.map +1 -0
- package/dist/esm/examples/server/jsonResponseStreamableHttp.d.ts +2 -0
- package/dist/esm/examples/server/jsonResponseStreamableHttp.d.ts.map +1 -0
- package/dist/esm/examples/server/jsonResponseStreamableHttp.js +134 -0
- package/dist/esm/examples/server/jsonResponseStreamableHttp.js.map +1 -0
- package/dist/esm/examples/server/simpleSseServer.d.ts +2 -0
- package/dist/esm/examples/server/simpleSseServer.d.ts.map +1 -0
- package/dist/esm/examples/server/simpleSseServer.js +143 -0
- package/dist/esm/examples/server/simpleSseServer.js.map +1 -0
- package/dist/esm/examples/server/simpleStreamableHttp.d.ts +2 -0
- package/dist/esm/examples/server/simpleStreamableHttp.d.ts.map +1 -0
- package/dist/esm/examples/server/simpleStreamableHttp.js +245 -0
- package/dist/esm/examples/server/simpleStreamableHttp.js.map +1 -0
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.d.ts +2 -0
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.d.ts.map +1 -0
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.js +224 -0
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.js.map +1 -0
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.d.ts +2 -0
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.d.ts.map +1 -0
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.js +107 -0
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.js.map +1 -0
- package/dist/esm/examples/shared/inMemoryEventStore.d.ts +31 -0
- package/dist/esm/examples/shared/inMemoryEventStore.d.ts.map +1 -0
- package/dist/esm/examples/shared/inMemoryEventStore.js +65 -0
- package/dist/esm/examples/shared/inMemoryEventStore.js.map +1 -0
- package/dist/esm/inMemory.d.ts +13 -3
- package/dist/esm/inMemory.d.ts.map +1 -1
- package/dist/esm/inMemory.js +9 -7
- package/dist/esm/inMemory.js.map +1 -1
- package/dist/esm/server/auth/handlers/token.d.ts.map +1 -1
- package/dist/esm/server/auth/handlers/token.js +10 -5
- package/dist/esm/server/auth/handlers/token.js.map +1 -1
- package/dist/esm/server/auth/provider.d.ts +9 -1
- package/dist/esm/server/auth/provider.d.ts.map +1 -1
- package/dist/esm/server/auth/providers/proxyProvider.d.ts +43 -0
- package/dist/esm/server/auth/providers/proxyProvider.d.ts.map +1 -0
- package/dist/esm/server/auth/providers/proxyProvider.js +141 -0
- package/dist/esm/server/auth/providers/proxyProvider.js.map +1 -0
- package/dist/esm/server/auth/router.d.ts +6 -0
- package/dist/esm/server/auth/router.d.ts.map +1 -1
- package/dist/esm/server/auth/router.js +5 -4
- package/dist/esm/server/auth/router.js.map +1 -1
- package/dist/esm/server/auth/types.d.ts +5 -0
- package/dist/esm/server/auth/types.d.ts.map +1 -1
- package/dist/esm/server/index.d.ts +12 -0
- package/dist/esm/server/index.d.ts.map +1 -1
- package/dist/esm/server/mcp.d.ts +100 -19
- package/dist/esm/server/mcp.d.ts.map +1 -1
- package/dist/esm/server/mcp.js +154 -12
- package/dist/esm/server/mcp.js.map +1 -1
- package/dist/esm/server/sse.d.ts +10 -3
- package/dist/esm/server/sse.d.ts.map +1 -1
- package/dist/esm/server/sse.js +14 -5
- package/dist/esm/server/sse.js.map +1 -1
- package/dist/esm/server/streamableHttp.d.ts +146 -0
- package/dist/esm/server/streamableHttp.d.ts.map +1 -0
- package/dist/esm/server/streamableHttp.js +531 -0
- package/dist/esm/server/streamableHttp.js.map +1 -0
- package/dist/esm/shared/protocol.d.ts +31 -5
- package/dist/esm/shared/protocol.d.ts.map +1 -1
- package/dist/esm/shared/protocol.js +30 -20
- package/dist/esm/shared/protocol.js.map +1 -1
- package/dist/esm/shared/stdio.js +1 -1
- package/dist/esm/shared/stdio.js.map +1 -1
- package/dist/esm/shared/transport.d.ts +32 -3
- package/dist/esm/shared/transport.d.ts.map +1 -1
- package/dist/esm/shared/uriTemplate.d.ts +1 -0
- package/dist/esm/shared/uriTemplate.d.ts.map +1 -1
- package/dist/esm/shared/uriTemplate.js +3 -0
- package/dist/esm/shared/uriTemplate.js.map +1 -1
- package/dist/esm/types.d.ts +1990 -35
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +30 -2
- package/dist/esm/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_1 = __importDefault(require("express"));
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const mcp_js_1 = require("../../server/mcp.js");
|
|
9
|
+
const streamableHttp_js_1 = require("../../server/streamableHttp.js");
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const types_js_1 = require("../../types.js");
|
|
12
|
+
// Create an MCP server with implementation details
|
|
13
|
+
const server = new mcp_js_1.McpServer({
|
|
14
|
+
name: 'json-response-streamable-http-server',
|
|
15
|
+
version: '1.0.0',
|
|
16
|
+
}, {
|
|
17
|
+
capabilities: {
|
|
18
|
+
logging: {},
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
// Register a simple tool that returns a greeting
|
|
22
|
+
server.tool('greet', 'A simple greeting tool', {
|
|
23
|
+
name: zod_1.z.string().describe('Name to greet'),
|
|
24
|
+
}, async ({ name }) => {
|
|
25
|
+
return {
|
|
26
|
+
content: [
|
|
27
|
+
{
|
|
28
|
+
type: 'text',
|
|
29
|
+
text: `Hello, ${name}!`,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
// Register a tool that sends multiple greetings with notifications
|
|
35
|
+
server.tool('multi-greet', 'A tool that sends different greetings with delays between them', {
|
|
36
|
+
name: zod_1.z.string().describe('Name to greet'),
|
|
37
|
+
}, async ({ name }, { sendNotification }) => {
|
|
38
|
+
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
39
|
+
await sendNotification({
|
|
40
|
+
method: "notifications/message",
|
|
41
|
+
params: { level: "debug", data: `Starting multi-greet for ${name}` }
|
|
42
|
+
});
|
|
43
|
+
await sleep(1000); // Wait 1 second before first greeting
|
|
44
|
+
await sendNotification({
|
|
45
|
+
method: "notifications/message",
|
|
46
|
+
params: { level: "info", data: `Sending first greeting to ${name}` }
|
|
47
|
+
});
|
|
48
|
+
await sleep(1000); // Wait another second before second greeting
|
|
49
|
+
await sendNotification({
|
|
50
|
+
method: "notifications/message",
|
|
51
|
+
params: { level: "info", data: `Sending second greeting to ${name}` }
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{
|
|
56
|
+
type: 'text',
|
|
57
|
+
text: `Good morning, ${name}!`,
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
const app = (0, express_1.default)();
|
|
63
|
+
app.use(express_1.default.json());
|
|
64
|
+
// Map to store transports by session ID
|
|
65
|
+
const transports = {};
|
|
66
|
+
app.post('/mcp', async (req, res) => {
|
|
67
|
+
console.log('Received MCP request:', req.body);
|
|
68
|
+
try {
|
|
69
|
+
// Check for existing session ID
|
|
70
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
71
|
+
let transport;
|
|
72
|
+
if (sessionId && transports[sessionId]) {
|
|
73
|
+
// Reuse existing transport
|
|
74
|
+
transport = transports[sessionId];
|
|
75
|
+
}
|
|
76
|
+
else if (!sessionId && (0, types_js_1.isInitializeRequest)(req.body)) {
|
|
77
|
+
// New initialization request - use JSON response mode
|
|
78
|
+
transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
79
|
+
sessionIdGenerator: () => (0, node_crypto_1.randomUUID)(),
|
|
80
|
+
enableJsonResponse: true, // Enable JSON response mode
|
|
81
|
+
onsessioninitialized: (sessionId) => {
|
|
82
|
+
// Store the transport by session ID when session is initialized
|
|
83
|
+
// This avoids race conditions where requests might come in before the session is stored
|
|
84
|
+
console.log(`Session initialized with ID: ${sessionId}`);
|
|
85
|
+
transports[sessionId] = transport;
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// Connect the transport to the MCP server BEFORE handling the request
|
|
89
|
+
await server.connect(transport);
|
|
90
|
+
await transport.handleRequest(req, res, req.body);
|
|
91
|
+
return; // Already handled
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Invalid request - no session ID or not initialization request
|
|
95
|
+
res.status(400).json({
|
|
96
|
+
jsonrpc: '2.0',
|
|
97
|
+
error: {
|
|
98
|
+
code: -32000,
|
|
99
|
+
message: 'Bad Request: No valid session ID provided',
|
|
100
|
+
},
|
|
101
|
+
id: null,
|
|
102
|
+
});
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Handle the request with existing transport - no need to reconnect
|
|
106
|
+
await transport.handleRequest(req, res, req.body);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error('Error handling MCP request:', error);
|
|
110
|
+
if (!res.headersSent) {
|
|
111
|
+
res.status(500).json({
|
|
112
|
+
jsonrpc: '2.0',
|
|
113
|
+
error: {
|
|
114
|
+
code: -32603,
|
|
115
|
+
message: 'Internal server error',
|
|
116
|
+
},
|
|
117
|
+
id: null,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
// Handle GET requests for SSE streams according to spec
|
|
123
|
+
app.get('/mcp', async (req, res) => {
|
|
124
|
+
// Since this is a very simple example, we don't support GET requests for this server
|
|
125
|
+
// The spec requires returning 405 Method Not Allowed in this case
|
|
126
|
+
res.status(405).set('Allow', 'POST').send('Method Not Allowed');
|
|
127
|
+
});
|
|
128
|
+
// Start the server
|
|
129
|
+
const PORT = 3000;
|
|
130
|
+
app.listen(PORT, () => {
|
|
131
|
+
console.log(`MCP Streamable HTTP Server listening on port ${PORT}`);
|
|
132
|
+
});
|
|
133
|
+
// Handle server shutdown
|
|
134
|
+
process.on('SIGINT', async () => {
|
|
135
|
+
console.log('Shutting down server...');
|
|
136
|
+
await server.close();
|
|
137
|
+
process.exit(0);
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=jsonResponseStreamableHttp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonResponseStreamableHttp.js","sourceRoot":"","sources":["../../../../src/examples/server/jsonResponseStreamableHttp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simpleSseServer.d.ts","sourceRoot":"","sources":["../../../../src/examples/server/simpleSseServer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_1 = __importDefault(require("express"));
|
|
7
|
+
const mcp_js_1 = require("../../server/mcp.js");
|
|
8
|
+
const sse_js_1 = require("../../server/sse.js");
|
|
9
|
+
const zod_1 = require("zod");
|
|
10
|
+
/**
|
|
11
|
+
* This example server demonstrates the deprecated HTTP+SSE transport
|
|
12
|
+
* (protocol version 2024-11-05). It mainly used for testing backward compatible clients.
|
|
13
|
+
*
|
|
14
|
+
* The server exposes two endpoints:
|
|
15
|
+
* - /mcp: For establishing the SSE stream (GET)
|
|
16
|
+
* - /messages: For receiving client messages (POST)
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
// Create an MCP server instance
|
|
20
|
+
const server = new mcp_js_1.McpServer({
|
|
21
|
+
name: 'simple-sse-server',
|
|
22
|
+
version: '1.0.0',
|
|
23
|
+
}, { capabilities: { logging: {} } });
|
|
24
|
+
server.tool('start-notification-stream', 'Starts sending periodic notifications', {
|
|
25
|
+
interval: zod_1.z.number().describe('Interval in milliseconds between notifications').default(1000),
|
|
26
|
+
count: zod_1.z.number().describe('Number of notifications to send').default(10),
|
|
27
|
+
}, async ({ interval, count }, { sendNotification }) => {
|
|
28
|
+
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
29
|
+
let counter = 0;
|
|
30
|
+
// Send the initial notification
|
|
31
|
+
await sendNotification({
|
|
32
|
+
method: "notifications/message",
|
|
33
|
+
params: {
|
|
34
|
+
level: "info",
|
|
35
|
+
data: `Starting notification stream with ${count} messages every ${interval}ms`
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
// Send periodic notifications
|
|
39
|
+
while (counter < count) {
|
|
40
|
+
counter++;
|
|
41
|
+
await sleep(interval);
|
|
42
|
+
try {
|
|
43
|
+
await sendNotification({
|
|
44
|
+
method: "notifications/message",
|
|
45
|
+
params: {
|
|
46
|
+
level: "info",
|
|
47
|
+
data: `Notification #${counter} at ${new Date().toISOString()}`
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
console.error("Error sending notification:", error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
content: [
|
|
57
|
+
{
|
|
58
|
+
type: 'text',
|
|
59
|
+
text: `Completed sending ${count} notifications every ${interval}ms`,
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
const app = (0, express_1.default)();
|
|
65
|
+
app.use(express_1.default.json());
|
|
66
|
+
// Store transports by session ID
|
|
67
|
+
const transports = {};
|
|
68
|
+
// SSE endpoint for establishing the stream
|
|
69
|
+
app.get('/mcp', async (req, res) => {
|
|
70
|
+
console.log('Received GET request to /sse (establishing SSE stream)');
|
|
71
|
+
try {
|
|
72
|
+
// Create a new SSE transport for the client
|
|
73
|
+
// The endpoint for POST messages is '/messages'
|
|
74
|
+
const transport = new sse_js_1.SSEServerTransport('/messages', res);
|
|
75
|
+
// Store the transport by session ID
|
|
76
|
+
const sessionId = transport.sessionId;
|
|
77
|
+
transports[sessionId] = transport;
|
|
78
|
+
// Set up onclose handler to clean up transport when closed
|
|
79
|
+
transport.onclose = () => {
|
|
80
|
+
console.log(`SSE transport closed for session ${sessionId}`);
|
|
81
|
+
delete transports[sessionId];
|
|
82
|
+
};
|
|
83
|
+
// Connect the transport to the MCP server
|
|
84
|
+
await server.connect(transport);
|
|
85
|
+
// Start the SSE transport to begin streaming
|
|
86
|
+
// This sends an initial 'endpoint' event with the session ID in the URL
|
|
87
|
+
await transport.start();
|
|
88
|
+
console.log(`Established SSE stream with session ID: ${sessionId}`);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('Error establishing SSE stream:', error);
|
|
92
|
+
if (!res.headersSent) {
|
|
93
|
+
res.status(500).send('Error establishing SSE stream');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
// Messages endpoint for receiving client JSON-RPC requests
|
|
98
|
+
app.post('/messages', async (req, res) => {
|
|
99
|
+
console.log('Received POST request to /messages');
|
|
100
|
+
// Extract session ID from URL query parameter
|
|
101
|
+
// In the SSE protocol, this is added by the client based on the endpoint event
|
|
102
|
+
const sessionId = req.query.sessionId;
|
|
103
|
+
if (!sessionId) {
|
|
104
|
+
console.error('No session ID provided in request URL');
|
|
105
|
+
res.status(400).send('Missing sessionId parameter');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const transport = transports[sessionId];
|
|
109
|
+
if (!transport) {
|
|
110
|
+
console.error(`No active transport found for session ID: ${sessionId}`);
|
|
111
|
+
res.status(404).send('Session not found');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
// Handle the POST message with the transport
|
|
116
|
+
await transport.handlePostMessage(req, res, req.body);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error('Error handling request:', error);
|
|
120
|
+
if (!res.headersSent) {
|
|
121
|
+
res.status(500).send('Error handling request');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
// Start the server
|
|
126
|
+
const PORT = 3000;
|
|
127
|
+
app.listen(PORT, () => {
|
|
128
|
+
console.log(`Simple SSE Server (deprecated protocol version 2024-11-05) listening on port ${PORT}`);
|
|
129
|
+
});
|
|
130
|
+
// Handle server shutdown
|
|
131
|
+
process.on('SIGINT', async () => {
|
|
132
|
+
console.log('Shutting down server...');
|
|
133
|
+
// Close all active transports to properly clean up resources
|
|
134
|
+
for (const sessionId in transports) {
|
|
135
|
+
try {
|
|
136
|
+
console.log(`Closing transport for session ${sessionId}`);
|
|
137
|
+
await transports[sessionId].close();
|
|
138
|
+
delete transports[sessionId];
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.error(`Error closing transport for session ${sessionId}:`, error);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
await server.close();
|
|
145
|
+
console.log('Server shutdown complete');
|
|
146
|
+
process.exit(0);
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=simpleSseServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simpleSseServer.js","sourceRoot":"","sources":["../../../../src/examples/server/simpleSseServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simpleStreamableHttp.d.ts","sourceRoot":"","sources":["../../../../src/examples/server/simpleStreamableHttp.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_1 = __importDefault(require("express"));
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const mcp_js_1 = require("../../server/mcp.js");
|
|
9
|
+
const streamableHttp_js_1 = require("../../server/streamableHttp.js");
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const types_js_1 = require("../../types.js");
|
|
12
|
+
const inMemoryEventStore_js_1 = require("../shared/inMemoryEventStore.js");
|
|
13
|
+
// Create an MCP server with implementation details
|
|
14
|
+
const server = new mcp_js_1.McpServer({
|
|
15
|
+
name: 'simple-streamable-http-server',
|
|
16
|
+
version: '1.0.0',
|
|
17
|
+
}, { capabilities: { logging: {} } });
|
|
18
|
+
// Register a simple tool that returns a greeting
|
|
19
|
+
server.tool('greet', 'A simple greeting tool', {
|
|
20
|
+
name: zod_1.z.string().describe('Name to greet'),
|
|
21
|
+
}, async ({ name }) => {
|
|
22
|
+
return {
|
|
23
|
+
content: [
|
|
24
|
+
{
|
|
25
|
+
type: 'text',
|
|
26
|
+
text: `Hello, ${name}!`,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
// Register a tool that sends multiple greetings with notifications
|
|
32
|
+
server.tool('multi-greet', 'A tool that sends different greetings with delays between them', {
|
|
33
|
+
name: zod_1.z.string().describe('Name to greet'),
|
|
34
|
+
}, async ({ name }, { sendNotification }) => {
|
|
35
|
+
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
36
|
+
await sendNotification({
|
|
37
|
+
method: "notifications/message",
|
|
38
|
+
params: { level: "debug", data: `Starting multi-greet for ${name}` }
|
|
39
|
+
});
|
|
40
|
+
await sleep(1000); // Wait 1 second before first greeting
|
|
41
|
+
await sendNotification({
|
|
42
|
+
method: "notifications/message",
|
|
43
|
+
params: { level: "info", data: `Sending first greeting to ${name}` }
|
|
44
|
+
});
|
|
45
|
+
await sleep(1000); // Wait another second before second greeting
|
|
46
|
+
await sendNotification({
|
|
47
|
+
method: "notifications/message",
|
|
48
|
+
params: { level: "info", data: `Sending second greeting to ${name}` }
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: 'text',
|
|
54
|
+
text: `Good morning, ${name}!`,
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
// Register a simple prompt
|
|
60
|
+
server.prompt('greeting-template', 'A simple greeting prompt template', {
|
|
61
|
+
name: zod_1.z.string().describe('Name to include in greeting'),
|
|
62
|
+
}, async ({ name }) => {
|
|
63
|
+
return {
|
|
64
|
+
messages: [
|
|
65
|
+
{
|
|
66
|
+
role: 'user',
|
|
67
|
+
content: {
|
|
68
|
+
type: 'text',
|
|
69
|
+
text: `Please greet ${name} in a friendly manner.`,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
// Register a tool specifically for testing resumability
|
|
76
|
+
server.tool('start-notification-stream', 'Starts sending periodic notifications for testing resumability', {
|
|
77
|
+
interval: zod_1.z.number().describe('Interval in milliseconds between notifications').default(100),
|
|
78
|
+
count: zod_1.z.number().describe('Number of notifications to send (0 for 100)').default(50),
|
|
79
|
+
}, async ({ interval, count }, { sendNotification }) => {
|
|
80
|
+
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
81
|
+
let counter = 0;
|
|
82
|
+
while (count === 0 || counter < count) {
|
|
83
|
+
counter++;
|
|
84
|
+
try {
|
|
85
|
+
await sendNotification({
|
|
86
|
+
method: "notifications/message",
|
|
87
|
+
params: {
|
|
88
|
+
level: "info",
|
|
89
|
+
data: `Periodic notification #${counter} at ${new Date().toISOString()}`
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.error("Error sending notification:", error);
|
|
95
|
+
}
|
|
96
|
+
// Wait for the specified interval
|
|
97
|
+
await sleep(interval);
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
content: [
|
|
101
|
+
{
|
|
102
|
+
type: 'text',
|
|
103
|
+
text: `Started sending periodic notifications every ${interval}ms`,
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
// Create a simple resource at a fixed URI
|
|
109
|
+
server.resource('greeting-resource', 'https://example.com/greetings/default', { mimeType: 'text/plain' }, async () => {
|
|
110
|
+
return {
|
|
111
|
+
contents: [
|
|
112
|
+
{
|
|
113
|
+
uri: 'https://example.com/greetings/default',
|
|
114
|
+
text: 'Hello, world!',
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
const app = (0, express_1.default)();
|
|
120
|
+
app.use(express_1.default.json());
|
|
121
|
+
// Map to store transports by session ID
|
|
122
|
+
const transports = {};
|
|
123
|
+
app.post('/mcp', async (req, res) => {
|
|
124
|
+
console.log('Received MCP request:', req.body);
|
|
125
|
+
try {
|
|
126
|
+
// Check for existing session ID
|
|
127
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
128
|
+
let transport;
|
|
129
|
+
if (sessionId && transports[sessionId]) {
|
|
130
|
+
// Reuse existing transport
|
|
131
|
+
transport = transports[sessionId];
|
|
132
|
+
}
|
|
133
|
+
else if (!sessionId && (0, types_js_1.isInitializeRequest)(req.body)) {
|
|
134
|
+
// New initialization request
|
|
135
|
+
const eventStore = new inMemoryEventStore_js_1.InMemoryEventStore();
|
|
136
|
+
transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
137
|
+
sessionIdGenerator: () => (0, node_crypto_1.randomUUID)(),
|
|
138
|
+
eventStore, // Enable resumability
|
|
139
|
+
onsessioninitialized: (sessionId) => {
|
|
140
|
+
// Store the transport by session ID when session is initialized
|
|
141
|
+
// This avoids race conditions where requests might come in before the session is stored
|
|
142
|
+
console.log(`Session initialized with ID: ${sessionId}`);
|
|
143
|
+
transports[sessionId] = transport;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
// Set up onclose handler to clean up transport when closed
|
|
147
|
+
transport.onclose = () => {
|
|
148
|
+
const sid = transport.sessionId;
|
|
149
|
+
if (sid && transports[sid]) {
|
|
150
|
+
console.log(`Transport closed for session ${sid}, removing from transports map`);
|
|
151
|
+
delete transports[sid];
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
// Connect the transport to the MCP server BEFORE handling the request
|
|
155
|
+
// so responses can flow back through the same transport
|
|
156
|
+
await server.connect(transport);
|
|
157
|
+
await transport.handleRequest(req, res, req.body);
|
|
158
|
+
return; // Already handled
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Invalid request - no session ID or not initialization request
|
|
162
|
+
res.status(400).json({
|
|
163
|
+
jsonrpc: '2.0',
|
|
164
|
+
error: {
|
|
165
|
+
code: -32000,
|
|
166
|
+
message: 'Bad Request: No valid session ID provided',
|
|
167
|
+
},
|
|
168
|
+
id: null,
|
|
169
|
+
});
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
// Handle the request with existing transport - no need to reconnect
|
|
173
|
+
// The existing transport is already connected to the server
|
|
174
|
+
await transport.handleRequest(req, res, req.body);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error('Error handling MCP request:', error);
|
|
178
|
+
if (!res.headersSent) {
|
|
179
|
+
res.status(500).json({
|
|
180
|
+
jsonrpc: '2.0',
|
|
181
|
+
error: {
|
|
182
|
+
code: -32603,
|
|
183
|
+
message: 'Internal server error',
|
|
184
|
+
},
|
|
185
|
+
id: null,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
// Handle GET requests for SSE streams (using built-in support from StreamableHTTP)
|
|
191
|
+
app.get('/mcp', async (req, res) => {
|
|
192
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
193
|
+
if (!sessionId || !transports[sessionId]) {
|
|
194
|
+
res.status(400).send('Invalid or missing session ID');
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Check for Last-Event-ID header for resumability
|
|
198
|
+
const lastEventId = req.headers['last-event-id'];
|
|
199
|
+
if (lastEventId) {
|
|
200
|
+
console.log(`Client reconnecting with Last-Event-ID: ${lastEventId}`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.log(`Establishing new SSE stream for session ${sessionId}`);
|
|
204
|
+
}
|
|
205
|
+
const transport = transports[sessionId];
|
|
206
|
+
await transport.handleRequest(req, res);
|
|
207
|
+
});
|
|
208
|
+
// Handle DELETE requests for session termination (according to MCP spec)
|
|
209
|
+
app.delete('/mcp', async (req, res) => {
|
|
210
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
211
|
+
if (!sessionId || !transports[sessionId]) {
|
|
212
|
+
res.status(400).send('Invalid or missing session ID');
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
console.log(`Received session termination request for session ${sessionId}`);
|
|
216
|
+
try {
|
|
217
|
+
const transport = transports[sessionId];
|
|
218
|
+
await transport.handleRequest(req, res);
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
console.error('Error handling session termination:', error);
|
|
222
|
+
if (!res.headersSent) {
|
|
223
|
+
res.status(500).send('Error processing session termination');
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
// Start the server
|
|
228
|
+
const PORT = 3000;
|
|
229
|
+
app.listen(PORT, () => {
|
|
230
|
+
console.log(`MCP Streamable HTTP Server listening on port ${PORT}`);
|
|
231
|
+
});
|
|
232
|
+
// Handle server shutdown
|
|
233
|
+
process.on('SIGINT', async () => {
|
|
234
|
+
console.log('Shutting down server...');
|
|
235
|
+
// Close all active transports to properly clean up resources
|
|
236
|
+
for (const sessionId in transports) {
|
|
237
|
+
try {
|
|
238
|
+
console.log(`Closing transport for session ${sessionId}`);
|
|
239
|
+
await transports[sessionId].close();
|
|
240
|
+
delete transports[sessionId];
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
console.error(`Error closing transport for session ${sessionId}:`, error);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
await server.close();
|
|
247
|
+
console.log('Server shutdown complete');
|
|
248
|
+
process.exit(0);
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=simpleStreamableHttp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simpleStreamableHttp.js","sourceRoot":"","sources":["../../../../src/examples/server/simpleStreamableHttp.ts"],"names":[],"mappings":";;;;;AAAA,sDAAqD;AACrD,6CAAyC;AACzC,gDAAgD;AAChD,sEAA+E;AAC/E,6BAAwB;AACxB,6CAA0G;AAC1G,2EAAqE;AAErE,mDAAmD;AACnD,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;IAC3B,IAAI,EAAE,+BAA+B;IACrC,OAAO,EAAE,OAAO;CACjB,EAAE,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAEtC,iDAAiD;AACjD,MAAM,CAAC,IAAI,CACT,OAAO,EACP,wBAAwB,EACxB;IACE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;CAC3C,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAA2B,EAAE;IAC1C,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU,IAAI,GAAG;aACxB;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,IAAI,CACT,aAAa,EACb,gEAAgE,EAChE;IACE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;CAC3C,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAA2B,EAAE;IAChE,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAE9E,MAAM,gBAAgB,CAAC;QACrB,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,4BAA4B,IAAI,EAAE,EAAE;KACrE,CAAC,CAAC;IAEH,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,sCAAsC;IAEzD,MAAM,gBAAgB,CAAC;QACrB,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,IAAI,EAAE,EAAE;KACrE,CAAC,CAAC;IAEH,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,6CAA6C;IAEhE,MAAM,gBAAgB,CAAC;QACrB,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,IAAI,EAAE,EAAE;KACtE,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,iBAAiB,IAAI,GAAG;aAC/B;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,2BAA2B;AAC3B,MAAM,CAAC,MAAM,CACX,mBAAmB,EACnB,mCAAmC,EACnC;IACE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CACzD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAA4B,EAAE;IAC3C,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,gBAAgB,IAAI,wBAAwB;iBACnD;aACF;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,wDAAwD;AACxD,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,gEAAgE,EAChE;IACE,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAC5F,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACtF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAA2B,EAAE;IAC3E,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9E,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,KAAK,KAAK,CAAC,IAAI,OAAO,GAAG,KAAK,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,gBAAgB,CAAC;gBACrB,MAAM,EAAE,uBAAuB;gBAC/B,MAAM,EAAE;oBACN,KAAK,EAAE,MAAM;oBACb,IAAI,EAAE,0BAA0B,OAAO,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;iBACzE;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;QACD,kCAAkC;QAClC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,gDAAgD,QAAQ,IAAI;aACnE;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,QAAQ,CACb,mBAAmB,EACnB,uCAAuC,EACvC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAC1B,KAAK,IAAiC,EAAE;IACtC,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,uCAAuC;gBAC5C,IAAI,EAAE,eAAe;aACtB;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;AACtB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAExB,wCAAwC;AACxC,MAAM,UAAU,GAA2D,EAAE,CAAC;AAE9E,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,gCAAgC;QAChC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QACtE,IAAI,SAAwC,CAAC;QAE7C,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,2BAA2B;YAC3B,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,CAAC,SAAS,IAAI,IAAA,8BAAmB,EAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,6BAA6B;YAC7B,MAAM,UAAU,GAAG,IAAI,0CAAkB,EAAE,CAAC;YAC5C,SAAS,GAAG,IAAI,iDAA6B,CAAC;gBAC5C,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAA,wBAAU,GAAE;gBACtC,UAAU,EAAE,sBAAsB;gBAClC,oBAAoB,EAAE,CAAC,SAAS,EAAE,EAAE;oBAClC,gEAAgE;oBAChE,wFAAwF;oBACxF,OAAO,CAAC,GAAG,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;oBACzD,UAAU,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;gBACpC,CAAC;aACF,CAAC,CAAC;YAEH,2DAA2D;YAC3D,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACvB,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;gBAChC,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,gCAAgC,GAAG,gCAAgC,CAAC,CAAC;oBACjF,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC,CAAC;YAEF,sEAAsE;YACtE,wDAAwD;YACxD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEhC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,CAAC,kBAAkB;QAC5B,CAAC;aAAM,CAAC;YACN,gEAAgE;YAChE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC,KAAK;oBACZ,OAAO,EAAE,2CAA2C;iBACrD;gBACD,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,oEAAoE;QACpE,4DAA4D;QAC5D,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC,KAAK;oBACZ,OAAO,EAAE,uBAAuB;iBACjC;gBACD,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,mFAAmF;AACnF,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;IACtE,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,kDAAkD;IAClD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAuB,CAAC;IACvE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,2CAA2C,WAAW,EAAE,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,yEAAyE;AACzE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACvD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;IACtE,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oDAAoD,SAAS,EAAE,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;IAC9B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,6DAA6D;IAC7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;YAC1D,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sseAndStreamableHttpCompatibleServer.d.ts","sourceRoot":"","sources":["../../../../src/examples/server/sseAndStreamableHttpCompatibleServer.ts"],"names":[],"mappings":""}
|