const proxyaddr = require('proxy-addr') module.exports = class WebsocketAddressManager { constructor(behindProxy, trustedProxyIps) { if (behindProxy) { // parse trustedProxyIps comma-separated list the same way as express this.trust = proxyaddr.compile( trustedProxyIps ? trustedProxyIps.split(/ *, */) : [] ) } } getRemoteIp(clientHandshake) { if (!clientHandshake) { return 'client-handshake-missing' } else if (this.trust) { // create a dummy req object using the client handshake and // connection.remoteAddress for the proxy-addr module to parse try { const addressPort = clientHandshake.address const req = { headers: { 'x-forwarded-for': clientHandshake.headers && clientHandshake.headers['x-forwarded-for'], }, connection: { remoteAddress: addressPort && addressPort.address }, } // return the address parsed from x-forwarded-for return proxyaddr(req, this.trust) } catch (err) { return 'client-handshake-invalid' } } else { // return the address from the client handshake itself return clientHandshake.address && clientHandshake.address.address } } }