示例#1
0
        public static Schema.KRPC.StreamUpdate ToProtobufMessage(this StreamUpdate streamUpdate)
        {
            var result = new Schema.KRPC.StreamUpdate();

            result.Results.Add(streamUpdate.Results.Select(ToProtobufMessage));
            return(result);
        }
示例#2
0
     public override async Task CallStream(Empty request, IServerStreamWriter <StreamUpdate> responseStream, ServerCallContext context)
     {
         for (var i = 0; i < 100; i++)
         {
             StreamUpdate st = new StreamUpdate();
             if (i % 2 == 0)
             {
                 st.Pulse = new HeartBeat {
                     Tick = new Timestamp()
                 }
             }
             ;
             else
             {
                 st.Price = new Price {
                     Symbol = "VOD LN", RefPrice = 10
                 }
             };
             if (!context.CancellationToken.IsCancellationRequested)
             {
                 await responseStream.WriteAsync(st);
             }
         }
     }
 }
示例#3
0
        public void SetUp()
        {
            // Create a response object and get the binary representation of it
            var streamUpdate = new StreamUpdate();

            var result1 = new ProcedureResult();

            result1.Error = new Error("Foo", string.Empty);

            var streamResult1 = new StreamResult();

            streamResult1.Id     = 1263;
            streamResult1.Result = result1;

            var result2 = new ProcedureResult();

            result2.Error = new Error("Bar", string.Empty);

            var streamResult2 = new StreamResult();

            streamResult2.Id     = 3443;
            streamResult2.Result = result2;

            streamUpdate.Results.Add(streamResult1);
            streamUpdate.Results.Add(streamResult2);

            expectedUpdate = streamUpdate;
            using (var stream = new MemoryStream()) {
                expectedUpdate.ToProtobufMessage().WriteDelimitedTo(stream);
                updateBytes = stream.ToArray();
            }
        }
示例#4
0
 public override void Write(StreamUpdate value)
 {
     using (var bufferStream = new MemoryStream()) {
         value.ToProtobufMessage().WriteTo(bufferStream);
         bufferStream.Flush();
         var payload = bufferStream.ToArray();
         var frame   = new Frame(OpCode.Binary, payload);
         Stream.Write(frame.Header.ToBytes());
         Stream.Write(frame.Payload);
     }
 }
示例#5
0
        void StreamServerUpdate()
        {
            streamTimer.Reset();
            streamTimer.Start();
            uint rpcsExecuted = 0;

            // Update stream servers
            for (int i = 0; i < Servers.Count; i++)
            {
                Servers [i].StreamServer.Update();
            }

            if (removeStreams.Any())
            {
                foreach (var entry in removeStreams)
                {
                    Logger.WriteLine("Removing stream " + entry.Item2, Logger.Severity.Debug);
                    RemoveStreamInternal(entry.Item1, entry.Item2);
                }
                removeStreams.Clear();
            }

            // Run stream continuations
            if (streams.Count > 0)
            {
                foreach (var entry in streams)
                {
                    var streamClient        = entry.Key;
                    var streamClientAddress = streamClient.Address;
                    var id            = streamClient.Guid;
                    var clientStreams = entry.Value.Values;
                    if (clientStreams.Count == 0)
                    {
                        continue;
                    }
                    if (!rpcClients.ContainsKey(id))
                    {
                        continue;
                    }
                    CallContext.Set(rpcClients [id]);
                    // Update streams
                    bool changed = false;
                    foreach (var stream in clientStreams)
                    {
                        if (stream.Started)
                        {
                            stream.Update();
                            changed |= stream.Changed;
                        }
                    }
                    // If anything changed, produce an update
                    if (changed)
                    {
                        var streamUpdate = new StreamUpdate();
                        foreach (var stream in clientStreams)
                        {
                            if (stream.Changed)
                            {
                                var result = stream.StreamResult;
                                streamUpdate.Results.Add(result);
                                if (result.Result.HasError)
                                {
                                    removeStreams.Add(Utils.Tuple.Create(streamClient, stream.Id));
                                }
                            }
                        }
                        try {
                            streamClient.Stream.Write(streamUpdate);
                        } catch (ServerException exn) {
                            Logger.WriteLine("Failed to send stream update to client " + streamClientAddress + Environment.NewLine + exn, Logger.Severity.Error);
                        }
                        Logger.WriteLine("Sent stream update to client " + streamClientAddress, Logger.Severity.Debug);
                        foreach (var stream in clientStreams)
                        {
                            if (stream.Changed)
                            {
                                stream.Sent();
                            }
                        }
                    }
                }
                CallContext.Clear();
                if (removeStreams.Any())
                {
                    foreach (var entry in removeStreams)
                    {
                        Logger.WriteLine("Removing stream as it returned an error", Logger.Severity.Debug);
                        RemoveStreamInternal(entry.Item1, entry.Item2);
                    }
                    removeStreams.Clear();
                }
            }

            streamTimer.Stop();
            StreamRPCsExecuted += rpcsExecuted;
            TimePerStreamUpdate = (float)streamTimer.ElapsedSeconds();
        }
示例#6
0
        private async void Client_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            using (DataReader reader = args.GetDataReader())
                try
                {
                    string str = reader.ReadString(reader.UnconsumedBufferLength).Trim('\0');
                    if (!string.IsNullOrEmpty(str))
                    {
                        JObject json = JObject.Parse(str);
                        switch (json["event"].ToString())
                        {
                        case "auth":
                            if ((bool)json["needsAuth"])
                            {
                                string login = string.Format("{{\"username\":\"{0}\",\"password\":\"{1}\"}}", AuthenticationCredentials.UserName.Replace("\"", "\\\""), AuthenticationCredentials.Password.Replace("\"", "\\\""));
                                clientWriter.WriteString(login);
                                await clientWriter.FlushAsync();
                            }
                            break;

                        case "update":
                            EventType  eventType  = (EventType)Enum.Parse(typeof(EventType), json["eventType"].ToString());
                            ObjectType objectType = (ObjectType)Enum.Parse(typeof(ObjectType), json["objectType"].ToString());
                            IIdObject  obj        = JsonToObject(objectType, (JObject)json["obj"]);
                            switch (eventType)
                            {
                            case EventType.Add:
                                switch (objectType)
                                {
                                case ObjectType.Recipient:
                                    recipients.Add(obj.Id, obj as Recipient);
                                    break;

                                case ObjectType.Conversation:
                                    conversations.Add(obj.Id, obj as Conversation);
                                    break;

                                case ObjectType.Message:
                                    messages.Add(obj.Id, obj as Message);
                                    break;

                                case ObjectType.Attachment:
                                    attachments.Add(obj.Id, obj as Attachment);
                                    break;
                                }
                                break;

                            case EventType.Update:
                                switch (objectType)
                                {
                                case ObjectType.Recipient:
                                    UpdateObject(recipients[obj.Id], obj);
                                    break;

                                case ObjectType.Conversation:
                                    UpdateObject(conversations[obj.Id], obj);
                                    break;

                                case ObjectType.Message:
                                    UpdateObject(messages[obj.Id], obj);
                                    break;

                                case ObjectType.Attachment:
                                    UpdateObject(attachments[obj.Id], obj);
                                    break;
                                }
                                break;

                            case EventType.Remove:
                                switch (objectType)
                                {
                                case ObjectType.Recipient:
                                    recipients.Remove(obj.Id);
                                    break;

                                case ObjectType.Conversation:
                                    conversations.Remove(obj.Id);
                                    break;

                                case ObjectType.Message:
                                    messages.Remove(obj.Id);
                                    break;

                                case ObjectType.Attachment:
                                    attachments.Remove(obj.Id);
                                    break;
                                }
                                break;
                            }
                            StreamUpdate?.Invoke(this, new StreamUpdateEventArgs()
                            {
                                ObjectType = objectType,
                                EventType  = eventType,
                                Object     = obj
                            });
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    StopStream();
                    StreamUpdate?.Invoke(this, new StreamUpdateEventArgs()
                    {
                        Error = ex
                    });
                }
        }
示例#7
0
 public override void Write(StreamUpdate value)
 {
     codedOutputStream.WriteMessage(value.ToProtobufMessage());
     codedOutputStream.Flush();
 }
 private void SaveUpdate(StreamUpdate update)
 {
     walWriter.Write((uint) update.UpdateType);
     walWriter.Write(update.Value);
     if (update.Data != null)
     {
         walWriter.Write(update.Data, 0, update.Data.Length);
     }
 }
 private void ApplyUpdate(StreamUpdate update)
 {
     if (update.UpdateType == StreamUpdateType.Write)
     {
         mainStream.Position = update.Value;
         mainStream.Write(update.Data, 0, update.Data.Length);
     }
     else if (update.UpdateType == StreamUpdateType.SetLength)
     {
         mainStream.SetLength(update.Value);
     }
     else if (update.UpdateType == StreamUpdateType.Commit)
     {
         // nothing to do, we are commiting changes already
     }
     else
     {
         throw new Exception(string.Format("Unexpected StreamUpdateType: {0}", update.UpdateType));
     }
 }
示例#10
0
        async void StreamClientThread()
        {
            try
            {
                while (running)
                {
                    var buffer  = new byte[1024];
                    var segment = new ArraySegment <byte>(buffer);
                    var result  = await client.ReceiveAsync(segment, cancelToken.Token);

                    string str = Encoding.UTF8.GetString(buffer).Trim('\0');
                    if (!string.IsNullOrEmpty(str))
                    {
                        JObject json = JObject.Parse(str);
                        switch (json["event"].ToString())
                        {
                        case "auth":
                            if ((bool)json["needsAuth"])
                            {
                                string login = string.Format("{{\"username\":\"{0}\",\"password\":\"{1}\"}}", AuthenticationCredentials.UserName.Replace("\"", "\\\""), AuthenticationCredentials.Password.Replace("\"", "\\\""));
                                await client.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(login)), WebSocketMessageType.Text, true, cancelToken.Token);
                            }
                            break;

                        case "update":
                            EventType  eventType  = (EventType)Enum.Parse(typeof(EventType), json["eventType"].ToString());
                            ObjectType objectType = (ObjectType)Enum.Parse(typeof(ObjectType), json["objectType"].ToString());
                            IIdObject  obj        = JsonToObject(objectType, (JObject)json["obj"]);
                            switch (eventType)
                            {
                            case EventType.Add:
                                switch (objectType)
                                {
                                case ObjectType.Recipient:
                                    recipients.Add(obj.Id, obj as Recipient);
                                    break;

                                case ObjectType.Conversation:
                                    conversations.Add(obj.Id, obj as Conversation);
                                    break;

                                case ObjectType.Message:
                                    messages.Add(obj.Id, obj as Message);
                                    break;

                                case ObjectType.Attachment:
                                    attachments.Add(obj.Id, obj as Attachment);
                                    break;
                                }
                                break;

                            case EventType.Update:
                                switch (objectType)
                                {
                                case ObjectType.Recipient:
                                    UpdateObject(recipients[obj.Id], obj);
                                    break;

                                case ObjectType.Conversation:
                                    UpdateObject(conversations[obj.Id], obj);
                                    break;

                                case ObjectType.Message:
                                    UpdateObject(messages[obj.Id], obj);
                                    break;

                                case ObjectType.Attachment:
                                    UpdateObject(attachments[obj.Id], obj);
                                    break;
                                }
                                break;

                            case EventType.Remove:
                                switch (objectType)
                                {
                                case ObjectType.Recipient:
                                    recipients.Remove(obj.Id);
                                    break;

                                case ObjectType.Conversation:
                                    conversations.Remove(obj.Id);
                                    break;

                                case ObjectType.Message:
                                    messages.Remove(obj.Id);
                                    break;

                                case ObjectType.Attachment:
                                    attachments.Remove(obj.Id);
                                    break;
                                }
                                break;
                            }
                            StreamUpdate?.Invoke(this, new StreamUpdateEventArgs()
                            {
                                ObjectType = objectType,
                                EventType  = eventType,
                                Object     = obj
                            });
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                StopStream();
                StreamUpdate?.Invoke(this, new StreamUpdateEventArgs()
                {
                    Error = ex
                });
            }
        }