2015-04-01 4 views
1

J'essaie de créer des événements Server-Sent sur mon Ruby Grape API. Le problème est que la connexion semble être fermée très rapidement tout le temps, car je reçois Connection closed événement tout le temps sur la page Web de test.Evénements envoyés par le serveur avec Ruby Grape

Le client se connecte au serveur car je peux voir la méthode appelée, mais je voudrais savoir pourquoi la connexion n'est pas constante et pourquoi je ne reçois pas les données que j'envoie en utilisant le thread.

Voici mon code Ruby:

$connections = [] 

class EventsAPI < Sinantra::Base 

    def connections 
    $connections 
    end 

    get "/" do 
    content_type "text/event-stream" 
    stream(:keep_open) { |out| 
     puts "New connection" 
     out << "data: {}\n\n" 
     connections << out 
    } 
    end 

    post "/" do 
    data = "data\n\n" 
    connections.each { |out| out << data } 
    puts "sent\n" 
    end 

end 

Voici mon Javascript:

var source = new EventSource('http://localhost:9292/events'); 

    source.onmessage = function(e) { 
     console.log("New message: ", e.data); 
     showMessage(e.data); 
    }; 

    source.onopen = function(e) { 
     // Connection was opened. 
    }; 

    source.onerror = function(e) { 
     console.log("Source Error", e) 
     if (e.eventPhase == EventSource.CLOSED) { 
      console.log("Connection was closed"); 
      // Connection was closed. 
     } 
    }; 

    var showMessage = function(msg) { 
     var out = document.getElementById('stream'); 
     var d = document.createElement('div') 
     var b = document.createElement('strong') 
     var now = new Date; 
     b.innerHTML = msg; 
     d.innerHTML = now.getHours() + ":" + now.getMinutes() + ":" +now.getSeconds() + " "; 
     d.appendChild(b); 
     out.appendChild(d); 
    }; 

EDIT: Je l'ai travailler avec la méthode GET (j'ai changé le raisin :: API à Sinatra: : Base comme Grape n'implémente pas de flux). Je reçois maintenant des données, mais la connexion n'est pas conservée et lorsque j'utilise la méthode post, les données n'atteignent jamais le navigateur.

Merci d'avance pour vos réponses.

+0

Je viens de répondre, mais si vous suivez un exemple spécifique pour SSE dans l'API Grape, il serait utile de poster un lien vers cette documentation. (En particulier, je me demande exactement ce que ': keep_open' fait.) –

Répondre

0

Le code JS semble correct. Ma conjecture est que vous ne devriez pas commencer un nouveau fil pour votre boucle infinie. Ce qui va se passer, c'est que le thread principal continuera à s'exécuter, atteindra la fin de son bloc et fermera la requête http. Votre thread détaché est alors laissé à écrire dans un flux out inexistant. UPDATE en réponse à votre EDIT: Le POST n'est pas pris en charge dans SSE.

Les données ne peuvent être transmises à un processus SSE qu'à l'aide de données GET ou de cookies.

+0

J'ai supprimé la boucle et le fil juste pour m'assurer que j'obtiens les données. Cela fonctionne (voir ci-dessus), mais les connexions ne sont pas maintenues en vie. – Manny42

+0

Vous avez besoin de la boucle infinie: dès que votre processus se termine, la connexion SSE se ferme. –