public static Schema.KRPC.StreamUpdate ToProtobufMessage(this StreamUpdate streamUpdate) { var result = new Schema.KRPC.StreamUpdate(); result.Results.Add(streamUpdate.Results.Select(ToProtobufMessage)); return(result); }
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); } } } }
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(); } }
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); } }
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(); }
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 }); } }
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)); } }
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 }); } }