processGossipRequest(msg) {
		const response = {
			online: {},
			offline: {}
		};

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

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

			const list = this.nodes.toArray();
			list.forEach(node => {
				const online = payload.online ? payload.online[node.id] : null;
				const offline = payload.offline ? payload.offline[node.id] : null;
				let seq, cpuSeq, cpu;

				if (offline) seq = offline;
				else if (online) [seq, cpuSeq, cpu] = online;

				if (!seq || seq < node.seq) {
					// We have newer info or requester doesn't know it
					if (node.available) {
						const info = this.registry.getNodeInfo(node.id);
						response.online[node.id] = [info, node.cpuSeq || 0, node.cpu || 0];
					} else {
						response.offline[node.id] = node.seq;
					}

					return;
				}

				if (offline) {
					// Requester said it is OFFLINE

					if (!node.available) {
						// We also know it as offline

						// Update 'seq' if it is newer than us
						if (seq > node.seq) node.seq = seq;

						return;
					} else if (!node.local) {
						// 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;
					} else if (node.local) {
						// Requested said I'm offline. We should send back that we are online!
						// We need to increment the received `seq` so that the requester will update us
						node.seq = seq + 1;

						const info = this.registry.getLocalNodeInfo(true);
						response.online[node.id] = [info, node.cpuSeq || 0, node.cpu || 0];
					}
				} else if (online) {
					// Requester said it is ONLINE

					if (node.available) {
						if (cpuSeq > node.cpuSeq) {
							// We update CPU info
							node.heartbeat({
								cpu,
								cpuSeq
							});
						} else if (cpuSeq < node.cpuSeq) {
							// We have newer CPU value, send back
							response.online[node.id] = [node.cpuSeq || 0, node.cpu || 0];
						}
					} else {
						// We know it as offline. We do nothing, because we'll request it and we'll receive its INFO.
						return;
					}
				}
			});

			// Remove empty keys
			if (Object.keys(response.offline).length == 0) delete response.offline;

			if (Object.keys(response.online).length == 0) delete response.online;

			if (response.online || response.offline) {
				let sender = this.nodes.get(payload.sender);

				// Send back the Gossip response to the sender
				const rspPacket = new P.Packet(P.PACKET_GOSSIP_RES, sender.id, response);
				this.publish(rspPacket).catch(() => {});

				if (this.GOSSIP_DEBUG)
					this.logger.info(
						kleur
							.bgMagenta()
							.black(`----- RESPONSE ${this.nodeID} -> ${sender.id} -----`),
						rspPacket.payload
					);
			} else {
				if (this.GOSSIP_DEBUG)
					this.logger.info(
						kleur
							.bgBlue()
							.white(`----- EMPTY RESPONSE ${this.nodeID} -> ${payload.sender} -----`)
					);
			}
		} catch (err) {
			this.logger.warn("Invalid incoming GOSSIP_REQ packet.", err);
			this.logger.debug("Content:", msg.toString());
			// this.logger.debug("Response:", inspect(response, { depth: 10 }));
		}
	}
Process incoming Gossip Request packet

@param {Buffer} msg
@memberof TcpTransporter