2013-04-29 9 views
5

Ich benutze private_pub, um eine Eins-zu-eins Chat-ähnliche Anwendung zu implementieren.Ruby on Rails - Faye Framework - private_pub

Hier ist meine Geschichte: als Benutzer, würde Ich mag eine Nachricht erhalten, wenn mein Partner den Chat verlässt - schließt das Fenster, usw.

der Faye Monitoring docs hier Blick durch ist mein Versuch, auf unsubscribe bei Bindung:


# 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 

aber ich erhalte immer Timeouts: [ERROR] [Faye::RackAdapter] Timeout::Error

Wenn ich in PrivatePub#publish_to stoße, halten Daten, was ich erwarte, sowohl wenn ich von der Rails- oder der private_pub-App veröffentliche, aber die private_pub-App bleibt hängen.

Wie kann ich Publishing von private_pub zur Arbeit bekommen?

+0

Dieser Thread ist etwas alt; Hast du herausgefunden, was das Problem ist? Ich habe Stunden mit diesem genauen Problem ohne viel Erfolg verbracht. – Etienne

Antwort

0

Ihre zweite Bindung sollte disconnect Ereignis statt unsubscribe sein.

Denken Sie auch daran, ein Faye/PrivatePub disconnect Ereignis in Ihrem Client-Seitencode auszulösen, wenn ein Browserfenster geschlossen wird.

Hinweis: Sie können dies mit dem Faye-Server für alle offene Sitzungen tun müssen, oder einfach nur auf einem Kanal von Basis-Kanal basierend auf Chat-Anwendung Design

Im Klar JS dies könnte so etwas wie sein:

window.onbeforeunload = functionThatTriggersFayeDisconnectEvent; 

Entschuldigung dafür, dass Sie kein korrektes Markup, Posting vom Handy verwenden.

+0

Die beiden Ereignisse "disconnect" und "unsubscribe" werden beim Schließen des Tabs automatisch ausgelöst - hier ist der [modified private_pub.rb] (https://gist.github.com/mariusbutuc/8cdd6d71e7595a2fb814#file-private_pub-rb) und [ seine Ausgabe] (https://gist.github.com/mariusbutuc/8cdd6d71e7595a2fb814#file-private_pub-out). Scheint das Problem des OP nicht zu lösen. –

0

Nach Stunden der Forschung und zahlreiche Versuche unternommen, das ist die Lösung, die ich gefunden:

ersetzen PrivatePub.publish_to channel, { marius_says: 'quitter' } mit:

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\"}}' &" 

Dies wird eine asynchrone Anforderung auslösen (curl + &), die das Problem umgehen wird . Nicht die beste Lösung, aber es funktioniert.