Sha256: e9db06ca14000c735b7fb635099e825b063ee57a133a15faf631a4e7c73627c5

Contents?: true

Size: 1.18 KB

Versions: 8

Compression:

Stored size: 1.18 KB

Contents

# frozen_string_literal: true

require "anycable/middleware"
require "monitor"

module AnyCable
  # Middleware chain is used to build the list of
  # gRPC server interceptors.
  #
  # Each interceptor should be a subsclass of
  # AnyCable::Middleware and implement `#call` method.
  class MiddlewareChain
    def initialize
      @registry = []
      @mu = Monitor.new
    end

    def use(middleware)
      check_frozen!
      middleware = build_middleware(middleware)
      sync { registry << middleware }
    end

    def freeze
      registry.freeze
      super
    end

    def to_a
      registry
    end

    private

    attr_reader :mu, :registry

    def sync
      mu.synchronize { yield }
    end

    def check_frozen!
      raise "Cannot modify AnyCable middlewares after server started" if frozen?
    end

    def build_middleware(middleware)
      middleware = middleware.new if
        middleware.is_a?(Class) && middleware <= AnyCable::Middleware

      unless middleware.is_a?(AnyCable::Middleware)
        raise ArgumentError,
          "AnyCable middleware must be a subclass of AnyCable::Middleware, " \
          "got #{middleware} instead"
      end

      middleware
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
anycable-1.0.3 lib/anycable/middleware_chain.rb
anycable-1.0.2 lib/anycable/middleware_chain.rb
anycable-1.0.1 lib/anycable/middleware_chain.rb
anycable-1.0.0 lib/anycable/middleware_chain.rb
anycable-1.0.0.rc2 lib/anycable/middleware_chain.rb
anycable-1.0.0.rc1 lib/anycable/middleware_chain.rb
anycable-1.0.0.preview2 lib/anycable/middleware_chain.rb
anycable-1.0.0.preview1 lib/anycable/middleware_chain.rb