diff --git a/src/pushStats/users.js b/src/pushStats/users.js index ef3b781..7b5d9f4 100644 --- a/src/pushStats/users.js +++ b/src/pushStats/users.js @@ -5,7 +5,7 @@ const SERVER_PORT = parseInt(/** @type {string} */ (process.env.SERVER_PORT), 10 /** * Check whether there's a server nearby - * @returns {Promise<[string, number]>} + * @returns {Promise<[string, number] | undefined>} */ async function checkLocalhostServer() { const hosts = [ @@ -13,30 +13,37 @@ async function checkLocalhostServer() { 'host.docker.internal', '172.17.0.1', ]; - /** @type {Promise<[string, number]>[]} */ + /** @type {Promise<[string, number] | undefined>[]} */ const promises = []; for (const host of hosts) { const p = new Promise((resolve, reject) => { const sock = new net.Socket(); - sock.setTimeout(2500); + function kill() { + sock.removeAllListeners(); + sock.end(); + sock.destroy(); + sock.unref(); + } + sock.setTimeout(200); console.log(`[${host}:${SERVER_PORT}] attempting connection`); sock - .on('connect', () => { - sock.destroy(); + .once('connect', () => { + kill(); resolve([host, SERVER_PORT]); }) - .on('error', () => { - sock.destroy(); - reject(); + .once('error', () => { + kill(); + reject(new Error('Error connecting to server')); }) - .on('timeout', () => { - sock.destroy(); - reject(); + .once('timeout', () => { + kill(); + reject(new Error('Timeout connecting to server')); }) .connect(SERVER_PORT, host); }); promises.push(p); } + promises.push(new Promise((resolve) => { setTimeout(() => resolve(undefined), 1000); })); return Promise.any(promises); } @@ -78,6 +85,9 @@ export default async function loadUsers() { if (!user.host) { try { if (user.type === 'private') { + if (!localServer) { + throw new Error('no local server available, and host unspecified'); + } [user.host, user.port] = localServer; } else { [user.host, user.port] = getHostInfoFromType(user.type); @@ -101,5 +111,6 @@ export default async function loadUsers() { } validUsers.push(user); } + console.log(`Loaded ${validUsers.length} users (out of ${users.length})`); return validUsers; }