class LogCourier::PendingPayload

Describes a pending payload

Attributes

events[RW]
last_sequence[RW]
next[RW]
nonce[RW]
payload[RW]
sequence_len[RW]

Public Class Methods

new(events, nonce) click to toggle source
# File lib/log-courier/client.rb, line 35
def initialize(events, nonce)
  @events = events
  @nonce = nonce

  generate
end

Public Instance Methods

ack(sequence) click to toggle source
# File lib/log-courier/client.rb, line 60
def ack(sequence)
  return 0, false if sequence <= @last_sequence

  if sequence >= @sequence_len
    lines = @sequence_len - @last_sequence
    @last_sequence = sequence
    @payload = nil
    @events = []
    return lines, true
  end

  lines = sequence - @last_sequence
  @last_sequence = sequence
  @payload = nil
  @events.shift(lines)
  [lines, false]
end
generate() click to toggle source
# File lib/log-courier/client.rb, line 42
def generate
  raise ArgumentError, 'Corrupt payload' if @events.length.zero?

  buffer = Zlib::Deflate.new

  # Write each event in JSON format
  events.each do |event|
    json_data = MultiJson.dump(event)
    # Add length and then the data
    buffer << [json_data.bytesize].pack('N') << json_data
  end

  # Generate and store the payload
  @payload = nonce + buffer.finish
  @last_sequence = 0
  @sequence_len = @events.length
end