Streaming y Valores de Retorno

El valor de retorno del bloque de una ruta determina el cuerpo de respuesta pasado al cliente HTTP, o al menos al siguiente middleware en la pila de Rack. Lo habitual es que sea una String pero puede ser otra cosa.

De hecho, podemos retornar cualquier tipo de objeto que sea una respuesta Rack válida, un objeto que disponga de un each o un código de estatus HTTP:

Así podemos, implementar el siguiente ejemplo que funciona en streaming cuando se usa con puma:

[~/sinatra/sinatra-streaming/intro-streaming(master)]$ cat stream.rb 
require 'sinatra'

before do
  content_type :txt
end

class Flujo
  def each
    5.times do |i| 
      yield "#{i}: #{Time.now}\n"
      sleep 1
    end
  end
end

get '/' do
  puts env
  Flujo.new
end
Véase el código en https://github.com/crguezl/sinatra_intro/tree/master/streaming.

[~/sinatra/sinatra-streaming/intro-streaming(master)]$ cat Rakefile 
task :default => :puma
desc "run stream.rb using puma server"
task :puma do
  sh "ruby stream.rb -e production -s puma"
end

desc "run stream.rb using thin server"
task :thin do
  sh "ruby stream.rb -e production -s thin"
end

[~/sinatra/sinatra-streaming/intro-streaming(master)]$ rake
ruby stream.rb -e production -s puma
Puma 2.6.0 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:4567
== Sinatra/1.4.4 has taken the stage on 4567 for production with backup from Puma
127.0.0.1 - - [01/Dec/2013 21:05:32] "GET / HTTP/1.1" 200 - 5.0094

Nota: con thin no funciona en modo streaming.

Prepara la página completa y la suelta de golpe.

Cuando visitamos localhost:4567 obtenemos una salida en la que cada línea aparece un segundo después que la anterior:

0: 2013-12-01 21:05:27 +0000
1: 2013-12-01 21:05:28 +0000
2: 2013-12-01 21:05:29 +0000
3: 2013-12-01 21:05:30 +0000
4: 2013-12-01 21:05:31 +0000

Casiano Rodriguez León 2015-01-07