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);
        }
예제 #2
0
        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);
        }