Sha256: d4a974c61f47ff76bee46593d93d15feed5bf5c2ba75756ee3944f771df80c37

Contents?: true

Size: 1.58 KB

Versions: 2

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true

require 'rack'
require 'puma'
require 'roda'

module Rodbot
  class Services
    class App
      include Rodbot::Memoize

      class << self
        include Rodbot::Memoize

        # URL (including port) to reach the app service locally
        #
        # @return [String] URL
        memoize def url
          [
            (ENV['RODBOT_APP_URL'] || 'http://localhost'),
            Rodbot.config(:port)
          ].join(':')
        end
      end

      def tasks(**)
        puts "Starting app service on http://#{bind.join(':')}"
        [method(:run)]
      end

      private

      def run
        Dir.chdir(Rodbot.env.root)
        Puma::Server.new(app, nil, options).tap do |server|
          server.add_tcp_listener(*bind)
          server.app = ::Rack::CommonLogger.new(app, logger)
        end.run.join
      end

      memoize def bind
        [
          (ENV['RODBOT_APP_HOST'] || 'localhost'),
          Rodbot.config(:port)
        ]
      end

      memoize def app
        ::Rack::Builder.parse_file(Rodbot.env.root.join('config.ru').to_s)
      end

      def options
        {
          lowlevel_error_handler: method(:lowlevel_error_handler),
          log_writer: Puma::LogWriter.null,
          min_threads: Rodbot.config(:app, :threads).min,
          max_threads: Rodbot.config(:app, :threads).max
        }
      end

      memoize def logger
        Rodbot::Log.logger('app')
      end

      def lowlevel_error_handler(error)
        logger.error("#{error.message}: #{error.backtrace.first}")
        [500, {}, ['Oops!']]
      end

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rodbot-0.5.1 lib/rodbot/services/app.rb
rodbot-0.5.0 lib/rodbot/services/app.rb