async evictNode(nodeId, { broadcast = false, reason = "" }) {
    const subscriber = this.remoteNodes.get(nodeId);

    if (!subscriber) {
      global.kuzzle.log.warn(
        `[CLUSTER] Node "${nodeId}" with no subscriber evicted. Reason: ${reason}`,
      );
      return;
    }

    global.kuzzle.log.warn(
      `[CLUSTER] Node "${nodeId}" evicted. Reason: ${reason}`,
    );

    this.trackActivity(
      nodeId,
      subscriber.remoteNodeIP,
      nodeActivityEnum.EVICTED,
      reason,
    );

    await this.idCardHandler.removeNode(nodeId);
    this.remoteNodes.delete(nodeId);
    this.fullState.removeNode(nodeId);
    subscriber.dispose();

    if (broadcast) {
      this.publisher.sendNodeEvicted(this.nodeId, nodeId, reason);
    }

    if (this.countActiveNodes() < this.config.minimumNodes) {
      global.kuzzle.state = kuzzleStateEnum.NOT_ENOUGH_NODES;
      global.kuzzle.log.warn(
        `[CLUSTER] Not enough nodes active (expected: ${
          this.config.minimumNodes
        }, active: ${this.countActiveNodes()}). Deactivating node until new ones are added.`,
      );
    }
  }
Evicts a remote from the list
@param {string}  nodeId - remote node ID
@param {Object}  [options]
@param {boolean} [options.broadcast] - broadcast the eviction to the cluster
@param {string}  [options.reason] - reason of eviction