using System; using System.Threading.Tasks; using System.Collections.Generic; using System.Linq; using Aurora.Services; using Aurora.Proto.Events; using Aurora.Proto.General; namespace Aurora.RemoteImpl { public class RemoteEventServiceImpl : RemoteEventService.RemoteEventServiceBase { public RemoteEventServiceImpl() { } /// /// RPC for getting event stream for a particular client. /// /// Empty /// The response stream /// gRPC client context /// public async override Task GetEvents(Empty request, Grpc.Core.IServerStreamWriter responseStream, Grpc.Core.ServerCallContext context) { while (EventManager.Instance.GetSubscriptionCount(context.Peer) > 0) { List events = EventManager.Instance.GetSessionEvents(context.Peer); foreach (BaseEvent currentEvent in events) { await responseStream.WriteAsync(currentEvent); } } } /// /// RPC for subscribing to remote events /// /// SubscribeRequest /// gRPC client context /// public override Task SubscribeToEvents(SubscribeRequest request, Grpc.Core.ServerCallContext context) { EventManager.Instance.AddSubscriptionList(context.Peer, request.EventTypes.ToList()); return Task.FromResult(new SubscriptionResponse { Successful = true }); } /// /// RPC for unsubscibing from events /// /// UnsubscribeRequest /// gRPC client context /// public override Task UnsubscribeFromEvents(UnsubscribeRequest request, Grpc.Core.ServerCallContext context) { EventType[] eventTypes = null; request.EventTypes.CopyTo(eventTypes, 0); EventManager.Instance.RemoveSubscriptionList(context.Peer, eventTypes.ToList()); return Task.FromResult(new SubscriptionResponse { Successful = true }); } /// /// RPC for unsubscribing from all events /// /// UnsubscribeAllRequest /// gRPC client context /// public override Task UnsubscribeFromAll(UnsubscribeAllRequest request, Grpc.Core.ServerCallContext context) { EventManager.Instance.RemoveAllSubscriptions(context.Peer); return Task.FromResult(new SubscriptionResponse { Successful = true }); } } }