module JWT::JWK

def classes

def classes
  @mappings = nil # reset the cached mappings
  @classes ||= []
end

def create_from(key, params = nil, options = {})

def create_from(key, params = nil, options = {})
  if key.is_a?(Hash)
    jwk_kty = key[:kty] || key['kty']
    raise JWT::JWKError, 'Key type (kty) not provided' unless jwk_kty
    return mappings.fetch(jwk_kty.to_s) do |kty|
      raise JWT::JWKError, "Key type #{kty} not supported"
    end.new(key, params, options)
  end
  mappings.fetch(key.class) do |klass|
    raise JWT::JWKError, "Cannot create JWK from a #{klass.name}"
  end.new(key, params, options)
end

def generate_mappings

def generate_mappings
  classes.each_with_object({}) do |klass, hash|
    next unless klass.const_defined?('KTYS')
    Array(klass::KTYS).each do |kty|
      hash[kty] = klass
    end
  end
end

def mappings

def mappings
  @mappings ||= generate_mappings
end