#ruby #sinatra #eventmachine
#ruby #sinatra #eventmachine
Вопрос:
Я пытаюсь использовать потоковый API Twitter с помощью Sinatra и предоставлять пользователям обновления в режиме реального времени при поиске ключевого слова.
require 'sinatra'
require 'eventmachine'
require 'em-http'
require 'json'
STREAMING_URL = 'https://stream.twitter.com/1/statuses/sample.json'
get '/' do
stream(:keep_open) do |out|
http = EM::HttpRequest.new(STREAMING_URL).get :head => { 'Authorization' => [ 'USERNAME', 'PASS' ] }
buffer = ""
http.stream do |chunk|
puts "still chugging"
buffer = chunk
while line = buffer.slice!(/. r?n/)
tweet = JSON.parse(line)
unless tweet.length == 0 or tweet['user'].nil?
out << "<p><b>#{tweet['user']['screen_name']}</b>: #{tweet['text']}</p>"
end
end
end
end
end
Я хочу, чтобы обработка потока em-http-запросов останавливалась, если пользователь закрывает соединение. Кто-нибудь знает, как это сделать?
Ответ №1:
Ответ Эрика был близок, но он закрывает тело ответа (не клиентское соединение, кстати) после закрытия вашего потока в Twitter, чего обычно никогда не происходит. Это должно сработать:
require 'sinatra/streaming' # gem install sinatra-contrib
# ...
get '/' do
stream(:keep_open) do |out|
# ...
out.callback { http.conn.close_connection }
out.errback { http.conn.close_connection }
end
end
Комментарии:
1. Я только что добавил поддержку нескольких обратных вызовов в Sinatra, поэтому в следующем выпуске Sinatra для этого примера sinatra-contrib больше не понадобится.
2. Этот обратный вызов работает, но em-http-request не отвечает на закрытие или отмену привязки (например, http.close). Есть идеи?
Ответ №2:
Я еще не совсем знаком с Sinatra stream API, но вы пробовали это?
http.callback { out.close }