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.
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.) –