class WebsocketRails::ConnectionAdapters::Http::DeferrableBody

From [thin_async](github.com/macournoyer/thin_async)

Public Class Methods

new(chunks = []) click to toggle source

@param chunks - object that responds to each. holds initial chunks of content

# File lib/websocket_rails/connection_adapters/http.rb, line 73
def initialize(chunks = [])
  @queue = []
  chunks.each {|c| chunk(c)}
end

Public Instance Methods

chunk(*chunks) click to toggle source

Enqueue a chunk of content to be flushed to stream at a later time

# File lib/websocket_rails/connection_adapters/http.rb, line 79
def chunk(*chunks)
  @queue += chunks
  schedule_dequeue
end
close!(flush = true) click to toggle source
# File lib/websocket_rails/connection_adapters/http.rb, line 95
def close!(flush = true)
  EM.next_tick {
    if !flush || empty?
      succeed
    else
      schedule_dequeue
      close!(flush)
    end
  }
end
each(&blk) click to toggle source

When rack attempts to iterate over `body`, save the block, and execute at a later time when `@queue` has elements

# File lib/websocket_rails/connection_adapters/http.rb, line 86
def each(&blk)
  @body_callback = blk
  schedule_dequeue
end
empty?() click to toggle source
# File lib/websocket_rails/connection_adapters/http.rb, line 91
def empty?
  @queue.empty?
end

Private Instance Methods

schedule_dequeue() click to toggle source
# File lib/websocket_rails/connection_adapters/http.rb, line 108
def schedule_dequeue
  return unless @body_callback
  EM.next_tick do
    next unless c = @queue.shift
    @body_callback.call(c)
    schedule_dequeue unless empty?
  end
end