With ActionCable, is there a way to count how many subscribers from inside a channel?

房东的猫 提交于 2019-12-11 01:44:17

问题


For an app I'm building, I have a "lobby" page where people configure which area they'd like to join. Pretty basic.

I'd like to have a running total of active consumers that are currently subscribed to the channel for this page, so that users know whether or not there's other people around to interact with.

Is there an easy way to do this?


回答1:


I defined a helper method:

app/channels/application_cable/channel.rb

module ApplicationCable
  class Channel < ActionCable::Channel::Base

    def connections_info

        connections_array = []

        connection.server.connections.each do |conn|

            conn_hash = {}

            conn_hash[:current_user] = conn.current_user

            conn_hash[:subscriptions_identifiers] = conn.subscriptions.identifiers.map {|k| JSON.parse k}

            connections_array << conn_hash

        end

        connections_array

    end

  end
end

Now you can call connections_info anywhere inside your derived channel. The method returns an informational array of data about all the available server socket connections, their respective current_users and all their current subscriptions.

Here is an example of my data connections_info returns:

[1] pry(#<ChatChannel>)> connections_info
=> [{:current_user=>"D8pg2frw5db9PyHzE6Aj8LRf",
  :subscriptions_identifiers=>
   [{"channel"=>"ChatChannel",
     "secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"},
    {"channel"=>"AppearanceChannel"}]},
 {:current_user=>
   #<User id: 2, email: "client1@example.com", created_at: "2017-03-27 13:22:14", updated_at: "2017-04-28 11:13:37", provider: "email", uid: "client1@example.com", first_name: "John", active: nil, last_name: nil, middle_name: nil, email_public: nil, phone: nil, experience: nil, qualification: nil, price: nil, university: nil, faculty: nil, dob_issue: nil, work: nil, staff: nil, dob: nil, balance: nil, online: true>,
  :subscriptions_identifiers=>
   [{"channel"=>"ChatChannel",
     "secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"}]}]

You can then parse this structure the way you want and extract the desired data. You can distinguish your own connection in this list by the same current_user (the current_user method is available inside class Channel < ActionCable::Channel::Base).

If a user connects twice (or more times), then corresponding array elements just double.




回答2:


Yup there is one :

In your app/channel/what_so_ever_you_called_it.rb:

class WhatSoEverYouCalledItChannel < ApplicationCable::Channel
     def subscribed
       stream_from "your_streamer_thingy"
       @subscriber +=1 #<==== like this
     end

     def unsubscribed
       # Any cleanup needed when channel is unsubscribed 
       @subscriber -=1 #<===== like this
     end
     def send_message(data)
        your_message_mechanic
     end

Setup a variable increasing in subscribed and decreasing in unsubscribed.

You may want store the value in your 'lobby' model , in this case '@subscriber' may be called @lobby.connected_total, i dont know, make this fit your needs.

But this is a way to keep track of number of stream.

Njoy



来源:https://stackoverflow.com/questions/38542817/with-actioncable-is-there-a-way-to-count-how-many-subscribers-from-inside-a-cha

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!