Sha256: 503625aa06a7ab2a62dfa53af663f0a4d266afe1acd6de6077530cc536997503

Contents?: true

Size: 1.96 KB

Versions: 3

Compression:

Stored size: 1.96 KB

Contents

# frozen_string_literal: true

require 'typhoeus'
require 'redis'
require 'multi_json'

module Umbra
  autoload :Config, 'umbra/config'
  autoload :Encoder, 'umbra/encoder'
  autoload :Middleware, 'umbra/middleware'
  autoload :Publisher, 'umbra/publisher'
  autoload :Subscriber, 'umbra/subscriber'
  autoload :RequestBuilder, 'umbra/request_builder'
  autoload :ShadowRequester, 'umbra/shadow_requester'
  autoload :SynchronousPublisher, 'umbra/synchronous_publisher'
  autoload :Version, 'umbra/version'

  CHANNEL = 'umbra_channel'
  HEADER_KEY = 'HTTP_X_UMBRA_REQUEST'
  HEADER_VALUE = 'true'

  RequestSelector = proc { true }
  SuppressErrorHandler = proc { nil }

  class << self
    attr_reader :config

    def configure(&block)
      @config = Config.default(&block)

      test_redis_connection!
    end

    def publish(env, response)
      return if umbra_request?(env)
      return unless @config
      return unless @config.request_selector.call(env, response)

      env['umbra.request_body'] = request_body(env)

      @config.publisher.call(env, response)
    rescue StandardError => e
      @config.error_handler.call(e, env, response)
    end

    def redis
      @redis ||= Redis.new(@config.redis_options)
    end

    def encoder
      @config.encoder
    end

    def logger
      @config.logger
    end

    def reset!
      @config = nil
      @redis = nil
    end

    private

    def request_body(env)
      io = env.fetch('rack.input')
      io.rewind
      body = io.read
      io.rewind

      body
    end

    def test_redis_connection!
      logger.info '[umbra] Testing redis connection...'
      redis.ping
      logger.info '[umbra] redis is alive!'
    rescue Redis::BaseError => e
      logger.warn "[umbra] error while connecting to redis: #{e.message}"
      reset!
    rescue StandardError => e
      logger.warn "[umbra] redis is misconfigured: #{e.message}"
      reset!
    end

    def umbra_request?(env)
      env[HEADER_KEY] == HEADER_VALUE
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
umbra-rb-0.2.0 lib/umbra.rb
umbra-rb-0.1.5.pre lib/umbra.rb
umbra-rb-0.1.4.pre lib/umbra.rb