Sha256: a5d5db1c5eb933706ac1301ed26ae52e4f7f62ca6fba1cab32be8b59e3534d1e

Contents?: true

Size: 1.24 KB

Versions: 1

Compression:

Stored size: 1.24 KB

Contents

# encoding: utf-8

module Hatetepe
  class Server
    def self.start(config)
      callback = proc { |connection| new(config, connection) }
      EM.start_server(config[:address], config[:port],
                      Connection::EventMachine, callback)
    end

    include Support::Handlers
    include Connection::Status

    attr_reader :config

    def initialize(config, connection)
      @config = config

      setup_connection(connection)
      setup_handlers
      notify_handlers(:setup)
    end

    def serve(request)
      served = Promise.new
      served.then { |response| respond(request, response) }

      Fiber.new { notify_handlers(:serve, request, served) }.resume
    end

    def respond(request, response)
      fiber = Fiber.new do
        notify_handlers(:respond, request, response)
        @connection.serialize(response)
        response.closed { finish(request) }
      end
      fiber.resume
    end

    def finish(request)
      notify_handlers(:finish, request)
    end

    def close
      @connection.close
    end

    private

    def setup_connection(connection)
      @connection = connection
      @connection.parse(method(:serve))
      @connection.closed.then(method(:shutdown))
    end

    def shutdown(_)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hatetepe-0.6.0.pre.1 lib/hatetepe/server.rb