Class: Cyberweb::REST::Helpers::Stream
- Inherits:
-
Object
- Object
- Cyberweb::REST::Helpers::Stream
- 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
- .defer ⇒ Object
-
.schedule ⇒ Object
Cyberweb::REST::Helpers::Stream.
Instance Method Summary collapse
-
#<<(data) ⇒ Object
# === << ========================================================================= #.
-
#callback(&block) ⇒ Object
(also: #errback)
# === callback ========================================================================= #.
-
#close ⇒ Object
# === close ========================================================================= #.
-
#closed? ⇒ Boolean
# === closed? ========================================================================= #.
-
#each(&front) ⇒ Object
# === each ========================================================================= #.
-
#initialize(scheduler = self.class, keep_open = false, &back) ⇒ Stream
constructor
# === initialize ========================================================================= #.
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
.defer ⇒ Object
30 31 32 |
# File 'lib/cyberweb/REST/base/helpers/stream.rb', line 30 def self.defer(*) yield end |
.schedule ⇒ Object
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 |
#close ⇒ Object
#
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?
#
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 |