class EStream::Generic
Public Class Methods
defer(*) { |end| ... }
click to toggle source
# File lib/e-core/instance/stream.rb, line 61 def self.defer(*) yield end def initialize(scheduler = self.class, keep_open = false, &back) @back, @scheduler, @keep_open = back.to_proc, scheduler, keep_open @callbacks, @closed = [], false end def close return if @closed @closed = true @scheduler.schedule { @callbacks.each { |c| c.call }} end 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 def <<(data) @scheduler.schedule { @front.call(data.to_s) } self end def callback(&block) return yield if @closed @callbacks << block end alias errback callback def closed? @closed end end
new(scheduler = self.class, keep_open = false, &back)
click to toggle source
# File lib/e-core/instance/stream.rb, line 63 def initialize(scheduler = self.class, keep_open = false, &back) @back, @scheduler, @keep_open = back.to_proc, scheduler, keep_open @callbacks, @closed = [], false end
schedule(*) { |end| ... }
click to toggle source
# File lib/e-core/instance/stream.rb, line 60 def self.schedule(*) yield end def self.defer(*) yield end def initialize(scheduler = self.class, keep_open = false, &back) @back, @scheduler, @keep_open = back.to_proc, scheduler, keep_open @callbacks, @closed = [], false end def close return if @closed @closed = true @scheduler.schedule { @callbacks.each { |c| c.call }} end 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 def <<(data) @scheduler.schedule { @front.call(data.to_s) } self end def callback(&block) return yield if @closed @callbacks << block end alias errback callback def closed? @closed end end class Chunked < Generic def << data data = data.to_s.chomp + "\n" # ensure data ends in a new line size = data.bytesize.to_s(16) super size + "\r\n" + data + "\r\n" end def close @scheduler.schedule { @front.call("0\r\n\r\n") } unless closed? super end end class Evented < Generic # EventSource-related helpers # # @example # evented_stream do |socket| # socket.event 'some event' # socket.retry 10 # end # %w[event id retry].each do |meth| define_method meth do |data| # unlike on #data, these messages expects a single \n at the end. write meth + ": " + data.to_s.gsub(/\n|\r/, '') + "\n" end end # sending data # # @example # event_stream :keep_open do |out| # out.data 'chunk one' # out.data 'chunk two' # out.data 'etc.' # end # def data data # - any single message should not contain \n except at the end. # - EventSource expects \n\n at the end of each single message. write "data: %s\n\n" % data.gsub(/\n|\r/, '') end alias :<< :data def write data @scheduler.schedule { @front.call(data.to_s) } end end end
Public Instance Methods
<<(data)
click to toggle source
# File lib/e-core/instance/stream.rb, line 86 def <<(data) @scheduler.schedule { @front.call(data.to_s) } self end
callback() { || ... }
click to toggle source
# File lib/e-core/instance/stream.rb, line 91 def callback(&block) return yield if @closed @callbacks << block end
close()
click to toggle source
# File lib/e-core/instance/stream.rb, line 68 def close return if @closed @closed = true @scheduler.schedule { @callbacks.each { |c| c.call }} end
closed?()
click to toggle source
# File lib/e-core/instance/stream.rb, line 98 def closed? @closed end
each(&front)
click to toggle source
# File lib/e-core/instance/stream.rb, line 74 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