UNPKG

1.82 kBJavaScriptView Raw
1var tcp_wrap = process.binding('tcp_wrap')
2var TCP = tcp_wrap.TCP;
3var errno = require('util')._errnoException;
4
5// Check if the current node version is >= 9.3.0 or >= 8.11.2
6var v = process.version.substr(1).split('.').map(x=>Number(x))
7var is_recent_node = (v[0] >= 10
8 || (v[0] >= 9 && v[1] >= 3) // v9_3_0
9 || (v[0] >= 8 && v[1] >= 11 && v[2] >= 2)) // v8_11_2
10
11module.exports = function (addr, port) {
12 if (typeof addr === 'number' || /^\d+$/.test(addr)) {
13 var p = port;
14 port = addr;
15 addr = p;
16 }
17 if (!port) port = 0;
18 if (!addr) addr = '0.0.0.0';
19 if (is_recent_node)
20 var h = new TCP(tcp_wrap.constants && tcp_wrap.constants.SERVER);
21 else
22 var h = new TCP;
23 var r = /:/.test(addr)
24 ? h.bind6(addr, port)
25 : h.bind(addr, port)
26 ;
27 if (r) {
28 error(r, 'bind');
29 }
30
31 var sock = {};
32 if (/^v0\.10\./.test(process.version)) {
33 sock = h.getsockname && h.getsockname();
34 if (!sock || (port && port !== sock.port)) {
35 error('EADDRINUSE', 'bind');
36 }
37 else return h.fd;
38 }
39 else {
40 var s = h.getsockname && h.getsockname(sock);
41 if (s || (port && port !== sock.port)) {
42 error('EADDRINUSE', 'bind');
43 }
44 else {
45 return h.fd;
46 }
47 }
48};
49
50function error (code, syscall) {
51 if (process._errno) {
52 var ex = new Error(syscall + ' ' + process._errno);
53 ex.errno = ex.code = code;
54 ex.syscall = syscall;
55 throw ex;
56 }
57 else if (errno && code !== 'EADDRINUSE') {
58 throw errno(code, syscall);
59 }
60 else {
61 var ex = new Error(syscall + ' ' + code);
62 ex.errno = code;
63 ex.syscall = syscall;
64 throw ex;
65 }
66}
\No newline at end of file