async processData(topic, data) {
    if (this.state === stateEnum.EVICTED) {
      return;
    }

    const decoder = this.protoroot.lookup(topic);

    if (decoder === null) {
      await this.evictNode({
        broadcast: true,
        reason: `received an invalid message from ${this.remoteNodeId} (unknown topic "${topic}")`,
      });
      return;
    }

    const message = decoder.toObject(decoder.decode(data));

    if (!(await this.validateMessage(message))) {
      return;
    }

    try {
      // If we are receiving messages from a node,
      // it means the node is alive so it should counts as an heartbeat
      this.handleHeartbeat();
      await this.handlers[topic].call(this, message);
    } catch (e) {
      this.localNode.evictSelf(
        `Unable to process sync message (topic: ${topic}, message: ${JSON.stringify(
          message,
        )}`,
        e,
      );
    }
  }
Decodes an incoming message, and dispatches it.
The topic name must match a protobuf message.

/!\ This method MUST NEVER THROW
It's awaited by this.listen(), which cannot be awaited (infinite loop),
and it also cannot afford to attach a rejection handler everytime a message
is received to prevent clogging the event loop with unnecessary promises

@param  {string} topic
@param  {Buffer} data
@return {void}