/// <summary> /// Processes the client message which has single receiver (message by unique id) /// </summary> private async Task ProcessSingleReceiverClientMessage(MqClient client, TmqMessage message) { //find the receiver MqClient other = _server.FindClient(message.Target); if (other == null) { await client.SendAsync(MessageBuilder.ResponseStatus(message, KnownContentTypes.NotFound)); return; } //check sending message authority if (_server.Authorization != null) { bool grant = await _server.Authorization.CanMessageToPeer(client, message, other); if (!grant) { await client.SendAsync(MessageBuilder.ResponseStatus(message, KnownContentTypes.Unauthorized)); return; } } //send the message await other.SendAsync(message); }
public async Task Handle(MqClient client, TmqMessage message) { //priority has no role in ack message. //we are using priority for helping receiver type recognization for better performance if (message.HighPriority) { //target should be client MqClient target = _server.FindClient(message.Target); if (target != null) { await target.SendAsync(message); return; } } //find channel and queue Channel channel = _server.FindChannel(message.Target); if (channel == null) { //if high prio, dont try to find client again if (!message.HighPriority) { //target should be client MqClient target = _server.FindClient(message.Target); if (target != null) { await target.SendAsync(message); } } return; } ChannelQueue queue = channel.FindQueue(message.ContentType); if (queue == null) { return; } await queue.AcknowledgeDelivered(client, message); }
public async Task Handle(MqClient sender, TmqMessage message) { //server does not care response messages //if receiver could be found, message is sent to it's receiver //if receiver isn't available, response will be thrown MqClient receiver = _server.FindClient(message.Target); if (receiver != null) { await receiver.SendAsync(message); } }
/// <summary> /// Called when a new client is connected via TMQ protocol /// </summary> public async Task <TmqServerSocket> Connected(ITwinoServer server, IConnectionInfo connection, ConnectionData data) { string clientId; bool found = data.Properties.TryGetValue(TmqHeaders.CLIENT_ID, out clientId); if (!found || string.IsNullOrEmpty(clientId)) { clientId = _server.ClientIdGenerator.Create(); } //if another client with same unique id is online, do not accept new client MqClient foundClient = _server.FindClient(clientId); if (foundClient != null) { await connection.Socket.SendAsync(await _writer.Create(MessageBuilder.Busy())); return(null); } //creates new mq client object MqClient client = new MqClient(_server, connection, _server.MessageIdGenerator, _server.Options.UseMessageId); client.Data = data; client.UniqueId = clientId.Trim(); client.Token = data.Properties.GetStringValue(TmqHeaders.CLIENT_TOKEN); client.Name = data.Properties.GetStringValue(TmqHeaders.CLIENT_NAME); client.Type = data.Properties.GetStringValue(TmqHeaders.CLIENT_TYPE); //connecting client is a MQ server string serverValue = data.Properties.GetStringValue(TmqHeaders.TWINO_MQ_SERVER); if (!string.IsNullOrEmpty(serverValue) && (serverValue.Equals("1") || serverValue.Equals("true", StringComparison.InvariantCultureIgnoreCase))) { if (_server.ServerAuthenticator == null) { return(null); } bool accepted = await _server.ServerAuthenticator.Authenticate(_server, client); if (!accepted) { return(null); } client.IsInstanceServer = true; _server.SlaveInstances.Add(new SlaveInstance { ConnectedDate = DateTime.UtcNow, Client = client, RemoteHost = client.Info.Client.Client.RemoteEndPoint.ToString().Split(':')[0] }); await client.SendAsync(MessageBuilder.Accepted(client.UniqueId)); } //connecting client is a producer/consumer client else { //authenticates client if (_server.Authenticator != null) { client.IsAuthenticated = await _server.Authenticator.Authenticate(_server, client); if (!client.IsAuthenticated) { await client.SendAsync(MessageBuilder.Unauthorized()); return(null); } } //client authenticated, add it into the connected clients list _server.AddClient(client); //send response message to the client, client should check unique id, //if client's unique id isn't permitted, server will create new id for client and send it as response await client.SendAsync(MessageBuilder.Accepted(client.UniqueId)); if (_server.ClientHandler != null) { await _server.ClientHandler.Connected(_server, client); } } return(client); }
/// <summary> /// Called when a new client is connected via TMQ protocol /// </summary> public async Task <TmqServerSocket> Connected(ITwinoServer server, IConnectionInfo connection, ConnectionData data) { string clientId; bool found = data.Properties.TryGetValue(TmqHeaders.CLIENT_ID, out clientId); if (!found || string.IsNullOrEmpty(clientId)) { clientId = _server.ClientIdGenerator.Create(); } //if another client with same unique id is online, do not accept new client MqClient foundClient = _server.FindClient(clientId); if (foundClient != null) { await connection.Socket.SendAsync(await _writer.Create(MessageBuilder.Busy())); return(null); } if (_server.Options.ClientLimit > 0 && _server.GetOnlineClients() >= _server.Options.ClientLimit) { return(null); } //creates new mq client object MqClient client = new MqClient(_server, connection, _server.MessageIdGenerator, _server.Options.UseMessageId); client.Data = data; client.UniqueId = clientId.Trim(); client.Token = data.Properties.GetStringValue(TmqHeaders.CLIENT_TOKEN); client.Name = data.Properties.GetStringValue(TmqHeaders.CLIENT_NAME); client.Type = data.Properties.GetStringValue(TmqHeaders.CLIENT_TYPE); //authenticates client if (_server.Authenticator != null) { client.IsAuthenticated = await _server.Authenticator.Authenticate(_server, client); if (!client.IsAuthenticated) { await client.SendAsync(MessageBuilder.Unauthorized()); return(null); } } //client authenticated, add it into the connected clients list _server.AddClient(client); //send response message to the client, client should check unique id, //if client's unique id isn't permitted, server will create new id for client and send it as response await client.SendAsync(MessageBuilder.Accepted(client.UniqueId)); if (_server.ClientHandler != null) { await _server.ClientHandler.Connected(_server, client); } return(client); }