class JWT::Encode

Encoding logic for JWT

def combine(*parts)

def combine(*parts)
  parts.join('.')
end

def encode_data(data)

def encode_data(data)
  ::JWT::Base64.url_encode(JWT::JSON.generate(data))
end

def encode_header

def encode_header
  encode_data(@headers)
end

def encode_payload

def encode_payload
  encode_data(@payload)
end

def encode_signature

def encode_signature
  ::JWT::Base64.url_encode(signature)
end

def encoded_header

def encoded_header
  @encoded_header ||= encode_header
end

def encoded_header_and_payload

def encoded_header_and_payload
  @encoded_header_and_payload ||= combine(encoded_header, encoded_payload)
end

def encoded_payload

def encoded_payload
  @encoded_payload ||= encode_payload
end

def encoded_signature

def encoded_signature
  @encoded_signature ||= encode_signature
end

def initialize(options)

def initialize(options)
  @payload          = options[:payload]
  @key              = options[:key]
  @algorithm        = resolve_algorithm(options[:algorithm])
  @headers          = options[:headers].transform_keys(&:to_s)
  @headers[ALG_KEY] = @algorithm.alg
end

def resolve_algorithm(algorithm)

def resolve_algorithm(algorithm)
  return algorithm if Algos.implementation?(algorithm)
  Algos.create(algorithm)
end

def segments

def segments
  validate_claims!
  combine(encoded_header_and_payload, encoded_signature)
end

def signature

def signature
  @algorithm.sign(data: encoded_header_and_payload, signing_key: @key)
end

def validate_claims!

def validate_claims!
  return unless @payload.is_a?(Hash)
  ClaimsValidator.new(@payload).validate!
end