lazy-mcp 2.2.7 → 2.3.1

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.
@@ -0,0 +1,578 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DEFAULT_MAX_PAYLOAD_SIZE = void 0;
37
+ exports.startHttpServer = startHttpServer;
38
+ const http = __importStar(require("http"));
39
+ const net_1 = require("net");
40
+ const crypto_1 = require("crypto");
41
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
42
+ const server_1 = require("./server");
43
+ const logger_1 = require("./logger");
44
+ const DEFAULT_PORT = 8080;
45
+ const DEFAULT_HOST = '127.0.0.1';
46
+ const DEFAULT_PATH = '/mcp';
47
+ exports.DEFAULT_MAX_PAYLOAD_SIZE = 4 * 1024 * 1024; // 4MB
48
+ const HMAC_KEY = Buffer.from('lazy-mcp-auth-check');
49
+ function getClientIp(req) {
50
+ return req.socket.remoteAddress ?? 'unknown';
51
+ }
52
+ function getRequestScheme(req) {
53
+ // Intentionally derived from the backend socket, not from Forwarded /
54
+ // X-Forwarded-Proto headers. Those headers are only safe to trust behind an
55
+ // explicit trusted-proxy configuration.
56
+ //
57
+ // If lazy-mcp is deployed behind a TLS-terminating reverse proxy, the
58
+ // proxy-to-app hop is usually plain HTTP, so the implicit same-origin check
59
+ // may not match the public HTTPS origin. In that case, configure explicit
60
+ // transport.allowedOrigins (and often transport.allowedHosts).
61
+ return req.socket.encrypted ? 'https:' : 'http:';
62
+ }
63
+ function parseMCPRequestDetails(body) {
64
+ if (Array.isArray(body)) {
65
+ const firstMethod = body.find((item) => item && typeof item.method === 'string')?.method;
66
+ return {
67
+ requestType: 'batch',
68
+ mcpMethod: firstMethod,
69
+ };
70
+ }
71
+ if (!body || typeof body !== 'object') {
72
+ return { requestType: 'unknown' };
73
+ }
74
+ const method = typeof body.method === 'string' ? body.method : undefined;
75
+ const details = {
76
+ requestType: 'single',
77
+ mcpMethod: method,
78
+ };
79
+ if (method === 'tools/call') {
80
+ const params = body.params;
81
+ if (params && typeof params === 'object') {
82
+ const lazyTool = typeof params.name === 'string' ? params.name : undefined;
83
+ details.lazyTool = lazyTool;
84
+ if (lazyTool === 'invoke_command') {
85
+ const args = params.arguments;
86
+ if (args && typeof args === 'object') {
87
+ details.downstreamServer =
88
+ typeof args.server === 'string' ? args.server : undefined;
89
+ details.downstreamCommand =
90
+ typeof args.command_name === 'string' ? args.command_name : undefined;
91
+ }
92
+ }
93
+ }
94
+ }
95
+ return details;
96
+ }
97
+ function tryParseResponseBody(rawBody) {
98
+ if (!rawBody) {
99
+ return '';
100
+ }
101
+ try {
102
+ return JSON.parse(rawBody);
103
+ }
104
+ catch {
105
+ return rawBody;
106
+ }
107
+ }
108
+ function appendCapturedChunk(chunks, chunk, encoding) {
109
+ if (chunk === undefined || chunk === null) {
110
+ return;
111
+ }
112
+ if (Buffer.isBuffer(chunk)) {
113
+ chunks.push(chunk);
114
+ return;
115
+ }
116
+ if (typeof chunk === 'string') {
117
+ chunks.push(Buffer.from(chunk, encoding));
118
+ return;
119
+ }
120
+ chunks.push(Buffer.from(String(chunk), encoding));
121
+ }
122
+ /**
123
+ * Format a host string for use in a URL authority.
124
+ * IPv6 addresses must be bracketed (e.g. "::1" → "[::1]").
125
+ */
126
+ function formatHostForURL(host) {
127
+ if ((0, net_1.isIP)(host) === 6) {
128
+ return `[${host}]`;
129
+ }
130
+ return host;
131
+ }
132
+ /**
133
+ * Validate Bearer token from the Authorization header.
134
+ * Uses timing-safe HMAC comparison to prevent length-leaking timing attacks.
135
+ */
136
+ function validateAuth(req, expectedToken) {
137
+ const authHeader = req.headers['authorization'];
138
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
139
+ return false;
140
+ }
141
+ const token = authHeader.slice(7); // Remove 'Bearer ' prefix
142
+ try {
143
+ const ha = (0, crypto_1.createHmac)('sha256', HMAC_KEY).update(token).digest();
144
+ const hb = (0, crypto_1.createHmac)('sha256', HMAC_KEY).update(expectedToken).digest();
145
+ return (0, crypto_1.timingSafeEqual)(ha, hb);
146
+ }
147
+ catch {
148
+ return false;
149
+ }
150
+ }
151
+ /**
152
+ * Read the full request body as a string, with a configurable size limit to prevent DoS.
153
+ */
154
+ function readBody(req, maxPayloadSize) {
155
+ return new Promise((resolve, reject) => {
156
+ let totalSize = 0;
157
+ let settled = false;
158
+ const rejectOnce = (err) => {
159
+ if (settled) {
160
+ return;
161
+ }
162
+ settled = true;
163
+ reject(err);
164
+ };
165
+ const contentLength = parseInt(req.headers['content-length'] || '0', 10);
166
+ if (contentLength > maxPayloadSize) {
167
+ const err = new Error('Payload Too Large');
168
+ err.statusCode = 413;
169
+ return rejectOnce(err);
170
+ }
171
+ const chunks = [];
172
+ req.on('data', (chunk) => {
173
+ if (settled)
174
+ return;
175
+ totalSize += chunk.length;
176
+ if (totalSize > maxPayloadSize) {
177
+ const err = new Error('Payload Too Large');
178
+ err.statusCode = 413;
179
+ rejectOnce(err);
180
+ }
181
+ else {
182
+ chunks.push(chunk);
183
+ }
184
+ });
185
+ req.on('end', () => {
186
+ if (settled)
187
+ return;
188
+ settled = true;
189
+ resolve(Buffer.concat(chunks).toString());
190
+ });
191
+ req.on('error', (err) => {
192
+ if (settled)
193
+ return;
194
+ settled = true;
195
+ reject(err);
196
+ });
197
+ });
198
+ }
199
+ /**
200
+ * Start an HTTP server exposing the MCP Streamable HTTP transport.
201
+ *
202
+ * Design:
203
+ * - Each request creates a fresh StreamableHTTPServerTransport (stateless)
204
+ * - Each transport gets a fresh Server instance sharing the same ServerManager
205
+ * - This allows concurrent multi-client access without session conflicts
206
+ * - Node.js http.createServer handles concurrency via the event loop
207
+ *
208
+ * Returns a shutdown function that the caller should invoke on process exit.
209
+ * Signal handling is intentionally NOT registered here — the caller (cli.ts)
210
+ * owns process lifecycle and calls shutdown() from its own signal handlers.
211
+ */
212
+ function startHttpServer(serverManager, config) {
213
+ const port = config.port ?? DEFAULT_PORT;
214
+ const host = config.host ?? DEFAULT_HOST;
215
+ const mcpPath = config.path ?? DEFAULT_PATH;
216
+ const authToken = config.authToken;
217
+ const maxPayloadSize = config.maxPayloadSize ?? exports.DEFAULT_MAX_PAYLOAD_SIZE;
218
+ const httpServer = http.createServer((req, res) => {
219
+ const requestId = (0, crypto_1.randomUUID)();
220
+ void (0, logger_1.runWithLogContext)({ requestId }, async () => {
221
+ const logger = (0, logger_1.getLogger)();
222
+ const startedAt = Date.now();
223
+ const clientIp = getClientIp(req);
224
+ const requestUrl = req.url ?? '/';
225
+ const requestMethod = req.method ?? 'UNKNOWN';
226
+ const requestScheme = getRequestScheme(req);
227
+ const origin = req.headers.origin;
228
+ const authPresent = !!req.headers.authorization;
229
+ const forwardedFor = Array.isArray(req.headers['x-forwarded-for'])
230
+ ? req.headers['x-forwarded-for'].join(', ')
231
+ : req.headers['x-forwarded-for'];
232
+ const responseChunks = [];
233
+ if (logger.shouldDumpBodies()) {
234
+ const originalWrite = res.write.bind(res);
235
+ const originalEnd = res.end.bind(res);
236
+ res.write = (...args) => {
237
+ const chunk = args[0];
238
+ const encoding = typeof args[1] === 'string' ? args[1] : undefined;
239
+ appendCapturedChunk(responseChunks, chunk, encoding);
240
+ return originalWrite(...args);
241
+ };
242
+ res.end = (...args) => {
243
+ const chunk = args[0];
244
+ const encoding = typeof args[1] === 'string' ? args[1] : undefined;
245
+ appendCapturedChunk(responseChunks, chunk, encoding);
246
+ return originalEnd(...args);
247
+ };
248
+ }
249
+ let accessLogged = false;
250
+ let accessReason = 'ok';
251
+ let payloadSize;
252
+ let requestDetails = { requestType: 'unknown' };
253
+ const writeJsonResponse = (status, body, reason, extraHeaders) => {
254
+ accessReason = reason;
255
+ res.writeHead(status, {
256
+ 'Content-Type': 'application/json',
257
+ ...extraHeaders,
258
+ });
259
+ res.end(JSON.stringify(body));
260
+ };
261
+ const logAccess = (status, reason) => {
262
+ if (accessLogged) {
263
+ return;
264
+ }
265
+ accessLogged = true;
266
+ const durationMs = Date.now() - startedAt;
267
+ const fields = {
268
+ event: 'http_access',
269
+ requestId,
270
+ clientIp,
271
+ forwardedFor,
272
+ httpMethod: requestMethod,
273
+ path: requestUrl,
274
+ host: req.headers.host,
275
+ origin,
276
+ authPresent,
277
+ status,
278
+ reason,
279
+ durationMs,
280
+ payloadBytes: payloadSize,
281
+ requestType: requestDetails.requestType,
282
+ mcpMethod: requestDetails.mcpMethod,
283
+ lazyTool: requestDetails.lazyTool,
284
+ downstreamServer: requestDetails.downstreamServer,
285
+ downstreamCommand: requestDetails.downstreamCommand,
286
+ };
287
+ if (status >= 500) {
288
+ logger.error('HTTP access', fields);
289
+ }
290
+ else {
291
+ logger.info('HTTP access', fields);
292
+ }
293
+ };
294
+ res.on('finish', () => {
295
+ if (logger.shouldDumpBodies()) {
296
+ const rawBody = Buffer.concat(responseChunks).toString('utf8');
297
+ logger.dumpBody('response', tryParseResponseBody(rawBody), {
298
+ event: 'http_response_body',
299
+ requestId,
300
+ status: res.statusCode,
301
+ mcpMethod: requestDetails.mcpMethod,
302
+ lazyTool: requestDetails.lazyTool,
303
+ });
304
+ }
305
+ logAccess(res.statusCode || 0, accessReason);
306
+ });
307
+ res.on('close', () => {
308
+ if (!res.writableEnded) {
309
+ accessReason = 'client_closed';
310
+ logAccess(499, accessReason);
311
+ }
312
+ });
313
+ let requestHost = req.headers.host || '';
314
+ let requestHostHostname = requestHost;
315
+ try {
316
+ requestHostHostname = new URL('http://' + requestHost).hostname;
317
+ }
318
+ catch {
319
+ requestHostHostname = requestHost.split(':')[0];
320
+ }
321
+ // Convert "[::1]" to "::1" for net.isIP
322
+ requestHostHostname = requestHostHostname.replace(/^\[(.*)\]$/, '$1');
323
+ const allowedHosts = new Set();
324
+ ['localhost', '127.0.0.1', '::1'].forEach(h => allowedHosts.add(h));
325
+ if (host !== '0.0.0.0' && host !== '::') {
326
+ try {
327
+ allowedHosts.add(new URL('http://' + formatHostForURL(host)).hostname);
328
+ }
329
+ catch {
330
+ allowedHosts.add(host);
331
+ }
332
+ }
333
+ if (config.allowedHosts) {
334
+ config.allowedHosts.forEach(h => {
335
+ try {
336
+ allowedHosts.add(new URL('http://' + h).hostname);
337
+ }
338
+ catch {
339
+ allowedHosts.add(h);
340
+ }
341
+ });
342
+ }
343
+ // DNS Rebinding / Host header validation
344
+ // A Host is valid if it's explicitly allowed, OR if it's a raw IP address (IPs cannot be used for DNS rebinding).
345
+ const isHostValid = allowedHosts.has(requestHostHostname) || (0, net_1.isIP)(requestHostHostname) !== 0;
346
+ if (!isHostValid) {
347
+ writeJsonResponse(403, {
348
+ jsonrpc: '2.0',
349
+ error: { code: -32002, message: 'Invalid Host header for DNS rebinding protection' },
350
+ id: null,
351
+ }, 'invalid_host');
352
+ return;
353
+ }
354
+ // Origin validation — compares the full origin tuple (scheme+host+port).
355
+ // Per the MCP transport spec, an invalid or untrusted Origin must be
356
+ // rejected with 403 Forbidden (not 400).
357
+ if (origin) {
358
+ let isOriginValid = false;
359
+ // "null" is a valid Origin value (RFC 6454 §7.1) sent by privacy-
360
+ // sensitive redirects, sandboxed iframes, and cross-origin redirects.
361
+ // It is syntactically valid but never trusted — always reject with 403.
362
+ if (origin !== 'null') {
363
+ try {
364
+ const originUrl = new URL(origin);
365
+ const normalizedOrigin = originUrl.origin; // scheme://host:port (canonical form)
366
+ const requestOrigin = new URL(`${requestScheme}//${requestHost}`).origin;
367
+ // Same-origin check: origin must match the request Host header exactly
368
+ // (scheme://host:port tuple, not just hostname/port). This prevents DNS
369
+ // rebinding bypasses and scheme confusion (http vs https).
370
+ if (normalizedOrigin === requestOrigin) {
371
+ isOriginValid = true;
372
+ }
373
+ // Origin matches explicitly configured allowedOrigins (full origin comparison)
374
+ else if (config.allowedOrigins) {
375
+ const normalizedAllowed = config.allowedOrigins.map(o => {
376
+ try {
377
+ return new URL(o).origin;
378
+ }
379
+ catch {
380
+ return o;
381
+ }
382
+ });
383
+ if (normalizedAllowed.includes(normalizedOrigin)) {
384
+ isOriginValid = true;
385
+ }
386
+ }
387
+ }
388
+ catch {
389
+ // Unparseable Origin — treated as untrusted, falls through to 403
390
+ }
391
+ }
392
+ if (!isOriginValid) {
393
+ writeJsonResponse(403, {
394
+ jsonrpc: '2.0',
395
+ error: { code: -32002, message: 'Forbidden: Origin not allowed' },
396
+ id: null,
397
+ }, 'invalid_origin');
398
+ return;
399
+ }
400
+ }
401
+ const url = new URL(req.url ?? '/', `http://${formatHostForURL(host)}:${port}`);
402
+ // Route check: only serve the MCP endpoint path
403
+ if (url.pathname !== mcpPath) {
404
+ writeJsonResponse(404, {
405
+ jsonrpc: '2.0',
406
+ error: { code: -32000, message: `Not found. MCP endpoint is at ${mcpPath}` },
407
+ id: null,
408
+ }, 'not_found');
409
+ return;
410
+ }
411
+ // Auth check
412
+ if (authToken && !validateAuth(req, authToken)) {
413
+ writeJsonResponse(401, {
414
+ jsonrpc: '2.0',
415
+ error: { code: -32001, message: 'Unauthorized: invalid or missing Bearer token' },
416
+ id: null,
417
+ }, 'auth_failed', {
418
+ 'WWW-Authenticate': 'Bearer',
419
+ });
420
+ return;
421
+ }
422
+ // Method check
423
+ if (req.method !== 'POST') {
424
+ const methodMessage = req.method === 'GET'
425
+ ? 'GET (SSE streaming) is not supported in stateless mode. Use POST for all requests.'
426
+ : `Method ${req.method} not allowed. Use POST.`;
427
+ writeJsonResponse(405, {
428
+ jsonrpc: '2.0',
429
+ error: { code: -32000, message: methodMessage },
430
+ id: null,
431
+ }, 'method_not_allowed', {
432
+ Allow: 'POST',
433
+ });
434
+ return;
435
+ }
436
+ try {
437
+ // Create a fresh transport and Server per request (stateless mode).
438
+ // sessionIdGenerator: undefined → no session tracking.
439
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
440
+ sessionIdGenerator: undefined,
441
+ });
442
+ const mcpServer = (0, server_1.createMCPServer)(serverManager);
443
+ // Request-scoped cleanup: registered before connect so it fires even if connect throws
444
+ res.on('close', () => {
445
+ transport.close().catch(err => {
446
+ logger.error('Error closing transport', {
447
+ event: 'http_transport_close_error',
448
+ error: err,
449
+ });
450
+ });
451
+ mcpServer.close().catch(err => {
452
+ logger.error('Error closing local MCP server', {
453
+ event: 'http_local_server_close_error',
454
+ error: err,
455
+ });
456
+ });
457
+ });
458
+ await mcpServer.connect(transport);
459
+ // For POST requests, read and pre-parse the body so we can pass it
460
+ // to handleRequest. The SDK's handleRequest can also read from the
461
+ // raw stream, but pre-parsing lets us validate earlier.
462
+ const bodyStr = await readBody(req, maxPayloadSize);
463
+ payloadSize = Buffer.byteLength(bodyStr, 'utf8');
464
+ let body;
465
+ try {
466
+ body = JSON.parse(bodyStr);
467
+ }
468
+ catch {
469
+ accessReason = 'invalid_json';
470
+ logger.dumpBody('request', bodyStr, {
471
+ event: 'http_request_body',
472
+ requestId,
473
+ parseError: true,
474
+ });
475
+ writeJsonResponse(400, {
476
+ jsonrpc: '2.0',
477
+ error: { code: -32700, message: 'Parse error: invalid JSON' },
478
+ id: null,
479
+ }, 'invalid_json');
480
+ return;
481
+ }
482
+ requestDetails = parseMCPRequestDetails(body);
483
+ logger.dumpBody('request', body, {
484
+ event: 'http_request_body',
485
+ requestId,
486
+ payloadBytes: payloadSize,
487
+ requestType: requestDetails.requestType,
488
+ mcpMethod: requestDetails.mcpMethod,
489
+ lazyTool: requestDetails.lazyTool,
490
+ downstreamServer: requestDetails.downstreamServer,
491
+ downstreamCommand: requestDetails.downstreamCommand,
492
+ });
493
+ await transport.handleRequest(req, res, body);
494
+ }
495
+ catch (error) {
496
+ logger.error('HTTP handler error', {
497
+ event: 'http_handler_error',
498
+ error,
499
+ mcpMethod: requestDetails.mcpMethod,
500
+ lazyTool: requestDetails.lazyTool,
501
+ downstreamServer: requestDetails.downstreamServer,
502
+ downstreamCommand: requestDetails.downstreamCommand,
503
+ });
504
+ // Only send error response if headers haven't been sent yet
505
+ if (!res.headersSent) {
506
+ const isPayloadTooLarge = error?.statusCode === 413;
507
+ if (isPayloadTooLarge) {
508
+ res.shouldKeepAlive = false;
509
+ }
510
+ accessReason = isPayloadTooLarge ? 'payload_too_large' : 'internal_error';
511
+ writeJsonResponse(isPayloadTooLarge ? 413 : 500, {
512
+ jsonrpc: '2.0',
513
+ error: {
514
+ code: isPayloadTooLarge ? -32000 : -32603,
515
+ message: isPayloadTooLarge ? 'Payload Too Large' : 'Internal server error',
516
+ },
517
+ id: null,
518
+ }, accessReason, isPayloadTooLarge ? { Connection: 'close' } : undefined);
519
+ }
520
+ }
521
+ }).catch((error) => {
522
+ const logger = (0, logger_1.getLogger)();
523
+ logger.error('HTTP request crashed before response', {
524
+ event: 'http_request_unhandled_error',
525
+ requestId,
526
+ error,
527
+ });
528
+ if (!res.headersSent) {
529
+ res.writeHead(500, { 'Content-Type': 'application/json' });
530
+ res.end(JSON.stringify({
531
+ jsonrpc: '2.0',
532
+ error: { code: -32603, message: 'Internal server error' },
533
+ id: null,
534
+ }));
535
+ }
536
+ });
537
+ });
538
+ return new Promise((resolve, reject) => {
539
+ const logger = (0, logger_1.getLogger)();
540
+ const connections = new Set();
541
+ httpServer.on('connection', (socket) => {
542
+ connections.add(socket);
543
+ socket.on('close', () => connections.delete(socket));
544
+ });
545
+ httpServer.on('error', (err) => {
546
+ logger.error('HTTP server error', {
547
+ event: 'http_server_error',
548
+ error: err,
549
+ });
550
+ reject(err);
551
+ });
552
+ httpServer.listen(port, host, () => {
553
+ logger.info(`lazy-mcp HTTP server listening on http://${formatHostForURL(host)}:${port}${mcpPath}`, {
554
+ event: 'http_server_listening',
555
+ host,
556
+ port,
557
+ path: mcpPath,
558
+ });
559
+ resolve({ shutdown });
560
+ });
561
+ // Graceful shutdown — caller invokes this from its own signal handler
562
+ const shutdown = () => {
563
+ logger.info('Shutting down HTTP server...', {
564
+ event: 'http_server_shutdown_start',
565
+ });
566
+ httpServer.close(() => {
567
+ logger.info('HTTP server closed', {
568
+ event: 'http_server_shutdown_complete',
569
+ });
570
+ });
571
+ // Force destroy open connections to avoid hangs (no grace period — in-flight requests may be cut off)
572
+ for (const socket of connections) {
573
+ socket.destroy();
574
+ }
575
+ };
576
+ });
577
+ }
578
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { LogFormat, LoggingConfig, LogLevel } from './types';
2
+ export type LogFields = Record<string, unknown>;
3
+ export interface ResolvedLoggingConfig {
4
+ level: LogLevel;
5
+ format: LogFormat;
6
+ dumpBodies: boolean;
7
+ maxBodyLogBytes: number;
8
+ redactKeys: string[];
9
+ }
10
+ export interface PreparedLogBody {
11
+ body: unknown;
12
+ bodyBytes: number;
13
+ bodyTruncated: boolean;
14
+ bodyLoggedBytes: number;
15
+ }
16
+ type LogWriter = (line: string) => void;
17
+ export declare function safeJsonStringify(value: unknown): string;
18
+ export declare function resolveLoggingConfig(config?: LoggingConfig): ResolvedLoggingConfig;
19
+ export declare function redactForLogging(value: unknown, redactKeys: Set<string>): unknown;
20
+ export declare function prepareBodyForLogging(value: unknown, maxBodyLogBytes: number, redactKeys: Set<string>): PreparedLogBody;
21
+ export declare class StructuredLogger {
22
+ private config;
23
+ private writer;
24
+ private redactKeySet;
25
+ constructor(config?: LoggingConfig, writer?: LogWriter);
26
+ getConfig(): ResolvedLoggingConfig;
27
+ shouldLog(level: LogLevel): boolean;
28
+ shouldDumpBodies(): boolean;
29
+ error(message: string, fields?: LogFields): void;
30
+ info(message: string, fields?: LogFields): void;
31
+ debug(message: string, fields?: LogFields): void;
32
+ dumpBody(direction: 'request' | 'response', body: unknown, fields?: LogFields): void;
33
+ prepareBody(body: unknown): PreparedLogBody;
34
+ private log;
35
+ }
36
+ export declare function configureLogger(config?: LoggingConfig): void;
37
+ export declare function getLogger(): StructuredLogger;
38
+ export declare function runWithLogContext<T>(context: LogFields, fn: () => T): T;
39
+ export {};
40
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAmCD,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAaxC,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAexD;AA+DD,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,qBAAqB,CAQlF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAEjF;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,eAAe,CA8BjB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAc;gBAEtB,MAAM,CAAC,EAAE,aAAa,EAAE,MAAM,GAAE,SAAyC;IAMrF,SAAS,IAAI,qBAAqB;IAIlC,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAInC,gBAAgB,IAAI,OAAO;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,SAAc,GAAG,IAAI;IAIpD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,SAAc,GAAG,IAAI;IAInD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,SAAc,GAAG,IAAI;IAIpD,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAE,SAAc,GAAG,IAAI;IAyBxF,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe;IAI3C,OAAO,CAAC,GAAG;CAgCZ;AAID,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAE5D;AAED,wBAAgB,SAAS,IAAI,gBAAgB,CAE5C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAGvE"}