ably-rest 1.0.5 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +6 -3
  3. data/CHANGELOG.md +1 -1
  4. data/LICENSE +1 -1
  5. data/README.md +26 -7
  6. data/SPEC.md +2003 -1605
  7. data/ably-rest.gemspec +4 -2
  8. data/lib/submodules/ably-ruby/.editorconfig +14 -0
  9. data/lib/submodules/ably-ruby/.travis.yml +10 -8
  10. data/lib/submodules/ably-ruby/CHANGELOG.md +97 -1
  11. data/lib/submodules/ably-ruby/LICENSE +1 -3
  12. data/lib/submodules/ably-ruby/README.md +12 -7
  13. data/lib/submodules/ably-ruby/Rakefile +32 -0
  14. data/lib/submodules/ably-ruby/SPEC.md +1277 -835
  15. data/lib/submodules/ably-ruby/ably.gemspec +17 -11
  16. data/lib/submodules/ably-ruby/lib/ably/auth.rb +34 -8
  17. data/lib/submodules/ably-ruby/lib/ably/exceptions.rb +10 -4
  18. data/lib/submodules/ably-ruby/lib/ably/logger.rb +8 -2
  19. data/lib/submodules/ably-ruby/lib/ably/models/channel_state_change.rb +1 -1
  20. data/lib/submodules/ably-ruby/lib/ably/models/connection_state_change.rb +1 -1
  21. data/lib/submodules/ably-ruby/lib/ably/models/device_details.rb +87 -0
  22. data/lib/submodules/ably-ruby/lib/ably/models/device_push_details.rb +86 -0
  23. data/lib/submodules/ably-ruby/lib/ably/models/error_info.rb +23 -2
  24. data/lib/submodules/ably-ruby/lib/ably/models/idiomatic_ruby_wrapper.rb +12 -12
  25. data/lib/submodules/ably-ruby/lib/ably/models/message.rb +6 -4
  26. data/lib/submodules/ably-ruby/lib/ably/models/presence_message.rb +6 -4
  27. data/lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb +32 -2
  28. data/lib/submodules/ably-ruby/lib/ably/models/push_channel_subscription.rb +89 -0
  29. data/lib/submodules/ably-ruby/lib/ably/modules/async_wrapper.rb +2 -2
  30. data/lib/submodules/ably-ruby/lib/ably/modules/conversions.rb +2 -2
  31. data/lib/submodules/ably-ruby/lib/ably/modules/encodeable.rb +2 -2
  32. data/lib/submodules/ably-ruby/lib/ably/modules/event_emitter.rb +2 -2
  33. data/lib/submodules/ably-ruby/lib/ably/modules/exception_codes.rb +128 -0
  34. data/lib/submodules/ably-ruby/lib/ably/modules/model_common.rb +15 -2
  35. data/lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb +1 -1
  36. data/lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb +1 -1
  37. data/lib/submodules/ably-ruby/lib/ably/modules/state_emitter.rb +5 -5
  38. data/lib/submodules/ably-ruby/lib/ably/modules/state_machine.rb +2 -2
  39. data/lib/submodules/ably-ruby/lib/ably/realtime.rb +1 -0
  40. data/lib/submodules/ably-ruby/lib/ably/realtime/auth.rb +2 -2
  41. data/lib/submodules/ably-ruby/lib/ably/realtime/channel.rb +27 -105
  42. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +4 -8
  43. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_state_machine.rb +2 -2
  44. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/publisher.rb +74 -0
  45. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/push_channel.rb +62 -0
  46. data/lib/submodules/ably-ruby/lib/ably/realtime/client.rb +91 -3
  47. data/lib/submodules/ably-ruby/lib/ably/realtime/client/incoming_message_dispatcher.rb +9 -4
  48. data/lib/submodules/ably-ruby/lib/ably/realtime/client/outgoing_message_dispatcher.rb +1 -1
  49. data/lib/submodules/ably-ruby/lib/ably/realtime/connection.rb +45 -26
  50. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_manager.rb +25 -9
  51. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/websocket_transport.rb +2 -2
  52. data/lib/submodules/ably-ruby/lib/ably/realtime/presence.rb +7 -7
  53. data/lib/submodules/ably-ruby/lib/ably/realtime/presence/members_map.rb +9 -9
  54. data/lib/submodules/ably-ruby/lib/ably/realtime/push.rb +40 -0
  55. data/lib/submodules/ably-ruby/lib/ably/realtime/push/admin.rb +61 -0
  56. data/lib/submodules/ably-ruby/lib/ably/realtime/push/channel_subscriptions.rb +108 -0
  57. data/lib/submodules/ably-ruby/lib/ably/realtime/push/device_registrations.rb +105 -0
  58. data/lib/submodules/ably-ruby/lib/ably/rest.rb +1 -0
  59. data/lib/submodules/ably-ruby/lib/ably/rest/channel.rb +54 -18
  60. data/lib/submodules/ably-ruby/lib/ably/rest/channel/push_channel.rb +62 -0
  61. data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +171 -41
  62. data/lib/submodules/ably-ruby/lib/ably/rest/middleware/parse_message_pack.rb +17 -1
  63. data/lib/submodules/ably-ruby/lib/ably/rest/presence.rb +1 -0
  64. data/lib/submodules/ably-ruby/lib/ably/rest/push.rb +42 -0
  65. data/lib/submodules/ably-ruby/lib/ably/rest/push/admin.rb +54 -0
  66. data/lib/submodules/ably-ruby/lib/ably/rest/push/channel_subscriptions.rb +121 -0
  67. data/lib/submodules/ably-ruby/lib/ably/rest/push/device_registrations.rb +103 -0
  68. data/lib/submodules/ably-ruby/lib/ably/version.rb +7 -2
  69. data/lib/submodules/ably-ruby/spec/acceptance/realtime/auth_spec.rb +253 -49
  70. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb +33 -21
  71. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb +180 -62
  72. data/lib/submodules/ably-ruby/spec/acceptance/realtime/client_spec.rb +155 -2
  73. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_failures_spec.rb +293 -13
  74. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +142 -39
  75. data/lib/submodules/ably-ruby/spec/acceptance/realtime/message_spec.rb +38 -36
  76. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_history_spec.rb +12 -3
  77. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +207 -173
  78. data/lib/submodules/ably-ruby/spec/acceptance/realtime/push_admin_spec.rb +736 -0
  79. data/lib/submodules/ably-ruby/spec/acceptance/realtime/push_spec.rb +27 -0
  80. data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +62 -51
  81. data/lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb +2 -2
  82. data/lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb +79 -4
  83. data/lib/submodules/ably-ruby/spec/acceptance/rest/channels_spec.rb +6 -0
  84. data/lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb +318 -74
  85. data/lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb +158 -6
  86. data/lib/submodules/ably-ruby/spec/acceptance/rest/push_admin_spec.rb +952 -0
  87. data/lib/submodules/ably-ruby/spec/acceptance/rest/push_spec.rb +25 -0
  88. data/lib/submodules/ably-ruby/spec/acceptance/rest/time_spec.rb +1 -1
  89. data/lib/submodules/ably-ruby/spec/run_parallel_tests +33 -0
  90. data/lib/submodules/ably-ruby/spec/shared/client_initializer_behaviour.rb +1 -9
  91. data/lib/submodules/ably-ruby/spec/spec_helper.rb +3 -1
  92. data/lib/submodules/ably-ruby/spec/support/debug_failure_helper.rb +9 -5
  93. data/lib/submodules/ably-ruby/spec/support/event_emitter_helper.rb +31 -0
  94. data/lib/submodules/ably-ruby/spec/support/event_machine_helper.rb +1 -1
  95. data/lib/submodules/ably-ruby/spec/support/test_app.rb +2 -2
  96. data/lib/submodules/ably-ruby/spec/support/test_logger_helper.rb +42 -0
  97. data/lib/submodules/ably-ruby/spec/unit/logger_spec.rb +11 -12
  98. data/lib/submodules/ably-ruby/spec/unit/models/device_details_spec.rb +102 -0
  99. data/lib/submodules/ably-ruby/spec/unit/models/device_push_details_spec.rb +101 -0
  100. data/lib/submodules/ably-ruby/spec/unit/models/error_info_spec.rb +51 -3
  101. data/lib/submodules/ably-ruby/spec/unit/models/message_spec.rb +17 -2
  102. data/lib/submodules/ably-ruby/spec/unit/models/presence_message_spec.rb +1 -1
  103. data/lib/submodules/ably-ruby/spec/unit/models/push_channel_subscription_spec.rb +86 -0
  104. data/lib/submodules/ably-ruby/spec/unit/modules/async_wrapper_spec.rb +2 -2
  105. data/lib/submodules/ably-ruby/spec/unit/modules/enum_spec.rb +1 -1
  106. data/lib/submodules/ably-ruby/spec/unit/modules/event_emitter_spec.rb +3 -3
  107. data/lib/submodules/ably-ruby/spec/unit/modules/state_emitter_spec.rb +10 -10
  108. data/lib/submodules/ably-ruby/spec/unit/realtime/channel_spec.rb +1 -1
  109. data/lib/submodules/ably-ruby/spec/unit/realtime/client_spec.rb +13 -1
  110. data/lib/submodules/ably-ruby/spec/unit/realtime/connection_spec.rb +2 -2
  111. data/lib/submodules/ably-ruby/spec/unit/realtime/presence_spec.rb +1 -1
  112. data/lib/submodules/ably-ruby/spec/unit/realtime/push_channel_spec.rb +36 -0
  113. data/lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb +30 -1
  114. data/lib/submodules/ably-ruby/spec/unit/rest/client_spec.rb +30 -0
  115. data/lib/submodules/ably-ruby/spec/unit/rest/push_channel_spec.rb +36 -0
  116. data/lib/submodules/ably-ruby/spec/unit/util/pub_sub_spec.rb +3 -3
  117. data/spec/spec_helper.rb +1 -0
  118. metadata +51 -10
@@ -144,11 +144,11 @@ module Ably::Models
144
144
  @attributes
145
145
  end
146
146
 
147
- # Takes the underlying Hash object and returns it in as a JSON ready Hash object using snakeCase for compability with the Ably service.
147
+ # Takes the underlying Hash object and returns it in as a JSON ready Hash object using camelCase for compability with the Ably service.
148
148
  # Note name clashes are ignored and will result in loss of one or more values
149
149
  # @example
150
150
  # wrapper = IdiomaticRubyWrapper({ 'mixedCase': true, mixed_case: false, 'snake_case': 1 })
151
- # wrapper.as_json({ 'mixedCase': true, 'snakeCase': 1 })
151
+ # wrapper.as_json => { 'mixedCase': true, 'snakeCase': 1 }
152
152
  def as_json(*args)
153
153
  attributes.each_with_object({}) do |key_val, new_hash|
154
154
  key = key_val[0]
@@ -161,7 +161,7 @@ module Ably::Models
161
161
  end
162
162
 
163
163
  # Converts the current wrapped mixedCase object to JSON
164
- # using mixedCase syntax as expected by the Realtime API
164
+ # using snakedCase syntax as expected by the Realtime API
165
165
  def to_json(*args)
166
166
  as_json(args).to_json
167
167
  end
@@ -170,7 +170,7 @@ module Ably::Models
170
170
  # Note name clashes are ignored and will result in loss of one or more values
171
171
  # @example
172
172
  # wrapper = IdiomaticRubyWrapper({ 'mixedCase': true, mixed_case: false, 'snake_case': 1 })
173
- # wrapper.to_hash({ mixed_case: true, snake_case: 1 })
173
+ # wrapper.to_hash => { mixed_case: true, snake_case: 1 }
174
174
  def to_hash(*args)
175
175
  each_with_object({}) do |key_val, object|
176
176
  key, val = key_val
@@ -210,14 +210,14 @@ module Ably::Models
210
210
  # key is not found in mixedCase.
211
211
  def source_key_for(symbolized_key)
212
212
  format_preferences = [
213
- proc { |key_sym| convert_to_mixed_case(key_sym) },
214
- proc { |key_sym| key_sym.to_sym },
215
- proc { |key_sym| key_sym.to_s },
216
- proc { |key_sym| convert_to_mixed_case(key_sym).to_sym },
217
- proc { |key_sym| convert_to_lower_case(key_sym) },
218
- proc { |key_sym| convert_to_lower_case(key_sym).to_sym },
219
- proc { |key_sym| convert_to_mixed_case(key_sym, force_camel: true) },
220
- proc { |key_sym| convert_to_mixed_case(key_sym, force_camel: true).to_sym }
213
+ lambda { |key_sym| convert_to_mixed_case(key_sym) },
214
+ lambda { |key_sym| key_sym.to_sym },
215
+ lambda { |key_sym| key_sym.to_s },
216
+ lambda { |key_sym| convert_to_mixed_case(key_sym).to_sym },
217
+ lambda { |key_sym| convert_to_lower_case(key_sym) },
218
+ lambda { |key_sym| convert_to_lower_case(key_sym).to_sym },
219
+ lambda { |key_sym| convert_to_mixed_case(key_sym, force_camel: true) },
220
+ lambda { |key_sym| convert_to_mixed_case(key_sym, force_camel: true).to_sym }
221
221
  ]
222
222
 
223
223
  preferred_format = format_preferences.detect do |format|
@@ -62,9 +62,11 @@ module Ably::Models
62
62
 
63
63
  set_attributes_object attributes
64
64
 
65
- ensure_utf_8 :name, name, allow_nil: true
66
- ensure_utf_8 :client_id, client_id, allow_nil: true
67
- ensure_utf_8 :encoding, encoding, allow_nil: true
65
+ self.attributes[:name] = ensure_utf_8(:name, name, allow_nil: true) if name
66
+ self.attributes[:client_id] = ensure_utf_8(:client_id, client_id, allow_nil: true) if client_id
67
+ self.attributes[:encoding] = ensure_utf_8(:encoding, encoding, allow_nil: true) if encoding
68
+
69
+ self.attributes.freeze
68
70
  end
69
71
 
70
72
  %w( name client_id encoding ).each do |attribute|
@@ -145,7 +147,7 @@ module Ably::Models
145
147
  end
146
148
 
147
149
  def set_attributes_object(new_attributes)
148
- @attributes = IdiomaticRubyWrapper(new_attributes.clone.freeze, stop_at: [:data, :extras])
150
+ @attributes = IdiomaticRubyWrapper(new_attributes.clone, stop_at: [:data, :extras])
149
151
  end
150
152
 
151
153
  def logger
@@ -69,9 +69,11 @@ module Ably::Models
69
69
 
70
70
  set_attributes_object attributes
71
71
 
72
- ensure_utf_8 :client_id, client_id, allow_nil: true
73
- ensure_utf_8 :connection_id, connection_id, allow_nil: true
74
- ensure_utf_8 :encoding, encoding, allow_nil: true
72
+ self.attributes[:client_id] = ensure_utf_8(:client_id, client_id, allow_nil: true) if client_id
73
+ self.attributes[:connection_id] = ensure_utf_8(:connection_id, connection_id, allow_nil: true) if connection_id
74
+ self.attributes[:encoding] = ensure_utf_8(:encoding, encoding, allow_nil: true) if encoding
75
+
76
+ self.attributes.freeze
75
77
  end
76
78
 
77
79
  %w( client_id data encoding ).each do |attribute|
@@ -167,7 +169,7 @@ module Ably::Models
167
169
  end
168
170
 
169
171
  def set_attributes_object(new_attributes)
170
- @attributes = IdiomaticRubyWrapper(new_attributes.clone.freeze, stop_at: [:data])
172
+ @attributes = IdiomaticRubyWrapper(new_attributes.clone, stop_at: [:data])
171
173
  end
172
174
 
173
175
  def logger
@@ -198,12 +198,42 @@ module Ably::Models
198
198
 
199
199
  # @api private
200
200
  def has_backlog_flag?
201
- flags & 2 == 2
201
+ flags & 2 == 2 # 2^1
202
202
  end
203
203
 
204
204
  # @api private
205
205
  def has_channel_resumed_flag?
206
- flags & 4 == 4
206
+ flags & 4 == 4 # 2^2
207
+ end
208
+
209
+ # @api private
210
+ def has_local_presence_flag?
211
+ flags & 8 == 8 # 2^3
212
+ end
213
+
214
+ # @api private
215
+ def has_transient_flag?
216
+ flags & 16 == 16 # 2^4
217
+ end
218
+
219
+ # @api private
220
+ def has_attach_presence_flag?
221
+ flags & 65536 == 65536 # 2^16
222
+ end
223
+
224
+ # @api private
225
+ def has_attach_publish_flag?
226
+ flags & 131072 == 131072 # 2^17
227
+ end
228
+
229
+ # @api private
230
+ def has_attach_subscribe_flag?
231
+ flags & 262144 == 262144 # 2^18
232
+ end
233
+
234
+ # @api private
235
+ def has_attach_presence_subscribe_flag?
236
+ flags & 524288 == 524288 # 2^19
207
237
  end
208
238
 
209
239
  def connection_details
@@ -0,0 +1,89 @@
1
+ module Ably::Modules
2
+ module Conversions
3
+ private
4
+ # Convert push_channel_subscription argument to a {Ably::Models::PushChannelSubscription} object
5
+ #
6
+ # @param push_channel_subscription [Ably::Models::PushChannelSubscription,Hash,nil] A device details object
7
+ #
8
+ # @return [Ably::Models::PushChannelSubscription]
9
+ def PushChannelSubscription(push_channel_subscription)
10
+ case push_channel_subscription
11
+ when Ably::Models::PushChannelSubscription
12
+ push_channel_subscription
13
+ else
14
+ Ably::Models::PushChannelSubscription.new(push_channel_subscription)
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ module Ably::Models
21
+ # An object representing a devices details, used currently for push notifications
22
+ #
23
+ # @!attribute [r] channel
24
+ # @return [String] The realtime pub/sub channel this subscription is registered to
25
+ # @!attribute [r] client_id
26
+ # @return [String] Client ID that is assigned to one or more registered push devices
27
+ # @!attribute [r] device_id
28
+ # @return [String] Unique device identifier assigned to the push device
29
+ #
30
+ class PushChannelSubscription < Ably::Exceptions::BaseAblyException
31
+ include Ably::Modules::ModelCommon
32
+
33
+ # @param hash_object [Hash,nil] Device detail attributes
34
+ #a
35
+ def initialize(hash_object = {})
36
+ @raw_hash_object = hash_object || {}
37
+ @hash_object = IdiomaticRubyWrapper(hash_object)
38
+
39
+ if !attributes[:client_id] && !attributes[:device_id]
40
+ raise ArgumentError, 'Either client_id or device_id must be provided'
41
+ end
42
+ if attributes[:client_id] && attributes[:device_id]
43
+ raise ArgumentError, 'client_id and device_id cannot both be provided, they are mutually exclusive'
44
+ end
45
+ if !attributes[:channel]
46
+ raise ArgumentError, 'channel is required'
47
+ end
48
+ end
49
+
50
+ # Constructor for channel subscription by device ID
51
+ #
52
+ # @param channel [String] the realtime pub/sub channel this subscription is registered to
53
+ # @param device_id [String] Unique device identifier assigned to the push device
54
+ #
55
+ # @return [PushChannelSubscription]
56
+ #
57
+ def self.for_device(channel, device_id)
58
+ PushChannelSubscription.new(channel: channel, device_id: device_id)
59
+ end
60
+
61
+ # Constructor for channel subscription by client ID
62
+ #
63
+ # @param channel [String] the realtime pub/sub channel this subscription is registered to
64
+ # @param client_id [String] Client ID that is assigned to one or more registered push devices
65
+ #
66
+ # @return [PushChannelSubscription]
67
+ #
68
+ def self.for_client_id(channel, client_id)
69
+ PushChannelSubscription.new(channel: channel, client_id: client_id)
70
+ end
71
+
72
+ %w(channel client_id device_id).each do |attribute|
73
+ define_method attribute do
74
+ attributes[attribute.to_sym]
75
+ end
76
+
77
+ define_method "#{attribute}=" do |val|
78
+ unless val.nil? || val.kind_of?(String)
79
+ raise ArgumentError, "#{attribute} must be nil or a string value"
80
+ end
81
+ attributes[attribute.to_sym] = val
82
+ end
83
+ end
84
+
85
+ def attributes
86
+ @hash_object
87
+ end
88
+ end
89
+ end
@@ -44,7 +44,7 @@ module Ably::Modules
44
44
  Ably::Util::SafeDeferrable.new(logger).tap do |deferrable|
45
45
  deferrable.callback(&success_callback) if success_callback
46
46
 
47
- operation_with_exception_handling = proc do
47
+ operation_with_exception_handling = lambda do
48
48
  begin
49
49
  yield
50
50
  rescue StandardError => err
@@ -57,7 +57,7 @@ module Ably::Modules
57
57
  end
58
58
  end
59
59
 
60
- complete_callback = proc do |result|
60
+ complete_callback = lambda do |result|
61
61
  deferrable.succeed result
62
62
  end
63
63
 
@@ -96,7 +96,7 @@ module Ably::Modules
96
96
  unless options[:allow_nil] && string_value.nil?
97
97
  raise ArgumentError, "#{field_name} must be a String" unless string_value.kind_of?(String)
98
98
  end
99
- string_value.encode!(Encoding::UTF_8) if string_value
99
+ string_value.encode(Encoding::UTF_8) if string_value
100
100
  rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError => e
101
101
  raise ArgumentError, "#{field_name} could not be converted to UTF-8: #{e.message}"
102
102
  end
@@ -113,7 +113,7 @@ module Ably::Modules
113
113
  payload.kind_of?(Array) ||
114
114
  payload.nil?
115
115
 
116
- raise Ably::Exceptions::UnsupportedDataType.new('Invalid data payload', 400, 40011)
116
+ raise Ably::Exceptions::UnsupportedDataType.new('Invalid data payload', 400, Ably::Exceptions::Codes::INVALID_MESSAGE_DATA_OR_ENCODING)
117
117
  end
118
118
  end
119
119
  end
@@ -27,7 +27,7 @@ module Ably::Modules
27
27
  end
28
28
 
29
29
  # Return an Array of Message or Presence objects from the encoded Array of JSON-like objects, using the optional channel options
30
- # @param message_objects [Array<Hash>] Array of JSON-like objects with encoded messages
30
+ # @param message_object_array [Array<Hash>] Array of JSON-like objects with encoded messages
31
31
  # @param channel_options [Hash] Channel options, currently reserved for Encryption options
32
32
  # @return [Array<Message,Presence>]
33
33
  def from_encoded_array(message_object_array, channel_options = {})
@@ -95,7 +95,7 @@ module Ably::Modules
95
95
 
96
96
  previous_encoding = message_attributes[:encoding]
97
97
  encoders.each do |encoder|
98
- encoder.send method, message_attributes, channel_options
98
+ encoder.public_send method, message_attributes, channel_options
99
99
  end
100
100
  end until previous_encoding == message_attributes[:encoding]
101
101
 
@@ -31,7 +31,7 @@ module Ably
31
31
  # @option options [Proc] :coerce_into A lambda/Proc that is used to coerce the event names for all events. This is useful to ensure the event names conform to a naming or type convention.
32
32
  #
33
33
  # @example
34
- # configure_event_emitter coerce_into: Proc.new { |event| event.to_sym }
34
+ # configure_event_emitter coerce_into: lambda { |event| event.to_sym }
35
35
  #
36
36
  def configure_event_emitter(options = {})
37
37
  @event_emitter_coerce_proc = options[:coerce_into]
@@ -158,7 +158,7 @@ module Ably
158
158
  # #emit automatically deletes any blocks that return true thus allowing a block to be run once
159
159
  def proc_for_block(block, options = {})
160
160
  {
161
- emit_proc: Proc.new do |*args|
161
+ emit_proc: lambda do |*args|
162
162
  block.call(*args)
163
163
  true if options[:delete_once_run]
164
164
  end,
@@ -0,0 +1,128 @@
1
+ # This file is generated by running `rake :generate_error_codes`
2
+ # Do not manually modify this file
3
+ # Generated at: 2018-09-18 18:28:58 UTC
4
+ #
5
+ module Ably
6
+ module Exceptions
7
+ module Codes
8
+ NO_ERROR = 10000
9
+ BAD_REQUEST = 40000
10
+ INVALID_REQUEST_BODY = 40001
11
+ INVALID_PARAMETER_NAME = 40002
12
+ INVALID_PARAMETER_VALUE = 40003
13
+ INVALID_HEADER = 40004
14
+ INVALID_CREDENTIAL = 40005
15
+ INVALID_CONNECTION_ID = 40006
16
+ INVALID_MESSAGE_ID = 40007
17
+ INVALID_CONTENT_LENGTH = 40008
18
+ MAXIMUM_MESSAGE_LENGTH_EXCEEDED = 40009
19
+ INVALID_CHANNEL_NAME = 40010
20
+ STALE_RING_STATE = 40011
21
+ INVALID_CLIENT_ID = 40012
22
+ INVALID_MESSAGE_DATA_OR_ENCODING = 40013
23
+ RESOURCE_DISPOSED = 40014
24
+ INVALID_DEVICE_ID = 40015
25
+ BATCH_ERROR = 40020
26
+ INVALID_PUBLISH_REQUEST_UNSPECIFIED = 40030
27
+ INVALID_PUBLISH_REQUEST_INVALID_CLIENTSPECIFIED_ID = 40031
28
+ UNAUTHORIZED = 40100
29
+ INVALID_CREDENTIALS = 40101
30
+ INCOMPATIBLE_CREDENTIALS = 40102
31
+ INVALID_USE_OF_BASIC_AUTH_OVER_NONTLS_TRANSPORT = 40103
32
+ TIMESTAMP_NOT_CURRENT = 40104
33
+ NONCE_VALUE_REPLAYED = 40105
34
+ UNABLE_TO_OBTAIN_CREDENTIALS_FROM_GIVEN_PARAMETERS = 40106
35
+ ACCOUNT_DISABLED = 40110
36
+ ACCOUNT_RESTRICTED_CONNECTION_LIMITS_EXCEEDED = 40111
37
+ ACCOUNT_BLOCKED_MESSAGE_LIMITS_EXCEEDED = 40112
38
+ ACCOUNT_BLOCKED = 40113
39
+ ACCOUNT_RESTRICTED_CHANNEL_LIMITS_EXCEEDED = 40114
40
+ APPLICATION_DISABLED = 40120
41
+ KEY_ERROR_UNSPECIFIED = 40130
42
+ KEY_REVOKED = 40131
43
+ KEY_EXPIRED = 40132
44
+ KEY_DISABLED = 40133
45
+ TOKEN_ERROR_UNSPECIFIED = 40140
46
+ TOKEN_REVOKED = 40141
47
+ TOKEN_EXPIRED = 40142
48
+ TOKEN_UNRECOGNISED = 40143
49
+ INVALID_JWT_FORMAT = 40144
50
+ INVALID_TOKEN_FORMAT = 40145
51
+ CONNECTION_BLOCKED_LIMITS_EXCEEDED = 40150
52
+ OPERATION_NOT_PERMITTED_WITH_PROVIDED_CAPABILITY = 40160
53
+ ERROR_FROM_CLIENT_TOKEN_CALLBACK = 40170
54
+ FORBIDDEN = 40300
55
+ ACCOUNT_DOES_NOT_PERMIT_TLS_CONNECTION = 40310
56
+ OPERATION_REQUIRES_TLS_CONNECTION = 40311
57
+ APPLICATION_REQUIRES_AUTHENTICATION = 40320
58
+ UNABLE_TO_ACTIVATE_ACCOUNT_DUE_TO_PLACEMENT_CONSTRAINT_UNSPECIFIED = 40330
59
+ UNABLE_TO_ACTIVATE_ACCOUNT_DUE_TO_PLACEMENT_CONSTRAINT_INCOMPATIBLE_ENVIRONMENT = 40331
60
+ UNABLE_TO_ACTIVATE_ACCOUNT_DUE_TO_PLACEMENT_CONSTRAINT_INCOMPATIBLE_SITE = 40332
61
+ NOT_FOUND = 40400
62
+ METHOD_NOT_ALLOWED = 40500
63
+ RATE_LIMIT_EXCEEDED_NONFATAL_REQUEST_REJECTED_UNSPECIFIED = 42910
64
+ MAX_PERCONNECTION_PUBLISH_RATE_LIMIT_EXCEEDED_NONFATAL_UNABLE_TO_PUBLISH_MESSAGE = 42911
65
+ RATE_LIMIT_EXCEEDED_FATAL = 42920
66
+ MAX_PERCONNECTION_PUBLISH_RATE_LIMIT_EXCEEDED_FATAL_CLOSING_CONNECTION = 42921
67
+ INTERNAL_ERROR = 50000
68
+ INTERNAL_CHANNEL_ERROR = 50001
69
+ INTERNAL_CONNECTION_ERROR = 50002
70
+ TIMEOUT_ERROR = 50003
71
+ REQUEST_FAILED_DUE_TO_OVERLOADED_INSTANCE = 50004
72
+ REACTOR_OPERATION_FAILED = 70000
73
+ REACTOR_OPERATION_FAILED_POST_OPERATION_FAILED = 70001
74
+ REACTOR_OPERATION_FAILED_POST_OPERATION_RETURNED_UNEXPECTED_CODE = 70002
75
+ REACTOR_OPERATION_FAILED_MAXIMUM_NUMBER_OF_CONCURRENT_INFLIGHT_REQUESTS_EXCEEDED = 70003
76
+ EXCHANGE_ERROR_UNSPECIFIED = 71000
77
+ FORCED_REATTACHMENT_DUE_TO_PERMISSIONS_CHANGE = 71001
78
+ EXCHANGE_PUBLISHER_ERROR_UNSPECIFIED = 71100
79
+ NO_SUCH_PUBLISHER = 71101
80
+ PUBLISHER_NOT_ENABLED_AS_AN_EXCHANGE_PUBLISHER = 71102
81
+ EXCHANGE_PRODUCT_ERROR_UNSPECIFIED = 71200
82
+ NO_SUCH_PRODUCT = 71201
83
+ PRODUCT_DISABLED = 71202
84
+ NO_SUCH_CHANNEL_IN_THIS_PRODUCT = 71203
85
+ EXCHANGE_SUBSCRIPTION_ERROR_UNSPECIFIED = 71300
86
+ SUBSCRIPTION_DISABLED = 71301
87
+ REQUESTER_HAS_NO_SUBSCRIPTION_TO_THIS_PRODUCT = 71302
88
+ CONNECTION_FAILED = 80000
89
+ CONNECTION_FAILED_NO_COMPATIBLE_TRANSPORT = 80001
90
+ CONNECTION_SUSPENDED = 80002
91
+ DISCONNECTED = 80003
92
+ ALREADY_CONNECTED = 80004
93
+ INVALID_CONNECTION_ID_REMOTE_NOT_FOUND = 80005
94
+ UNABLE_TO_RECOVER_CONNECTION_MESSAGES_EXPIRED = 80006
95
+ UNABLE_TO_RECOVER_CONNECTION_MESSAGE_LIMIT_EXCEEDED = 80007
96
+ UNABLE_TO_RECOVER_CONNECTION_CONNECTION_EXPIRED = 80008
97
+ CONNECTION_NOT_ESTABLISHED_NO_TRANSPORT_HANDLE = 80009
98
+ INVALID_OPERATION_INVALID_TRANSPORT_HANDLE = 80010
99
+ UNABLE_TO_RECOVER_CONNECTION_INCOMPATIBLE_AUTH_PARAMS = 80011
100
+ UNABLE_TO_RECOVER_CONNECTION_INVALID_OR_UNSPECIFIED_CONNECTION_SERIAL = 80012
101
+ PROTOCOL_ERROR = 80013
102
+ CONNECTION_TIMED_OUT = 80014
103
+ INCOMPATIBLE_CONNECTION_PARAMETERS = 80015
104
+ OPERATION_ON_SUPERSEDED_TRANSPORT = 80016
105
+ CONNECTION_CLOSED = 80017
106
+ INVALID_CONNECTION_ID_INVALID_FORMAT = 80018
107
+ CLIENT_CONFIGURED_AUTHENTICATION_PROVIDER_REQUEST_FAILED = 80019
108
+ CONTINUITY_LOSS_DUE_TO_MAXIMUM_SUBSCRIBE_MESSAGE_RATE_EXCEEDED = 80020
109
+ CLIENT_RESTRICTION_NOT_SATISFIED = 80030
110
+ CHANNEL_OPERATION_FAILED = 90000
111
+ CHANNEL_OPERATION_FAILED_INVALID_CHANNEL_STATE = 90001
112
+ CHANNEL_OPERATION_FAILED_EPOCH_EXPIRED_OR_NEVER_EXISTED = 90002
113
+ UNABLE_TO_RECOVER_CHANNEL_MESSAGES_EXPIRED = 90003
114
+ UNABLE_TO_RECOVER_CHANNEL_MESSAGE_LIMIT_EXCEEDED = 90004
115
+ UNABLE_TO_RECOVER_CHANNEL_NO_MATCHING_EPOCH = 90005
116
+ UNABLE_TO_RECOVER_CHANNEL_UNBOUNDED_REQUEST = 90006
117
+ CHANNEL_OPERATION_FAILED_NO_RESPONSE_FROM_SERVER = 90007
118
+ MAXIMUM_NUMBER_OF_CHANNELS_PER_CONNECTION_EXCEEDED = 90010
119
+ UNABLE_TO_ENTER_PRESENCE_CHANNEL_NO_CLIENTID = 91000
120
+ UNABLE_TO_ENTER_PRESENCE_CHANNEL_INVALID_CHANNEL_STATE = 91001
121
+ UNABLE_TO_LEAVE_PRESENCE_CHANNEL_THAT_IS_NOT_ENTERED = 91002
122
+ UNABLE_TO_ENTER_PRESENCE_CHANNEL_MAXIMUM_MEMBER_LIMIT_EXCEEDED = 91003
123
+ UNABLE_TO_AUTOMATICALLY_REENTER_PRESENCE_CHANNEL = 91004
124
+ PRESENCE_STATE_IS_OUT_OF_SYNC = 91005
125
+ MEMBER_IMPLICITLY_LEFT_PRESENCE_CHANNEL_CONNECTION_CLOSED = 91100
126
+ end
127
+ end
128
+ end
@@ -42,10 +42,23 @@ module Ably::Modules
42
42
  attributes.hash
43
43
  end
44
44
 
45
+ def to_s
46
+ representation = attributes.map do |key, val|
47
+ if val.nil?
48
+ nil
49
+ else
50
+ val_str = val.to_s
51
+ val_str = "#{val_str[0...80]}..." if val_str.length > 80
52
+ "#{key}=#{val_str}"
53
+ end
54
+ end
55
+ "<#{self.class.name}: #{representation.compact.join(', ')}>"
56
+ end
57
+
45
58
  module ClassMethods
46
59
  # Return a new instance of this object using the provided JSON-like object or JSON string
47
- # @param [Hash, String] JSON-like object or JSON string
48
- # @return a new instance o this object
60
+ # @param json_like_object [Hash, String] JSON-like object or JSON string
61
+ # @return a new instance to this object
49
62
  def from_json(json_like_object)
50
63
  if json_like_object.kind_of?(String)
51
64
  new(JSON.parse(json_like_object))