Class: Polyn::PullSubscriber

Inherits:
Object
  • Object
show all
Defined in:
lib/polyn/pull_subscriber.rb

Overview

Wrapper around nats-pure that can validate polyn messages

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(fields) ⇒ PullSubscriber

is more than the ‘source_root`

Parameters:

  • fields (Object)

    :nats - Connected NATS instance from ‘NATS.connect`

  • fields (String)

    :type - The type of event

Options Hash (fields):

  • :source (String)
    • If the ‘source` portion of the consumer name



12
13
14
15
16
17
18
19
20
# File 'lib/polyn/pull_subscriber.rb', line 12

def initialize(fields)
  @nats          = fields.fetch(:nats)
  @type          = Polyn::Naming.trim_domain_prefix(fields.fetch(:type))
  @consumer_name = Polyn::Naming.consumer_name(@type, fields[:source])
  @stream        = @nats.jetstream.find_stream_name_by_subject(@type)
  self.class.validate_consumer_exists!(@nats, @stream, @consumer_name)
  @psub          = @nats.jetstream.pull_subscribe(@type, @consumer_name)
  @serializer    = fields.fetch(:serializer)
end

Class Method Details

.validate_consumer_exists!(nats, stream, consumer_name) ⇒ Object

nats-pure will create a consumer if the one you passed does not exist. Polyn wants to avoid this functionality and instead encourage consumer creation in the centralized ‘events` codebase so that it’s documented, discoverable, and polyn-cli can manage it



26
27
28
29
30
31
32
# File 'lib/polyn/pull_subscriber.rb', line 26

def self.validate_consumer_exists!(nats, stream, consumer_name)
  nats.jetstream.consumer_info(stream, consumer_name)
rescue NATS::JetStream::Error::NotFound
  raise Polyn::Errors::ValidationError,
    "Consumer #{consumer_name} does not exist. Use polyn-cli to create"\
    "it before attempting to subscribe"
end

Instance Method Details

#fetch(batch = 1, params = {}) ⇒ Array<NATS::Msg>

fetch makes a request to be delivered more messages from a pull consumer.

Parameters:

  • batch (Fixnum) (defaults to: 1)

    Number of messages to pull from the stream.

  • params (Hash) (defaults to: {})

    Options to customize the fetch request.

Options Hash (params):

  • :timeout (Float)

    Duration of the fetch request before it expires.

Returns:

  • (Array<NATS::Msg>)


40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/polyn/pull_subscriber.rb', line 40

def fetch(batch = 1, params = {})
  Polyn::Tracing.processing_span(@type) do |process_span|
    msgs = @psub.fetch(batch, params)
    msgs.map do |msg|
      Polyn::Tracing.subscribe_span(@type, msg, links: [process_span]) do |span|
        updated_msg = process_message(msg)
        Polyn::Tracing.span_attributes(span,
          nats:    @nats,
          type:    @type,
          event:   updated_msg.data,
          payload: msg.data)
        updated_msg
      end
    end
  end
end