async handshake(force) {
        //Abort new handshake request if we're still handshaking
        if (this.state === STATES.HANDSHAKING || (this.state === STATES.CONNECTED && force !== true)) {
            return;
        }

        this.state = STATES.HANDSHAKING;

        return new Promise((resolve, reject) => {
            this.loopHandshake(() => {
                resolve();
            });
        });
    }
@param {boolean} [force] Whether to force a new handshake
@returns {Promise<void>}