Class: Ably::Models::ProtocolMessage
- Inherits:
-
Object
- Object
- Ably::Models::ProtocolMessage
- Extended by:
- Ably::Modules::Enum
- Defined in:
- lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb
Overview
A message sent and received over the Realtime protocol. A ProtocolMessage always relates to a single channel only, but can contain multiple individual Messages or PresenceMessages. ProtocolMessages are serially numbered on a connection. See the / Ably client library developer documentation for further details on the members of a ProtocolMessage
Constant Summary collapse
- ACTION =
Actions which are sent by the Ably Realtime API
The values correspond to the ints which the API understands.
ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 )
Instance Attribute Summary collapse
-
#action ⇒ ACTION
readonly
Protocol Message action Ably::Modules::Enum from list of ACTION.
-
#attributes ⇒ Hash
readonly
Access the protocol message Hash object ruby'fied to use symbolized keys.
-
#auth ⇒ Ably::Models::AuthDetails
readonly
Authentication details used to perform authentication upgrades over an existing transport.
-
#channel ⇒ String
readonly
Channel name for messages.
-
#channel_serial ⇒ String
readonly
Contains a serial number for a message on the current channel.
-
#connection_id ⇒ String
readonly
Contains a string private connection key used to recover this connection.
-
#connection_serial ⇒ Bignum
readonly
Contains a serial number for a message sent from the server to the client.
-
#count ⇒ Integer
readonly
The count field is used for ACK and NACK actions.
-
#error ⇒ ErrorInfo
readonly
Contains error information.
-
#flags ⇒ Integer
readonly
Flags indicating special ProtocolMessage states.
- #logger ⇒ Object readonly private
-
#message_serial ⇒ Bignum
readonly
Contains a serial number for a message sent from the client to the server.
-
#messages ⇒ Array<Message>
readonly
A ProtocolMessage with a `:message` action contains one or more messages belonging to the channel.
-
#presence ⇒ Array<PresenceMessage>
readonly
A ProtocolMessage with a `:presence` action contains one or more presence updates belonging to the channel.
-
#timestamp ⇒ Time
readonly
An optional timestamp, applied by the service in messages sent to the client, to indicate the system time at which the message was sent (milliseconds past epoch).
Attributes included from Ably::Modules::ModelCommon
Class Method Summary collapse
-
.ack_required?(for_action) ⇒ Boolean
private
Indicates this protocol message action will generate an ACK response such as :message or :presence.
Instance Method Summary collapse
-
#ack_required? ⇒ Boolean
private
Indicates this protocol message will generate an ACK response when sent Examples of protocol messages required ACK include :message and :presence.
- #add_message(message) ⇒ Object private
-
#as_json(*args) ⇒ Object
Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys.
- #connection_details ⇒ Object
- #has_attach_presence_flag? ⇒ Boolean private
- #has_attach_presence_subscribe_flag? ⇒ Boolean private
- #has_attach_publish_flag? ⇒ Boolean private
- #has_attach_resume_flag? ⇒ Boolean private
- #has_attach_subscribe_flag? ⇒ Boolean private
- #has_backlog_flag? ⇒ Boolean private
- #has_channel_resumed_flag? ⇒ Boolean private
- #has_connection_serial? ⇒ Boolean private
- #has_correct_message_size? ⇒ Boolean
- #has_local_presence_flag? ⇒ Boolean private
- #has_message_serial? ⇒ Boolean private
- #has_presence_flag? ⇒ Boolean private
- #has_serial? ⇒ Boolean private
- #has_transient_flag? ⇒ Boolean private
- #id! ⇒ Object
-
#initialize(hash_object, options = {}) ⇒ ProtocolMessage
constructor
ProtocolMessage initializer.
-
#invalid? ⇒ Boolean
private
True if the ProtocolMessage appears to be invalid, however this is not a guarantee.
- #message_size ⇒ Object
- #serial ⇒ Object
- #to_s ⇒ Object
Methods included from Ably::Modules::SafeDeferrable
#callback, #errback, #fail, #succeed
Methods included from Ably::Modules::Encodeable
#decode, #encode, included, #original_encoding
Methods included from Ably::Modules::ModelCommon
Methods included from Ably::Modules::MessagePack
Constructor Details
#initialize(hash_object, options = {}) ⇒ ProtocolMessage
Ably::Models::ProtocolMessage initializer
81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 81 def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end |
Instance Attribute Details
#action ⇒ ACTION (readonly)
Returns Protocol Message action Ably::Modules::Enum from list of ACTION. Returns nil if action is unsupported by protocol.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#attributes ⇒ Hash (readonly)
Returns Access the protocol message Hash object ruby'fied to use symbolized keys.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#auth ⇒ Ably::Models::AuthDetails (readonly)
Returns Authentication details used to perform authentication upgrades over an existing transport.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#channel ⇒ String (readonly)
Returns Channel name for messages.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#channel_serial ⇒ String (readonly)
Returns Contains a serial number for a message on the current channel.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#connection_id ⇒ String (readonly)
Returns Contains a string private connection key used to recover this connection.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#connection_serial ⇒ Bignum (readonly)
Returns Contains a serial number for a message sent from the server to the client.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#count ⇒ Integer (readonly)
Returns The count field is used for ACK and NACK actions. See message acknowledgement protocol.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#error ⇒ ErrorInfo (readonly)
Returns Contains error information.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#flags ⇒ Integer (readonly)
Returns Flags indicating special ProtocolMessage states.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#logger ⇒ Object (readonly)
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.
300 301 302 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 300 def logger @logger end |
#message_serial ⇒ Bignum (readonly)
Returns Contains a serial number for a message sent from the client to the server.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#messages ⇒ Array<Message> (readonly)
Returns A Ably::Models::ProtocolMessage with a `:message` action contains one or more messages belonging to the channel.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#presence ⇒ Array<PresenceMessage> (readonly)
Returns A Ably::Models::ProtocolMessage with a `:presence` action contains one or more presence updates belonging to the channel.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
#timestamp ⇒ Time (readonly)
Returns An optional timestamp, applied by the service in messages sent to the client, to indicate the system time at which the message was sent (milliseconds past epoch).
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 38 class ProtocolMessage include Ably::Modules::ModelCommon include Ably::Modules::Encodeable include Ably::Modules::SafeDeferrable if defined?(Ably::Realtime) extend Ably::Modules::Enum # Actions which are sent by the Ably Realtime API # # The values correspond to the ints which the API # understands. ACTION = ruby_enum('ACTION', heartbeat: 0, ack: 1, nack: 2, connect: 3, connected: 4, disconnect: 5, disconnected: 6, close: 7, closed: 8, error: 9, attach: 10, attached: 11, detach: 12, detached: 13, presence: 14, message: 15, sync: 16, auth: 17 ) # Indicates this protocol message action will generate an ACK response such as :message or :presence # @api private def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end # {ProtocolMessage} initializer # # @param hash_object [Hash] object with the underlying protocol message data # @param [Hash] options an options Hash for this initializer # @option options [Logger] :logger An optional Logger to be used by {Ably::Modules::SafeDeferrable} if an exception is caught in a callback # def initialize(hash_object, = {}) @logger = [:logger] # Logger expected for SafeDeferrable @raw_hash_object = hash_object @hash_object = IdiomaticRubyWrapper(@raw_hash_object.clone) raise ArgumentError, 'Invalid ProtocolMessage, action cannot be nil' if @hash_object[:action].nil? @hash_object[:action] = ACTION(@hash_object[:action]).to_i unless @hash_object[:action].kind_of?(Integer) @hash_object.freeze end %w(id channel channel_serial connection_id).each do |attribute| define_method attribute do attributes[attribute.to_sym] end end def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end def action ACTION(attributes[:action]) rescue KeyError raise KeyError, "Action '#{attributes[:action]}' is not supported by ProtocolMessage" end def error @error ||= ErrorInfo.new(attributes[:error]) if attributes[:error] end def as_time_from_epoch(attributes[:timestamp]) if attributes[:timestamp] end def Integer(attributes[:msg_serial]) rescue TypeError raise TypeError, "msg_serial '#{attributes[:msg_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def connection_serial Integer(attributes[:connection_serial]) rescue TypeError raise TypeError, "connection_serial '#{attributes[:connection_serial]}' is invalid, a positive Integer is expected for a ProtocolMessage" end def count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end # @api private def has_connection_serial? connection_serial && true rescue TypeError false end def serial if has_connection_serial? connection_serial else end end # @api private def has_serial? has_connection_serial? || end def @messages ||= Array(attributes[:messages]).map do || Ably::Models.Message(, protocol_message: self) end end # @api private def () << end def presence @presence ||= Array(attributes[:presence]).map do || Ably::Models.PresenceMessage(, protocol_message: self) end end def presence.map(&:size).sum + .map(&:size).sum end def <= connection_details. end def flags Integer(attributes[:flags]) rescue TypeError 0 end # @api private def has_presence_flag? flags & 1 == 1 end # @api private def has_backlog_flag? flags & 2 == 2 # 2^1 end # @api private def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end # @api private def has_local_presence_flag? flags & 8 == 8 # 2^3 end # @api private def has_transient_flag? flags & 16 == 16 # 2^4 end # @api private def has_attach_resume_flag? flags & 32 == 32 # 2^5 end # @api private def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end # @api private def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end # @api private def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end def auth @auth ||= Ably::Models::AuthDetails(attributes[:auth]) end # Indicates this protocol message will generate an ACK response when sent # Examples of protocol messages required ACK include :message and :presence # @api private def ack_required? self.class.ack_required?(action) end def attributes @hash_object end # Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end # True if the ProtocolMessage appears to be invalid, however this is not a guarantee # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end # @!attribute [r] logger # @api private attr_reader :logger end |
Class Method Details
.ack_required?(for_action) ⇒ 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.
Indicates this protocol message action will generate an ACK response such as :message or :presence
71 72 73 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 71 def self.ack_required?(for_action) ACTION(for_action).match_any?(ACTION.Presence, ACTION.Message) end |
Instance Method Details
#ack_required? ⇒ 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.
Indicates this protocol message will generate an ACK response when sent Examples of protocol messages required ACK include :message and :presence
255 256 257 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 255 def ack_required? self.class.ack_required?(action) end |
#add_message(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.
169 170 171 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 169 def () << end |
#as_json(*args) ⇒ Object
Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys
264 265 266 267 268 269 270 271 272 273 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 264 def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action raise TypeError, ':msg_serial or :connection_serial is missing, cannot generate a valid Hash for ProtocolMessage' if ack_required? && !has_serial? attributes.dup.tap do |hash_object| hash_object['action'] = action.to_i hash_object['messages'] = .map(&:as_json) unless .empty? hash_object['presence'] = presence.map(&:as_json) unless presence.empty? end.as_json end |
#connection_details ⇒ Object
244 245 246 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 244 def connection_details @connection_details ||= Ably::Models::ConnectionDetails(attributes[:connection_details]) end |
#has_attach_presence_flag? ⇒ 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.
225 226 227 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 225 def has_attach_presence_flag? flags & 65536 == 65536 # 2^16 end |
#has_attach_presence_subscribe_flag? ⇒ 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.
240 241 242 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 240 def has_attach_presence_subscribe_flag? flags & 524288 == 524288 # 2^19 end |
#has_attach_publish_flag? ⇒ 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.
230 231 232 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 230 def has_attach_publish_flag? flags & 131072 == 131072 # 2^17 end |
#has_attach_resume_flag? ⇒ 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.
220 221 222 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 220 def has_attach_resume_flag? flags & 32 == 32 # 2^5 end |
#has_attach_subscribe_flag? ⇒ 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.
235 236 237 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 235 def has_attach_subscribe_flag? flags & 262144 == 262144 # 2^18 end |
#has_backlog_flag? ⇒ 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.
200 201 202 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 200 def has_backlog_flag? flags & 2 == 2 # 2^1 end |
#has_channel_resumed_flag? ⇒ 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.
205 206 207 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 205 def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end |
#has_connection_serial? ⇒ 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.
142 143 144 145 146 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 142 def has_connection_serial? connection_serial && true rescue TypeError false end |
#has_correct_message_size? ⇒ Boolean
184 185 186 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 184 def <= connection_details. end |
#has_local_presence_flag? ⇒ 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.
210 211 212 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 210 def has_local_presence_flag? flags & 8 == 8 # 2^3 end |
#has_message_serial? ⇒ 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.
135 136 137 138 139 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 135 def && true rescue TypeError false end |
#has_presence_flag? ⇒ 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.
195 196 197 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 195 def has_presence_flag? flags & 1 == 1 end |
#has_serial? ⇒ 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.
157 158 159 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 157 def has_serial? has_connection_serial? || end |
#has_transient_flag? ⇒ 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.
215 216 217 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 215 def has_transient_flag? flags & 16 == 16 # 2^4 end |
#id! ⇒ Object
99 100 101 102 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 99 def id! raise RuntimeError, 'ProtocolMessage #id is nil' unless id id end |
#invalid? ⇒ 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 the ProtocolMessage appears to be invalid, however this is not a guarantee
293 294 295 296 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 293 def invalid? action_enum = action rescue nil !action_enum || (ack_required? && !has_serial?) end |
#message_size ⇒ Object
180 181 182 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 180 def presence.map(&:size).sum + .map(&:size).sum end |
#serial ⇒ Object
148 149 150 151 152 153 154 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 148 def serial if has_connection_serial? connection_serial else end end |
#to_s ⇒ Object
275 276 277 278 279 280 281 282 283 284 285 286 287 288 |
# File 'lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb', line 275 def to_s json_hash = as_json # Decode any binary data to before converting to a JSON string representation %w(messages presence).each do || if json_hash[] && !json_hash[].empty? json_hash[].each do || decode_binary_data_before_to_json end end end json_hash.to_json end |