class Lightstreamer::UpdateMessage

Helper class used by {Subscription} in order to parse incoming update messages.

@private

Attributes

data[RW]

The field data specified by this update message.

@return [Array]

item_index[RW]

The index of the item this update message applies to.

@return [Fixnum]

Public Class Methods

parse(line, table_id, items, fields) click to toggle source

Attempts to parses the specified line as an update message for the given table, items, and fields, and returns an instance of {UpdateMessage} on success, or `nil` on failure.

# File lib/lightstreamer/messages/update_message.rb, line 19
def parse(line, table_id, items, fields)
  match = line.match table_regexp(table_id, fields)
  return unless match

  message = new

  message.item_index = match.captures[0].to_i - 1
  return unless message.item_index < items.size

  message.data = parse_field_values match.captures[1..-1], fields

  message
end

Private Class Methods

decode_escape_sequences(string) click to toggle source

Decodes any UTF-16 escape sequences in the form 'uXXXX' in the passed string. Invalid escape sequences are removed.

# File lib/lightstreamer/messages/update_message.rb, line 62
def decode_escape_sequences(string)
  string = decode_surrogate_pair_escape_sequences string

  string.gsub(/\\u[A-F\d]{4}/i) do |escape_sequence|
    codepoint = escape_sequence[2..-1].hex

    # Codepoints greater than 0xD7FF are invalid and so are removed
    codepoint < 0xD800 ? [codepoint].pack('U') : ''
  end
end
decode_surrogate_pair_escape_sequences(string) click to toggle source

Decodes any UTF-16 surrogate pair escape sequences in the form 'uXXXXuYYYY' in the passed string.

# File lib/lightstreamer/messages/update_message.rb, line 74
def decode_surrogate_pair_escape_sequences(string)
  string.gsub(/\\uD[89AB][A-F\d]{2}\\uD[C-F][A-F\d]{2}/i) do |escape_sequence|
    high_surrogate = escape_sequence[2...6].hex
    low_surrogate = escape_sequence[8...12].hex

    codepoint = 0x10000 + ((high_surrogate - 0xD800) << 10) + (low_surrogate - 0xDC00)

    [codepoint].pack 'U'
  end
end
parse_field_values(field_values, fields) click to toggle source
# File lib/lightstreamer/messages/update_message.rb, line 39
def parse_field_values(field_values, fields)
  hash = {}

  field_values.each_with_index do |field_value, index|
    next if field_value == ''

    hash[fields[index]] = parse_raw_field_value field_value
  end

  hash
end
parse_raw_field_value(value) click to toggle source
# File lib/lightstreamer/messages/update_message.rb, line 51
def parse_raw_field_value(value)
  return '' if value == '$'
  return nil if value == '#'

  value = value[1..-1] if /^(\$|#)/.match?(value)

  decode_escape_sequences value
end
table_regexp(table_id, fields) click to toggle source
# File lib/lightstreamer/messages/update_message.rb, line 35
def table_regexp(table_id, fields)
  Regexp.new "^#{table_id},(\\d+)#{'\|(.*)' * fields.size}$"
end