2013-04-29 39 views
5

Używam private_pub do implementacji aplikacji typu "jeden do jednego".Ruby on Rails - Faye Framework - private_pub

Oto moja historia: jako użytkownik, chciałbym, aby otrzymać wiadomość gdy mój partner opuści czat - zamyka okno, itp

Patrząc przez Faye Monitoring docs tutaj jest moja próba wiążące unsubscribe:


# Run with: rackup private_pub.ru -s thin -E production 
require "bundler/setup" 
require "yaml" 
require "faye" 
require "private_pub" 
require "active_support/core_ext" 

Faye::WebSocket.load_adapter('thin') 

PrivatePub.load_config(File.expand_path("../config/private_pub.yml", __FILE__),  ENV["RAILS_ENV"] || "development") 

wts_pubsub = PrivatePub.faye_app 

wts_pubsub.bind(:subscribe) do |client_id, channel| 
puts "[#{Time.now}] Client #{client_id} joined #{channel}" 
end 

wts_pubsub.bind(:unsubscribe) do |client_id, channel| 
    puts "[#{Time.now}] Client #{client_id} disconnected from #{channel}" 
    PrivatePub.publish_to channel, { marius_says: 'quitter' } 
end 

run wts_pubsub 

ale wciąż otrzymuję limity czasu: [ERROR] [Faye::RackAdapter] Timeout::Error

Wpisując do PrivatePub#publish_to, dane zawierają to, czego oczekuję zarówno podczas publikowania z aplikacji Rails, jak i private_pub, ale aplikacja private_pub zawiesza się.

Jak można uzyskać publikowanie z private_pub do pracy?

+0

Ten wątek jest nieco stary; Czy wiesz, jaki jest problem? Spędzałem wiele godzin nad tym problemem bez większego powodzenia. – Etienne

Odpowiedz

0

Twoje drugie powiązanie powinno być wydarzenie disconnect zamiast unsubscribe.

Pamiętaj również, aby wywołać zdarzenie Faye/PrivatePub disconnect po stronie klienta po zamknięciu okna przeglądarki.

Uwaga: Być może trzeba to zrobić dla wszystkich otwartych sesji z serwerem Faye lub po prostu na kanale przez podstawę kanału opartego na chacie aplikacji wzornictwa

W zwykły JS to może być coś podobnego:

window.onbeforeunload = functionThatTriggersFayeDisconnectEvent; 

Przepraszamy za niewłaściwe stosowanie znaczników, publikowanie z urządzeń mobilnych.

+0

Zarówno zdarzenia 'disconnect' i' unsubscribe' są automatycznie wyzwalane podczas zamykania karty - tutaj jest [modified private_pub.rb] (https://gist.github.com/mariusbutuc/8cdd6d71e7595a2fb814#file-private_pub-rb) i [ jego wyjście] (https://gist.github.com/mariusbutuc/8cdd6d71e7595a2fb814#file-private_pub-out). Nie wydaje się, aby rozwiązać problem PO. –

0

Po godzinach badań i licznych prób, jest to rozwiązanie znalazłem:

Wymień PrivatePub.publish_to channel, { marius_says: 'quitter' } z:

system "curl http://localhost:9292/faye -d 'message={\"channel\":\"#{channel}\", \"data\":{\"channel\":\"#{channel}\",\"data\":{\"message\":{\"content\":\"#{client_id} disconnected from this channel.\"}}}, \"ext\":{\"private_pub_token\":\"ADD_APPROPRIATE_SECRET_HERE\"}}' &" 

To spowoduje asynchroniczne żądanie (curl + &), która ominie problemu . To nie najlepsza poprawka, ale działa.