Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you remove an actioncable channel subscription in Rails 5 with App.cable.subscriptions.remove?

To create subscriptions I run:

  App.room = App.cable.subscriptions.create({
    channel: "RoomChannel",
    roomId: roomId
  }, {
    connected: function() {},
    disconnected: function() {},
    received: function(data) {
      return $('#messages').append(data['message']);
    },
    speak: function(message, roomId) {
      return this.perform('speak', {
        message: message,
        roomId: roomId
      });
    }
  });

But because I want the client to never be subscribed to more than one channel, what can I run each time before this to remove all subscriptions the client has?

I tried to do something super hacky like:

App.cable.subscriptions['subscriptions'] = [App.cable.subscriptions['subscriptions'][1, 0]]

But I'm sure it didn't work because there are many other components that go into a subscription/unsubscription.

App.cable.subscriptions.remove requires a subscription argument, but what do I pass in?

Thanks!

like image 849
Laser Avatar asked May 01 '16 07:05

Laser


People also ask

How do you test an action cable?

Testing Action Cable To test this connection class, we can use connect method to simulate a client server connection and then test the state of connection is as expected. The connection object is available in the test.

What is actioncable in Rails?

1 What is Action Cable? Action Cable seamlessly integrates WebSockets with the rest of your Rails application. It allows for real-time features to be written in Ruby in the same style and form as the rest of your Rails application, while still being performant and scalable.

How do I cancel Actioncable?

you can unsubscribe by calling the unsubscribe() function on the channel returned by creating a new subscription.


3 Answers

A bit of a late answer, but considering you've already declared

App.room = App.cable.subscriptions.create(...)

to remove, something like

if (App.room) App.cable.subscriptions.remove(App.room);

should suffice.

like image 138
Matthew Ager Avatar answered Nov 04 '22 07:11

Matthew Ager


Running this before each subscription creation will ensure there is only ever a maximum of one subscription per client.

if (App.cable.subscriptions['subscriptions'].length > 1) {
    App.cable.subscriptions.remove(App.cable.subscriptions['subscriptions'][1])
};
like image 44
Laser Avatar answered Nov 04 '22 07:11

Laser


It looks like you would need to create a reference to your subscription on create

let mySubscription = App.cable.subscriptions.create({
  channel: "MyChannel"
},
{
  connected: () => { console.log('connected') },
  disconnected: () => {},
  received: (data) => {}
});

and then remove it like so

App.cable.subscriptions.remove(mySubscription)
like image 26
stowns Avatar answered Nov 04 '22 08:11

stowns