Sha256: b50ebc2262f0136f44209cb468b2523eb6498f6f0b1dab8f14f7a517d738d51d

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true

require "zeitwerk"
require "rack"
require "redis"
require "concurrent"

Zeitwerk::Loader.for_gem.setup

module Umbra
  autoload :Pb, "umbra/pb/umbra_pb"

  CHANNEL = "umbra_channel"
  HEADER_KEY = "HTTP_X_UMBRA_REQUEST"
  HEADER_VALUE = "true"

  RequestSelector = proc { true }
  SuppressErrorHandler = proc {}

  class << self
    attr_reader :config

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

      test_redis_connection!
    end

    def publish(env)
      return if umbra_request?(env)

      return unless @config
      return unless @config.request_selector.call(env)

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

      @config.publisher.call(env)
    rescue => e
      @config.error_handler.call(e, env)
    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 => 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

1 entries across 1 versions & 1 rubygems

Version Path
umbra-rb-0.3.0 lib/umbra.rb