Sha256: bf8b9608a2156898e6d44605b8b883ba2e6cddee84cc29a895c5581c70d7f4fa

Contents?: true

Size: 1.81 KB

Versions: 73

Compression:

Stored size: 1.81 KB

Contents

# frozen_string_literal: true

require "time"

module ActiveSupport
  module Messages #:nodoc:
    class Metadata #:nodoc:
      def initialize(message, expires_at = nil, purpose = nil)
        @message, @expires_at, @purpose = message, expires_at, purpose
      end

      def as_json(options = {})
        { _rails: { message: @message, exp: @expires_at, pur: @purpose } }
      end

      class << self
        def wrap(message, expires_at: nil, expires_in: nil, purpose: nil)
          if expires_at || expires_in || purpose
            JSON.encode new(encode(message), pick_expiry(expires_at, expires_in), purpose)
          else
            message
          end
        end

        def verify(message, purpose)
          extract_metadata(message).verify(purpose)
        end

        private
          def pick_expiry(expires_at, expires_in)
            if expires_at
              expires_at.utc.iso8601(3)
            elsif expires_in
              Time.now.utc.advance(seconds: expires_in).iso8601(3)
            end
          end

          def extract_metadata(message)
            data = JSON.decode(message) rescue nil

            if data.is_a?(Hash) && data.key?("_rails")
              new(decode(data["_rails"]["message"]), data["_rails"]["exp"], data["_rails"]["pur"])
            else
              new(message)
            end
          end

          def encode(message)
            ::Base64.strict_encode64(message)
          end

          def decode(message)
            ::Base64.strict_decode64(message)
          end
      end

      def verify(purpose)
        @message if match?(purpose) && fresh?
      end

      private
        def match?(purpose)
          @purpose.to_s == purpose.to_s
        end

        def fresh?
          @expires_at.nil? || Time.now.utc < Time.iso8601(@expires_at)
        end
    end
  end
end

Version data entries

73 entries across 65 versions & 10 rubygems

Version Path
activesupport-5.2.8.1 lib/active_support/messages/metadata.rb
activesupport-5.2.8 lib/active_support/messages/metadata.rb
activesupport-5.2.7.1 lib/active_support/messages/metadata.rb
activesupport-5.2.7 lib/active_support/messages/metadata.rb
activesupport-5.2.6.3 lib/active_support/messages/metadata.rb
activesupport-5.2.6.2 lib/active_support/messages/metadata.rb
activesupport-5.2.6.1 lib/active_support/messages/metadata.rb
activesupport-5.2.6 lib/active_support/messages/metadata.rb
activesupport-5.2.4.6 lib/active_support/messages/metadata.rb
activesupport-5.2.5 lib/active_support/messages/metadata.rb
activesupport-5.2.4.5 lib/active_support/messages/metadata.rb
grape-extra_validators-2.0.0 vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.4.1/lib/active_support/messages/metadata.rb
activesupport-5.2.4.4 lib/active_support/messages/metadata.rb
activesupport-5.2.4.3 lib/active_support/messages/metadata.rb
activesupport-6.0.2.2 lib/active_support/messages/metadata.rb
activesupport-5.2.4.2 lib/active_support/messages/metadata.rb
argon-1.3.1 vendor/bundle/ruby/2.7.0/gems/activesupport-6.0.2.1/lib/active_support/messages/metadata.rb
symbolic_enum-1.1.5 vendor/bundle/ruby/2.7.0/gems/activesupport-6.0.2.1/lib/active_support/messages/metadata.rb
grape-extra_validators-1.0.0 vendor/bundle/ruby/2.4.0/gems/activesupport-5.2.4.1/lib/active_support/messages/metadata.rb
activesupport-6.0.2.1 lib/active_support/messages/metadata.rb