@graphty/remote-logger 1.2.2 → 1.2.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/README.md +1 -1
- package/dist/client/RemoteLogClient.d.ts +2 -1
- package/dist/client/RemoteLogClient.d.ts.map +1 -1
- package/dist/client/RemoteLogClient.js +20 -10
- package/dist/client/RemoteLogClient.js.map +1 -1
- package/dist/client/types.d.ts +6 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +20 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-server.d.ts +5 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +6 -5
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +6 -6
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +1 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/logs-clear.d.ts +1 -2
- package/dist/mcp/tools/logs-clear.d.ts.map +1 -1
- package/dist/mcp/tools/logs-get-all.d.ts +1 -2
- package/dist/mcp/tools/logs-get-all.d.ts.map +1 -1
- package/dist/mcp/tools/logs-get-errors.d.ts +1 -2
- package/dist/mcp/tools/logs-get-errors.d.ts.map +1 -1
- package/dist/mcp/tools/logs-get-file-path.d.ts +8 -2
- package/dist/mcp/tools/logs-get-file-path.d.ts.map +1 -1
- package/dist/mcp/tools/logs-get-file-path.js +1 -1
- package/dist/mcp/tools/logs-get-file-path.js.map +1 -1
- package/dist/mcp/tools/logs-receive.d.ts +1 -2
- package/dist/mcp/tools/logs-receive.d.ts.map +1 -1
- package/dist/mcp/tools/logs-search.d.ts +1 -2
- package/dist/mcp/tools/logs-search.d.ts.map +1 -1
- package/dist/server/dual-server.d.ts +7 -4
- package/dist/server/dual-server.d.ts.map +1 -1
- package/dist/server/dual-server.js +108 -46
- package/dist/server/dual-server.js.map +1 -1
- package/dist/server/log-server.d.ts +2 -2
- package/dist/server/log-server.d.ts.map +1 -1
- package/dist/server/log-server.js +32 -55
- package/dist/server/log-server.js.map +1 -1
- package/dist/server/self-signed-cert.d.ts +9 -0
- package/dist/server/self-signed-cert.d.ts.map +1 -1
- package/dist/server/self-signed-cert.js +9 -0
- package/dist/server/self-signed-cert.js.map +1 -1
- package/dist/ui/ConsoleCaptureUI.d.ts.map +1 -1
- package/dist/ui/ConsoleCaptureUI.js +6 -1
- package/dist/ui/ConsoleCaptureUI.js.map +1 -1
- package/package.json +2 -1
- package/src/client/RemoteLogClient.ts +22 -11
- package/src/client/types.ts +6 -0
- package/src/mcp/index.ts +42 -0
- package/src/mcp/mcp-server.ts +6 -5
- package/src/mcp/tools/index.ts +7 -0
- package/src/mcp/tools/logs-clear.ts +1 -1
- package/src/mcp/tools/logs-get-all.ts +1 -1
- package/src/mcp/tools/logs-get-errors.ts +1 -1
- package/src/mcp/tools/logs-get-file-path.ts +2 -2
- package/src/mcp/tools/logs-receive.ts +1 -1
- package/src/mcp/tools/logs-search.ts +1 -1
- package/src/server/dual-server.ts +146 -53
- package/src/server/log-server.ts +35 -60
- package/src/server/self-signed-cert.ts +9 -0
- package/src/ui/ConsoleCaptureUI.ts +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleCaptureUI.js","sourceRoot":"","sources":["../../src/ui/ConsoleCaptureUI.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConsoleCaptureUI.js","sourceRoot":"","sources":["../../src/ui/ConsoleCaptureUI.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graphty/remote-logger",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "Remote logging client and server for browser debugging",
|
|
5
5
|
"author": "Adam Powers <apowers@ato.ms>",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -69,6 +69,7 @@
|
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
71
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
72
|
+
"internal-ip": "^8.0.1",
|
|
72
73
|
"selfsigned": "^2.4.1",
|
|
73
74
|
"zod": "^3.25.0"
|
|
74
75
|
},
|
|
@@ -38,6 +38,7 @@ const DEFAULT_BATCH_INTERVAL_MS = 1000;
|
|
|
38
38
|
const DEFAULT_MAX_RETRIES = 3;
|
|
39
39
|
const DEFAULT_RETRY_DELAY_MS = 1000;
|
|
40
40
|
const DEFAULT_SESSION_PREFIX = "session";
|
|
41
|
+
const DEFAULT_TIMEOUT_MS = 5000;
|
|
41
42
|
|
|
42
43
|
/**
|
|
43
44
|
* Generates a unique session ID with the given prefix.
|
|
@@ -86,6 +87,7 @@ export class RemoteLogClient {
|
|
|
86
87
|
private readonly throttlePatterns: ThrottlePattern[];
|
|
87
88
|
private readonly projectMarker: string | undefined;
|
|
88
89
|
private readonly worktreePath: string | undefined;
|
|
90
|
+
private readonly timeoutMs: number;
|
|
89
91
|
|
|
90
92
|
private pendingLogs: LogEntry[] = [];
|
|
91
93
|
private batchTimer: ReturnType<typeof setTimeout> | null = null;
|
|
@@ -106,6 +108,7 @@ export class RemoteLogClient {
|
|
|
106
108
|
this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
107
109
|
this.retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;
|
|
108
110
|
this.throttlePatterns = options.throttlePatterns ?? [];
|
|
111
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
109
112
|
|
|
110
113
|
// Priority: explicit option > global variable
|
|
111
114
|
this.projectMarker = options.projectMarker ?? getGlobalValue("__REMOTE_LOG_PROJECT_MARKER__");
|
|
@@ -229,7 +232,7 @@ export class RemoteLogClient {
|
|
|
229
232
|
/**
|
|
230
233
|
* Makes the actual HTTP request to send logs.
|
|
231
234
|
* @param logs - The log entries to send
|
|
232
|
-
* @throws Error if the request fails
|
|
235
|
+
* @throws Error if the request fails or times out
|
|
233
236
|
*/
|
|
234
237
|
private async sendRequest(logs: LogEntry[]): Promise<void> {
|
|
235
238
|
const requestBody: {
|
|
@@ -250,16 +253,24 @@ export class RemoteLogClient {
|
|
|
250
253
|
requestBody.worktreePath = this.worktreePath;
|
|
251
254
|
}
|
|
252
255
|
|
|
253
|
-
const
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
256
|
+
const controller = new AbortController();
|
|
257
|
+
const timeoutId = setTimeout(() => { controller.abort(); }, this.timeoutMs);
|
|
258
|
+
|
|
259
|
+
try {
|
|
260
|
+
const response = await fetch(`${this.serverUrl}/log`, {
|
|
261
|
+
method: "POST",
|
|
262
|
+
headers: {
|
|
263
|
+
"Content-Type": "application/json",
|
|
264
|
+
},
|
|
265
|
+
body: JSON.stringify(requestBody),
|
|
266
|
+
signal: controller.signal,
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
if (!response.ok) {
|
|
270
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
271
|
+
}
|
|
272
|
+
} finally {
|
|
273
|
+
clearTimeout(timeoutId);
|
|
263
274
|
}
|
|
264
275
|
}
|
|
265
276
|
|
package/src/client/types.ts
CHANGED
|
@@ -59,4 +59,10 @@ export interface RemoteLogClientOptions {
|
|
|
59
59
|
* __REMOTE_LOG_WORKTREE_PATH__ global variable (injected by Vite plugin).
|
|
60
60
|
*/
|
|
61
61
|
worktreePath?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Request timeout in milliseconds.
|
|
64
|
+
* Requests that take longer than this will be aborted and retried.
|
|
65
|
+
* @default 5000
|
|
66
|
+
*/
|
|
67
|
+
timeoutMs?: number;
|
|
62
68
|
}
|
package/src/mcp/index.ts
CHANGED
|
@@ -6,17 +6,59 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
export { createMcpServer, getToolNames, startMcpServer } from "./mcp-server.js";
|
|
9
|
+
|
|
10
|
+
// Re-export all tool handlers, schemas, and definitions for programmatic use
|
|
9
11
|
export {
|
|
12
|
+
// logs_get_file_path
|
|
13
|
+
getLogFilePath,
|
|
14
|
+
// logs_clear
|
|
15
|
+
logsClearHandler,
|
|
16
|
+
type LogsClearInput,
|
|
17
|
+
logsClearInputSchema,
|
|
18
|
+
type LogsClearOutput,
|
|
19
|
+
logsClearTool,
|
|
20
|
+
// logs_get_all
|
|
21
|
+
logsGetAllHandler,
|
|
22
|
+
type LogsGetAllInput,
|
|
23
|
+
logsGetAllInputSchema,
|
|
24
|
+
type LogsGetAllOutput,
|
|
25
|
+
logsGetAllTool,
|
|
26
|
+
// logs_get_errors
|
|
27
|
+
logsGetErrorsHandler,
|
|
28
|
+
type LogsGetErrorsInput,
|
|
29
|
+
logsGetErrorsInputSchema,
|
|
30
|
+
type LogsGetErrorsOutput,
|
|
31
|
+
logsGetErrorsTool,
|
|
32
|
+
logsGetFilePathHandler,
|
|
33
|
+
type LogsGetFilePathInput,
|
|
34
|
+
logsGetFilePathInputSchema,
|
|
35
|
+
type LogsGetFilePathOutput,
|
|
36
|
+
logsGetFilePathTool,
|
|
37
|
+
// logs_get_recent
|
|
10
38
|
logsGetRecentHandler,
|
|
11
39
|
type LogsGetRecentInput,
|
|
12
40
|
logsGetRecentInputSchema,
|
|
13
41
|
type LogsGetRecentOutput,
|
|
14
42
|
logsGetRecentTool,
|
|
43
|
+
// logs_list_sessions
|
|
15
44
|
logsListSessionsHandler,
|
|
16
45
|
type LogsListSessionsInput,
|
|
17
46
|
logsListSessionsInputSchema,
|
|
18
47
|
type LogsListSessionsOutput,
|
|
19
48
|
logsListSessionsTool,
|
|
49
|
+
// logs_receive
|
|
50
|
+
logsReceiveHandler,
|
|
51
|
+
type LogsReceiveInput,
|
|
52
|
+
logsReceiveInputSchema,
|
|
53
|
+
type LogsReceiveOutput,
|
|
54
|
+
logsReceiveTool,
|
|
55
|
+
// logs_search
|
|
56
|
+
logsSearchHandler,
|
|
57
|
+
type LogsSearchInput,
|
|
58
|
+
logsSearchInputSchema,
|
|
59
|
+
type LogsSearchOutput,
|
|
60
|
+
logsSearchTool,
|
|
61
|
+
// logs_status
|
|
20
62
|
logsStatusHandler,
|
|
21
63
|
type LogsStatusInput,
|
|
22
64
|
logsStatusInputSchema,
|
package/src/mcp/mcp-server.ts
CHANGED
|
@@ -61,8 +61,9 @@ export function getToolNames(): string[] {
|
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
63
|
* Server instructions for LLMs describing the overall purpose and usage.
|
|
64
|
+
* Exported for testing purposes.
|
|
64
65
|
*/
|
|
65
|
-
const SERVER_INSTRUCTIONS = `Remote Logger MCP Server - View console.log output from browser applications.
|
|
66
|
+
export const SERVER_INSTRUCTIONS = `Remote Logger MCP Server - View console.log output from browser applications.
|
|
66
67
|
|
|
67
68
|
## What is Remote Logging?
|
|
68
69
|
|
|
@@ -82,7 +83,7 @@ Remote logging is especially valuable for LLM assistants like this one - it enab
|
|
|
82
83
|
|
|
83
84
|
## Architecture
|
|
84
85
|
|
|
85
|
-
Browser App → HTTP POST to /
|
|
86
|
+
Browser App → HTTP POST to /log → Log Server (stores in memory + JSONL files) → MCP Tools (query logs)
|
|
86
87
|
|
|
87
88
|
## Setting Up a Browser App to Send Logs
|
|
88
89
|
|
|
@@ -96,8 +97,8 @@ Install: npm install @graphty/remote-logger
|
|
|
96
97
|
import { RemoteLogClient } from "@graphty/remote-logger";
|
|
97
98
|
|
|
98
99
|
const logger = new RemoteLogClient({
|
|
99
|
-
serverUrl: "http://localhost:9080
|
|
100
|
-
projectMarker: "my-project",
|
|
100
|
+
serverUrl: "http://localhost:9080", // Get this from logs_status (client appends /log)
|
|
101
|
+
projectMarker: "my-project", // Optional: for filtering
|
|
101
102
|
});
|
|
102
103
|
|
|
103
104
|
// Intercept all console.log/warn/error calls
|
|
@@ -110,7 +111,7 @@ logger.log("INFO", "Hello from browser!");
|
|
|
110
111
|
### Option 2: Raw fetch() calls
|
|
111
112
|
|
|
112
113
|
\`\`\`typescript
|
|
113
|
-
fetch("http://localhost:9080/
|
|
114
|
+
fetch("http://localhost:9080/log", {
|
|
114
115
|
method: "POST",
|
|
115
116
|
headers: { "Content-Type": "application/json" },
|
|
116
117
|
body: JSON.stringify({
|
package/src/mcp/tools/index.ts
CHANGED
|
@@ -7,24 +7,29 @@ export {
|
|
|
7
7
|
logsClearHandler,
|
|
8
8
|
type LogsClearInput,
|
|
9
9
|
logsClearInputSchema,
|
|
10
|
+
type LogsClearOutput,
|
|
10
11
|
logsClearTool,
|
|
11
12
|
} from "./logs-clear.js";
|
|
12
13
|
export {
|
|
13
14
|
logsGetAllHandler,
|
|
14
15
|
type LogsGetAllInput,
|
|
15
16
|
logsGetAllInputSchema,
|
|
17
|
+
type LogsGetAllOutput,
|
|
16
18
|
logsGetAllTool,
|
|
17
19
|
} from "./logs-get-all.js";
|
|
18
20
|
export {
|
|
19
21
|
logsGetErrorsHandler,
|
|
20
22
|
type LogsGetErrorsInput,
|
|
21
23
|
logsGetErrorsInputSchema,
|
|
24
|
+
type LogsGetErrorsOutput,
|
|
22
25
|
logsGetErrorsTool,
|
|
23
26
|
} from "./logs-get-errors.js";
|
|
24
27
|
export {
|
|
28
|
+
getLogFilePath,
|
|
25
29
|
logsGetFilePathHandler,
|
|
26
30
|
type LogsGetFilePathInput,
|
|
27
31
|
logsGetFilePathInputSchema,
|
|
32
|
+
type LogsGetFilePathOutput,
|
|
28
33
|
logsGetFilePathTool,
|
|
29
34
|
} from "./logs-get-file-path.js";
|
|
30
35
|
export {
|
|
@@ -45,12 +50,14 @@ export {
|
|
|
45
50
|
logsReceiveHandler,
|
|
46
51
|
type LogsReceiveInput,
|
|
47
52
|
logsReceiveInputSchema,
|
|
53
|
+
type LogsReceiveOutput,
|
|
48
54
|
logsReceiveTool,
|
|
49
55
|
} from "./logs-receive.js";
|
|
50
56
|
export {
|
|
51
57
|
logsSearchHandler,
|
|
52
58
|
type LogsSearchInput,
|
|
53
59
|
logsSearchInputSchema,
|
|
60
|
+
type LogsSearchOutput,
|
|
54
61
|
logsSearchTool,
|
|
55
62
|
} from "./logs-search.js";
|
|
56
63
|
export {
|
|
@@ -29,7 +29,7 @@ export type LogsClearInput = z.infer<typeof logsClearInputSchema>;
|
|
|
29
29
|
/**
|
|
30
30
|
* Output type for the logs_clear handler.
|
|
31
31
|
*/
|
|
32
|
-
interface LogsClearOutput {
|
|
32
|
+
export interface LogsClearOutput {
|
|
33
33
|
/** Whether the operation succeeded */
|
|
34
34
|
success: boolean;
|
|
35
35
|
/** Number of sessions cleared */
|
|
@@ -25,7 +25,7 @@ export type LogsGetAllInput = z.infer<typeof logsGetAllInputSchema>;
|
|
|
25
25
|
/**
|
|
26
26
|
* Output type for the logs_get_all handler.
|
|
27
27
|
*/
|
|
28
|
-
interface LogsGetAllOutput {
|
|
28
|
+
export interface LogsGetAllOutput {
|
|
29
29
|
/** Logs grouped by session ID */
|
|
30
30
|
sessions: Record<string, LogEntry[]>;
|
|
31
31
|
/** Number of sessions */
|
|
@@ -27,7 +27,7 @@ export type LogsGetErrorsInput = z.infer<typeof logsGetErrorsInputSchema>;
|
|
|
27
27
|
/**
|
|
28
28
|
* Output type for the logs_get_errors handler.
|
|
29
29
|
*/
|
|
30
|
-
interface LogsGetErrorsOutput {
|
|
30
|
+
export interface LogsGetErrorsOutput {
|
|
31
31
|
/** Array of ERROR level log entries */
|
|
32
32
|
errors: LogEntryWithSession[];
|
|
33
33
|
/** Number of errors returned */
|
|
@@ -31,7 +31,7 @@ export type LogsGetFilePathInput = z.infer<typeof logsGetFilePathInputSchema>;
|
|
|
31
31
|
/**
|
|
32
32
|
* Output type for the logs_get_file_path handler.
|
|
33
33
|
*/
|
|
34
|
-
interface LogsGetFilePathOutput {
|
|
34
|
+
export interface LogsGetFilePathOutput {
|
|
35
35
|
/** Full path to the JSONL log file */
|
|
36
36
|
path: string;
|
|
37
37
|
/** Whether the file exists */
|
|
@@ -46,7 +46,7 @@ interface LogsGetFilePathOutput {
|
|
|
46
46
|
* @param projectMarker - The project marker
|
|
47
47
|
* @returns Full path to the JSONL file
|
|
48
48
|
*/
|
|
49
|
-
function getLogFilePath(projectMarker: string): string {
|
|
49
|
+
export function getLogFilePath(projectMarker: string): string {
|
|
50
50
|
return path.join(os.tmpdir(), "remote-logger", projectMarker, "logs.jsonl");
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -47,7 +47,7 @@ export type LogsReceiveInput = z.infer<typeof logsReceiveInputSchema>;
|
|
|
47
47
|
/**
|
|
48
48
|
* Output type for the logs_receive handler.
|
|
49
49
|
*/
|
|
50
|
-
interface LogsReceiveOutput {
|
|
50
|
+
export interface LogsReceiveOutput {
|
|
51
51
|
/** Whether the operation succeeded */
|
|
52
52
|
success: boolean;
|
|
53
53
|
/** Number of logs stored */
|
|
@@ -33,7 +33,7 @@ export type LogsSearchInput = z.infer<typeof logsSearchInputSchema>;
|
|
|
33
33
|
/**
|
|
34
34
|
* Output type for the logs_search handler.
|
|
35
35
|
*/
|
|
36
|
-
interface LogsSearchOutput {
|
|
36
|
+
export interface LogsSearchOutput {
|
|
37
37
|
/** Matching log entries */
|
|
38
38
|
results: LogEntryWithSession[];
|
|
39
39
|
/** Number of results returned */
|
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
10
10
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
11
|
-
import
|
|
12
|
-
import
|
|
11
|
+
import * as http from "http";
|
|
12
|
+
import * as https from "https";
|
|
13
|
+
import { internalIpV4Sync } from "internal-ip";
|
|
13
14
|
import * as net from "net";
|
|
14
15
|
import * as os from "os";
|
|
15
16
|
import * as path from "path";
|
|
@@ -35,6 +36,90 @@ const MAX_PORT_SCAN_ATTEMPTS = 100;
|
|
|
35
36
|
/** Maximum port number allowed (ports 9000-9099 per project guidelines) */
|
|
36
37
|
const MAX_PORT_NUMBER = 9099;
|
|
37
38
|
|
|
39
|
+
/** Maximum retries for binding after EADDRINUSE during listen */
|
|
40
|
+
const MAX_BIND_RETRIES = 10;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Attempt to bind an HTTP/HTTPS server to a port with retry on EADDRINUSE.
|
|
44
|
+
* This handles race conditions where a port becomes unavailable between
|
|
45
|
+
* port scanning and actual binding.
|
|
46
|
+
* @param serverFactory - Function to create a new server instance
|
|
47
|
+
* @param startPort - Starting port to try
|
|
48
|
+
* @param host - Host to bind to
|
|
49
|
+
* @param quiet - Suppress output messages
|
|
50
|
+
* @param maxPort - Maximum port number to scan up to (default: 9099)
|
|
51
|
+
* @returns Promise resolving to bound server and actual port
|
|
52
|
+
*/
|
|
53
|
+
async function tryBindWithRetry(
|
|
54
|
+
serverFactory: () => http.Server | https.Server,
|
|
55
|
+
startPort: number,
|
|
56
|
+
host: string,
|
|
57
|
+
quiet: boolean,
|
|
58
|
+
maxPort: number = MAX_PORT_NUMBER,
|
|
59
|
+
): Promise<{ server: http.Server | https.Server; port: number }> {
|
|
60
|
+
let port = startPort;
|
|
61
|
+
let attempts = 0;
|
|
62
|
+
|
|
63
|
+
while (attempts < MAX_BIND_RETRIES) {
|
|
64
|
+
if (port > maxPort) {
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const server = serverFactory();
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
await new Promise<void>((resolve, reject) => {
|
|
72
|
+
const errorHandler = (err: NodeJS.ErrnoException): void => {
|
|
73
|
+
if (err.code === "EADDRINUSE") {
|
|
74
|
+
if (!quiet) {
|
|
75
|
+
// eslint-disable-next-line no-console
|
|
76
|
+
console.log(
|
|
77
|
+
`${colors.yellow}Port ${port} claimed during bind, trying ${port + 1}...${colors.reset}`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
reject(err);
|
|
81
|
+
} else {
|
|
82
|
+
reject(err);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
server.once("error", errorHandler);
|
|
87
|
+
server.listen({ port, host, exclusive: false }, () => {
|
|
88
|
+
server.removeListener("error", errorHandler);
|
|
89
|
+
resolve();
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Success - server is bound
|
|
94
|
+
if (!quiet) {
|
|
95
|
+
// eslint-disable-next-line no-console
|
|
96
|
+
console.log(
|
|
97
|
+
`${colors.green}HTTP server listening on ${host}:${port}${colors.reset}`,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
return { server, port };
|
|
101
|
+
} catch (err) {
|
|
102
|
+
if ((err as NodeJS.ErrnoException).code === "EADDRINUSE") {
|
|
103
|
+
port++;
|
|
104
|
+
attempts++;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
// Re-throw non-EADDRINUSE errors
|
|
108
|
+
throw err;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Exhausted retries
|
|
113
|
+
const errorMsg = `Could not bind to any port after ${attempts} attempts. ` +
|
|
114
|
+
`Ports ${startPort}-${port - 1} are all in use or were claimed during bind.`;
|
|
115
|
+
|
|
116
|
+
if (!quiet) {
|
|
117
|
+
console.error(`${colors.red}${errorMsg}${colors.reset}`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
throw new Error(errorMsg);
|
|
121
|
+
}
|
|
122
|
+
|
|
38
123
|
/**
|
|
39
124
|
* Check if a port is available for binding.
|
|
40
125
|
* @param port - Port number to check
|
|
@@ -72,16 +157,22 @@ async function isPortAvailable(port: number, host: string): Promise<boolean> {
|
|
|
72
157
|
* @param basePort - Starting port number
|
|
73
158
|
* @param host - Host to bind to
|
|
74
159
|
* @param quiet - Suppress output messages
|
|
160
|
+
* @param maxPort - Maximum port number to scan up to (default: 9099)
|
|
75
161
|
* @returns Promise resolving to available port number
|
|
76
162
|
* @throws Error if no available port found within MAX_PORT_SCAN_ATTEMPTS
|
|
77
163
|
*/
|
|
78
|
-
export async function findAvailablePort(
|
|
164
|
+
export async function findAvailablePort(
|
|
165
|
+
basePort: number,
|
|
166
|
+
host: string,
|
|
167
|
+
quiet: boolean = false,
|
|
168
|
+
maxPort: number = MAX_PORT_NUMBER,
|
|
169
|
+
): Promise<number> {
|
|
79
170
|
let port = basePort;
|
|
80
171
|
let attempts = 0;
|
|
81
172
|
|
|
82
173
|
while (attempts < MAX_PORT_SCAN_ATTEMPTS) {
|
|
83
|
-
if (port >
|
|
84
|
-
//
|
|
174
|
+
if (port > maxPort) {
|
|
175
|
+
// Stop if we exceed max port
|
|
85
176
|
break;
|
|
86
177
|
}
|
|
87
178
|
|
|
@@ -107,12 +198,12 @@ export async function findAvailablePort(basePort: number, host: string, quiet: b
|
|
|
107
198
|
}
|
|
108
199
|
|
|
109
200
|
// No available port found
|
|
110
|
-
const errorMsg = `Could not find available port after ${
|
|
111
|
-
`Ports ${basePort}-${port - 1} are all in use. ` +
|
|
201
|
+
const errorMsg = `Could not find available port after ${attempts} attempts starting from ${basePort}. ` +
|
|
202
|
+
`Ports ${basePort}-${Math.min(port - 1, maxPort)} are all in use. ` +
|
|
112
203
|
`Try killing existing processes: pkill -f "remote-log-server"`;
|
|
113
204
|
|
|
114
205
|
if (!quiet) {
|
|
115
|
-
|
|
206
|
+
|
|
116
207
|
console.error(`${colors.red}${errorMsg}${colors.reset}`);
|
|
117
208
|
}
|
|
118
209
|
|
|
@@ -125,7 +216,7 @@ export async function findAvailablePort(basePort: number, host: string, quiet: b
|
|
|
125
216
|
export interface DualServerOptions {
|
|
126
217
|
/** Port for HTTP server (default: 9080) */
|
|
127
218
|
httpPort?: number;
|
|
128
|
-
/** Host for HTTP server (default:
|
|
219
|
+
/** Host for HTTP server (default: 0.0.0.0) */
|
|
129
220
|
httpHost?: string;
|
|
130
221
|
/** Enable MCP server (default: true) */
|
|
131
222
|
mcpEnabled?: boolean;
|
|
@@ -145,6 +236,8 @@ export interface DualServerOptions {
|
|
|
145
236
|
jsonlWriter?: JsonlWriter;
|
|
146
237
|
/** Only serve /log POST and /health GET endpoints (default: false) */
|
|
147
238
|
logReceiveOnly?: boolean;
|
|
239
|
+
/** Maximum port number to scan up to (default: 9099) */
|
|
240
|
+
maxPortNumber?: number;
|
|
148
241
|
}
|
|
149
242
|
|
|
150
243
|
/**
|
|
@@ -176,7 +269,7 @@ export interface DualServerResult {
|
|
|
176
269
|
export async function createDualServer(options: DualServerOptions = {}): Promise<DualServerResult> {
|
|
177
270
|
const {
|
|
178
271
|
httpPort: requestedPort = 9080,
|
|
179
|
-
httpHost = "
|
|
272
|
+
httpHost = "0.0.0.0",
|
|
180
273
|
mcpEnabled = true,
|
|
181
274
|
httpEnabled = true,
|
|
182
275
|
quiet = false,
|
|
@@ -185,6 +278,7 @@ export async function createDualServer(options: DualServerOptions = {}): Promise
|
|
|
185
278
|
logReceiveOnly = false,
|
|
186
279
|
certPath,
|
|
187
280
|
keyPath,
|
|
281
|
+
maxPortNumber = MAX_PORT_NUMBER,
|
|
188
282
|
} = options;
|
|
189
283
|
|
|
190
284
|
// Create or use provided JSONL writer
|
|
@@ -204,18 +298,31 @@ export async function createDualServer(options: DualServerOptions = {}): Promise
|
|
|
204
298
|
// Start HTTP server if enabled
|
|
205
299
|
if (httpEnabled) {
|
|
206
300
|
// Find an available port starting from the requested port
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
301
|
+
const startPort = await findAvailablePort(requestedPort, httpHost, quiet, maxPortNumber);
|
|
302
|
+
|
|
303
|
+
// Factory function to create server instances (for retry on bind failure)
|
|
304
|
+
const createServerInstance = (): http.Server | https.Server => {
|
|
305
|
+
return createLogServer({
|
|
306
|
+
port: startPort, // Port is set but not used until bind
|
|
307
|
+
host: httpHost,
|
|
308
|
+
storage,
|
|
309
|
+
quiet: true, // Quiet during factory, messages handled by tryBindWithRetry
|
|
310
|
+
logReceiveOnly,
|
|
311
|
+
certPath,
|
|
312
|
+
keyPath,
|
|
313
|
+
}).server;
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
// Bind with retry logic to handle race conditions
|
|
317
|
+
const bindResult = await tryBindWithRetry(
|
|
318
|
+
createServerInstance,
|
|
319
|
+
startPort,
|
|
320
|
+
httpHost,
|
|
213
321
|
quiet,
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
httpServer = result.server;
|
|
322
|
+
maxPortNumber,
|
|
323
|
+
);
|
|
324
|
+
httpServer = bindResult.server;
|
|
325
|
+
actualHttpPort = bindResult.port;
|
|
219
326
|
|
|
220
327
|
// Track connections for graceful shutdown
|
|
221
328
|
httpServer.on("connection", (socket: net.Socket) => {
|
|
@@ -229,37 +336,6 @@ export async function createDualServer(options: DualServerOptions = {}): Promise
|
|
|
229
336
|
httpServer.keepAliveTimeout = 1000;
|
|
230
337
|
httpServer.headersTimeout = 2000;
|
|
231
338
|
|
|
232
|
-
// Wait for HTTP server to be listening
|
|
233
|
-
const serverToStart = httpServer;
|
|
234
|
-
const portToUse = actualHttpPort;
|
|
235
|
-
await new Promise<void>((resolve, reject) => {
|
|
236
|
-
serverToStart.on("error", (err: NodeJS.ErrnoException) => {
|
|
237
|
-
// Provide helpful error message for port conflicts
|
|
238
|
-
if (err.code === "EADDRINUSE") {
|
|
239
|
-
const errorMsg = `Port ${portToUse} is already in use. ` +
|
|
240
|
-
`This shouldn't happen after port scanning - there may be a race condition. ` +
|
|
241
|
-
`Try again or kill existing processes: pkill -f "remote-log-server"`;
|
|
242
|
-
if (!quiet) {
|
|
243
|
-
|
|
244
|
-
console.error(`${colors.red}${errorMsg}${colors.reset}`);
|
|
245
|
-
}
|
|
246
|
-
reject(new Error(errorMsg));
|
|
247
|
-
} else {
|
|
248
|
-
reject(err);
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
serverToStart.listen({ port: portToUse, host: httpHost, exclusive: false }, () => {
|
|
252
|
-
serverToStart.removeListener("error", reject);
|
|
253
|
-
if (!quiet) {
|
|
254
|
-
// eslint-disable-next-line no-console
|
|
255
|
-
console.log(
|
|
256
|
-
`${colors.green}HTTP server listening on ${httpHost}:${portToUse}${colors.reset}`,
|
|
257
|
-
);
|
|
258
|
-
}
|
|
259
|
-
resolve();
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
|
|
263
339
|
// Set server config in storage so MCP tools can report it
|
|
264
340
|
// Determine protocol based on whether valid cert files were provided
|
|
265
341
|
const useHttps = certPath && keyPath && certFilesExist(certPath, keyPath);
|
|
@@ -273,11 +349,28 @@ export async function createDualServer(options: DualServerOptions = {}): Promise
|
|
|
273
349
|
} else {
|
|
274
350
|
mode = "dual";
|
|
275
351
|
}
|
|
352
|
+
// When bound to all interfaces (0.0.0.0), detect the machine's IP address
|
|
353
|
+
// for the endpoint URL since 0.0.0.0 is not a routable address for clients
|
|
354
|
+
let endpointHost = httpHost;
|
|
355
|
+
if (httpHost === "0.0.0.0") {
|
|
356
|
+
const internalIp = internalIpV4Sync();
|
|
357
|
+
if (internalIp) {
|
|
358
|
+
endpointHost = internalIp;
|
|
359
|
+
} else {
|
|
360
|
+
// Fallback for local-only use - don't use hostname as it may not resolve
|
|
361
|
+
endpointHost = "127.0.0.1";
|
|
362
|
+
if (!quiet) {
|
|
363
|
+
console.warn(
|
|
364
|
+
`${colors.yellow}Could not detect LAN IP. Endpoint URL will only work locally.${colors.reset}`,
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
276
369
|
storage.setServerConfig({
|
|
277
370
|
httpPort: actualHttpPort,
|
|
278
371
|
httpHost,
|
|
279
372
|
protocol,
|
|
280
|
-
httpEndpoint: `${protocol}://${
|
|
373
|
+
httpEndpoint: `${protocol}://${endpointHost}:${actualHttpPort}/log`,
|
|
281
374
|
mode,
|
|
282
375
|
});
|
|
283
376
|
}
|