ably 0.8.7 → 0.8.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +61 -3
  3. data/ably.gemspec +1 -1
  4. data/lib/ably/auth.rb +12 -3
  5. data/lib/ably/logger.rb +3 -1
  6. data/lib/ably/models/connection_details.rb +2 -1
  7. data/lib/ably/models/idiomatic_ruby_wrapper.rb +1 -1
  8. data/lib/ably/models/message.rb +4 -2
  9. data/lib/ably/models/message_encoders/cipher.rb +2 -2
  10. data/lib/ably/models/paginated_result.rb +27 -1
  11. data/lib/ably/models/presence_message.rb +3 -1
  12. data/lib/ably/models/{stat.rb → stats.rb} +5 -3
  13. data/lib/ably/modules/async_wrapper.rb +1 -1
  14. data/lib/ably/modules/channels_collection.rb +11 -1
  15. data/lib/ably/modules/enum.rb +18 -2
  16. data/lib/ably/modules/event_emitter.rb +3 -3
  17. data/lib/ably/modules/safe_deferrable.rb +1 -1
  18. data/lib/ably/modules/safe_yield.rb +2 -2
  19. data/lib/ably/modules/state_emitter.rb +8 -8
  20. data/lib/ably/modules/statesman_monkey_patch.rb +2 -2
  21. data/lib/ably/modules/uses_state_machine.rb +4 -2
  22. data/lib/ably/realtime.rb +1 -0
  23. data/lib/ably/realtime/auth.rb +6 -2
  24. data/lib/ably/realtime/channel.rb +6 -4
  25. data/lib/ably/realtime/channel/channel_manager.rb +7 -1
  26. data/lib/ably/realtime/client.rb +7 -12
  27. data/lib/ably/realtime/client/incoming_message_dispatcher.rb +9 -2
  28. data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +7 -1
  29. data/lib/ably/realtime/connection.rb +19 -8
  30. data/lib/ably/realtime/connection/connection_manager.rb +16 -9
  31. data/lib/ably/realtime/connection/websocket_transport.rb +12 -3
  32. data/lib/ably/realtime/presence.rb +6 -6
  33. data/lib/ably/realtime/presence/members_map.rb +21 -7
  34. data/lib/ably/rest/channel.rb +8 -8
  35. data/lib/ably/rest/client.rb +1 -1
  36. data/lib/ably/rest/middleware/exceptions.rb +3 -1
  37. data/lib/ably/rest/presence.rb +4 -4
  38. data/lib/ably/version.rb +1 -1
  39. data/spec/acceptance/realtime/channel_history_spec.rb +4 -4
  40. data/spec/acceptance/realtime/connection_failures_spec.rb +2 -4
  41. data/spec/acceptance/realtime/connection_spec.rb +46 -8
  42. data/spec/acceptance/realtime/presence_spec.rb +49 -34
  43. data/spec/acceptance/rest/auth_spec.rb +1 -1
  44. data/spec/acceptance/rest/base_spec.rb +1 -1
  45. data/spec/shared/safe_deferrable_behaviour.rb +4 -4
  46. data/spec/unit/models/message_encoders/cipher_spec.rb +1 -1
  47. data/spec/unit/models/token_details_spec.rb +20 -18
  48. data/spec/unit/modules/event_emitter_spec.rb +2 -2
  49. data/spec/unit/modules/state_emitter_spec.rb +6 -6
  50. data/spec/unit/realtime/channel_spec.rb +4 -4
  51. data/spec/unit/realtime/connection_spec.rb +1 -1
  52. data/spec/unit/realtime/presence_spec.rb +5 -5
  53. metadata +5 -5
@@ -98,11 +98,20 @@ module Ably::Realtime
98
98
  end
99
99
 
100
100
  private
101
- attr_reader :connection, :driver, :reason_closed
101
+ def driver
102
+ @driver
103
+ end
104
+
105
+ def connection
106
+ @connection
107
+ end
108
+
109
+ def reason_closed
110
+ @reason_closed
111
+ end
102
112
 
103
113
  # Send object down the WebSocket driver connection as a serialized string/byte array based on protocol
104
114
  # @param [Object] object to serialize and send to the WebSocket driver
105
- # @api public
106
115
  def send_object(object)
107
116
  case client.protocol
108
117
  when :json
@@ -122,7 +131,7 @@ module Ably::Realtime
122
131
  end
123
132
 
124
133
  def clear_timer
125
- if @timer
134
+ if defined?(@timer) && @timer
126
135
  @timer.cancel
127
136
  @timer = nil
128
137
  end
@@ -250,11 +250,11 @@ module Ably::Realtime
250
250
  ensure_channel_attached(deferrable) do
251
251
  members.get(options).tap do |members_map_deferrable|
252
252
  members_map_deferrable.callback do |*args|
253
- safe_yield block, *args if block_given?
254
- deferrable.succeed *args
253
+ safe_yield(block, *args) if block_given?
254
+ deferrable.succeed(*args)
255
255
  end
256
256
  members_map_deferrable.errback do |*args|
257
- deferrable.fail *args
257
+ deferrable.fail(*args)
258
258
  end
259
259
  end
260
260
  end
@@ -426,14 +426,14 @@ module Ably::Realtime
426
426
  end
427
427
 
428
428
  def deferrable_succeed(deferrable, *args, &block)
429
- safe_yield block, self, *args if block_given?
429
+ safe_yield(block, self, *args) if block_given?
430
430
  EventMachine.next_tick { deferrable.succeed self, *args } # allow callback to be added to the returned Deferrable before calling succeed
431
431
  deferrable
432
432
  end
433
433
 
434
434
  def deferrable_fail(deferrable, *args, &block)
435
- safe_yield block, *args if block_given?
436
- EventMachine.next_tick { deferrable.fail *args } # allow errback to be added to the returned Deferrable
435
+ safe_yield(block, *args) if block_given?
436
+ EventMachine.next_tick { deferrable.fail(*args) } # allow errback to be added to the returned Deferrable
437
437
  deferrable
438
438
  end
439
439
 
@@ -99,12 +99,12 @@ module Ably::Realtime
99
99
  end
100
100
 
101
101
  reset_callbacks = proc do
102
- off &in_sync_callback
103
- off &failed_callback
104
- channel.off &failed_callback
102
+ off(&in_sync_callback)
103
+ off(&failed_callback)
104
+ channel.off(&failed_callback)
105
105
  end
106
106
 
107
- once :in_sync, &in_sync_callback
107
+ once(:in_sync, &in_sync_callback)
108
108
 
109
109
  once(:failed, &failed_callback)
110
110
  channel.unsafe_once(:detaching, :detached, :failed) do |error_reason|
@@ -131,7 +131,21 @@ module Ably::Realtime
131
131
  end
132
132
 
133
133
  private
134
- attr_reader :members, :sync_serial, :presence, :absent_member_cleanup_queue
134
+ def members
135
+ @members
136
+ end
137
+
138
+ def sync_serial
139
+ @sync_serial
140
+ end
141
+
142
+ def presence
143
+ @presence
144
+ end
145
+
146
+ def absent_member_cleanup_queue
147
+ @absent_member_cleanup_queue
148
+ end
135
149
 
136
150
  def channel
137
151
  presence.channel
@@ -156,9 +170,9 @@ module Ably::Realtime
156
170
  end
157
171
 
158
172
  resume_sync_proc = method(:resume_sync).to_proc
159
- connection.on_resume &resume_sync_proc
173
+ connection.on_resume(&resume_sync_proc)
160
174
  once(:in_sync, :failed) do
161
- connection.off_resume &resume_sync_proc
175
+ connection.off_resume(&resume_sync_proc)
162
176
  end
163
177
 
164
178
  once(:in_sync) do
@@ -65,15 +65,15 @@ module Ably
65
65
  end
66
66
 
67
67
  payload = messages.map do |message|
68
- Ably::Models::Message(message.dup).tap do |message|
69
- message.encode self
68
+ Ably::Models::Message(message.dup).tap do |msg|
69
+ msg.encode self
70
70
 
71
- next if message.client_id.nil?
72
- if message.client_id == '*'
71
+ next if msg.client_id.nil?
72
+ if msg.client_id == '*'
73
73
  raise Ably::Exceptions::IncompatibleClientId.new('Wildcard client_id is reserved and cannot be used when publishing messages', 400, 40012)
74
74
  end
75
- unless client.auth.can_assume_client_id?(message.client_id)
76
- raise Ably::Exceptions::IncompatibleClientId.new("Cannot publish with client_id '#{message.client_id}' as it is incompatible with the current configured client_id '#{client.client_id}'", 400, 40012)
75
+ unless client.auth.can_assume_client_id?(msg.client_id)
76
+ raise Ably::Exceptions::IncompatibleClientId.new("Cannot publish with client_id '#{msg.client_id}' as it is incompatible with the current configured client_id '#{client.client_id}'", 400, 40012)
77
77
  end
78
78
  end.as_json
79
79
  end
@@ -111,8 +111,8 @@ module Ably
111
111
  response = client.get(url, options)
112
112
 
113
113
  Ably::Models::PaginatedResult.new(response, url, client, paginated_options) do |message|
114
- message.tap do |message|
115
- decode_message message
114
+ message.tap do |msg|
115
+ decode_message msg
116
116
  end
117
117
  end
118
118
  end
@@ -315,7 +315,7 @@ module Ably
315
315
  #
316
316
  # @api private
317
317
  def fallback_connection
318
- unless @fallback_connections
318
+ unless defined?(@fallback_connections) && @fallback_connections
319
319
  @fallback_connections = Ably::FALLBACK_HOSTS.shuffle.map { |host| Faraday.new(endpoint_for_host(host).to_s, connection_options) }
320
320
  end
321
321
  @fallback_index ||= 0
@@ -7,6 +7,8 @@ module Ably
7
7
  # HTTP exceptions raised by Ably due to an error status code
8
8
  # Ably returns JSON/Msgpack error codes and messages so include this if possible in the exception messages
9
9
  class Exceptions < Faraday::Response::Middleware
10
+ TOKEN_EXPIRED_CODE = 40140..40149
11
+
10
12
  def on_complete(env)
11
13
  if env.status >= 400
12
14
  error_status_code = env.status
@@ -30,7 +32,7 @@ module Ably
30
32
 
31
33
  if env.status >= 500
32
34
  raise Ably::Exceptions::ServerError.new(message, error_status_code, error_code)
33
- elsif env.status == 401 && error_code == 40140
35
+ elsif env.status == 401 && TOKEN_EXPIRED_CODE.include?(error_code)
34
36
  raise Ably::Exceptions::TokenExpired.new(message, error_status_code, error_code)
35
37
  else
36
38
  raise Ably::Exceptions::InvalidRequest.new(message, error_status_code, error_code)
@@ -40,8 +40,8 @@ module Ably
40
40
  response = client.get(base_path, options)
41
41
 
42
42
  Ably::Models::PaginatedResult.new(response, base_path, client, paginated_options) do |presence_message|
43
- presence_message.tap do |presence_message|
44
- decode_message presence_message
43
+ presence_message.tap do |message|
44
+ decode_message message
45
45
  end
46
46
  end
47
47
  end
@@ -74,8 +74,8 @@ module Ably
74
74
  response = client.get(url, options)
75
75
 
76
76
  Ably::Models::PaginatedResult.new(response, url, client, paginated_options) do |presence_message|
77
- presence_message.tap do |presence_message|
78
- decode_message presence_message
77
+ presence_message.tap do |message|
78
+ decode_message message
79
79
  end
80
80
  end
81
81
  end
@@ -1,3 +1,3 @@
1
1
  module Ably
2
- VERSION = '0.8.7'
2
+ VERSION = '0.8.8'
3
3
  end
@@ -19,7 +19,7 @@ describe Ably::Realtime::Channel, '#history', :event_machine do
19
19
  let(:options) { { :protocol => :json } }
20
20
 
21
21
  it 'returns a SafeDeferrable that catches exceptions in callbacks and logs them' do
22
- channel.publish('event', payload) do |message|
22
+ channel.publish('event', payload) do
23
23
  history = channel.history
24
24
  expect(history).to be_a(Ably::Util::SafeDeferrable)
25
25
  history.callback do |page|
@@ -32,7 +32,7 @@ describe Ably::Realtime::Channel, '#history', :event_machine do
32
32
 
33
33
  context 'with a single client publishing and receiving' do
34
34
  it 'retrieves realtime history' do
35
- channel.publish('event', payload) do |message|
35
+ channel.publish('event', payload) do
36
36
  channel.history do |page|
37
37
  expect(page.items.length).to eql(1)
38
38
  expect(page.items[0].data).to eql(payload)
@@ -44,8 +44,8 @@ describe Ably::Realtime::Channel, '#history', :event_machine do
44
44
 
45
45
  context 'with two clients publishing messages on the same channel' do
46
46
  it 'retrieves realtime history on both channels' do
47
- channel.publish('event', payload) do |message|
48
- channel2.publish('event', payload) do |message|
47
+ channel.publish('event', payload) do
48
+ channel2.publish('event', payload) do
49
49
  channel.history do |page|
50
50
  expect(page.items.length).to eql(2)
51
51
  expect(page.items.map(&:data).uniq).to eql([payload])
@@ -481,8 +481,6 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
481
481
  end
482
482
 
483
483
  it 'retains channel subscription state' do
484
- messages_received = false
485
-
486
484
  channel.subscribe('event') do |message|
487
485
  expect(message.data).to eql('message')
488
486
  stop_reactor
@@ -712,6 +710,7 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
712
710
  context 'when the Internet is up' do
713
711
  before do
714
712
  allow(connection).to receive(:internet_up?).and_yield(true)
713
+ @suspended = 0
715
714
  end
716
715
 
717
716
  it 'uses a fallback host on every subsequent disconnected attempt until suspended' do
@@ -740,14 +739,13 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
740
739
  expect(host).to eql(expected_host)
741
740
  else
742
741
  expect(custom_hosts).to include(host)
743
- fallback_hosts_used << host if @suspended
742
+ fallback_hosts_used << host if @suspended > 0
744
743
  end
745
744
  request += 1
746
745
  raise EventMachine::ConnectionError
747
746
  end
748
747
 
749
748
  connection.on(:suspended) do
750
- @suspended ||= 0
751
749
  @suspended += 1
752
750
 
753
751
  if @suspended > 3
@@ -141,7 +141,7 @@ describe Ably::Realtime::Connection, :event_machine do
141
141
  started_at = Time.now.to_f
142
142
  connection.once(:disconnected) do
143
143
  connection.once(:disconnected) do |connection_state_change|
144
- expect(connection_state_change.reason.code).to eql(40140) # token expired
144
+ expect(connection_state_change.reason.code).to eql(40142) # token expired
145
145
  expect(Time.now.to_f - started_at).to be < 1000
146
146
  expect(auth_requests.count).to eql(2)
147
147
  stop_reactor
@@ -156,7 +156,7 @@ describe Ably::Realtime::Connection, :event_machine do
156
156
  started_at = Time.now.to_f
157
157
  disconnect_count = 0
158
158
  connection.on(:disconnected) do |connection_state_change|
159
- expect(connection_state_change.reason.code).to eql(40140) # token expired
159
+ expect(connection_state_change.reason.code).to eql(40142) # token expired
160
160
  disconnect_count += 1
161
161
  if disconnect_count == 6
162
162
  expect(Time.now.to_f - started_at).to be > 4 * 0.5 # at least 4 0.5 second pauses should have happened
@@ -207,7 +207,7 @@ describe Ably::Realtime::Connection, :event_machine do
207
207
  expect(original_token).to_not be_expired
208
208
  started_at = Time.now
209
209
  connection.once(:disconnected) do |connection_state_change|
210
- expect(connection_state_change.reason.code).to eq(40140) # Token expired
210
+ expect(connection_state_change.reason.code).to eq(40142) # Token expired
211
211
 
212
212
  # Token has expired, so now ensure it is not used again
213
213
  stub_const 'Ably::Models::TokenDetails::TOKEN_EXPIRY_BUFFER', original_token_expiry_buffer
@@ -333,7 +333,7 @@ describe Ably::Realtime::Connection, :event_machine do
333
333
  expect(expired_token_details).to be_expired
334
334
  connection.once(:connected) { raise 'Connection should never connect as token has expired' }
335
335
  connection.once(:failed) do
336
- expect(client.connection.error_reason.code).to eql(40140)
336
+ expect(client.connection.error_reason.code).to eql(40142)
337
337
  stop_reactor
338
338
  end
339
339
  end
@@ -800,6 +800,41 @@ describe Ably::Realtime::Connection, :event_machine do
800
800
  end
801
801
  end
802
802
 
803
+ context '#details' do
804
+ let(:connection) { client.connection }
805
+
806
+ it 'is nil before connected' do
807
+ connection.on(:connecting) do
808
+ expect(connection.details).to eql(nil)
809
+ stop_reactor
810
+ end
811
+ end
812
+
813
+ it 'contains the ConnectionDetails object once connected' do
814
+ connection.on(:connected) do
815
+ expect(connection.details).to be_a(Ably::Models::ConnectionDetails)
816
+ expect(connection.details.connection_key).to_not be_nil
817
+ expect(connection.details.server_id).to_not be_nil
818
+ stop_reactor
819
+ end
820
+ end
821
+
822
+ it 'contains the new ConnectionDetails object once a subsequent connection is created' do
823
+ connection.once(:connected) do
824
+ expect(connection.details.connection_key).to_not be_nil
825
+ old_key = connection.details.connection_key
826
+ connection.close do
827
+ connection.once(:connected) do
828
+ expect(connection.details.connection_key).to_not be_nil
829
+ expect(connection.details.connection_key).to_not eql(old_key)
830
+ stop_reactor
831
+ end
832
+ connection.connect
833
+ end
834
+ end
835
+ end
836
+ end
837
+
803
838
  context 'recovery' do
804
839
  let(:channel_name) { random_str }
805
840
  let(:channel) { client.channel(channel_name) }
@@ -813,7 +848,8 @@ describe Ably::Realtime::Connection, :event_machine do
813
848
  log_level: :none,
814
849
  disconnected_retry_timeout: 0.1,
815
850
  suspended_retry_timeout: 0.1,
816
- connection_state_ttl: 0.2
851
+ connection_state_ttl: 0.2,
852
+ realtime_request_timeout: 5
817
853
  )
818
854
  end
819
855
 
@@ -889,7 +925,8 @@ describe Ably::Realtime::Connection, :event_machine do
889
925
 
890
926
  context "opening a new connection using a recently disconnected connection's #recovery_key" do
891
927
  context 'connection#id and connection#key after recovery' do
892
- it 'remains the same' do
928
+ it 'remains the same for id and party for key' do
929
+ connection_key_consistent_part_regex = /.*?!(\w{5,})-/
893
930
  previous_connection_id = nil
894
931
  previous_connection_key = nil
895
932
 
@@ -902,8 +939,9 @@ describe Ably::Realtime::Connection, :event_machine do
902
939
  connection.once(:failed) do
903
940
  recover_client = auto_close Ably::Realtime::Client.new(default_options.merge(recover: client.connection.recovery_key))
904
941
  recover_client.connection.on(:connected) do
905
- expect(recover_client.connection.key[/^\w{5,}-/, 0]).to_not be_nil
906
- expect(recover_client.connection.key[/^\w{5,}-/, 0]).to eql(previous_connection_key[/^\w{5,}-/, 0])
942
+ expect(recover_client.connection.key[connection_key_consistent_part_regex, 1]).to_not be_nil
943
+ expect(recover_client.connection.key[connection_key_consistent_part_regex, 1]).to eql(
944
+ previous_connection_key[connection_key_consistent_part_regex, 1])
907
945
  expect(recover_client.connection.id).to eql(previous_connection_id)
908
946
  stop_reactor
909
947
  end
@@ -509,7 +509,7 @@ describe Ably::Realtime::Presence, :event_machine do
509
509
  end
510
510
 
511
511
  context '250 existing (present) members on a channel (3 SYNC pages)' do
512
- context 'requires at least 3 SYNC ProtocolMessages' do
512
+ context 'requires at least 3 SYNC ProtocolMessages', em_timeout: 30 do
513
513
  let(:enter_expected_count) { 250 }
514
514
  let(:present) { [] }
515
515
  let(:entered) { [] }
@@ -518,15 +518,18 @@ describe Ably::Realtime::Presence, :event_machine do
518
518
 
519
519
  def setup_members_on(presence)
520
520
  enter_expected_count.times do |index|
521
- presence.enter_client("client:#{index}") do |message|
522
- entered << message
523
- next unless entered.count == enter_expected_count
524
- yield
521
+ # 10 messages per second max rate on simulation accounts
522
+ EventMachine.add_timer(index / 10) do
523
+ presence.enter_client("client:#{index}") do |message|
524
+ entered << message
525
+ next unless entered.count == enter_expected_count
526
+ yield
527
+ end
525
528
  end
526
529
  end
527
530
  end
528
531
 
529
- context 'when a client attaches to the presence channel', em_timeout: 10 do
532
+ context 'when a client attaches to the presence channel' do
530
533
  it 'emits :present for each member' do
531
534
  setup_members_on(presence_client_one) do
532
535
  presence_anonymous_client.subscribe(:present) do |present_message|
@@ -676,14 +679,16 @@ describe Ably::Realtime::Presence, :event_machine do
676
679
  context 'with :wait_for_sync option set to true' do
677
680
  it 'waits until sync is complete', em_timeout: 15 do
678
681
  enter_expected_count.times do |index|
679
- presence_client_one.enter_client("client:#{index}") do |message|
680
- entered << message
681
- next unless entered.count == enter_expected_count
682
-
683
- presence_anonymous_client.get(wait_for_sync: true) do |members|
684
- expect(members.map(&:client_id).uniq.count).to eql(enter_expected_count)
685
- expect(members.count).to eql(enter_expected_count)
686
- stop_reactor
682
+ EventMachine.add_timer(index / 10) do
683
+ presence_client_one.enter_client("client:#{index}") do |message|
684
+ entered << message
685
+ next unless entered.count == enter_expected_count
686
+
687
+ presence_anonymous_client.get(wait_for_sync: true) do |members|
688
+ expect(members.map(&:client_id).uniq.count).to eql(enter_expected_count)
689
+ expect(members.count).to eql(enter_expected_count)
690
+ stop_reactor
691
+ end
687
692
  end
688
693
  end
689
694
  end
@@ -693,15 +698,17 @@ describe Ably::Realtime::Presence, :event_machine do
693
698
  context 'by default' do
694
699
  it 'it does not wait for sync', em_timeout: 15 do
695
700
  enter_expected_count.times do |index|
696
- presence_client_one.enter_client("client:#{index}") do |message|
697
- entered << message
698
- next unless entered.count == enter_expected_count
699
-
700
- channel_anonymous_client.attach do
701
- presence_anonymous_client.get do |members|
702
- expect(presence_anonymous_client.members).to_not be_in_sync
703
- expect(members.count).to eql(0)
704
- stop_reactor
701
+ EventMachine.add_timer(index / 10) do
702
+ presence_client_one.enter_client("client:#{index}") do |message|
703
+ entered << message
704
+ next unless entered.count == enter_expected_count
705
+
706
+ channel_anonymous_client.attach do
707
+ presence_anonymous_client.get do |members|
708
+ expect(presence_anonymous_client.members).to_not be_in_sync
709
+ expect(members.count).to eql(0)
710
+ stop_reactor
711
+ end
705
712
  end
706
713
  end
707
714
  end
@@ -1225,7 +1232,7 @@ describe Ably::Realtime::Presence, :event_machine do
1225
1232
  end
1226
1233
  end
1227
1234
 
1228
- context 'during a sync' do
1235
+ context 'during a sync', em_timeout: 30 do
1229
1236
  let(:pages) { 2 }
1230
1237
  let(:members_per_page) { 100 }
1231
1238
  let(:sync_pages_received) { [] }
@@ -1234,7 +1241,15 @@ describe Ably::Realtime::Presence, :event_machine do
1234
1241
 
1235
1242
  def connect_members_deferrables
1236
1243
  (members_per_page * pages + 1).times.map do |index|
1237
- presence_client_one.enter_client("client:#{index}")
1244
+ # rate limit to 10 per second
1245
+ EventMachine::DefaultDeferrable.new.tap do |deferrable|
1246
+ EventMachine.add_timer(index / 10) do
1247
+ presence_client_one.enter_client("client:#{index}").tap do |enter_deferrable|
1248
+ enter_deferrable.callback { |*args| deferrable.succeed *args }
1249
+ enter_deferrable.errback { |*args| deferrable.fail *args }
1250
+ end
1251
+ end
1252
+ end
1238
1253
  end
1239
1254
  end
1240
1255
 
@@ -1316,9 +1331,9 @@ describe Ably::Realtime::Presence, :event_machine do
1316
1331
  expect(members.count).to eq(1)
1317
1332
  expect(members.first.connection_id).to eql(client_one.connection.id)
1318
1333
 
1319
- presence_client_one.get(connection_id: client_two.connection.id) do |members|
1320
- expect(members.count).to eq(1)
1321
- expect(members.first.connection_id).to eql(client_two.connection.id)
1334
+ presence_client_one.get(connection_id: client_two.connection.id) do |members_two|
1335
+ expect(members_two.count).to eq(1)
1336
+ expect(members_two.first.connection_id).to eql(client_two.connection.id)
1322
1337
  stop_reactor
1323
1338
  end
1324
1339
  end
@@ -1339,10 +1354,10 @@ describe Ably::Realtime::Presence, :event_machine do
1339
1354
  expect(members.first.client_id).to eql(client_one_id)
1340
1355
  expect(members.first.connection_id).to eql(client_one.connection.id)
1341
1356
 
1342
- presence_client_one.get(client_id: client_two_id) do |members|
1343
- expect(members.count).to eq(1)
1344
- expect(members.first.client_id).to eql(client_two_id)
1345
- expect(members.first.connection_id).to eql(client_two.connection.id)
1357
+ presence_client_one.get(client_id: client_two_id) do |members_two|
1358
+ expect(members_two.count).to eq(1)
1359
+ expect(members_two.first.client_id).to eql(client_two_id)
1360
+ expect(members_two.first.connection_id).to eql(client_two.connection.id)
1346
1361
  stop_reactor
1347
1362
  end
1348
1363
  end
@@ -1469,8 +1484,8 @@ describe Ably::Realtime::Presence, :event_machine do
1469
1484
  it 'removes the callback for all presence events' do
1470
1485
  when_all(channel_client_one.attach, channel_client_two.attach) do
1471
1486
  subscribe_callback = proc { raise 'Should not be called' }
1472
- presence_client_two.subscribe &subscribe_callback
1473
- presence_client_two.unsubscribe &subscribe_callback
1487
+ presence_client_two.subscribe(&subscribe_callback)
1488
+ presence_client_two.unsubscribe(&subscribe_callback)
1474
1489
 
1475
1490
  presence_client_one.enter
1476
1491
  presence_client_one.update