2013-04-29 9 views
5

Sto usando private_pub per implementare un'applicazione chat-like one-to-one.Ruby on Rails - Faye Framework - private_pub

Qui è la mia storia: come utente, mi piacerebbe ricevere un messaggio quando il mio compagno lascia la chat - chiude la finestra, ecc

Guardando attraverso il Faye Monitoring docs qui è il mio tentativo di vincolante per 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 

ma io continuo a ricevere timeout: [ERROR] [Faye::RackAdapter] Timeout::Error

Con la tecnologia PrivatePub#publish_to, i dati contengono ciò che mi aspetto sia quando pubblico da Rails o dall'app private_pub, ma l'app private_pub continua a rimanere bloccata.

Come posso ottenere la pubblicazione da private_pub per funzionare?

+0

Questa discussione è piuttosto vecchia; hai capito qual è il problema? Ho passato ore su questo esatto problema senza molto successo. – Etienne

risposta

0

Il secondo incontro dovrebbe essere l'evento disconnect anziché unsubscribe.

Inoltre, ricordarsi di attivare un evento Faye/PrivatePub disconnect nel codice lato client quando viene chiusa una finestra del browser.

Nota: Potrebbe essere necessario fare questo per tutte le sessioni aperte con il server Faye o solo su un canale base del canale su disegno chat di applicazione

In pianura JS questo potrebbe essere qualcosa di simile:

window.onbeforeunload = functionThatTriggersFayeDisconnectEvent; 

Ci scusiamo per non aver utilizzato il markup corretto, la pubblicazione da cellulare.

+0

Entrambi gli eventi 'disconnect' e' unsubscribe' vengono automaticamente attivati ​​quando si chiude la scheda - qui è [modificato private_pub.rb] (https://gist.github.com/mariusbutuc/8cdd6d71e7595a2fb814#file-private_pub-rb) e [ il suo output] (https://gist.github.com/mariusbutuc/8cdd6d71e7595a2fb814#file-private_pub-out). Non sembra risolvere il problema dell'OP. –

0

Dopo ore di ricerca e numerosi tentativi, questa è la soluzione che ho trovato:

Sostituire PrivatePub.publish_to channel, { marius_says: 'quitter' } con:

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

questo innescherà una richiesta asincrona (ricciolo + &), che consentirà di bypassare il problema . Non è la soluzione migliore, ma funziona.