Sha256: ed73f055d93333f08c60e63005a685efff3afae0c887dbdeb6b0f84106db2757

Contents?: true

Size: 893 Bytes

Versions: 5

Compression:

Stored size: 893 Bytes

Contents

# frozen_string_literal: true

require "openssl"
require "base64"
require "json"

module AnyCable
  module Streams
    class << self
      def signed(stream_name)
        ::Base64.urlsafe_encode64(::JSON.dump(stream_name)).then do |encoded|
          "#{encoded}--#{signature(encoded)}"
        end
      end

      def verified(signed_stream_name)
        encoded, sig = signed_stream_name.split("--")
        raise ArgumentError, "stream name has incorrect format" unless encoded

        return unless sig == signature(encoded)

        ::Base64.urlsafe_decode64(encoded).then do |decoded|
          ::JSON.parse(decoded)
        end
      end

      private

      def signature(val)
        key = AnyCable.config.streams_secret

        raise ArgumentError, "streams signing secret is missing" unless key

        ::OpenSSL::HMAC.hexdigest("SHA256", key, val)
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
anycable-core-1.6.0.rc.1 lib/anycable/streams.rb
anycable-core-1.5.2 lib/anycable/streams.rb
anycable-core-1.5.1 lib/anycable/streams.rb
anycable-core-1.5.0 lib/anycable/streams.rb
anycable-core-1.5.0.rc.1 lib/anycable/streams.rb