Sha256: 1181fd39c9fa4ab6cdfceec32f61cab2edea100579f3e9efd134f60f250743df

Contents?: true

Size: 1.07 KB

Versions: 2

Compression:

Stored size: 1.07 KB

Contents

module Propono
  class PublisherError < ProponoError
  end

  class Publisher
    include Sns

    def self.publish(topic_id, message, options = {})
      new(topic_id, message, options).publish
    end

    attr_reader :topic_id, :message, :protocol

    def initialize(topic_id, message, options = {})
      raise PublisherError.new("Topic is nil") if topic_id.nil?
      raise PublisherError.new("Message is nil") if message.nil?

      @topic_id = topic_id
      @message = message
      @protocol = options.fetch(:protocol, :sns).to_sym
    end

    def publish
      send("publish_via_#{protocol}")
    end

    private

    def publish_via_sns
      topic = TopicCreator.find_or_create(topic_id)
      msg = message.is_a?(String) ? message : message.to_json
      sns.publish(topic.arn, msg)
    end

    def publish_via_udp
      payload = {topic: topic_id, message: message}.to_json
      UDPSocket.new.send(payload, 0, Propono.config.udp_host, Propono.config.udp_port)
    rescue SocketError => e
      Propono.config.logger.error "Propono failed to send : #{e}"
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
propono-0.6.1 lib/propono/services/publisher.rb
propono-0.6.0 lib/propono/services/publisher.rb