@shin1ohno/sage 0.3.0 → 0.5.3
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/dist/cli/http-server-with-config.d.ts +38 -0
- package/dist/cli/http-server-with-config.d.ts.map +1 -0
- package/dist/cli/http-server-with-config.js +458 -0
- package/dist/cli/http-server-with-config.js.map +1 -0
- package/dist/cli/http-server.d.ts +74 -0
- package/dist/cli/http-server.d.ts.map +1 -0
- package/dist/cli/http-server.js +407 -0
- package/dist/cli/http-server.js.map +1 -0
- package/dist/cli/jwt-middleware.d.ts +36 -0
- package/dist/cli/jwt-middleware.d.ts.map +1 -0
- package/dist/cli/jwt-middleware.js +99 -0
- package/dist/cli/jwt-middleware.js.map +1 -0
- package/dist/cli/main-entry.d.ts +41 -0
- package/dist/cli/main-entry.d.ts.map +1 -0
- package/dist/cli/main-entry.js +80 -0
- package/dist/cli/main-entry.js.map +1 -0
- package/dist/cli/mcp-handler.d.ts +56 -0
- package/dist/cli/mcp-handler.d.ts.map +1 -0
- package/dist/cli/mcp-handler.js +2189 -0
- package/dist/cli/mcp-handler.js.map +1 -0
- package/dist/cli/parser.d.ts +43 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +162 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/remote-config-loader.d.ts +85 -0
- package/dist/cli/remote-config-loader.d.ts.map +1 -0
- package/dist/cli/remote-config-loader.js +129 -0
- package/dist/cli/remote-config-loader.js.map +1 -0
- package/dist/cli/secret-auth.d.ts +47 -0
- package/dist/cli/secret-auth.d.ts.map +1 -0
- package/dist/cli/secret-auth.js +165 -0
- package/dist/cli/secret-auth.js.map +1 -0
- package/dist/cli/sse-stream-handler.d.ts +45 -0
- package/dist/cli/sse-stream-handler.d.ts.map +1 -0
- package/dist/cli/sse-stream-handler.js +125 -0
- package/dist/cli/sse-stream-handler.js.map +1 -0
- package/dist/index.js +885 -209
- package/dist/index.js.map +1 -1
- package/dist/integrations/calendar-event-creator.d.ts +152 -0
- package/dist/integrations/calendar-event-creator.d.ts.map +1 -0
- package/dist/integrations/calendar-event-creator.js +507 -0
- package/dist/integrations/calendar-event-creator.js.map +1 -0
- package/dist/integrations/calendar-event-deleter.d.ts +137 -0
- package/dist/integrations/calendar-event-deleter.d.ts.map +1 -0
- package/dist/integrations/calendar-event-deleter.js +378 -0
- package/dist/integrations/calendar-event-deleter.js.map +1 -0
- package/dist/integrations/calendar-event-response.d.ts +213 -0
- package/dist/integrations/calendar-event-response.d.ts.map +1 -0
- package/dist/integrations/calendar-event-response.js +560 -0
- package/dist/integrations/calendar-event-response.js.map +1 -0
- package/dist/integrations/calendar-service.d.ts +66 -1
- package/dist/integrations/calendar-service.d.ts.map +1 -1
- package/dist/integrations/calendar-service.js +223 -0
- package/dist/integrations/calendar-service.js.map +1 -1
- package/dist/oauth/client-store.d.ts +36 -0
- package/dist/oauth/client-store.d.ts.map +1 -0
- package/dist/oauth/client-store.js +104 -0
- package/dist/oauth/client-store.js.map +1 -0
- package/dist/oauth/code-store.d.ts +48 -0
- package/dist/oauth/code-store.d.ts.map +1 -0
- package/dist/oauth/code-store.js +89 -0
- package/dist/oauth/code-store.js.map +1 -0
- package/dist/oauth/index.d.ts +13 -0
- package/dist/oauth/index.d.ts.map +1 -0
- package/dist/oauth/index.js +21 -0
- package/dist/oauth/index.js.map +1 -0
- package/dist/oauth/oauth-handler.d.ts +101 -0
- package/dist/oauth/oauth-handler.d.ts.map +1 -0
- package/dist/oauth/oauth-handler.js +577 -0
- package/dist/oauth/oauth-handler.js.map +1 -0
- package/dist/oauth/oauth-server.d.ts +165 -0
- package/dist/oauth/oauth-server.d.ts.map +1 -0
- package/dist/oauth/oauth-server.js +489 -0
- package/dist/oauth/oauth-server.js.map +1 -0
- package/dist/oauth/pkce.d.ts +48 -0
- package/dist/oauth/pkce.d.ts.map +1 -0
- package/dist/oauth/pkce.js +106 -0
- package/dist/oauth/pkce.js.map +1 -0
- package/dist/oauth/refresh-token-store.d.ts +45 -0
- package/dist/oauth/refresh-token-store.d.ts.map +1 -0
- package/dist/oauth/refresh-token-store.js +98 -0
- package/dist/oauth/refresh-token-store.js.map +1 -0
- package/dist/oauth/token-service.d.ts +46 -0
- package/dist/oauth/token-service.d.ts.map +1 -0
- package/dist/oauth/token-service.js +199 -0
- package/dist/oauth/token-service.js.map +1 -0
- package/dist/oauth/types.d.ts +264 -0
- package/dist/oauth/types.d.ts.map +1 -0
- package/dist/oauth/types.js +37 -0
- package/dist/oauth/types.js.map +1 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Server Mode for sage
|
|
3
|
+
* Requirements: 14.1, 14.9, 14.10, 13.1
|
|
4
|
+
*
|
|
5
|
+
* Provides HTTP server functionality for Remote MCP access.
|
|
6
|
+
*/
|
|
7
|
+
import { createServer } from 'http';
|
|
8
|
+
import { VERSION } from '../version.js';
|
|
9
|
+
import { createServer as createHttpsServer } from 'https';
|
|
10
|
+
import { randomUUID } from 'crypto';
|
|
11
|
+
/**
|
|
12
|
+
* HTTP Server implementation
|
|
13
|
+
*/
|
|
14
|
+
class HTTPServer {
|
|
15
|
+
config;
|
|
16
|
+
server = null;
|
|
17
|
+
running = false;
|
|
18
|
+
startTime = null;
|
|
19
|
+
tokens = new Map();
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Start the server
|
|
25
|
+
*/
|
|
26
|
+
async start() {
|
|
27
|
+
if (this.running) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
try {
|
|
32
|
+
const requestHandler = this.handleRequest.bind(this);
|
|
33
|
+
if (this.config.ssl) {
|
|
34
|
+
this.server = createHttpsServer({
|
|
35
|
+
cert: this.config.ssl.cert,
|
|
36
|
+
key: this.config.ssl.key,
|
|
37
|
+
ca: this.config.ssl.ca,
|
|
38
|
+
}, requestHandler);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this.server = createServer(requestHandler);
|
|
42
|
+
}
|
|
43
|
+
this.server.listen(this.config.port, this.config.host, () => {
|
|
44
|
+
this.running = true;
|
|
45
|
+
this.startTime = new Date();
|
|
46
|
+
resolve();
|
|
47
|
+
});
|
|
48
|
+
this.server.on('error', (error) => {
|
|
49
|
+
reject(error);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
reject(error);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Stop the server
|
|
59
|
+
*/
|
|
60
|
+
async stop() {
|
|
61
|
+
if (!this.running || !this.server) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
return new Promise((resolve) => {
|
|
65
|
+
this.server.close(() => {
|
|
66
|
+
this.running = false;
|
|
67
|
+
this.startTime = null;
|
|
68
|
+
resolve();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if server is running
|
|
74
|
+
*/
|
|
75
|
+
isRunning() {
|
|
76
|
+
return this.running;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get configured port
|
|
80
|
+
*/
|
|
81
|
+
getPort() {
|
|
82
|
+
return this.config.port;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get configured host
|
|
86
|
+
*/
|
|
87
|
+
getHost() {
|
|
88
|
+
return this.config.host;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get server info
|
|
92
|
+
*/
|
|
93
|
+
getServerInfo() {
|
|
94
|
+
return {
|
|
95
|
+
port: this.config.port,
|
|
96
|
+
host: this.config.host,
|
|
97
|
+
ssl: !!this.config.ssl,
|
|
98
|
+
authEnabled: this.config.auth?.enabled ?? false,
|
|
99
|
+
startTime: this.startTime ?? undefined,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Handle incoming HTTP request
|
|
104
|
+
*/
|
|
105
|
+
handleRequest(req, res) {
|
|
106
|
+
const url = req.url || '/';
|
|
107
|
+
const method = req.method || 'GET';
|
|
108
|
+
const origin = req.headers.origin;
|
|
109
|
+
// Add CORS headers
|
|
110
|
+
const corsHeaders = this.getCORSHeaders(origin);
|
|
111
|
+
for (const [key, value] of Object.entries(corsHeaders)) {
|
|
112
|
+
res.setHeader(key, value);
|
|
113
|
+
}
|
|
114
|
+
// Handle preflight
|
|
115
|
+
if (method === 'OPTIONS') {
|
|
116
|
+
res.writeHead(204);
|
|
117
|
+
res.end();
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Health check endpoint
|
|
121
|
+
if (url === '/health' && method === 'GET') {
|
|
122
|
+
this.handleHealthCheck(res);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Auth token endpoint
|
|
126
|
+
if (url === '/auth/token' && method === 'POST') {
|
|
127
|
+
this.handleAuthToken(req, res);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// MCP endpoint
|
|
131
|
+
if (url === '/mcp' && method === 'POST') {
|
|
132
|
+
this.handleMCPRequest(req, res);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// 404 for unknown routes
|
|
136
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
137
|
+
res.end(JSON.stringify({ error: 'Not found' }));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get CORS headers
|
|
141
|
+
*/
|
|
142
|
+
getCORSHeaders(origin) {
|
|
143
|
+
const allowedOrigins = this.config.cors?.allowedOrigins || ['*'];
|
|
144
|
+
let allowOrigin = '*';
|
|
145
|
+
if (origin && allowedOrigins.includes(origin)) {
|
|
146
|
+
allowOrigin = origin;
|
|
147
|
+
}
|
|
148
|
+
else if (allowedOrigins.length === 1 && allowedOrigins[0] !== '*') {
|
|
149
|
+
allowOrigin = allowedOrigins[0];
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
'Access-Control-Allow-Origin': allowOrigin,
|
|
153
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
154
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-API-Key',
|
|
155
|
+
'Access-Control-Max-Age': '86400',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Handle health check request
|
|
160
|
+
*/
|
|
161
|
+
handleHealthCheck(res) {
|
|
162
|
+
const uptime = this.startTime ? Date.now() - this.startTime.getTime() : 0;
|
|
163
|
+
const health = {
|
|
164
|
+
status: this.running ? 'ok' : 'error',
|
|
165
|
+
uptime,
|
|
166
|
+
version: VERSION,
|
|
167
|
+
timestamp: new Date().toISOString(),
|
|
168
|
+
};
|
|
169
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
170
|
+
res.end(JSON.stringify(health));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Handle auth token request
|
|
174
|
+
*/
|
|
175
|
+
handleAuthToken(req, res) {
|
|
176
|
+
// Check if auth is enabled and API key is valid
|
|
177
|
+
if (this.config.auth?.enabled) {
|
|
178
|
+
const apiKey = req.headers['x-api-key'];
|
|
179
|
+
if (!apiKey || !this.config.auth.apiKeys?.includes(apiKey)) {
|
|
180
|
+
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
181
|
+
res.end(JSON.stringify({ error: 'Invalid API key' }));
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Read request body
|
|
186
|
+
let body = '';
|
|
187
|
+
req.on('data', (chunk) => {
|
|
188
|
+
body += chunk.toString();
|
|
189
|
+
});
|
|
190
|
+
req.on('end', () => {
|
|
191
|
+
try {
|
|
192
|
+
const parsed = JSON.parse(body);
|
|
193
|
+
const userId = parsed.userId || 'anonymous';
|
|
194
|
+
// Generate token
|
|
195
|
+
const token = randomUUID();
|
|
196
|
+
const expiry = this.config.auth?.tokenExpiry || 3600000; // 1 hour default
|
|
197
|
+
const expiresAt = Date.now() + expiry;
|
|
198
|
+
this.tokens.set(token, { userId, expiresAt });
|
|
199
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
200
|
+
res.end(JSON.stringify({ token, expiresIn: expiry }));
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
204
|
+
res.end(JSON.stringify({ error: 'Invalid request body' }));
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Handle MCP request
|
|
210
|
+
*/
|
|
211
|
+
handleMCPRequest(req, res) {
|
|
212
|
+
// Check authentication if enabled
|
|
213
|
+
if (this.config.auth?.enabled) {
|
|
214
|
+
const authResult = this.checkAuth(req);
|
|
215
|
+
if (!authResult.success) {
|
|
216
|
+
res.writeHead(authResult.statusCode, { 'Content-Type': 'application/json' });
|
|
217
|
+
res.end(JSON.stringify({
|
|
218
|
+
jsonrpc: '2.0',
|
|
219
|
+
id: null,
|
|
220
|
+
error: {
|
|
221
|
+
code: authResult.errorCode,
|
|
222
|
+
message: authResult.errorMessage,
|
|
223
|
+
},
|
|
224
|
+
}));
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Read request body
|
|
229
|
+
let body = '';
|
|
230
|
+
req.on('data', (chunk) => {
|
|
231
|
+
body += chunk.toString();
|
|
232
|
+
});
|
|
233
|
+
req.on('end', () => {
|
|
234
|
+
try {
|
|
235
|
+
const request = this.parseJSONRPCRequest(body);
|
|
236
|
+
// TODO: Route to appropriate MCP tool handler
|
|
237
|
+
// For now, return a placeholder response
|
|
238
|
+
const response = {
|
|
239
|
+
jsonrpc: '2.0',
|
|
240
|
+
id: request.id,
|
|
241
|
+
result: {
|
|
242
|
+
message: 'MCP request received',
|
|
243
|
+
method: request.method,
|
|
244
|
+
params: request.params,
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
248
|
+
res.end(JSON.stringify(response));
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
252
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
253
|
+
res.end(JSON.stringify({
|
|
254
|
+
jsonrpc: '2.0',
|
|
255
|
+
id: null,
|
|
256
|
+
error: {
|
|
257
|
+
code: -32700,
|
|
258
|
+
message: errorMessage,
|
|
259
|
+
},
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
req.on('error', (error) => {
|
|
264
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
265
|
+
res.end(JSON.stringify({
|
|
266
|
+
jsonrpc: '2.0',
|
|
267
|
+
id: null,
|
|
268
|
+
error: {
|
|
269
|
+
code: -32603,
|
|
270
|
+
message: error.message,
|
|
271
|
+
},
|
|
272
|
+
}));
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Check authentication
|
|
277
|
+
*/
|
|
278
|
+
checkAuth(req) {
|
|
279
|
+
const authHeader = req.headers.authorization;
|
|
280
|
+
const apiKey = req.headers['x-api-key'];
|
|
281
|
+
const clientIP = req.headers['x-forwarded-for']?.split(',')[0] ||
|
|
282
|
+
req.socket.remoteAddress ||
|
|
283
|
+
'';
|
|
284
|
+
// Check IP whitelist
|
|
285
|
+
if (this.config.auth?.ipWhitelist &&
|
|
286
|
+
this.config.auth.ipWhitelist.length > 0 &&
|
|
287
|
+
!this.isIPAllowed(clientIP)) {
|
|
288
|
+
return {
|
|
289
|
+
success: false,
|
|
290
|
+
statusCode: 403,
|
|
291
|
+
errorCode: -32001,
|
|
292
|
+
errorMessage: 'IP not allowed',
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
// Check API key or token
|
|
296
|
+
const token = this.extractToken(authHeader);
|
|
297
|
+
if (!token && !apiKey) {
|
|
298
|
+
return {
|
|
299
|
+
success: false,
|
|
300
|
+
statusCode: 401,
|
|
301
|
+
errorCode: -32002,
|
|
302
|
+
errorMessage: 'Authentication required',
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
// Validate token
|
|
306
|
+
if (token) {
|
|
307
|
+
const tokenData = this.tokens.get(token);
|
|
308
|
+
if (tokenData && Date.now() <= tokenData.expiresAt) {
|
|
309
|
+
return { success: true };
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Validate API key
|
|
313
|
+
if (apiKey && this.config.auth?.apiKeys?.includes(apiKey)) {
|
|
314
|
+
return { success: true };
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
success: false,
|
|
318
|
+
statusCode: 401,
|
|
319
|
+
errorCode: -32003,
|
|
320
|
+
errorMessage: 'Invalid credentials',
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Check if IP is allowed
|
|
325
|
+
*/
|
|
326
|
+
isIPAllowed(ip) {
|
|
327
|
+
if (!this.config.auth?.ipWhitelist || this.config.auth.ipWhitelist.length === 0) {
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
for (const allowed of this.config.auth.ipWhitelist) {
|
|
331
|
+
if (ip === allowed) {
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
// Simple CIDR matching
|
|
335
|
+
if (allowed.includes('/')) {
|
|
336
|
+
const [network, bits] = allowed.split('/');
|
|
337
|
+
const mask = parseInt(bits, 10);
|
|
338
|
+
if (this.matchCIDR(ip, network, mask)) {
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Match IP against CIDR
|
|
347
|
+
*/
|
|
348
|
+
matchCIDR(ip, network, mask) {
|
|
349
|
+
const ipParts = ip.split('.').map(Number);
|
|
350
|
+
const networkParts = network.split('.').map(Number);
|
|
351
|
+
if (ipParts.length !== 4 || networkParts.length !== 4) {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
|
|
355
|
+
const networkNum = (networkParts[0] << 24) | (networkParts[1] << 16) | (networkParts[2] << 8) | networkParts[3];
|
|
356
|
+
const maskNum = ~((1 << (32 - mask)) - 1);
|
|
357
|
+
return (ipNum & maskNum) === (networkNum & maskNum);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Extract token from Authorization header
|
|
361
|
+
*/
|
|
362
|
+
extractToken(authHeader) {
|
|
363
|
+
if (!authHeader) {
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
if (authHeader.startsWith('Bearer ')) {
|
|
367
|
+
return authHeader.slice(7);
|
|
368
|
+
}
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Parse JSON-RPC request
|
|
373
|
+
*/
|
|
374
|
+
parseJSONRPCRequest(body) {
|
|
375
|
+
let parsed;
|
|
376
|
+
try {
|
|
377
|
+
parsed = JSON.parse(body);
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
throw new Error('Invalid JSON');
|
|
381
|
+
}
|
|
382
|
+
const request = parsed;
|
|
383
|
+
if (!request.jsonrpc || request.jsonrpc !== '2.0') {
|
|
384
|
+
throw new Error('Invalid JSON-RPC request');
|
|
385
|
+
}
|
|
386
|
+
if (request.method === undefined) {
|
|
387
|
+
throw new Error('Invalid JSON-RPC request: missing method');
|
|
388
|
+
}
|
|
389
|
+
return {
|
|
390
|
+
jsonrpc: '2.0',
|
|
391
|
+
id: request.id ?? null,
|
|
392
|
+
method: request.method,
|
|
393
|
+
params: request.params,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Create and start an HTTP server
|
|
399
|
+
* @param config - Server configuration
|
|
400
|
+
* @returns Running HTTP server instance
|
|
401
|
+
*/
|
|
402
|
+
export async function createHTTPServer(config) {
|
|
403
|
+
const server = new HTTPServer(config);
|
|
404
|
+
await server.start();
|
|
405
|
+
return server;
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=http-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/cli/http-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAA2C,MAAM,MAAM,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAyB,MAAM,OAAO,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AA2EpC;;GAEG;AACH,MAAM,UAAU;IACN,MAAM,CAAmB;IACzB,MAAM,GAAgC,IAAI,CAAC;IAC3C,OAAO,GAAY,KAAK,CAAC;IACzB,SAAS,GAAgB,IAAI,CAAC;IAC9B,MAAM,GAA4B,IAAI,GAAG,EAAE,CAAC;IAEpD,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAErD,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;oBACpB,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAC7B;wBACE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;wBAC1B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG;wBACxB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBACvB,EACD,cAAc,CACf,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;gBAC7C,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;oBAC1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAO,CAAC,KAAK,CAAC,GAAG,EAAE;gBACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;YACtB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK;YAC/C,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,GAAoB,EAAE,GAAmB;QAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;QACnC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAElC,mBAAmB;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,mBAAmB;QACnB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,GAAG,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,IAAI,GAAG,KAAK,aAAa,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/C,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,eAAe;QACf,IAAI,GAAG,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,MAAe;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjE,IAAI,WAAW,GAAG,GAAG,CAAC;QACtB,IAAI,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,WAAW,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpE,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,OAAO;YACL,6BAA6B,EAAE,WAAW;YAC1C,8BAA8B,EAAE,oBAAoB;YACpD,8BAA8B,EAAE,wCAAwC;YACxE,wBAAwB,EAAE,OAAO;SAClC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,GAAmB;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1E,MAAM,MAAM,GAAwB;YAClC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;YACrC,MAAM;YACN,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,GAAoB,EAAE,GAAmB;QAC/D,gDAAgD;QAChD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAuB,CAAC;YAE9D,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC;gBAE5C,iBAAiB;gBACjB,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,OAAO,CAAC,CAAC,iBAAiB;gBAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;gBAEtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAE9C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,GAAoB,EAAE,GAAmB;QAChE,kCAAkC;QAClC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC7E,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;oBACb,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE;wBACL,IAAI,EAAE,UAAU,CAAC,SAAS;wBAC1B,OAAO,EAAE,UAAU,CAAC,YAAY;qBACjC;iBACF,CAAC,CACH,CAAC;gBACF,OAAO;YACT,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAE/C,8CAA8C;gBAC9C,yCAAyC;gBACzC,MAAM,QAAQ,GAAG;oBACf,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM,EAAE;wBACN,OAAO,EAAE,sBAAsB;wBAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;qBACvB;iBACF,CAAC;gBAEF,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;gBAC9E,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;oBACb,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,YAAY;qBACtB;iBACF,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACxB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC,KAAK;oBACZ,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB;aACF,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,SAAS,CACf,GAAoB;QAEpB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAuB,CAAC;QAC9D,MAAM,QAAQ,GACX,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzD,GAAG,CAAC,MAAM,CAAC,aAAa;YACxB,EAAE,CAAC;QAEL,qBAAqB;QACrB,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAC3B,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,CAAC,KAAK;gBACjB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;QACJ,CAAC;QAED,yBAAyB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,CAAC,KAAK;gBACjB,YAAY,EAAE,yBAAyB;aACxC,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,CAAC,KAAK;YACjB,YAAY,EAAE,qBAAqB;SACpC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,EAAU;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,uBAAuB;YACvB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;oBACtC,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,EAAU,EAAE,OAAe,EAAE,IAAY;QACzD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,UAAU,GACd,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/F,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1C,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,UAA8B;QACjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,IAAY;QAMtC,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,OAAO,GAAG,MAAiC,CAAC;QAElD,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,EAAE,EAAG,OAAO,CAAC,EAAsB,IAAI,IAAI;YAC3C,MAAM,EAAE,OAAO,CAAC,MAAgB;YAChC,MAAM,EAAE,OAAO,CAAC,MAA6C;SAC9D,CAAC;IACJ,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAwB;IAC7D,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT Authentication Middleware for Remote MCP Server
|
|
3
|
+
* Requirements: 15.7, 15.8
|
|
4
|
+
*
|
|
5
|
+
* Provides middleware for authenticating requests with JWT tokens.
|
|
6
|
+
*/
|
|
7
|
+
import { IncomingMessage, ServerResponse } from 'http';
|
|
8
|
+
import { TokenResponse } from './secret-auth.js';
|
|
9
|
+
/**
|
|
10
|
+
* JWT middleware configuration
|
|
11
|
+
*/
|
|
12
|
+
export interface JWTMiddlewareConfig {
|
|
13
|
+
secret: string;
|
|
14
|
+
expiresIn: string;
|
|
15
|
+
skipPaths?: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Authentication result
|
|
19
|
+
*/
|
|
20
|
+
export interface AuthResult {
|
|
21
|
+
authenticated: boolean;
|
|
22
|
+
skipped?: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* JWT middleware interface
|
|
27
|
+
*/
|
|
28
|
+
export interface JWTMiddleware {
|
|
29
|
+
authenticate(req: IncomingMessage, res: ServerResponse): Promise<AuthResult>;
|
|
30
|
+
generateToken(secret: string): Promise<TokenResponse>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create JWT authentication middleware
|
|
34
|
+
*/
|
|
35
|
+
export declare function createJWTMiddleware(config: JWTMiddlewareConfig): JWTMiddleware;
|
|
36
|
+
//# sourceMappingURL=jwt-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-middleware.d.ts","sourceRoot":"","sources":["../../src/cli/jwt-middleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAkD,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACvD;AA8BD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CA0E9E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT Authentication Middleware for Remote MCP Server
|
|
3
|
+
* Requirements: 15.7, 15.8
|
|
4
|
+
*
|
|
5
|
+
* Provides middleware for authenticating requests with JWT tokens.
|
|
6
|
+
*/
|
|
7
|
+
import { createSecretAuthenticator } from './secret-auth.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse Authorization header
|
|
10
|
+
*/
|
|
11
|
+
function parseAuthorizationHeader(header) {
|
|
12
|
+
if (!header) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const parts = header.split(' ');
|
|
16
|
+
if (parts.length !== 2) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
scheme: parts[0].toLowerCase(),
|
|
21
|
+
token: parts[1],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Send JSON error response
|
|
26
|
+
*/
|
|
27
|
+
function sendErrorResponse(res, statusCode, error) {
|
|
28
|
+
res.setHeader('Content-Type', 'application/json');
|
|
29
|
+
res.writeHead(statusCode);
|
|
30
|
+
res.end(JSON.stringify({ error }));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create JWT authentication middleware
|
|
34
|
+
*/
|
|
35
|
+
export function createJWTMiddleware(config) {
|
|
36
|
+
const authenticator = createSecretAuthenticator({
|
|
37
|
+
secret: config.secret,
|
|
38
|
+
expiresIn: config.expiresIn,
|
|
39
|
+
});
|
|
40
|
+
const skipPaths = new Set(config.skipPaths || []);
|
|
41
|
+
return {
|
|
42
|
+
async authenticate(req, res) {
|
|
43
|
+
// Check if path should skip authentication
|
|
44
|
+
const url = req.url || '';
|
|
45
|
+
const path = url.split('?')[0];
|
|
46
|
+
if (skipPaths.has(path)) {
|
|
47
|
+
return {
|
|
48
|
+
authenticated: true,
|
|
49
|
+
skipped: true,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Get Authorization header
|
|
53
|
+
const authHeader = req.headers.authorization;
|
|
54
|
+
const parsed = parseAuthorizationHeader(authHeader);
|
|
55
|
+
if (!parsed) {
|
|
56
|
+
sendErrorResponse(res, 401, 'Missing or invalid Authorization header');
|
|
57
|
+
return {
|
|
58
|
+
authenticated: false,
|
|
59
|
+
error: 'Missing or invalid Authorization header',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Check scheme
|
|
63
|
+
if (parsed.scheme !== 'bearer') {
|
|
64
|
+
sendErrorResponse(res, 401, 'Authorization scheme must be Bearer');
|
|
65
|
+
return {
|
|
66
|
+
authenticated: false,
|
|
67
|
+
error: 'Authorization scheme must be Bearer',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Check token
|
|
71
|
+
if (!parsed.token || parsed.token.trim() === '') {
|
|
72
|
+
sendErrorResponse(res, 401, 'Token is required');
|
|
73
|
+
return {
|
|
74
|
+
authenticated: false,
|
|
75
|
+
error: 'Token is required',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Verify token
|
|
79
|
+
const verifyResult = await authenticator.verifyToken(parsed.token);
|
|
80
|
+
if (!verifyResult.valid) {
|
|
81
|
+
const errorMessage = verifyResult.error?.includes('expired')
|
|
82
|
+
? 'Token expired'
|
|
83
|
+
: 'Invalid token';
|
|
84
|
+
sendErrorResponse(res, 401, errorMessage);
|
|
85
|
+
return {
|
|
86
|
+
authenticated: false,
|
|
87
|
+
error: errorMessage,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
authenticated: true,
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
async generateToken(secret) {
|
|
95
|
+
return authenticator.authenticate(secret);
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=jwt-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-middleware.js","sourceRoot":"","sources":["../../src/cli/jwt-middleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,yBAAyB,EAAsC,MAAM,kBAAkB,CAAC;AA4BjG;;GAEG;AACH,SAAS,wBAAwB,CAAC,MAA0B;IAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QAC9B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAmB,EAAE,UAAkB,EAAE,KAAa;IAC/E,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAClD,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,MAAM,aAAa,GAAwB,yBAAyB,CAAC;QACnE,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAElD,OAAO;QACL,KAAK,CAAC,YAAY,CAAC,GAAoB,EAAE,GAAmB;YAC1D,2CAA2C;YAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,OAAO;oBACL,aAAa,EAAE,IAAI;oBACnB,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,2BAA2B;YAC3B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;YAC7C,MAAM,MAAM,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;YAEpD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,yCAAyC,CAAC,CAAC;gBACvE,OAAO;oBACL,aAAa,EAAE,KAAK;oBACpB,KAAK,EAAE,yCAAyC;iBACjD,CAAC;YACJ,CAAC;YAED,eAAe;YACf,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,qCAAqC,CAAC,CAAC;gBACnE,OAAO;oBACL,aAAa,EAAE,KAAK;oBACpB,KAAK,EAAE,qCAAqC;iBAC7C,CAAC;YACJ,CAAC;YAED,cAAc;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAChD,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;gBACjD,OAAO;oBACL,aAAa,EAAE,KAAK;oBACpB,KAAK,EAAE,mBAAmB;iBAC3B,CAAC;YACJ,CAAC;YAED,eAAe;YACf,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEnE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;gBACxB,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC;oBAC1D,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,eAAe,CAAC;gBACpB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;gBAC1C,OAAO;oBACL,aAAa,EAAE,KAAK;oBACpB,KAAK,EAAE,YAAY;iBACpB,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,aAAa,EAAE,IAAI;aACpB,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,MAAc;YAChC,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main Entry Point for sage
|
|
3
|
+
* Requirements: 14.1, 14.2, 14.3
|
|
4
|
+
*
|
|
5
|
+
* Handles server startup based on CLI options.
|
|
6
|
+
*/
|
|
7
|
+
import { CLIOptions } from './parser.js';
|
|
8
|
+
/**
|
|
9
|
+
* Server mode type
|
|
10
|
+
*/
|
|
11
|
+
export type ServerMode = 'stdio' | 'http' | 'help' | 'version';
|
|
12
|
+
/**
|
|
13
|
+
* Server start result
|
|
14
|
+
*/
|
|
15
|
+
export interface ServerStartResult {
|
|
16
|
+
/** Server mode */
|
|
17
|
+
mode: ServerMode;
|
|
18
|
+
/** Whether startup was successful */
|
|
19
|
+
success: boolean;
|
|
20
|
+
/** Error message if failed */
|
|
21
|
+
error?: string;
|
|
22
|
+
/** Message for help/version modes */
|
|
23
|
+
message?: string;
|
|
24
|
+
/** Config path used */
|
|
25
|
+
configPath?: string;
|
|
26
|
+
/** HTTP server port (for http mode) */
|
|
27
|
+
port?: number;
|
|
28
|
+
/** HTTP server host (for http mode) */
|
|
29
|
+
host?: string;
|
|
30
|
+
/** Whether authentication is enabled */
|
|
31
|
+
authEnabled?: boolean;
|
|
32
|
+
/** Stop function for HTTP server */
|
|
33
|
+
stop?: () => Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Start the server based on CLI options
|
|
37
|
+
* @param options - Parsed CLI options
|
|
38
|
+
* @returns Server start result
|
|
39
|
+
*/
|
|
40
|
+
export declare function startServer(options: CLIOptions): Promise<ServerStartResult>;
|
|
41
|
+
//# sourceMappingURL=main-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-entry.d.ts","sourceRoot":"","sources":["../../src/cli/main-entry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAA8B,MAAM,aAAa,CAAC;AAGrE;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmEjF"}
|