/// <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());
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 5
0
 /// <inheritdoc />
 public void ChunkReceived(Command cmd, string streamId, string token, Metadata header)
 {
     CommonSubscriptionHandler.ForwardByTopic(cmd, cmd.Topic);
 }