private async Task HandleMessage(byte[] messageStart)
{
var stopwatch = Stopwatch.StartNew();
var magic = Bits.ToUInt32(messageStart);
if (magic != Messaging.Magic)
throw new Exception($"Unknown magic bytes {messageStart.ToHexNumberString()}");
var message = await WireDecodeMessage(magic);
OnMessage?.Invoke(owner, message);
stopwatch.Stop();
if (logger.IsTraceEnabled)
logger.Trace($"{socket.RemoteEndPoint,25} Received message {message.Command,12} in {stopwatch.ElapsedMilliseconds,6} ms");
}