lib/jwt/jwk/set.rb
# frozen_string_literal: true
require 'forwardable'
module JWT
module JWK
class Set
include Enumerable
extend Forwardable
attr_reader :keys
def initialize(jwks = nil, options = {}) # rubocop:disable Metrics/CyclomaticComplexity
jwks ||= {}
@keys = case jwks
when JWT::JWK::Set # Simple duplication
jwks.keys
when JWT::JWK::KeyBase # Singleton
[jwks]
when Hash
jwks = jwks.transform_keys(&:to_sym)
[*jwks[:keys]].map { |k| JWT::JWK.new(k, nil, options) }
when Array
jwks.map { |k| JWT::JWK.new(k, nil, options) }
else
raise ArgumentError, 'Can only create new JWKS from Hash, Array and JWK'
end
end
def export(options = {})
{ keys: @keys.map { |k| k.export(options) } }
end
def_delegators :@keys, :each, :size, :delete, :dig
def select!(&block)
return @keys.select! unless block
self if @keys.select!(&block)
end
def reject!(&block)
return @keys.reject! unless block
self if @keys.reject!(&block)
end
def uniq!(&block)
self if @keys.uniq!(&block)
end
def merge(enum)
@keys += JWT::JWK::Set.new(enum.to_a).keys
self
end
def union(enum)
dup.merge(enum)
end
def add(key)
@keys << JWT::JWK.new(key)
self
end
def ==(other)
other.is_a?(JWT::JWK::Set) && keys.sort == other.keys.sort
end
alias eql? ==
alias filter! select!
alias length size
# For symbolic manipulation
alias | union
alias + union
alias << add
end
end
end