get ip() {
        // Resolve IP from cache if already resolved
        if (this._remote_ip) return this._remote_ip;

        // Ensure request has not ended yet
        if (this._request_ended)
            throw new Error('HyperExpress.Request.ip cannot be consumed after the Request/Response has ended.');

        // Determine if we can trust intermediary proxy servers and have a x-forwarded-for header
        const x_forwarded_for = this.get('X-Forwarded-For');
        const trust_proxy = this.route.app._options.trust_proxy;
        if (trust_proxy && x_forwarded_for) {
            // The first IP in the x-forwarded-for header is the client IP if we trust proxies
            this._remote_ip = x_forwarded_for.split(',')[0];
        } else {
            // Use the uWS detected connection IP address as a fallback
            this._remote_ip = array_buffer_to_string(this._raw_response.getRemoteAddressAsText());
        }

        // Return Remote IP
        return this._remote_ip;
    }
Returns remote IP address in string format from incoming request.
Note! You cannot call this method after the response has been sent or ended.
@returns {String}