Class: Sinatra::Helpers::Stream

Inherits:
Object
  • Object
show all
Defined in:
lib/sinatra/base.rb

Overview

Class of the response body in case you use #stream.

Three things really matter: The front and back block (back being the blog generating content, front the one sending it to the client) and the scheduler, integrating with whatever concurrency feature the Rack handler is using.

Scheduler has to respond to defer and schedule.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(scheduler = self.class, keep_open = false, &back) ⇒ Stream

Returns a new instance of Stream.



300
301
302
303
# File 'lib/sinatra/base.rb', line 300

def initialize(scheduler = self.class, keep_open = false, &back)
  @back, @scheduler, @keep_open = back.to_proc, scheduler, keep_open
  @callbacks, @closed = [], false
end

Class Method Details

.deferObject



298
# File 'lib/sinatra/base.rb', line 298

def self.defer(*)    yield end

.scheduleObject



297
# File 'lib/sinatra/base.rb', line 297

def self.schedule(*) yield end

Instance Method Details

#<<(data) ⇒ Object



323
324
325
326
# File 'lib/sinatra/base.rb', line 323

def <<(data)
  @scheduler.schedule { @front.call(data.to_s) }
  self
end

#callback(&block) ⇒ Object Also known as: errback



328
329
330
331
# File 'lib/sinatra/base.rb', line 328

def callback(&block)
  return yield if @closed
  @callbacks << block
end

#closeObject



305
306
307
308
309
# File 'lib/sinatra/base.rb', line 305

def close
  return if @closed
  @closed = true
  @scheduler.schedule { @callbacks.each { |c| c.call }}
end

#each(&front) ⇒ Object



311
312
313
314
315
316
317
318
319
320
321
# File 'lib/sinatra/base.rb', line 311

def each(&front)
  @front = front
  @scheduler.defer do
    begin
      @back.call(self)
    rescue Exception => e
      @scheduler.schedule { raise e }
    end
    close unless @keep_open
  end
end