Sha256: 37b0aaf31d6c5d45b4c34d8d9267121134fd75b8c60826eb34f09cb5e1e014af

Contents?: true

Size: 1.94 KB

Versions: 2

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true

require "json"
require "aws-sdk-lambda"
require "aws-sdk-sts"

module Hotsock
  class Publisher
    def initialize(config)
      @config = config
    end

    def publish_message(channel:, event:, **options)
      payload = {event:, channel:}
      payload[:data] = options.delete(:data) if options[:data]
      payload[:deduplicationId] = options.delete(:deduplication_id) if options[:deduplication_id]
      payload[:eagerIdGeneration] = options.delete(:eager_id_generation) if options[:eager_id_generation]
      payload[:emitPubSubEvent] = options.delete(:emit_pub_sub_event) if options[:emit_pub_sub_event]
      options.each do |k, v|
        payload[k] = v
      end

      lambda_client.invoke(
        function_name: @config.publish_function_arn,
        payload: JSON.dump(payload)
      )
    end

    private

    def lambda_client
      return @lambda_client if @lambda_client

      options = {region: @config.aws_region}

      if @config.aws_assume_role_arn
        options[:credentials] = assume_role_credentials
      elsif @config.aws_access_key_id || @config.aws_secret_access_key
        options[:credentials] = static_credentials
      end

      @lambda_client ||= Aws::Lambda::Client.new(options)
    end

    def static_credentials
      Aws::Credentials.new(
        @config.aws_access_key_id,
        @config.aws_secret_access_key
      )
    end

    def assume_role_credentials
      Aws::AssumeRoleCredentials.new(
        client: sts_base_client,
        role_arn: @config.aws_assume_role_arn,
        role_session_name: @config.aws_assume_role_session_name || "hotsock-ruby-#{Hotsock::VERSION}",
        external_id: @config.aws_assume_role_external_id
      )
    end

    def sts_base_client
      options = {region: @config.aws_region}

      if @config.aws_access_key_id || @config.aws_secret_access_key
        options[:credentials] = static_credentials
      end

      Aws::STS::Client.new(options)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
hotsock-1.0.1 lib/hotsock/publisher.rb
hotsock-1.0.0 lib/hotsock/publisher.rb