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