Class: Cyberweb::REST::Helpers::Stream

Inherits:
Object
  • Object
show all
Defined in:
lib/cyberweb/REST/base/helpers/stream.rb

Overview

#

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

Three things really matter: The front and back block (back being the block 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

#

initialize

#


37
38
39
40
41
42
43
# File 'lib/cyberweb/REST/base/helpers/stream.rb', line 37

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

Class Method Details

.deferObject



30
31
32
# File 'lib/cyberweb/REST/base/helpers/stream.rb', line 30

def self.defer(*)
  yield
end

.scheduleObject

Cyberweb::REST::Helpers::Stream



27
28
29
# File 'lib/cyberweb/REST/base/helpers/stream.rb', line 27

def self.schedule(*)
  yield
end

Instance Method Details

#<<(data) ⇒ Object

#

<<

#


72
73
74
75
# File 'lib/cyberweb/REST/base/helpers/stream.rb', line 72

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

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

#

callback

#


80
81
82
83
# File 'lib/cyberweb/REST/base/helpers/stream.rb', line 80

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

#closeObject

#

close

#


48
49
50
51
52
# File 'lib/cyberweb/REST/base/helpers/stream.rb', line 48

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

#closed?Boolean

#

closed?

#

Returns:

  • (Boolean)


88
89
90
# File 'lib/cyberweb/REST/base/helpers/stream.rb', line 88

def closed?
  @closed
end

#each(&front) ⇒ Object

#

each

#


57
58
59
60
61
62
63
64
65
66
67
# File 'lib/cyberweb/REST/base/helpers/stream.rb', line 57

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