public void ReadBlocking(MessagePipeCallback callback) { LinkedList <WebSocketRequestMessage> requests = Websocket.readRequests(); int amount = requests.Count; SignalServiceEnvelope[] envelopes = new SignalServiceEnvelope[amount]; WebSocketResponseMessage[] responses = new WebSocketResponseMessage[amount]; for (int i = 0; i < amount; i++) { WebSocketRequestMessage msg = requests.First.Value; requests.RemoveFirst(); if (isSignalServiceEnvelope(msg)) { envelopes[i] = new SignalServiceEnvelope(msg.Body.ToByteArray(), CredentialsProvider.GetSignalingKey()); } responses[i] = createWebSocketResponse(msg); } try { callback.onMessages(envelopes); } finally { foreach (WebSocketResponseMessage response in responses) { Websocket.SendResponse(response); } } }
private void Prepare_pipe_given_sockets_and_messages(MessagePipeCallback callback) { var messagePipeType = typeof(MessagePipe).FullName; var socketType = typeof(Socket).FullName; var messageType = typeof(Message).FullName; var addr = TestAddr; Section($"'{messagePipeType}' constructs properly given two " + $"'{socketType}' instances and '{messageType}' passed", () => { Message m1 = null; Message m2 = null; Socket s1 = null; Socket s2 = null; try { m1 = CreateMessage(); m2 = CreateMessage(); s1 = CreateOne <LatestPairSocket>(); s2 = CreateOne <LatestPairSocket>(); // Plant this seed for internal verification during subsequent steps. s2.Options.SetInt32(O.RecvBuf, ExpectedRecvBuf); // Some degree of cross-cutting concerns is unavoidable. s1.Listen(addr); s2.Dial(addr); m1.Body.Append(a_message_was_sent); s1.Send(m1); s2.TryReceive(m2); Assert.Equal(a_message_was_sent.ToBytes(), m2.Body.Get()); using (var p = CreateMessagePipe(m2)) { callback(s2, m2, p); } } finally { DisposeAll(s1, s2, m1, m2); } }); }