public void Send(ISession session, IMessage message) { if (message is IRequest request) { if (request.RequestId == 0) { request.RequestId = request.RequestId = session.GetNextRequestId(); } } var bufferWriter = new SpanBufferWriter(stackalloc byte[412]); if (message is IEncryptedMessage encryptedMessage) { if (session.EncryptionParameters is null) { if (message is not AcknowledgeMessage) { _logger.Warning( "Attempted to send an encrypted messsage before " + "any encryption parameters were established " + $"(EndPoint='{session.EndPoint}')." ); return; } bufferWriter.WriteBool(false); // IsEncrypted _messageWriter.WriteTo(ref bufferWriter, message, PacketProperty); } else { encryptedMessage.SequenceId = session.GetNextSequenceId(); bufferWriter.WriteBool(true); // IsEncrypted _encryptedMessageWriter.WriteTo( ref bufferWriter, encryptedMessage, session.EncryptionParameters.SendKey, session.EncryptionParameters.SendMac, PacketProperty ); } } else { bufferWriter.WriteBool(false); // IsEncrypted _messageWriter.WriteTo(ref bufferWriter, message, PacketProperty); } OnSent?.Invoke(session, bufferWriter.Data); }
private void SendInternal <T>(ISession session, T message) where T : class, IMessage { var buffer = new GrowingSpanBuffer(stackalloc byte[412]); if (session.State != SessionState.New && message is IEncryptedMessage encryptedMessage) { encryptedMessage.SequenceId = session.GetNextRequestId(); buffer.WriteBool(true); _encryptedMessageWriter.WriteTo(ref buffer, message, session.SendKey, session.SendMac); } else { buffer.WriteBool(false); _messageWriter.WriteTo(ref buffer, message); } _logger.Verbose( "Sending message " + $"(EndPoint='{session.EndPoint}', " + $"Data='{BitConverter.ToString(buffer.Data.ToArray())}')." ); session.MasterServer.SendAsync(session.EndPoint, buffer.Data); }