与美洲狮和tubeock的活动websocket连接列表

时间:2015-10-12 16:22:34

标签: ruby-on-rails ruby websocket puma

我使用Puma和Tubesock作为websocket消息,并希望访问处理发送消息的库文件中的连接websockets列表。我要做的是检查用户是否通过websocket连接,如果没有通过推送通知发送消息。

用户使用包含其用户ID的路​​径连接到websocket:

# config/routes.rb
Rails.application.routes.draw do
  get 'ws/:user_id', to: 'socket#ws', as: :socket
end

并在控制器内使用Tubesock

class SocketController < ApplicationController
  include Tubesock::Hijack

  def ws
    hijack do |tubesock|
      @wsTube = tubesock

      tubesock.onopen do
        socket_user = User.find_by_user_id(params[:user_id])
        # setup to send/receive messages through /lib/notification.rb
      end

      tubesock.onclose do
        # cleanup when connection closes
      end
    end
  end
end

我考虑过在数据库中向用户添加一个属性,但是我担心如果连接突然结束,比如在重新启动期间,那么该属性会说是连接的,如果事实并非如此。理想情况下,我想检查活动连接,而不是在打开和关闭期间切换属性。

1 个答案:

答案 0 :(得分:0)

考虑到您的问题,而不是问题的标题,在我看来,您应该只将邮件标记为&#39; read&#39;如果Tubesock#send_data返回真实值。

阅读源代码似乎Tubesock#send_data如果成功则返回一个数字,如果失败则返回nil(如果websocket有onclose回调,请注意它可能返回一个未确定的值)。

至于在数据库中存储Tubesock套接字,这根本不可能,因为Tubesock包含一个套接字对象,它是一个打开的文件描述符,不能以持久的方式存储到数据库中。

您应该将数据存储在本地内存中,例如Hash。

如果Tubesock要支持连接的UUID,这将是一个不同的故事,它也可以让你从一个进程扩展并使用Redis ...但是快速浏览一下(我&#39; m不是Tubesock用户),这似乎并非如此。