public void SendToken(TPacket packet, OnTokenPacketCallback callback)
        {
            if (!TryAssignToken(packet, callback))
            {
                return;
            }
            var payload = PackageTokenPacket(packet);

            SendBuffer(payload, packet);
        }
 public void SendTokenAsync(TPacket packet, OnTokenPacketCallback callback)
 {
     if (!TryAssignToken(packet, callback))
     {
         return;
     }
     SendAsync(new SendPayload
     {
         buffer = PackageTokenPacket(packet),
         packet = packet
     });
 }
        /// <summary>
        /// Creates a token and stores the callback
        /// </summary>
        /// <param name="callback"></param>
        /// <returns></returns>
        private bool TryAssignToken(TPacket packet, OnTokenPacketCallback callback)
        {
            if (!(packet is ITokenPacket tokenPacket))
            {
                Log.Error($"{packet.GetType().Name} is not an ITokenPacket!");
                return(false);
            }

            int token = Interlocked.Increment(ref nextToken);

            tokenCallbacks[token] = callback;
            tokenPacket.Token     = token;
            return(true);
        }