/// <inheritdoc /> public override async Task <GrpcResponse> StreamDisconnected(string streamID) { await CommonSubscriptionHandler.UnregisterStream(streamID); CommonBaseHandler.Log(this.ToString(), string.Format("Client stream {0} disconnted.", streamID), LogLevel.Info); return(Ok()); }
/// <inheritdoc /> public override async Task <GrpcResponse> StreamConnected(IStream <Command> stream, string token, Metadata header) { if (await this.tokenObserver.IsValid(token) == null) { return(Unauthorized()); } CommonSubscriptionHandler.RegisterStream(stream, stream.Id); CommonBaseHandler.Log(this.ToString(), string.Format("Client stream {0} is connected.", stream.Id), LogLevel.Info); // Send service metadata informations to client after successful connect foreach (var metaData in serviceMetaData.Values) { Command cmd = new Command { Type = CommandType.Action, Topic = StaticCommandKeys.ServiceMetaData }; cmd.Data.Add(Any.Pack(metaData)); stream.AddToQueue(cmd); } return(Ok()); }
/// <summary> /// Starts the server. /// </summary> /// <param name="srcDeviceId">The source device identifier.</param> /// <param name="communicationService">The communication service.</param> private void StartServer(string srcDeviceId, IServer <Command, FetchRequest, GrpcResponse> communicationService) { // Grpc server CommunicationServer server = new CommunicationServer(communicationService, srcDeviceId); // Grpc server actions server.OnAction = async(cmd, streamId, token, header) => { return(await ActionWorker.ProcessCommand(srcDeviceId, cmd, streamId, token, header)); }; server.OnFetch = async(request, streamId, token, header) => { return(await FetchWorker.ProcessFetch(request, streamId, token, header)); }; server.OnStreamOpened = async(stream, token, header) => { return(await ActionWorker.StreamConnected(stream, token, header)); }; server.OnStreaming = async(cmd, stream, token, header) => { return(await ActionWorker.ProcessCommand(srcDeviceId, cmd, stream.Id, token, header)); }; server.OnClientDisconnected = async(id) => { await CommonSubscriptionHandler.UnregisterStream(id); }; server.OnLog += (sender, srcid, msg, level) => { CommonBaseHandler.Log(sender.ToString(), msg, level); }; server.Start(); }
/// <summary> /// Handles the command. /// </summary> /// <param name="cmd">The cmd<see cref="Command"/></param> /// <param name="streamId">The streamId<see cref="string"/></param> /// <param name="cloudId">The cloud identifier.</param> /// <returns>a task</returns> private async Task <GrpcResponse> HandleCommand(NetworkUser user, Command cmd, string streamId, string cloudId) { GrpcResponse result = Ok(); switch (cmd.Topic) { case StaticCommandKeys.Connect: user = cmd.Data.FirstOrDefault()?.CastToModel <NetworkUser>(); if (user == null) { throw new Exception("Invalid connection data."); } return(await this.tokenObserver.Authenticate(user.LoginName, user.PasswordHash)); case StaticCommandKeys.ServiceMetaData: ServiceMetaData metaData = cmd.Data.FirstOrDefault()?.CastToModel <ServiceMetaData>(); if (metaData == null) { throw new Exception("Invalid data for service meta data information."); } if (serviceMetaData.ContainsKey(metaData.ServiceAddress)) { ServiceMetaData s; while (!serviceMetaData.TryRemove(metaData.ServiceAddress, out s)) { await Task.Delay(1); } } while (!serviceMetaData.TryAdd(metaData.ServiceAddress, metaData)) { await Task.Delay(1); } Log("Added service metadata for service " + streamId, LogLevel.Debug); break; case StaticCommandKeys.Subscribe: try { SubscriptionMessage msg = cmd.Data.FirstOrDefault()?.CastToModel <SubscriptionMessage>(); if (msg == null) { throw new Exception("Invalid data for the subscription message."); } Log("Client subscribed to Topic: " + msg.Topic, LogLevel.Debug); CommonSubscriptionHandler.SubscribeToTopic(streamId, msg.Topic.ToString()); } catch (Exception ex) { return(BadRequest(ex)); } break; case StaticCommandKeys.Unsubscribe: try { SubscriptionMessage msg = cmd.Data.FirstOrDefault()?.CastToModel <SubscriptionMessage>(); if (msg == null) { throw new Exception("Invalid data for the subscription message."); } Log("Client unsubscribed from Topic: " + msg.Topic, LogLevel.Debug); CommonSubscriptionHandler.UnsubscribeFromTopic(streamId, msg.Topic.ToString()); } catch (Exception ex) { return(BadRequest(ex)); } break; default: string topic = cmd.Topic; if (!string.IsNullOrEmpty(cmd.TargetId)) { topic = topic + "/" + cmd.TargetId; } CommonSubscriptionHandler.ForwardByTopic(cmd, topic); break; } return(result); }
/// <inheritdoc /> public void ChunkReceived(Command cmd, string streamId, string token, Metadata header) { CommonSubscriptionHandler.ForwardByTopic(cmd, cmd.Topic); }