@@ -55,16 +55,44 @@ import {
55
55
import { getUser , isAllowed } from "./auth" ;
56
56
import { dnsScan , localAddress , SCAN_INTERVAL } from "./dns-scan" ;
57
57
import { handleHealth } from "./health" ;
58
- import { initMetrics , handleMetrics } from "./metrics" ;
58
+ import { handleMetrics , initMetrics } from "./metrics" ;
59
59
60
60
const logger = getLogger ( "conat-server" ) ;
61
61
62
+ async function checkPortAvailable ( port : number ) : Promise < void > {
63
+ return new Promise ( ( resolve , reject ) => {
64
+ const { createServer } = require ( "http" ) ;
65
+ const server = createServer ( ) ;
66
+
67
+ server . listen ( port , ( ) => {
68
+ server . close ( ( ) => resolve ( ) ) ;
69
+ } ) ;
70
+
71
+ server . on ( "error" , ( err : any ) => {
72
+ if ( err . code === "EADDRINUSE" ) {
73
+ reject (
74
+ new Error (
75
+ `Port ${ port } is already in use. Another CoCalc server may already be running. Please stop the existing server or use a different port.` ,
76
+ ) ,
77
+ ) ;
78
+ } else {
79
+ reject ( err ) ;
80
+ }
81
+ } ) ;
82
+ } ) ;
83
+ }
84
+
62
85
export async function init (
63
86
options0 : Partial < Options > & { kucalc ?: boolean } = { } ,
64
87
) {
65
88
logger . debug ( "init" ) ;
66
89
const { kucalc, ...options } = options0 ;
67
90
91
+ // In development mode, check if port is available to prevent multiple servers
92
+ if ( process . env . NODE_ENV !== "production" && ! kucalc ) {
93
+ await checkPortAvailable ( port ) ;
94
+ }
95
+
68
96
if ( kucalc ) {
69
97
}
70
98
0 commit comments