Запуск / подписка на событие websocket-rails изнутри направляющей рельсов

У меня есть Rails-приложение с гемом websocket-rails.

Внутри моего приложения есть демон, с которым я запускаю rails runner MyDaemon.start

Я использую синхронизацию websocket-rails, поэтому мой config/initializers/websocket_rails.rb выглядит так:

WebsocketRails.setup do |config|
  config.log_internal_events = false
  config.standalone = false
  config.synchronize = true
end

внутри MyDaemon используя синхронизацию, я могу вызвать событие, которое достигнет моего WebsocketRails::BaseController и мой JavaScript WebSocketRails,

Я пытаюсь найти способ привязаться к событиям из моего MyDaemon,

Я пытался реализовать простой клиент WebSocket, используя как faye-websocket-ruby, так и https://github.com/shokai/websocket-client-simple, но, постучав некоторое время по клавиатуре, я понял, что существует какой-то процесс "рукопожатия", использующий connection_id от client_connected сообщение. В принципе, ни одно из решений, представленных в этом другом вопросе, не работает для меня.

Мне нужно понять, если внутри MyDaemon Я могу подписаться напрямую на некоторые WebsocketRails обратный вызов, даже внутри EventMachine, или как мне реализовать Websocket Client в самом Ruby.

Моя последняя попытка получить клиент ruby ​​может быть найдена в этом гисте, и это пример вывода:

ruby client.rb ws://localhost:3000/websocket
[:open, {"upgrade"=>"websocket", "connection"=>"Upgrade", "sec-websocket-accept"=>"zNTdGvxFKJeP+1PyGf27T4x2PGo="}]

JSON message is
[["client_connected", {"id"=>nil, "channel"=>nil, "user_id"=>nil, "data"=>{"connection_id"=>"4b7b91001befb160d17b"}, "success"=>nil, "result"=>nil, "token"=>nil, "server_token"=>nil}]]

client id is 4b7b91001befb160d17b
[:message, "[[\"client_connected\",{\"id\":null,\"channel\":null,\"user_id\":null,\"data\":{\"connection_id\":\"4b7b91001befb160d17b\"},\"success\":null,\"result\":null,\"token\":null,\"server_token\":null}]]"]

JSON message is
[["websocket_rails.ping", {"id"=>nil, "channel"=>nil, "user_id"=>nil, "data"=>{}, "success"=>nil, "result"=>nil, "token"=>nil, "server_token"=>nil}]]

Sending ["pong",{}]
[:message, "[[\"websocket_rails.ping\",{\"id\":null,\"channel\":null,\"user_id\":null,\"data\":{},\"success\":null,\"result\":null,\"token\":null,\"server_token\":null}]]"]
[:close, 1006, ""]

В то время как журнал websocket-rails является:

I [2015-06-27 02:08:45.250] [ConnectionManager] Connection opened: #<Connection::2b3dddaf3ec4ed5e3550>
I [2015-06-27 02:08:45.251] [Dispatcher] Started Event: client_connected
I [2015-06-27 02:08:45.251] [Dispatcher] Name: client_connected
I [2015-06-27 02:08:45.251] [Dispatcher] Data: {"connection_id"=>"2b3dddaf3ec4ed5e3550"}
I [2015-06-27 02:08:45.251] [Dispatcher] Connection: #<Connection::2b3dddaf3ec4ed5e3550>
I [2015-06-27 02:08:45.251] [Dispatcher] Event client_connected Finished in 0.000174623 seconds
I [2015-06-27 02:09:05.252] [ConnectionManager] Connection closed: #<Connection::2b3dddaf3ec4ed5e3550>
I [2015-06-27 02:09:05.252] [Dispatcher] Started Event: client_disconnected
I [2015-06-27 02:09:05.252] [Dispatcher] Name: client_disconnected
I [2015-06-27 02:09:05.252] [Dispatcher] Connection: #<Connection::2b3dddaf3ec4ed5e3550>
I [2015-06-27 02:09:05.253] [Dispatcher] Event client_disconnected Finished in 0.000236669 seconds

Вероятно, я скучаю по чему-то очень глупому, поэтому я здесь, чтобы попросить вас о помощи!

1 ответ

Вы можете использовать Йод в качестве клиента веб-сокета (я автор):

require 'iodine/http'
# prevents the Iodine's server from running
Iodine.protocol = :timer
# starts Iodine while the script is still running
Iodine.force_start!
options = {}
options[:on_open] = Proc.new {puts 'Connection Open'; write "Hello World!" }
options[:on_close] = Proc.new {puts 'Connection Closed'}
options[:on_message] = Proc.new {|data| puts "I got: #{data}" }

# connect to an echo server for demo. Use the blocking method:
websocket = Iodine::Http::WebsocketClient.connect "wss://echo.websocket.org/", options
websocket << "sending data"
sleep 0.5
websocket.close

В качестве примечания, читая вокруг, я заметил, что гем websocket-rails обновляется не так уж и много. Смотрите этот вопрос

В качестве альтернативы вы можете запускать веб-сокеты внутри вашего Rails-приложения с помощью инфраструктуры Plezi (я автор).

Довольно легко использовать обе платформы одновременно на одном сервере. Таким образом, вы можете использовать код своей модели Rails внутри контроллера Plezi Websocket.

Поскольку Plezi будет управлять веб-сокетами, а Rails, вероятно, отобразит страницу 404 Not Found, маршруты Plezi будут иметь приоритет... но до тех пор, пока ваши маршруты не переопределяют друг друга, у вас все в порядке.

Обратите внимание, что для того, чтобы оба приложения могли работать вместе, Plezi заставит вас использовать сервер Iodine в качестве сервера Rack. Чтобы избежать этого, вы можете использовать Placebo API и запустить Plezi в другом процессе.

Вы можете прочитать больше в файле README фреймворка.

Другие вопросы по тегам