Class: Ably::Models::Message

Inherits:
Object
  • Object
show all
Includes:
Ably::Modules::Conversions, Ably::Modules::Encodeable, Ably::Modules::ModelCommon, Ably::Modules::SafeDeferrable
Defined in:
lib/ably/models/message.rb

Overview

Contains an individual message that is sent to, or received from, Ably.

Instance Attribute Summary

Attributes included from Ably::Modules::ModelCommon

#hash

Instance Method Summary collapse

Methods included from Ably::Modules::SafeDeferrable

#callback, #errback, #fail, #succeed

Methods included from Ably::Modules::ModelCommon

#==, #[], #as_json, included, #to_s

Methods included from Ably::Modules::MessagePack

#to_msgpack

Methods included from Ably::Modules::Encodeable

#decode, #encode, included, #original_encoding

Constructor Details

#initialize(attributes, options = {}) ⇒ Message

Ably::Models::Message initializer

Parameters:

  • attributes (Hash)

    object with the underlying message detail key value attributes

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

    an options Hash for this initializer

Options Hash (options):



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/ably/models/message.rb', line 42

def initialize(attributes, options = {})
  @logger           = options[:logger] # Logger expected for SafeDeferrable
  @protocol_message = options[:protocol_message]
  @raw_hash_object  = attributes

  set_attributes_object attributes

  self.attributes[:name] = ensure_utf_8(:name, name, allow_nil: true) if name
  self.attributes[:client_id] = ensure_utf_8(:client_id, client_id, allow_nil: true) if client_id
  self.attributes[:encoding] = ensure_utf_8(:encoding,  encoding,  allow_nil: true) if encoding

  self.attributes.freeze
end

Instance Method Details

#assign_to_protocol_message(protocol_message) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Assign this message to a ProtocolMessage before delivery to the Ably system



158
159
160
# File 'lib/ably/models/message.rb', line 158

def assign_to_protocol_message(protocol_message)
  @protocol_message = protocol_message
end

#assigned_to_protocol_message?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

True if this message is assigned to a ProtocolMessage for delivery to Ably, or received from Ably

Returns:

  • (Boolean)


167
168
169
# File 'lib/ably/models/message.rb', line 167

def assigned_to_protocol_message?
  !!@protocol_message
end

#attributesObject



132
133
134
# File 'lib/ably/models/message.rb', line 132

def attributes
  @attributes
end

#client_idString

The client ID of the publisher of this message.

Returns:

  • (String)


62
63
64
# File 'lib/ably/models/message.rb', line 62

def client_id
  attributes[:client_id]
end

#connection_idString

The connection ID of the publisher of this message.

Returns:

  • (String)


114
115
116
# File 'lib/ably/models/message.rb', line 114

def connection_id
  attributes.fetch(:connection_id) { protocol_message.connection_id if assigned_to_protocol_message? }
end

#dataHash?

The message payload, if provided.

Returns:

  • (Hash, nil)


94
95
96
# File 'lib/ably/models/message.rb', line 94

def data
  @data ||= attributes[:data].freeze
end

#delta_extrasDeltaExtras?

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Delta extras extension (TM2i)

Returns:



200
201
202
203
# File 'lib/ably/models/message.rb', line 200

def delta_extras
  return nil if attributes[:extras][:delta].nil?
  @delta_extras ||= DeltaExtras.new(attributes[:extras][:delta]).freeze
end

#encodingString

This is typically empty, as all messages received from Ably are automatically decoded client-side using this value. However, if the message encoding cannot be processed, this attribute contains the remaining transformations not applied to the data payload.

Returns:

  • (String)


74
75
76
# File 'lib/ably/models/message.rb', line 74

def encoding
  attributes[:encoding]
end

#extrasObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Contains any arbitrary key value pairs which may also contain other primitive JSON types, JSON-encodable objects or JSON-encodable arrays. The extras field is provided to contain message metadata and/or ancillary payloads in support of specific functionality, e.g. push 1.2 adds the delta extension which is of type DeltaExtras, and the headers extension, which contains arbitrary string->string key-value pairs, settable at publish time. Unless otherwise specified, the client library should not attempt to do any filtering or validation of the extras field itself, but should treat it opaquely, encoding it and passing it to realtime unaltered.



187
188
189
190
191
192
193
# File 'lib/ably/models/message.rb', line 187

def extras
  attributes[:extras].tap do |val|
    unless val.kind_of?(IdiomaticRubyWrapper) || val.kind_of?(Array) || val.kind_of?(Hash) || val.nil?
      raise ArgumentError, "extras contains an unsupported type #{val.class}"
    end
  end
end

#idString

A Unique ID assigned by Ably to this message.

Returns:

  • (String)


104
105
106
# File 'lib/ably/models/message.rb', line 104

def id
  attributes.fetch(:id) { "#{protocol_message.id!}:#{protocol_message_index}" }
end

#nameString

The event name.

Returns:

  • (String)


84
85
86
# File 'lib/ably/models/message.rb', line 84

def name
  attributes[:name]
end

#protocol_messageAbly::Models::ProtocolMessage

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

The optional ProtocolMessage this message is assigned to. If ProtocolMessage is nil, an error will be raised.

Returns:

Raises:

  • (RuntimeError)


176
177
178
179
# File 'lib/ably/models/message.rb', line 176

def protocol_message
  raise RuntimeError, 'Message is not yet published with a ProtocolMessage. ProtocolMessage is nil' if @protocol_message.nil?
  @protocol_message
end

#protocol_message_indexObject



205
206
207
# File 'lib/ably/models/message.rb', line 205

def protocol_message_index
  protocol_message.messages.map(&:object_id).index(self.object_id)
end

#sizeObject

The size is the sum over name, data, clientId, and extras in bytes (TO3l8a)



144
145
146
147
148
149
150
151
152
153
154
# File 'lib/ably/models/message.rb', line 144

def size
  %w(name data client_id extras).map do |attr|
    if (value = attributes[attr.to_sym]).is_a?(String)
      value.bytesize
    elsif value.nil?
      0
    else
      value.to_json.bytesize
    end
  end.sum
end

#timestampInteger

Timestamp of when the message was received by Ably, as milliseconds since the Unix epoch.

Returns:

  • (Integer)


124
125
126
127
128
129
130
# File 'lib/ably/models/message.rb', line 124

def timestamp
  if attributes[:timestamp]
    as_time_from_epoch(attributes[:timestamp])
  else
    protocol_message.timestamp
  end
end

#to_json(*args) ⇒ Object



136
137
138
139
140
# File 'lib/ably/models/message.rb', line 136

def to_json(*args)
  as_json(*args).tap do |message|
    decode_binary_data_before_to_json message
  end.to_json
end