Skip to content

Commit f751582

Browse files
echopiclaude
andcommitted
fix: detect port-in-use before starting (#1234)
Add a server error handler in lib/index.js to catch EADDRINUSE and print a friendly message before the process exits. This approach: - Works for all startup modes (not just cluster) - Handles the actual bind failure (no TOCTOU race condition) - Preserves the synchronous return value of the module export Also regenerate test root certs with 2048-bit keys (Node.js 25+ rejects 1024-bit keys) and change test wsPort to avoid conflicts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 6ff0305 commit f751582

File tree

4 files changed

+61
-35
lines changed

4 files changed

+61
-35
lines changed

lib/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ function proxy(callback) {
8080
callback.call(server, proxyEvents);
8181
}
8282
};
83+
server.on('error', function(err) {
84+
if (err.code === 'EADDRINUSE') {
85+
var addr = (config.host ? config.host + ':' : '') + config.port;
86+
console.error('[!] Port ' + addr + ' is already in use.');
87+
console.error('[i] Use -p <port> to specify another port.');
88+
}
89+
throw err;
90+
});
8391
util.getBoundIp(function(host) {
8492
util.checkPort(!config.INADDR_ANY && !host && config.port, function() {
8593
server.listen(config.port, host, execCallback);

test/assets/certs/_root.crt

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
1-
-----BEGIN CERTIFICATE-----
2-
MIIDBTCCAm6gAwIBAgIBATANBgkqhkiG9w0BAQsFADCBkDEqMCgGA1UEAxMhV0hJ
3-
U1RMRShhdmVud3VANDg6NDU6MjA6NTI6ZTM6NTEpMQswCQYDVQQGEwJDTjELMAkG
4-
A1UECBMCWkoxCzAJBgNVBAcTAkhaMSowKAYDVQQKEyFXSElTVExFKGF2ZW53dUA0
5-
ODo0NToyMDo1MjplMzo1MSkxDzANBgNVBAsTBldQUk9YWTAeFw0xNjA5MDcwODQ0
6-
MzBaFw0yNjA5MDcwODQ0MzBaMIGQMSowKAYDVQQDEyFXSElTVExFKGF2ZW53dUA0
7-
ODo0NToyMDo1MjplMzo1MSkxCzAJBgNVBAYTAkNOMQswCQYDVQQIEwJaSjELMAkG
8-
A1UEBxMCSFoxKjAoBgNVBAoTIVdISVNUTEUoYXZlbnd1QDQ4OjQ1OjIwOjUyOmUz
9-
OjUxKTEPMA0GA1UECxMGV1BST1hZMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
10-
gQCkl91qX33cnRX3gTTfUi72r8t/D1HavEm0McCaMVDQGJBX0VgVswLNIMGEyAcV
11-
mSMVleJAgu225M7rtpl9TKzSrOhdHAj7/AjZWOL5GJEuxu0LsuH8ZG9J6sS7HnVO
12-
//ZGJGjS5gGWk/gAfiII64+gurwasS7xiBHYYZOFTjRARwIDAQABo20wazAMBgNV
13-
HRMEBTADAQH/MAsGA1UdDwQEAwIC9DA7BgNVHSUENDAyBggrBgEFBQcDAQYIKwYB
14-
BQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUHAwgwEQYJYIZIAYb4QgEB
15-
BAQDAgD3MA0GCSqGSIb3DQEBCwUAA4GBACv2/Vxc8wa1Cz/qwxJuAUQhQpntGyCN
16-
UFVJcBr6hHmOKFfs6/l6q8u9bXNKBHeOygn8bn4+u/4qTV040GCm/t4hO1Dx3NhJ
17-
SKBciStpksJ+kCQp1RvUzNqcmDxkzkVbSXgS+i1BAYezOHsmL5H9fTddZ+q9UtIX
18-
mN6IvU/hQOj7
19-
-----END CERTIFICATE-----
1+
-----BEGIN CERTIFICATE-----
2+
MIIEAzCCAuugAwIBAgIUCKsIACfL/YbRndqWC9mJfoebHwAwDQYJKoZIhvcNAQEL
3+
BQAwgZAxKjAoBgNVBAMMIVdISVNUTEUoYXZlbnd1QDQ4OjQ1OjIwOjUyOmUzOjUx
4+
KTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAlpKMQswCQYDVQQHDAJIWjEqMCgGA1UE
5+
CgwhV0hJU1RMRShhdmVud3VANDg6NDU6MjA6NTI6ZTM6NTEpMQ8wDQYDVQQLDAZX
6+
UFJPWFkwHhcNMjYwNDA2MTIzMTEwWhcNMzYwNDAzMTIzMTEwWjCBkDEqMCgGA1UE
7+
AwwhV0hJU1RMRShhdmVud3VANDg6NDU6MjA6NTI6ZTM6NTEpMQswCQYDVQQGEwJD
8+
TjELMAkGA1UECAwCWkoxCzAJBgNVBAcMAkhaMSowKAYDVQQKDCFXSElTVExFKGF2
9+
ZW53dUA0ODo0NToyMDo1MjplMzo1MSkxDzANBgNVBAsMBldQUk9YWTCCASIwDQYJ
10+
KoZIhvcNAQEBBQADggEPADCCAQoCggEBANuSlLE5ewy3wIcHTuXjP3Mpt3jq0XHV
11+
QQpskVRCKSO7v0BCwXm3TyyrKC/t00JDlO3OAYtdgz2gNOYtbf7+pxntXsrogJPh
12+
t+zMvw5wyt0LQF3QKvaFJcN04Op4KXZpeDPzVlaO5vWTZNZ2ZtD5YahNLP8nMIaX
13+
1HyxG8v9HFDtjYVoArGx2qu6s7U5LT+Tql/lZfo7jYKrMu/FEt9E5nB9r4II1bq1
14+
C1fXsvrhBnQgpACsftaLYB3WRMT3HthRg/FMQPzYMZih2mTr7yE/qpAXuBMu+LBQ
15+
CUvEudO5LLhg7/t0nrA9hX4PJV0BEwcto/zvx9Zwzwi16piDOIeAJQ8CAwEAAaNT
16+
MFEwHQYDVR0OBBYEFMW8PtI0f4DC2nTlvEO5ZTM7rQhvMB8GA1UdIwQYMBaAFMW8
17+
PtI0f4DC2nTlvEO5ZTM7rQhvMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
18+
BQADggEBAJZbsGHhjRSdjwvgbxXyY4g3wNq19OMVt2QQdL2bPbcWWQ/c0PwDWHok
19+
hSYcYyfqynK8VqGbKGa8EPPjaGjcXz2kQMOX73oV6csHTEb3D4cHKCYYMji6Eq2H
20+
83wzhpobL1vNiuM357+PYl7ZE5weOIXNsJKeId371dQOYEBUGe7AJkZCk5KoDPZB
21+
TAEbJ2bRec3YsPOXCthf20zSop5H9u5qApLkVGt4CKr/V0HAeJgX2S5mJI0G4bG9
22+
v/u+xotZLa63jxHwpvfZ4zq29XEnCKGJ7PCKrsADk205zApBptgOD4/l3YtHY4m8
23+
N1NFvGdMargnx9jEAvQWRkRXdsl4wZE=
24+
-----END CERTIFICATE-----

test/assets/certs/root.key

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,28 @@
1-
-----BEGIN RSA PRIVATE KEY-----
2-
MIICXgIBAAKBgQCkl91qX33cnRX3gTTfUi72r8t/D1HavEm0McCaMVDQGJBX0VgV
3-
swLNIMGEyAcVmSMVleJAgu225M7rtpl9TKzSrOhdHAj7/AjZWOL5GJEuxu0LsuH8
4-
ZG9J6sS7HnVO//ZGJGjS5gGWk/gAfiII64+gurwasS7xiBHYYZOFTjRARwIDAQAB
5-
AoGBAIDuOVJfNQ+AublkrA8XqJQyxtxkGsGWZsHRi0b9xIkOBNvVsANnc5VNyGmD
6-
6xC/IZ2CCHZyWVXATFqWcguV6XXouF9R8TN+HcEaiZ9epEOnwOSPz4DdEtB+TZp+
7-
Ih3l/NEzLRNxp7XVqI1k9OG5yguctyzfYcydFem/ZRWcMaxhAkEA0Rb+qGF7jb84
8-
xRBxFXxnKJVa6C2OSuDG1eecepMcYqNiUTimbk1/3qzJZqXmNBcIAfG/3a5dyM0O
9-
l1f2xeZ41wJBAMmFOPXkqS4gx8vItUJ36HSgXVOePbdmpBFRWD9R0uj83TuNc3V/
10-
pD9jKnU/ZQ0DacI57F5zvIxtVy9iAP1iVhECQEJ5sRUPiRyTwxTEGW/fUVzRv0k5
11-
0pdzx0OSk2lVBB1IHKX+AMvoz9KX1KBR9lJxUBZuKbXtDdwddZogWVCp6ZkCQQC9
12-
kXcdyPZlEC0ixDHOzyF65Igmass/xWw9ZjoPhpdS2Nv8c3nTZDlL76s3FGWosjdA
13-
oGB8EX+i0hCb4CNyOJkhAkEADdZsXlSL7e0qy7iE1IP7uHrfse1ZZhIX48DSK+Yg
14-
nqZ8YdcUsS3RlVOgahqizD723klbKeGq8Pi9t0wHamjHjg==
15-
-----END RSA PRIVATE KEY-----
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDbkpSxOXsMt8CH
3+
B07l4z9zKbd46tFx1UEKbJFUQikju79AQsF5t08sqygv7dNCQ5TtzgGLXYM9oDTm
4+
LW3+/qcZ7V7K6ICT4bfszL8OcMrdC0Bd0Cr2hSXDdODqeCl2aXgz81ZWjub1k2TW
5+
dmbQ+WGoTSz/JzCGl9R8sRvL/RxQ7Y2FaAKxsdqrurO1OS0/k6pf5WX6O42CqzLv
6+
xRLfROZwfa+CCNW6tQtX17L64QZ0IKQArH7Wi2Ad1kTE9x7YUYPxTED82DGYodpk
7+
6+8hP6qQF7gTLviwUAlLxLnTuSy4YO/7dJ6wPYV+DyVdARMHLaP878fWcM8IteqY
8+
gziHgCUPAgMBAAECggEAOq7o3ZrSt7nuk0gRPqCnJxTJq9/6XTWVHf+ZMc9C5oF5
9+
omeVBP5Ig1Q1N+YUlbuxNINf50r1VgWYzcHriYCu0V+e+5T7NErZ2Mh58ZaUqVIm
10+
AEywBtXcG2qD6DZ4QmT60sug0h58PLsJcsYPQZ+9CXmi4oirT/WJPVAqcTDzHe94
11+
nxTZtMakgwBlAtx0WrS1dq3cIvgF3+SKFgWNaKggoiR0ltwZblKsvICfmWhDh5sA
12+
iWvdKAoWHb/t7HvyPVfjZrsO7IlYWbFDCdcu/SihEdqJy1qUudtv8lClqMSI3vhS
13+
skJGpIPnxe+7DFcN9X9icJCzlLwhOvbkFqbbqsBMXQKBgQD0WYJopyoPETjACC3v
14+
Jk4hxRgP/y2uRKge4x3SdcT1HJbFPbfE3jI4aViM1M8xIHe0jr/JIVLzOZjMXFL3
15+
/yiE9egO516N00/dwAtrK3zL+Sy1ynqU3SZb3mFuNZDPX5i7ilYNqUUEuqSjHXaf
16+
NRpe7inukf263KQOcxo3R+hPBQKBgQDmCqWRA56VjYfC6hvG6cq1brWWkdOfrhua
17+
iMKIXnyC1kPJZiYqLUDmOL8A0ehXKMjU9I+BO13LlM+Sqr/lcGpWwv9h0S/gVl8U
18+
QQyOCi9QaLHLPF7yIXxNbZzwles/U4SAuhh7BObjDkUZrf82WLWbPy2AJkeghk4L
19+
27RQhZ/YAwKBgAaua+Jwr7W5wtN9ZcQkR/6kZQQK9jTNq8ssaqRWlAwfu/+osF2x
20+
ta3VM5amOwQc3ykQvi3Bu4LrEEKGQ76EO5dnIfFGYk9+d7CYj7deeQsaxR4zayam
21+
5WWdrwxUaqFA++wk3DWDa1+1usq7A4NW8GGoIX1kgIubfODoRM8+KBwBAoGAcFrY
22+
3MgAx5iVq1x+bpu3lv/Yjw7wZng6ITMUmFhVxe1ytEZA866gmRE0MOlU6mUQGfrM
23+
sFjXidxHuaHOEfji5zdcVmE+Wfq1e4X95M4Sp9pKpDH7SZWTSZn04gjHGmnnOJwr
24+
4sHVJybMFyvFj7yqDoY/6exIZZ3TNrV7Dy0EkhMCgYEAlEE5u1IRAuA2yD8FpGCA
25+
Xb139cUcV5633jvMx4mbAimSx3O27SAPlU7cbT0uNUiBCEI6drxwHiRjTuqp6iTn
26+
OIVRmU0H5oV2g2EY0rCSPC4CjxgXacmchqsgvyyllgKpONkUUO15bEOCtjdCS8wu
27+
xw+uUp6C8sYojHg7Ut1qdIY=
28+
-----END PRIVATE KEY-----

test/config.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
module.exports = {
33
port: 6666,
44
serverPort: 8080,
5-
wsPort: 8081,
5+
wsPort: 18081,
66
httpsPort: 5566,
77
socksPort: 1080,
88
authSocksPort: 1118,

0 commit comments

Comments
 (0)