我使用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
我考虑过在数据库中向用户添加一个属性,但是我担心如果连接突然结束,比如在重新启动期间,那么该属性会说是连接的,如果事实并非如此。理想情况下,我想检查活动连接,而不是在打开和关闭期间切换属性。
答案 0 :(得分:0)
考虑到您的问题,而不是问题的标题,在我看来,您应该只将邮件标记为&#39; read&#39;如果Tubesock#send_data返回真实值。
阅读源代码似乎Tubesock#send_data如果成功则返回一个数字,如果失败则返回nil
(如果websocket有onclose回调,请注意它可能返回一个未确定的值)。
至于在数据库中存储Tubesock套接字,这根本不可能,因为Tubesock包含一个套接字对象,它是一个打开的文件描述符,不能以持久的方式存储到数据库中。
您应该将数据存储在本地内存中,例如Hash。
如果Tubesock要支持连接的UUID,这将是一个不同的故事,它也可以让你从一个进程扩展并使用Redis ...但是快速浏览一下(我&#39; m不是Tubesock用户),这似乎并非如此。