예제 #1
0
        public async Task ChannelSubscribe()
        {
            var realtime = new AblyRealtime(new ClientOptions(PlaceholderKey)
            {
                AutoConnect = false
            });
            IRealtimeChannel channel = realtime.Channels.Get("test");

            // Or ...
            IRealtimeChannel channel2 = realtime.Channels.Get("shortcut");

            channel.Subscribe(message =>
            {
                var name = message.Name;
                var data = message.Data;
            });

            channel.On(args =>
            {
                var state = args.Current;    // Current channel State
                var error = args.Error;      // If the channel error-ed it will be reflected here
            });

            channel.On(ChannelEvent.Attached, args =>
            {
                // Do stuff when channel is attached
            });

            channel.Publish("greeting", "Hello World!");
            channel.Publish("greeting", "Hello World!", (success, error) =>
            {
                // If 'Publish' succeeded 'success' is 'true'
                // If 'Publish' failed 'success' is 'false' and 'error' will contain the specific error
            });

            var result = await channel.PublishAsync("greeting", "Hello World!");

            // You can check if the message failed
            if (result.IsFailure)
            {
                var error = result.Error;    // The error reason can be accessed as well
            }

            var secret           = Crypto.GenerateRandomKey();
            var encryptedChannel = realtime.Channels.Get("encrypted", new ChannelOptions(secret));

            encryptedChannel.Subscribe(message =>
            {
                var data = message.Data;    // Sensitive data (encrypted before published)
            });

            encryptedChannel.Publish("name (not encrypted)", "sensitive data (encrypted before published)");
        }
예제 #2
0
        public async Task TestAttachChannel_Sending3Messages_EchoesItBack(Protocol protocol)
        {
            Logger.LogLevel = LogLevel.Debug;
            ;
            // Arrange
            var client = await GetRealtimeClient(protocol);

            await client.WaitForState(ConnectionState.Connected);

            ManualResetEvent resetEvent = new ManualResetEvent(false);
            IRealtimeChannel target     = client.Channels.Get("test" + protocol);

            target.Attach();
            await target.WaitForState(ChannelState.Attached);

            ConcurrentQueue <Message> messagesReceived = new ConcurrentQueue <Message>();
            int count = 0;

            target.Subscribe(message =>
            {
                messagesReceived.Enqueue(message);
                count++;
                if (count == 3)
                {
                    resetEvent.Set();
                }
            });

            // Act
            target.Publish("test1", "test 12");
            target.Publish("test2", "test 123");
            target.Publish("test3", "test 321");

            bool result = resetEvent.WaitOne(8000);
            await Task.Delay(100);

            result.Should().BeTrue();

            // Assert
            messagesReceived.Count.ShouldBeEquivalentTo(3);
            var messages = messagesReceived.ToList();

            messages[0].Name.ShouldBeEquivalentTo("test1");
            messages[0].Data.ShouldBeEquivalentTo("test 12");
            messages[1].Name.ShouldBeEquivalentTo("test2");
            messages[1].Data.ShouldBeEquivalentTo("test 123");
            messages[2].Name.ShouldBeEquivalentTo("test3");
            messages[2].Data.ShouldBeEquivalentTo("test 321");
        }
예제 #3
0
        static async Task Main(string[] args)
        {
            AblyRealtime     ably           = new AblyRealtime("HG2KVw.AjZP_A:W7VXUG9yw1-Cza6u");
            IRealtimeChannel channel        = ably.Channels.Get("[?delta=vcdiff]delta-sample-app");
            VcdiffDecoder    channelDecoder = new VcdiffDecoder();

            channel.Subscribe(message =>
            {
                object data = message.Data;
                try
                {
                    if (VcdiffDecoder.IsDelta(data))
                    {
                        data = channelDecoder.ApplyDelta(data).AsObject();
                    }
                    else
                    {
                        channelDecoder.SetBase(data);
                    }
                }
                catch (Exception e)
                {
                    /* Delta decoder error */
                }

                /* Process decoded data */
                Console.WriteLine(JsonHelper.DeserializeObject <Data>(data as JObject));
            });
            ably.Connection.On(ConnectionEvent.Connected, change =>
            {
                Data data = new Data()
                {
                    foo    = "bar",
                    count  = 1,
                    status = "active"
                };
                channel.Publish("data", data);
                data.count++;
                channel.Publish("data", data);
                data.status = "inactive";
                channel.Publish("data", data);
            });

            await Task.Run(() =>
            {
                Console.ReadLine();
            });
        }
예제 #4
0
        public async Task SendingAMessageAttachesTheChannel_BeforeReceivingTheMessages(Protocol protocol)
        {
            Logger.LogLevel = LogLevel.Debug;
            ;
            // Arrange
            var client = await GetRealtimeClient(protocol);

            IRealtimeChannel target = client.Channels.Get("test");
            var messagesReceived    = new List <Message>();

            target.Subscribe(message =>
            {
                messagesReceived.Add(message);
                _resetEvent.Set();
            });

            // Act
            target.Publish("test", "test data");
            target.State.Should().Be(ChannelState.Attaching);
            _resetEvent.WaitOne(6000);

            // Assert
            target.State.Should().Be(ChannelState.Attached);
            messagesReceived.Count.ShouldBeEquivalentTo(1);
            messagesReceived[0].Name.ShouldBeEquivalentTo("test");
            messagesReceived[0].Data.ShouldBeEquivalentTo("test data");
        }
예제 #5
0
        public async Task TestAttachChannel_Sending3Messages_EchoesItBack(Protocol protocol)
        {
            // Arrange
            var client = await GetRealtimeClient(protocol);

            ManualResetEvent resetEvent = new ManualResetEvent(false);
            IRealtimeChannel target     = client.Channels.Get("test" + protocol);

            target.Attach();

            List <Message> messagesReceived = new List <Message>();
            int            count            = 0;

            target.Subscribe(message =>
            {
                messagesReceived.Add(message);
                count++;
                if (count == 3)
                {
                    resetEvent.Set();
                }
            });

            // Act
            target.Publish("test1", "test 12");
            target.Publish("test2", "test 123");
            target.Publish("test3", "test 321");

            bool result = resetEvent.WaitOne(8000);

            result.Should().BeTrue();

            // Assert
            messagesReceived.Count.ShouldBeEquivalentTo(3);
            messagesReceived[0].Name.ShouldBeEquivalentTo("test1");
            messagesReceived[0].Data.ShouldBeEquivalentTo("test 12");
            messagesReceived[1].Name.ShouldBeEquivalentTo("test2");
            messagesReceived[1].Data.ShouldBeEquivalentTo("test 123");
            messagesReceived[2].Name.ShouldBeEquivalentTo("test3");
            messagesReceived[2].Data.ShouldBeEquivalentTo("test 321");
        }
예제 #6
0
 public void Send(string message)
 {
     _channel.Publish(_publicAddress, message);
 }