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);
                }
            }
        }
예제 #2
0
        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);
                }
            });
        }