Фэй Рубин клиент не работает - PullRequest
4 голосов
/ 20 декабря 2011

Я использую faye в своем приложении Rails 2.1. И после тестирования и исправления многих вещей faye ruby client не работает.

Это мой код сервера.

require 'faye'

server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 45)


EM.run {
  thin = Rack::Handler.get('thin')
  thin.run(server, :Port => 9292)

  server.bind(:subscribe) do |client_id, channel|
    puts "[  SUBSCRIBE] #{client_id} -> #{channel}"
  end

  server.bind(:unsubscribe) do |client_id, channel|
    puts "[UNSUBSCRIBE] #{client_id} -> #{channel}"
  end

  server.bind(:disconnect) do |client_id|
    puts "[ DISCONNECT] #{client_id}"
  end
}

Это мой код JS на стороне клиента.

<script type="text/javascript">
    var client = new Faye.Client('http://localhost:9292/faye');
    client.subscribe("/faye/new_chats", function(data) {
        console.log(data);
    });
</script>

Это код клиента ruby.

EM.run do
      client = Faye::Client.new('http://localhost:9292/faye')
      publication = client.publish("/faye/new_chats", {
          "user" => "ruby-logger",
          "message" => "Got your message!"
      })
      publication.callback do
        puts "[PUBLISH SUCCEEDED]"
      end
      publication.errback do |error|
        puts "[PUBLISH FAILED] #{error.inspect}"
      end
    end

Сервер, JS работает нормально. Но код клиента Ruby не работает. Если я пишу это без EM , это показывает мне ошибку, что Event Machine not initialized. Если я напишу это в EM, это сработает, но повредит процессу ruby. Если я ставлю EM.stop в конце кода клиента, он выполняется, но не публикует сообщение.

Как я могу решить эту проблему?

Ответы [ 2 ]

11 голосов
/ 09 июля 2012

Вы были почти там ... Вам просто нужно было остановить цикл событий EM в ваших обратных вызовах, например:

EM.run do
  client = Faye::Client.new('http://localhost:9292/faye')
  publication = client.publish("/faye/new_chats", {
    "user" => "ruby-logger",
    "message" => "Got your message!"
  })
  publication.callback do
    puts "[PUBLISH SUCCEEDED]"
    EM.stop_event_loop
  end
  publication.errback do |error|
    puts "[PUBLISH FAILED] #{error.inspect}"
    EM.stop_event_loop
  end
end
3 голосов
/ 20 декабря 2011

Я наконец-то использовал HTTP, а не клиент Ruby Faye, как описано в эпизоде ​​Railscasts 260.

require 'net/http'
    message = {:channel => '/faye/new_chats', :data => self.text, :ext => {:auth_token => FAYE_TOKEN}}
    uri = URI.parse("http://localhost:9292/faye")
    Net::HTTP.post_form(uri, :message => message.to_json)

Это решает мою проблему.

ПРИМЕЧАНИЕ. Это решение работает только с HTTP, но не с HTTPS. Если кто-нибудь найдет решение для HTTPS, пожалуйста, сообщите мне.

...