@mcp-shark/mcp-shark 1.5.4 → 1.5.5
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 +32 -96
- package/bin/mcp-shark.js +1 -1
- package/core/configs/codex.js +68 -0
- package/core/configs/environment.js +51 -0
- package/{lib/common → core}/configs/index.js +16 -1
- package/core/constants/Defaults.js +15 -0
- package/core/constants/HttpStatus.js +14 -0
- package/core/constants/Server.js +20 -0
- package/core/constants/StatusCodes.js +25 -0
- package/core/constants/index.js +7 -0
- package/core/container/DependencyContainer.js +179 -0
- package/core/db/init.js +33 -0
- package/core/index.js +10 -0
- package/{mcp-server/lib/common/error.js → core/libraries/ErrorLibrary.js} +4 -0
- package/core/libraries/LoggerLibrary.js +91 -0
- package/core/libraries/SerializationLibrary.js +32 -0
- package/core/libraries/bootstrap-logger.js +19 -0
- package/core/libraries/errors/ApplicationError.js +97 -0
- package/core/libraries/index.js +17 -0
- package/{mcp-server/lib → core/mcp-server}/auditor/audit.js +77 -53
- package/core/mcp-server/index.js +192 -0
- package/{mcp-server/lib → core/mcp-server}/server/external/all.js +1 -1
- package/core/mcp-server/server/external/config.js +75 -0
- package/{mcp-server/lib → core/mcp-server}/server/external/single/client.js +1 -1
- package/{mcp-server/lib → core/mcp-server}/server/external/single/request.js +1 -1
- package/{mcp-server/lib → core/mcp-server}/server/external/single/run.js +20 -11
- package/{mcp-server/lib → core/mcp-server}/server/external/single/transport.js +1 -1
- package/{mcp-server/lib → core/mcp-server}/server/internal/handlers/error.js +1 -1
- package/core/mcp-server/server/internal/handlers/prompts-get.js +28 -0
- package/core/mcp-server/server/internal/handlers/prompts-list.js +21 -0
- package/core/mcp-server/server/internal/handlers/resources-list.js +21 -0
- package/core/mcp-server/server/internal/handlers/resources-read.js +28 -0
- package/core/mcp-server/server/internal/handlers/tools-call.js +44 -0
- package/core/mcp-server/server/internal/handlers/tools-list.js +23 -0
- package/core/mcp-server/server/internal/run.js +53 -0
- package/{mcp-server/lib → core/mcp-server}/server/internal/server.js +11 -1
- package/core/models/ConversationFilters.js +31 -0
- package/core/models/ExportFormat.js +8 -0
- package/core/models/RequestFilters.js +43 -0
- package/core/models/SessionFilters.js +23 -0
- package/core/models/index.js +8 -0
- package/core/repositories/AuditRepository.js +233 -0
- package/core/repositories/ConversationRepository.js +182 -0
- package/core/repositories/PacketRepository.js +237 -0
- package/core/repositories/SchemaRepository.js +107 -0
- package/core/repositories/SessionRepository.js +59 -0
- package/core/repositories/StatisticsRepository.js +54 -0
- package/core/repositories/index.js +10 -0
- package/core/services/AuditService.js +144 -0
- package/core/services/BackupService.js +222 -0
- package/core/services/ConfigDetectionService.js +89 -0
- package/core/services/ConfigFileService.js +210 -0
- package/core/services/ConfigPatchingService.js +137 -0
- package/core/services/ConfigService.js +250 -0
- package/core/services/ConfigTransformService.js +178 -0
- package/core/services/ConversationService.js +19 -0
- package/core/services/ExportService.js +117 -0
- package/core/services/LogService.js +64 -0
- package/core/services/McpClientService.js +235 -0
- package/core/services/McpDiscoveryService.js +107 -0
- package/core/services/RequestService.js +56 -0
- package/core/services/ScanCacheService.js +242 -0
- package/core/services/ScanService.js +167 -0
- package/core/services/ServerManagementService.js +206 -0
- package/core/services/SessionService.js +34 -0
- package/core/services/SettingsService.js +163 -0
- package/core/services/StatisticsService.js +64 -0
- package/core/services/TokenService.js +94 -0
- package/core/services/index.js +25 -0
- package/core/services/parsers/ConfigParserFactory.js +113 -0
- package/core/services/parsers/JsonConfigParser.js +66 -0
- package/core/services/parsers/LegacyJsonConfigParser.js +71 -0
- package/core/services/parsers/TomlConfigParser.js +87 -0
- package/core/services/parsers/index.js +4 -0
- package/{ui/server → core}/utils/scan-cache/directory.js +1 -1
- package/core/utils/validation.js +77 -0
- package/package.json +14 -11
- package/ui/dist/assets/index-CArYxKxS.js +35 -0
- package/ui/dist/index.html +1 -1
- package/ui/server/controllers/BackupController.js +129 -0
- package/ui/server/controllers/ConfigController.js +92 -0
- package/ui/server/controllers/ConversationController.js +41 -0
- package/ui/server/controllers/LogController.js +44 -0
- package/ui/server/controllers/McpClientController.js +60 -0
- package/ui/server/controllers/McpDiscoveryController.js +44 -0
- package/ui/server/controllers/RequestController.js +129 -0
- package/ui/server/controllers/ScanController.js +122 -0
- package/ui/server/controllers/ServerManagementController.js +134 -0
- package/ui/server/controllers/SessionController.js +57 -0
- package/ui/server/controllers/SettingsController.js +24 -0
- package/ui/server/controllers/StatisticsController.js +54 -0
- package/ui/server/controllers/TokenController.js +58 -0
- package/ui/server/controllers/index.js +17 -0
- package/ui/server/routes/backups/index.js +15 -9
- package/ui/server/routes/composite/index.js +62 -32
- package/ui/server/routes/composite/servers.js +20 -15
- package/ui/server/routes/config.js +13 -172
- package/ui/server/routes/conversations.js +9 -19
- package/ui/server/routes/help.js +4 -3
- package/ui/server/routes/logs.js +14 -26
- package/ui/server/routes/playground.js +11 -174
- package/ui/server/routes/requests.js +12 -232
- package/ui/server/routes/sessions.js +10 -21
- package/ui/server/routes/settings.js +10 -192
- package/ui/server/routes/smartscan.js +26 -15
- package/ui/server/routes/statistics.js +8 -79
- package/ui/server/setup.js +162 -0
- package/ui/server/swagger/paths/backups.js +151 -0
- package/ui/server/swagger/paths/components.js +76 -0
- package/ui/server/swagger/paths/config.js +117 -0
- package/ui/server/swagger/paths/conversations.js +29 -0
- package/ui/server/swagger/paths/help.js +82 -0
- package/ui/server/swagger/paths/logs.js +87 -0
- package/ui/server/swagger/paths/playground.js +49 -0
- package/ui/server/swagger/paths/requests.js +178 -0
- package/ui/server/swagger/paths/serverManagement.js +169 -0
- package/ui/server/swagger/paths/sessions.js +61 -0
- package/ui/server/swagger/paths/settings.js +31 -0
- package/ui/server/swagger/paths/smartScan/discovery.js +97 -0
- package/ui/server/swagger/paths/smartScan/index.js +13 -0
- package/ui/server/swagger/paths/smartScan/scans.js +151 -0
- package/ui/server/swagger/paths/smartScan/token.js +71 -0
- package/ui/server/swagger/paths/statistics.js +40 -0
- package/ui/server/swagger/paths.js +38 -0
- package/ui/server/swagger/swagger.js +37 -0
- package/ui/server/utils/cleanup.js +99 -0
- package/ui/server/utils/config.js +18 -96
- package/ui/server/utils/errorHandler.js +43 -0
- package/ui/server/utils/logger.js +2 -2
- package/ui/server/utils/paths.js +27 -30
- package/ui/server/utils/port.js +21 -21
- package/ui/server/utils/process.js +18 -10
- package/ui/server/utils/processState.js +17 -0
- package/ui/server/utils/signals.js +34 -0
- package/ui/server/websocket/broadcast.js +33 -0
- package/ui/server/websocket/handler.js +52 -0
- package/ui/server.js +51 -230
- package/ui/src/App.jsx +2 -0
- package/ui/src/CompositeSetup.jsx +23 -9
- package/ui/src/PacketFilters.jsx +17 -3
- package/ui/src/components/AlertModal.jsx +116 -0
- package/ui/src/components/App/ApiDocsButton.jsx +57 -0
- package/ui/src/components/App/useAppState.js +43 -1
- package/ui/src/components/BackupList.jsx +27 -3
- package/ui/src/utils/requestPairing.js +35 -36
- package/ui/src/utils/requestUtils.js +1 -0
- package/lib/common/db/init.js +0 -132
- package/lib/common/db/logger.js +0 -349
- package/lib/common/db/query.js +0 -403
- package/lib/common/logger.js +0 -90
- package/mcp-server/index.js +0 -138
- package/mcp-server/lib/server/external/config.js +0 -57
- package/mcp-server/lib/server/internal/handlers/prompts-get.js +0 -20
- package/mcp-server/lib/server/internal/handlers/prompts-list.js +0 -13
- package/mcp-server/lib/server/internal/handlers/resources-list.js +0 -13
- package/mcp-server/lib/server/internal/handlers/resources-read.js +0 -20
- package/mcp-server/lib/server/internal/handlers/tools-call.js +0 -35
- package/mcp-server/lib/server/internal/handlers/tools-list.js +0 -15
- package/mcp-server/lib/server/internal/run.js +0 -37
- package/mcp-server/mcp-shark.js +0 -22
- package/ui/dist/assets/index-CFHeMNwd.js +0 -35
- package/ui/server/routes/backups/deleteBackup.js +0 -54
- package/ui/server/routes/backups/listBackups.js +0 -75
- package/ui/server/routes/backups/restoreBackup.js +0 -83
- package/ui/server/routes/backups/viewBackup.js +0 -47
- package/ui/server/routes/composite/setup.js +0 -129
- package/ui/server/routes/composite/status.js +0 -7
- package/ui/server/routes/composite/stop.js +0 -39
- package/ui/server/routes/composite/utils.js +0 -45
- package/ui/server/routes/smartscan/discover.js +0 -118
- package/ui/server/routes/smartscan/scans/clearCache.js +0 -23
- package/ui/server/routes/smartscan/scans/createBatchScans.js +0 -124
- package/ui/server/routes/smartscan/scans/createScan.js +0 -43
- package/ui/server/routes/smartscan/scans/getCachedResults.js +0 -52
- package/ui/server/routes/smartscan/scans/getScan.js +0 -42
- package/ui/server/routes/smartscan/scans/listScans.js +0 -25
- package/ui/server/routes/smartscan/scans.js +0 -13
- package/ui/server/routes/smartscan/token.js +0 -57
- package/ui/server/utils/config-update.js +0 -240
- package/ui/server/utils/scan-cache/all-results.js +0 -197
- package/ui/server/utils/scan-cache/file-operations.js +0 -107
- package/ui/server/utils/scan-cache/hash.js +0 -47
- package/ui/server/utils/scan-cache/server-operations.js +0 -85
- package/ui/server/utils/scan-cache.js +0 -12
- package/ui/server/utils/smartscan-token.js +0 -43
- /package/{mcp-server/lib → core/mcp-server}/server/external/kv.js +0 -0
- /package/{mcp-server/lib → core/mcp-server}/server/internal/handlers/common.js +0 -0
- /package/{mcp-server/lib → core/mcp-server}/server/internal/session.js +0 -0
package/lib/common/db/logger.js
DELETED
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Helper functions for logging HTTP packets to the database for forensic analysis
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
function getTimestampNs() {
|
|
6
|
-
return Number(process.hrtime.bigint());
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function getTimestampISO() {
|
|
10
|
-
return new Date().toISOString();
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function calculateDurationMs(startNs, endNs) {
|
|
14
|
-
return (endNs - startNs) / 1_000_000;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Normalize session ID from various header formats
|
|
19
|
-
* Supports: mcp-session-id, Mcp-Session-Id, X-MCP-Session-Id
|
|
20
|
-
*/
|
|
21
|
-
function normalizeSessionId(headers) {
|
|
22
|
-
if (!headers || typeof headers !== 'object') {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Check all possible header formats (case-insensitive)
|
|
27
|
-
const sessionHeaderKeys = [
|
|
28
|
-
'mcp-session-id',
|
|
29
|
-
'Mcp-Session-Id',
|
|
30
|
-
'X-MCP-Session-Id',
|
|
31
|
-
'x-mcp-session-id',
|
|
32
|
-
'MCP-Session-Id',
|
|
33
|
-
];
|
|
34
|
-
|
|
35
|
-
for (const key of sessionHeaderKeys) {
|
|
36
|
-
if (headers[key]) {
|
|
37
|
-
return headers[key];
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Extract JSON-RPC metadata from body
|
|
46
|
-
*/
|
|
47
|
-
function extractJsonRpcMetadata(bodyJson) {
|
|
48
|
-
if (!bodyJson) {
|
|
49
|
-
return { id: null, method: null, result: null, error: null };
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
const parsed = typeof bodyJson === 'string' ? JSON.parse(bodyJson) : bodyJson;
|
|
54
|
-
return {
|
|
55
|
-
id: parsed.id !== undefined ? String(parsed.id) : null,
|
|
56
|
-
method: parsed.method || null,
|
|
57
|
-
result: parsed.result ? JSON.stringify(parsed.result) : null,
|
|
58
|
-
error: parsed.error ? JSON.stringify(parsed.error) : null,
|
|
59
|
-
};
|
|
60
|
-
} catch {
|
|
61
|
-
return { id: null, method: null, result: null, error: null };
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Generate info summary for quick packet identification
|
|
67
|
-
*/
|
|
68
|
-
function generateInfo(direction, method, url, statusCode, jsonrpcMethod) {
|
|
69
|
-
if (direction === 'request') {
|
|
70
|
-
const rpcInfo = jsonrpcMethod ? ` ${jsonrpcMethod}` : '';
|
|
71
|
-
return `${method} ${url}${rpcInfo}`;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const rpcInfo = jsonrpcMethod ? ` ${jsonrpcMethod}` : '';
|
|
75
|
-
return `${statusCode}${rpcInfo}`;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Log an HTTP request packet
|
|
80
|
-
*/
|
|
81
|
-
function logRequestPacket(db, options) {
|
|
82
|
-
const { method, url, headers = {}, body, userAgent = null, remoteAddress = null } = options;
|
|
83
|
-
|
|
84
|
-
const timestampNs = getTimestampNs();
|
|
85
|
-
const timestampISO = getTimestampISO();
|
|
86
|
-
const sessionId = normalizeSessionId(headers);
|
|
87
|
-
const host = headers.host || headers.Host || null;
|
|
88
|
-
|
|
89
|
-
// Prepare body data
|
|
90
|
-
const { bodyRaw, bodyJson } = (() => {
|
|
91
|
-
if (!body) {
|
|
92
|
-
return { bodyRaw: '', bodyJson: null };
|
|
93
|
-
}
|
|
94
|
-
if (typeof body === 'string') {
|
|
95
|
-
return { bodyRaw: body, bodyJson: body };
|
|
96
|
-
}
|
|
97
|
-
if (typeof body === 'object') {
|
|
98
|
-
const raw = JSON.stringify(body);
|
|
99
|
-
return { bodyRaw: raw, bodyJson: raw };
|
|
100
|
-
}
|
|
101
|
-
return { bodyRaw: '', bodyJson: null };
|
|
102
|
-
})();
|
|
103
|
-
const headersJson = JSON.stringify(headers);
|
|
104
|
-
|
|
105
|
-
// Extract JSON-RPC metadata
|
|
106
|
-
const jsonrpc = extractJsonRpcMetadata(bodyJson || bodyRaw);
|
|
107
|
-
const jsonrpcId = jsonrpc.id;
|
|
108
|
-
const jsonrpcMethod = jsonrpc.method;
|
|
109
|
-
|
|
110
|
-
// Calculate packet length
|
|
111
|
-
const length = Buffer.byteLength(headersJson, 'utf8') + Buffer.byteLength(bodyRaw, 'utf8');
|
|
112
|
-
|
|
113
|
-
// Generate info summary
|
|
114
|
-
const info = generateInfo('request', method, url, null, jsonrpcMethod);
|
|
115
|
-
|
|
116
|
-
const stmt = db.prepare(`
|
|
117
|
-
INSERT INTO packets (
|
|
118
|
-
timestamp_ns,
|
|
119
|
-
timestamp_iso,
|
|
120
|
-
direction,
|
|
121
|
-
protocol,
|
|
122
|
-
session_id,
|
|
123
|
-
method,
|
|
124
|
-
url,
|
|
125
|
-
headers_json,
|
|
126
|
-
body_raw,
|
|
127
|
-
body_json,
|
|
128
|
-
jsonrpc_id,
|
|
129
|
-
jsonrpc_method,
|
|
130
|
-
length,
|
|
131
|
-
info,
|
|
132
|
-
user_agent,
|
|
133
|
-
remote_address,
|
|
134
|
-
host
|
|
135
|
-
) VALUES (?, ?, 'request', 'HTTP', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
136
|
-
`);
|
|
137
|
-
|
|
138
|
-
const result = stmt.run(
|
|
139
|
-
timestampNs,
|
|
140
|
-
timestampISO,
|
|
141
|
-
sessionId,
|
|
142
|
-
method,
|
|
143
|
-
url,
|
|
144
|
-
headersJson,
|
|
145
|
-
bodyRaw,
|
|
146
|
-
bodyJson,
|
|
147
|
-
jsonrpcId,
|
|
148
|
-
jsonrpcMethod,
|
|
149
|
-
length,
|
|
150
|
-
info,
|
|
151
|
-
userAgent,
|
|
152
|
-
remoteAddress,
|
|
153
|
-
host
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
const frameNumber = result.lastInsertRowid;
|
|
157
|
-
|
|
158
|
-
// Update or create session record
|
|
159
|
-
if (sessionId) {
|
|
160
|
-
const sessionStmt = db.prepare(`
|
|
161
|
-
INSERT INTO sessions (session_id, first_seen_ns, last_seen_ns, packet_count, user_agent, remote_address, host)
|
|
162
|
-
VALUES (?, ?, ?, 1, ?, ?, ?)
|
|
163
|
-
ON CONFLICT(session_id) DO UPDATE SET
|
|
164
|
-
last_seen_ns = excluded.last_seen_ns,
|
|
165
|
-
packet_count = packet_count + 1,
|
|
166
|
-
user_agent = COALESCE(excluded.user_agent, user_agent),
|
|
167
|
-
remote_address = COALESCE(excluded.remote_address, remote_address),
|
|
168
|
-
host = COALESCE(excluded.host, host)
|
|
169
|
-
`);
|
|
170
|
-
sessionStmt.run(sessionId, timestampNs, timestampNs, userAgent, remoteAddress, host);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Create conversation entry for request
|
|
174
|
-
if (jsonrpcId) {
|
|
175
|
-
const convStmt = db.prepare(`
|
|
176
|
-
INSERT INTO conversations (
|
|
177
|
-
request_frame_number,
|
|
178
|
-
session_id,
|
|
179
|
-
jsonrpc_id,
|
|
180
|
-
method,
|
|
181
|
-
request_timestamp_ns,
|
|
182
|
-
status
|
|
183
|
-
) VALUES (?, ?, ?, ?, ?, 'pending')
|
|
184
|
-
`);
|
|
185
|
-
convStmt.run(frameNumber, sessionId, jsonrpcId, jsonrpcMethod || method, timestampNs);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return { frameNumber, timestampNs };
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Log an HTTP response packet
|
|
193
|
-
*/
|
|
194
|
-
function logResponsePacket(db, options) {
|
|
195
|
-
const {
|
|
196
|
-
statusCode,
|
|
197
|
-
headers = {},
|
|
198
|
-
body,
|
|
199
|
-
requestFrameNumber = null,
|
|
200
|
-
requestTimestampNs = null,
|
|
201
|
-
jsonrpcId = null,
|
|
202
|
-
userAgent = null,
|
|
203
|
-
remoteAddress = null,
|
|
204
|
-
} = options;
|
|
205
|
-
|
|
206
|
-
const timestampNs = getTimestampNs();
|
|
207
|
-
const timestampISO = getTimestampISO();
|
|
208
|
-
const sessionId = normalizeSessionId(headers);
|
|
209
|
-
const host = headers.host || headers.Host || null;
|
|
210
|
-
|
|
211
|
-
// Prepare body data
|
|
212
|
-
const { bodyRaw, bodyJson } = (() => {
|
|
213
|
-
if (!body) {
|
|
214
|
-
return { bodyRaw: '', bodyJson: null };
|
|
215
|
-
}
|
|
216
|
-
if (typeof body === 'string') {
|
|
217
|
-
return { bodyRaw: body, bodyJson: body };
|
|
218
|
-
}
|
|
219
|
-
if (typeof body === 'object') {
|
|
220
|
-
const raw = JSON.stringify(body);
|
|
221
|
-
return { bodyRaw: raw, bodyJson: raw };
|
|
222
|
-
}
|
|
223
|
-
return { bodyRaw: '', bodyJson: null };
|
|
224
|
-
})();
|
|
225
|
-
const headersJson = JSON.stringify(headers);
|
|
226
|
-
|
|
227
|
-
// Extract JSON-RPC metadata
|
|
228
|
-
const jsonrpc = extractJsonRpcMetadata(bodyJson || bodyRaw);
|
|
229
|
-
const jsonrpcIdFromBody = jsonrpc.id || jsonrpcId;
|
|
230
|
-
const jsonrpcMethod = jsonrpc.method;
|
|
231
|
-
const jsonrpcResult = jsonrpc.result;
|
|
232
|
-
const jsonrpcError = jsonrpc.error;
|
|
233
|
-
|
|
234
|
-
// Calculate packet length
|
|
235
|
-
const length = Buffer.byteLength(headersJson, 'utf8') + Buffer.byteLength(bodyRaw, 'utf8');
|
|
236
|
-
|
|
237
|
-
// Generate info summary
|
|
238
|
-
const info = generateInfo('response', null, null, statusCode, jsonrpcMethod);
|
|
239
|
-
|
|
240
|
-
const stmt = db.prepare(`
|
|
241
|
-
INSERT INTO packets (
|
|
242
|
-
timestamp_ns,
|
|
243
|
-
timestamp_iso,
|
|
244
|
-
direction,
|
|
245
|
-
protocol,
|
|
246
|
-
session_id,
|
|
247
|
-
status_code,
|
|
248
|
-
headers_json,
|
|
249
|
-
body_raw,
|
|
250
|
-
body_json,
|
|
251
|
-
jsonrpc_id,
|
|
252
|
-
jsonrpc_method,
|
|
253
|
-
jsonrpc_result,
|
|
254
|
-
jsonrpc_error,
|
|
255
|
-
length,
|
|
256
|
-
info,
|
|
257
|
-
user_agent,
|
|
258
|
-
remote_address,
|
|
259
|
-
host
|
|
260
|
-
) VALUES (?, ?, 'response', 'HTTP', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
261
|
-
`);
|
|
262
|
-
|
|
263
|
-
const result = stmt.run(
|
|
264
|
-
timestampNs,
|
|
265
|
-
timestampISO,
|
|
266
|
-
sessionId,
|
|
267
|
-
statusCode,
|
|
268
|
-
headersJson,
|
|
269
|
-
bodyRaw,
|
|
270
|
-
bodyJson,
|
|
271
|
-
jsonrpcIdFromBody,
|
|
272
|
-
jsonrpcMethod,
|
|
273
|
-
jsonrpcResult,
|
|
274
|
-
jsonrpcError,
|
|
275
|
-
length,
|
|
276
|
-
info,
|
|
277
|
-
userAgent,
|
|
278
|
-
remoteAddress,
|
|
279
|
-
host
|
|
280
|
-
);
|
|
281
|
-
|
|
282
|
-
const frameNumber = result.lastInsertRowid;
|
|
283
|
-
|
|
284
|
-
// Update session record
|
|
285
|
-
if (sessionId) {
|
|
286
|
-
const sessionStmt = db.prepare(`
|
|
287
|
-
INSERT INTO sessions (session_id, first_seen_ns, last_seen_ns, packet_count, user_agent, remote_address, host)
|
|
288
|
-
VALUES (?, ?, ?, 1, ?, ?, ?)
|
|
289
|
-
ON CONFLICT(session_id) DO UPDATE SET
|
|
290
|
-
last_seen_ns = excluded.last_seen_ns,
|
|
291
|
-
packet_count = packet_count + 1,
|
|
292
|
-
user_agent = COALESCE(excluded.user_agent, user_agent),
|
|
293
|
-
remote_address = COALESCE(excluded.remote_address, remote_address),
|
|
294
|
-
host = COALESCE(excluded.host, host)
|
|
295
|
-
`);
|
|
296
|
-
sessionStmt.run(sessionId, timestampNs, timestampNs, userAgent, remoteAddress, host);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// Update conversation entry with response
|
|
300
|
-
if (jsonrpcIdFromBody || requestFrameNumber) {
|
|
301
|
-
const durationMs = requestTimestampNs
|
|
302
|
-
? calculateDurationMs(requestTimestampNs, timestampNs)
|
|
303
|
-
: null;
|
|
304
|
-
|
|
305
|
-
const status = statusCode >= 200 && statusCode < 300 ? 'completed' : 'error';
|
|
306
|
-
|
|
307
|
-
if (requestFrameNumber) {
|
|
308
|
-
// Update existing conversation
|
|
309
|
-
const updateConvStmt = db.prepare(`
|
|
310
|
-
UPDATE conversations
|
|
311
|
-
SET response_frame_number = ?,
|
|
312
|
-
response_timestamp_ns = ?,
|
|
313
|
-
duration_ms = ?,
|
|
314
|
-
status = ?
|
|
315
|
-
WHERE request_frame_number = ?
|
|
316
|
-
`);
|
|
317
|
-
updateConvStmt.run(frameNumber, timestampNs, durationMs, status, requestFrameNumber);
|
|
318
|
-
} else if (jsonrpcIdFromBody) {
|
|
319
|
-
// Try to find conversation by JSON-RPC ID
|
|
320
|
-
const findConvStmt = db.prepare(`
|
|
321
|
-
SELECT request_frame_number FROM conversations
|
|
322
|
-
WHERE jsonrpc_id = ? AND response_frame_number IS NULL
|
|
323
|
-
ORDER BY request_timestamp_ns DESC
|
|
324
|
-
LIMIT 1
|
|
325
|
-
`);
|
|
326
|
-
const conv = findConvStmt.get(jsonrpcIdFromBody);
|
|
327
|
-
if (conv) {
|
|
328
|
-
const updateConvStmt = db.prepare(`
|
|
329
|
-
UPDATE conversations
|
|
330
|
-
SET response_frame_number = ?,
|
|
331
|
-
response_timestamp_ns = ?,
|
|
332
|
-
duration_ms = ?,
|
|
333
|
-
status = ?
|
|
334
|
-
WHERE request_frame_number = ?
|
|
335
|
-
`);
|
|
336
|
-
updateConvStmt.run(frameNumber, timestampNs, durationMs, status, conv.request_frame_number);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
return frameNumber;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
export function getLogger(db) {
|
|
345
|
-
return {
|
|
346
|
-
logRequestPacket: logRequestPacket.bind(null, db),
|
|
347
|
-
logResponsePacket: logResponsePacket.bind(null, db),
|
|
348
|
-
};
|
|
349
|
-
}
|