processGossipResponse(msg) {
		try {
			const packet = this.deserialize(P.PACKET_GOSSIP_RES, msg);
			const payload = packet.payload;

			if (this.GOSSIP_DEBUG)
				this.logger.info(
					`----- RESPONSE ${this.nodeID} <- ${payload.sender} -----`,
					payload
				);

			// Process online nodes
			if (payload.online) {
				Object.keys(payload.online).forEach(nodeID => {
					// We don't process the self info. We know it better.
					if (nodeID == this.nodeID) return;

					const row = payload.online[nodeID];
					if (!Array.isArray(row)) return;

					let info, cpu, cpuSeq;

					if (row.length == 1) info = row[0];
					else if (row.length == 2) [cpuSeq, cpu] = row;
					else if (row.length == 3) [info, cpuSeq, cpu] = row;

					let node = this.nodes.get(nodeID);
					if (info && (!node || node.seq < info.seq)) {
						// If we don't know it, or know, but has smaller seq, update 'info'
						info.sender = nodeID;
						node = this.nodes.processNodeInfo(info);
					}

					if (node && cpuSeq && cpuSeq > node.cpuSeq) {
						// Update CPU
						node.heartbeat({
							cpu,
							cpuSeq
						});
					}
				});
			}

			// Process offline nodes
			if (payload.offline) {
				Object.keys(payload.offline).forEach(nodeID => {
					// We don't process the self info. We know it better.
					if (nodeID == this.nodeID) return;

					const seq = payload.offline[nodeID];

					const node = this.nodes.get(nodeID);
					if (!node) return;

					if (node.seq < seq) {
						if (node.available) {
							// We know it is online, so we change it to offline
							this.nodes.disconnected(node.id, false);
						}

						// Update the 'seq' to the received value
						node.seq = seq;
					}
				});
			}
		} catch (err) {
			this.logger.warn("Invalid incoming GOSSIP_RES packet.", err);
			this.logger.debug("Content:", msg.toString());
		}
	}
Process the incoming Gossip Response packet

@param {Buffer} msg
@memberof TcpTransporter