Inheritance: IHostProxy, IStandInStub
        public void Receive_from_host()
        {
            var cre = PubnubCredentials.LoadFrom("pubnub credentials.txt");

            using (var sut = new PubnubStandInTransceiver(cre, "hostchannel"))
            {
                var are = new AutoResetEvent(false);
                HostOutput result = null;
                sut.ReceivedFromHost += _ =>
                                            {
                                                result = _;
                                                are.Set();
                                            };

                var sender = new Pubnub(cre.PublishingKey, cre.SubscriptionKey);
                var ho = new HostOutput {CorrelationId = Guid.NewGuid(), Data = "hello".Serialize(), Portname = "portname"};
                sender.publish(sut.StandInEndpointAddress, ho.Serialize(), _ => { });

                Assert.IsTrue(are.WaitOne(5000));

                Assert.AreEqual(ho.CorrelationId, result.CorrelationId);
                Assert.AreEqual(ho.Data, result.Data);
                Assert.AreEqual(ho.Portname, result.Portname);
            }
        }
        public void Send_to_host()
        {
            var cre = PubnubCredentials.LoadFrom("pubnub credentials.txt");

            var host = new Pubnub(cre.PublishingKey, cre.SubscriptionKey);
            try
            {
                var are = new AutoResetEvent(false);
                ReadOnlyCollection<object> result = null;
                host.subscribe("hostchannel", (ReadOnlyCollection<object> _) =>
                {
                    result = _;
                    are.Set();
                });

                using (var sut = new PubnubStandInTransceiver(cre, "hostchannel"))
                {
                    var hi = new HostInput
                                 {
                                     CorrelationId = Guid.NewGuid(),
                                     Data = "hello".Serialize(),
                                     Portname = "portname",
                                     StandInEndpointAddress = "endpoint"
                                 };
                    sut.SendToHost(hi);

                    Assert.IsTrue(are.WaitOne(5000));

                    var hiReceived = Convert.FromBase64String((string) ((JValue) result[0]).Value).Deserialize() as HostInput;
                    Assert.AreEqual(hi.CorrelationId, hiReceived.CorrelationId);
                    Assert.AreEqual(hi.Data, hiReceived.Data);
                    Assert.AreEqual(hi.Portname, hiReceived.Portname);
                    Assert.AreEqual(hi.StandInEndpointAddress, hiReceived.StandInEndpointAddress);
                }
            }
            finally
            {
                host.unsubscribe("hostchannel", _ => {});
            }
        }
 public PubnubStandInOperation(string name, PubnubCredentials credentials, string hostChannel)
     : base(name)
 {
     var transceiver = new PubnubStandInTransceiver(credentials, hostChannel);
     _standInOperation = new StandInOperation(name, transceiver, transceiver);
 }