Streaming data from Sinatra/Rack application

前端 未结 4 443
说谎
说谎 2020-12-02 21:13

I am trying to stream textual data (XML/JSON) from a Ruby (1.9.1p378) Sinatra (1.0) Rack (1.2.1) application. The suggested solutions (e.g. Is there a way to flush html to t

4条回答
  •  感动是毒
    2020-12-02 21:24

    Neither Webrick nor Thin support streaming that way. You could try Mongrel or Unicorn. If you want to use Thin or Rainbows!, you have to hook into the event loop in order to achieve streaming:

    require 'sinatra'
    
    class Stream
      include EventMachine::Deferrable
      def initialize
        @counter = 0
      end
    
      def each(&block)
        if @counter > 10
          succeed
        else
          EM.next_tick do
            yield counter
            each(&block)
          end
        end
      end
    end
    
    get '/' do
      Stream.new
    end
    

    I recently wrote a EventSource implementation that way:

    require 'sinatra'
    
    class EventStream
      include EventMachine::Deferrable
      def each
        count = 0
        timer = EventMachine::PeriodicTimer.new(1) do
          yield "data: #{count += 1}\n\n"
        end
        errback { timer.cancel }
      end
    end
    
    get '/' do
      EventMachine.next_tick do
        request.env['async.callback'].call [
          200, {'Content-Type' => 'text/event-stream'},
          EventStream.new ]
      end
      [-1, {}, []]
    end
    

    If you want to use Webrick for Streaming: here is a patch.

提交回复
热议问题