События HTML5, отправленные сервером, с Ruby Sinatra

Я новичок в Ruby и Sinatra, я пытаюсь настроить с ним простое событие, отправленное сервером HTML5. Приведенный ниже код отлично работает в сборках для разработчиков Chrome, но не работает в сборках без разработчиков и Safari как в Windows7, так и в OSX.

Сообщение об ошибке в консоли браузера: «Не удалось загрузить ресурс: отменено».

 var source = new EventSource('pull');
        source.addEventListener('message', function(e) {
            console.log(e.data);

        }, false);

        source.addEventListener('open', function(e) {
            // Conn open
        }, false);

        source.addEventListener('error', function(e) {
            if (e.eventPhase == EventSource.CLOSED) {
                // Connection was closed.
            }
        }, false);

С маршрутом Синатры ниже

get '/pull' do
   content_type 'text/event-stream'
   newevent   = false
   response = "data: "+newevent.inspect+" \n\n"
end

Я пробовал аналогичный код на стороне сервера с JSP и Tomcat, и он отлично работает во всех браузерах.

Что мне нужно знать о Синатре? Благодарность!


person user248257    schedule 08.03.2011    source источник
comment
Выяснилось, что я не устанавливал правильные заголовки ответа, похоже, Chrome Dev более расслаблен, когда дело доходит до заголовков. Заголовки ниже работали.. response.headers['Content-Type'] = 'text/event-stream' response.headers['Cache-Control'] = 'no-cache'   -  person user248257    schedule 09.03.2011
comment
Это вернет только одно значение и закроет соединение. В чем тогда преимущество перед AJAX?   -  person Konstantin Haase    schedule 30.06.2011


Ответы (1)


Если вы хотите поддерживать события, вам нужно создать собственный объект body< /а>. Взгляните на реализация и использование. Убедитесь, что вы запускаете его с помощью Thin или Rainbows. Это не будет работать на Mongrel или WEBrick.

Вы можете посмотреть презентацию на Confreaks (это исходный код на GitHub).

Обновление: вот еще один пример (простое приложение для чата с использованием Sinatra Streaming API).

person Konstantin Haase    schedule 30.06.2011
comment
Константин, а как бы вы удалили закрытые соединения из списка подписчиков? Chrome закрывает соединение EventSource через 60 секунд и открывает новое, так что список растет. Есть ли способ установить бесконечный тайм-аут для EventSource, аналогичный WebSocket? - person Andrei; 30.12.2011
comment
Константин ответил: Вы можете добавить callback/errback к объекту body. Вы можете отправлять нулевые байты или пустые сообщения, если ничего не произошло в течение 60 секунд (используйте для этого события тайм-аута EventMachine). - person Andrei; 30.12.2011
comment
См. Как написать хороший текст для ссылки, здесь нет хороший текст ссылки. - person Jonas; 31.12.2011
comment
Дополнительные ответы и комментарии о Sinatra с потоковой передачей событий и WebSockets - person Andrei; 31.12.2011