Class: Ably::Models::ProtocolMessage
- Inherits:
-
Object
- Object
- Ably::Models::ProtocolMessage
- Extended by:
- Ably::Modules::Enum
- Defined in:
- 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 )
- ATTACH_FLAGS_MAPPING =
{ resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 }
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.
-
#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_channel_serial? ⇒ Boolean
- #has_local_presence_flag? ⇒ Boolean private
- #has_message_serial? ⇒ Boolean private
- #has_presence_flag? ⇒ 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 Used for validating incoming protocol messages, so no need to add unnecessary checks.
- #message_size ⇒ Object
- #params ⇒ 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
87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/ably/models/protocol_message.rb', line 87 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.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum end # @!attribute [r] logger # @api private attr_reader :logger end |
#channel ⇒ String (readonly)
Returns Channel name for messages.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum end # @!attribute [r] logger # @api private attr_reader :logger end |
#error ⇒ ErrorInfo (readonly)
Returns Contains error information.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum end # @!attribute [r] logger # @api private attr_reader :logger end |
#flags ⇒ Integer (readonly)
Returns Flags indicating special ProtocolMessage states.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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.
286 287 288 |
# File 'lib/ably/models/protocol_message.rb', line 286 def logger @logger end |
#message_serial ⇒ Bignum (readonly)
Returns Contains a serial number for a message sent from the client to the server.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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.
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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).
36 37 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 |
# File 'lib/ably/models/protocol_message.rb', line 36 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 ) ATTACH_FLAGS_MAPPING = { resume: 32, # 2^5 presence: 65536, # 2^16 publish: 131072, # 2^17 subscribe: 262144, # 2^18 presence_subscribe: 524288, # 2^19 } # 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 count [1, attributes[:count].to_i].max end # @api private def && true rescue TypeError false end def has_channel_serial? channel_serial && true rescue TypeError false 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 params @params ||= attributes[:params].to_h 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 & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 2^5 end # @api private def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 2^16 end # @api private def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 2^17 end # @api private def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 2^18 end # @api private def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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 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 # Used for validating incoming protocol messages, so no need to add unnecessary checks # @return [Boolean] # @api private def invalid? action_enum = action rescue nil !action_enum 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
77 78 79 |
# File 'lib/ably/models/protocol_message.rb', line 77 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
241 242 243 |
# File 'lib/ably/models/protocol_message.rb', line 241 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.
155 156 157 |
# File 'lib/ably/models/protocol_message.rb', line 155 def () << end |
#as_json(*args) ⇒ Object
Return a JSON ready object from the underlying #attributes using Ably naming conventions for keys
250 251 252 253 254 255 256 257 258 |
# File 'lib/ably/models/protocol_message.rb', line 250 def as_json(*args) raise TypeError, ':action is missing, cannot generate a valid Hash for ProtocolMessage' unless action 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
230 231 232 |
# File 'lib/ably/models/protocol_message.rb', line 230 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.
211 212 213 |
# File 'lib/ably/models/protocol_message.rb', line 211 def has_attach_presence_flag? flags & ATTACH_FLAGS_MAPPING[:presence] == ATTACH_FLAGS_MAPPING[:presence] # 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.
226 227 228 |
# File 'lib/ably/models/protocol_message.rb', line 226 def has_attach_presence_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:presence_subscribe] == ATTACH_FLAGS_MAPPING[:presence_subscribe] # 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.
216 217 218 |
# File 'lib/ably/models/protocol_message.rb', line 216 def has_attach_publish_flag? flags & ATTACH_FLAGS_MAPPING[:publish] == ATTACH_FLAGS_MAPPING[:publish] # 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.
206 207 208 |
# File 'lib/ably/models/protocol_message.rb', line 206 def has_attach_resume_flag? flags & ATTACH_FLAGS_MAPPING[:resume] == ATTACH_FLAGS_MAPPING[:resume] # 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.
221 222 223 |
# File 'lib/ably/models/protocol_message.rb', line 221 def has_attach_subscribe_flag? flags & ATTACH_FLAGS_MAPPING[:subscribe] == ATTACH_FLAGS_MAPPING[:subscribe] # 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.
186 187 188 |
# File 'lib/ably/models/protocol_message.rb', line 186 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.
191 192 193 |
# File 'lib/ably/models/protocol_message.rb', line 191 def has_channel_resumed_flag? flags & 4 == 4 # 2^2 end |
#has_channel_serial? ⇒ Boolean
141 142 143 144 145 |
# File 'lib/ably/models/protocol_message.rb', line 141 def has_channel_serial? channel_serial && true rescue TypeError false 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.
196 197 198 |
# File 'lib/ably/models/protocol_message.rb', line 196 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/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.
181 182 183 |
# File 'lib/ably/models/protocol_message.rb', line 181 def has_presence_flag? flags & 1 == 1 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.
201 202 203 |
# File 'lib/ably/models/protocol_message.rb', line 201 def has_transient_flag? flags & 16 == 16 # 2^4 end |
#id! ⇒ Object
105 106 107 108 |
# File 'lib/ably/models/protocol_message.rb', line 105 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 Used for validating incoming protocol messages, so no need to add unnecessary checks
279 280 281 282 |
# File 'lib/ably/models/protocol_message.rb', line 279 def invalid? action_enum = action rescue nil !action_enum end |
#message_size ⇒ Object
166 167 168 |
# File 'lib/ably/models/protocol_message.rb', line 166 def presence.map(&:size).sum + .map(&:size).sum end |
#params ⇒ Object
170 171 172 |
# File 'lib/ably/models/protocol_message.rb', line 170 def params @params ||= attributes[:params].to_h end |
#to_s ⇒ Object
260 261 262 263 264 265 266 267 268 269 270 271 272 273 |
# File 'lib/ably/models/protocol_message.rb', line 260 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 |