async getFullState(nodes) {
    let idx = Math.floor(Math.random() * Math.floor(nodes.length));
    let fullState = null;

    for (
      let retries = 0;
      fullState === null && retries < nodes.length;
      retries++
    ) {
      const { id, ip } = nodes[idx];
      const req = new Request();

      req.receiveTimeout = this.node.config.syncTimeout;

      req.connect(`tcp://${ip}:${this.node.config.ports.command}`);

      // No payload message for a full state request
      await req.send([topicEnum.FULLSTATE, null]);

      try {
        [, fullState] = await req.receive();
      } catch (e) {
        // no response from the remote node in a timely fashion... retrying
        // with another one
        global.kuzzle.log.warn(
          `Unable to fetch a full state from node ${id} (no response received)`,
        );
        idx = (idx + 1) % nodes.length;
      } finally {
        req.close();
      }
    }

    if (fullState === null) {
      return null;
    }

    const decoder = this.protoroot.lookupType("FullStateResponse");

    return decoder.toObject(decoder.decode(fullState));
  }
Request the full state from ONE of the remote nodes of the cluster, AT
RANDOM (necessary to make sure we distribute the full state serialization
load across all nodes)

@param  {Array.<IdCard>} nodes
@return {Object|null} Returns the fetched full state, or null if no node answered