ably 0.8.4 → 0.8.5
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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/lib/ably/auth.rb +23 -19
- data/lib/ably/models/token_details.rb +8 -6
- data/lib/ably/modules/conversions.rb +4 -0
- data/lib/ably/modules/state_emitter.rb +1 -1
- data/lib/ably/modules/uses_state_machine.rb +8 -1
- data/lib/ably/realtime/auth.rb +13 -13
- data/lib/ably/realtime/channel.rb +2 -2
- data/lib/ably/realtime/channel/channel_manager.rb +3 -3
- data/lib/ably/realtime/channel/channel_state_machine.rb +2 -1
- data/lib/ably/realtime/client/incoming_message_dispatcher.rb +13 -7
- data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +6 -0
- data/lib/ably/realtime/connection.rb +4 -4
- data/lib/ably/realtime/connection/connection_manager.rb +9 -3
- data/lib/ably/realtime/connection/connection_state_machine.rb +1 -1
- data/lib/ably/realtime/presence.rb +4 -4
- data/lib/ably/rest/client.rb +2 -2
- data/lib/ably/version.rb +1 -1
- data/spec/acceptance/realtime/auth_spec.rb +9 -9
- data/spec/acceptance/realtime/channel_history_spec.rb +2 -2
- data/spec/acceptance/realtime/channel_spec.rb +13 -12
- data/spec/acceptance/realtime/channels_spec.rb +6 -2
- data/spec/acceptance/realtime/client_spec.rb +4 -3
- data/spec/acceptance/realtime/connection_failures_spec.rb +21 -15
- data/spec/acceptance/realtime/connection_spec.rb +31 -27
- data/spec/acceptance/realtime/message_spec.rb +31 -24
- data/spec/acceptance/realtime/presence_history_spec.rb +2 -2
- data/spec/acceptance/realtime/presence_spec.rb +10 -11
- data/spec/acceptance/realtime/stats_spec.rb +1 -1
- data/spec/acceptance/realtime/time_spec.rb +1 -1
- data/spec/acceptance/rest/auth_spec.rb +77 -46
- data/spec/acceptance/rest/channel_spec.rb +22 -3
- data/spec/acceptance/rest/client_spec.rb +6 -6
- data/spec/acceptance/rest/presence_spec.rb +9 -7
- data/spec/support/event_machine_helper.rb +30 -4
- data/spec/support/protocol_helper.rb +9 -6
- data/spec/unit/auth_spec.rb +1 -1
- data/spec/unit/models/token_details_spec.rb +8 -0
- data/spec/unit/modules/async_wrapper_spec.rb +1 -1
- metadata +2 -2
@@ -12,9 +12,10 @@ describe Ably::Rest::Channel do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '#publish' do
|
15
|
-
let(:
|
16
|
-
let(:
|
17
|
-
let(:
|
15
|
+
let(:channel_name) { random_str }
|
16
|
+
let(:channel) { client.channel(channel_name) }
|
17
|
+
let(:name) { 'foo' }
|
18
|
+
let(:data) { 'woop!' }
|
18
19
|
|
19
20
|
context 'with name and data arguments' do
|
20
21
|
it 'publishes the message and return true indicating success' do
|
@@ -33,6 +34,24 @@ describe Ably::Rest::Channel do
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
context 'with a client_id configured in the ClientOptions' do
|
38
|
+
let(:client_id) { random_str }
|
39
|
+
let(:client_options) { default_options.merge(client_id: client_id) }
|
40
|
+
|
41
|
+
it 'publishes the message without a client_id' do
|
42
|
+
expect(client).to receive(:post).
|
43
|
+
with("/channels/#{channel_name}/publish", hash_excluding(client_id: client_id)).
|
44
|
+
and_return(double('response', status: 201))
|
45
|
+
|
46
|
+
expect(channel.publish(name, data)).to eql(true)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'expects a client_id to be added by the realtime service' do
|
50
|
+
channel.publish name, data
|
51
|
+
expect(channel.history.items.first.client_id).to eql(client_id)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
36
55
|
context 'with an array of Hash objects with :name and :data attributes' do
|
37
56
|
let(:messages) do
|
38
57
|
10.times.map do |index|
|
@@ -16,7 +16,7 @@ describe Ably::Rest::Client do
|
|
16
16
|
|
17
17
|
context '#initialize' do
|
18
18
|
let(:client_id) { random_str }
|
19
|
-
let(:token_request) { client.auth.create_token_request(key_name: key_name, key_secret: key_secret, client_id: client_id) }
|
19
|
+
let(:token_request) { client.auth.create_token_request({}, key_name: key_name, key_secret: key_secret, client_id: client_id) }
|
20
20
|
|
21
21
|
context 'with only an API key' do
|
22
22
|
let(:client) { Ably::Rest::Client.new(client_options.merge(key: api_key)) }
|
@@ -65,7 +65,7 @@ describe Ably::Rest::Client do
|
|
65
65
|
|
66
66
|
context 'with an :auth_callback Proc (clientId provided in library options instead of as a token_request param)' do
|
67
67
|
let(:client) { Ably::Rest::Client.new(client_options.merge(client_id: client_id, auth_callback: Proc.new { token_request })) }
|
68
|
-
let(:token_request) { client.auth.create_token_request(key_name: key_name, key_secret: key_secret) }
|
68
|
+
let(:token_request) { client.auth.create_token_request({}, key_name: key_name, key_secret: key_secret) }
|
69
69
|
|
70
70
|
it 'correctly sets the clientId on the token' do
|
71
71
|
expect { client.channel('channel_name').publish('event', 'message') }.to change { client.auth.current_token_details }
|
@@ -84,7 +84,7 @@ describe Ably::Rest::Client do
|
|
84
84
|
context 'before any REST request' do
|
85
85
|
before do
|
86
86
|
expect(client.auth).to receive(:token_request_from_auth_url).with(token_request_url, hash_including(:auth_method => :get)).once do
|
87
|
-
client.auth.create_token_request(
|
87
|
+
client.auth.create_token_request(client_id: client_id)
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
@@ -154,11 +154,11 @@ describe Ably::Rest::Client do
|
|
154
154
|
send("token_request_#{@request_index > 2 ? 'next' : @request_index}")
|
155
155
|
end))
|
156
156
|
end
|
157
|
-
let(:token_request_1) { client.auth.create_token_request(token_request_options.merge(client_id: random_str)) }
|
158
|
-
let(:token_request_2) { client.auth.create_token_request(token_request_options.merge(client_id: random_str)) }
|
157
|
+
let(:token_request_1) { client.auth.create_token_request({}, token_request_options.merge(client_id: random_str)) }
|
158
|
+
let(:token_request_2) { client.auth.create_token_request({}, token_request_options.merge(client_id: random_str)) }
|
159
159
|
|
160
160
|
# If token expires against whilst runnig tests in a slower CI environment then use this token
|
161
|
-
let(:token_request_next) { client.auth.create_token_request(token_request_options.merge(client_id: random_str)) }
|
161
|
+
let(:token_request_next) { client.auth.create_token_request({}, token_request_options.merge(client_id: random_str)) }
|
162
162
|
|
163
163
|
context 'when expired' do
|
164
164
|
before do
|
@@ -93,23 +93,25 @@ describe Ably::Rest::Presence do
|
|
93
93
|
|
94
94
|
context 'with :client_id option' do
|
95
95
|
let(:client_id) { non_encoded_fixtures.first[:client_id] }
|
96
|
-
let(:presence_page)
|
96
|
+
let(:presence_page) { fixtures_channel.presence.get(client_id: client_id) }
|
97
97
|
|
98
98
|
it 'returns a list members filtered by the provided client ID' do
|
99
|
-
pending 'not implemented in the REST API yet' # TODO realtime/issues/243
|
100
99
|
expect(presence_page.items.count).to eql(1)
|
101
100
|
expect(presence_page.items.first.client_id).to eql(client_id)
|
102
101
|
end
|
103
102
|
end
|
104
103
|
|
105
104
|
context 'with :connection_id option' do
|
106
|
-
let(:
|
107
|
-
let(:
|
105
|
+
let(:all_members) { fixtures_channel.presence.get.items }
|
106
|
+
let(:connection_id) { all_members.first.connection_id }
|
107
|
+
let(:presence_page) { fixtures_channel.presence.get(connection_id: connection_id) }
|
108
108
|
|
109
109
|
it 'returns a list members filtered by the provided connection ID' do
|
110
|
-
|
111
|
-
|
112
|
-
|
110
|
+
expect(presence_page.items.all? { |member| member.connection_id == connection_id }).to eql(true)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'returns a list members filtered by the provided connection ID' do
|
114
|
+
expect(fixtures_channel.presence.get(connection_id: 'does.not.exist').items).to be_empty
|
113
115
|
end
|
114
116
|
end
|
115
117
|
end
|
@@ -17,11 +17,34 @@ module RSpec
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def stop_reactor
|
20
|
+
unless realtime_clients.empty?
|
21
|
+
realtime_clients.shift.tap do |client|
|
22
|
+
# Ensure close appens outside of the caller as this can cause errbacks on Deferrables
|
23
|
+
# e.g. connection.connect { connection.close } => # Error as calling close within the connected callback
|
24
|
+
::EventMachine.add_timer(0.05) do
|
25
|
+
client.close if client.connection.can_transition_to?(:closing)
|
26
|
+
::EventMachine.add_timer(0.1) { stop_reactor }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
20
32
|
::EventMachine.next_tick do
|
21
33
|
::EventMachine.stop
|
22
34
|
end
|
23
35
|
end
|
24
36
|
|
37
|
+
# Ensures that any clients used in tests will have their connections
|
38
|
+
# explicitly closed when stop_reactor is called
|
39
|
+
def auto_close(realtime_client)
|
40
|
+
realtime_clients << realtime_client
|
41
|
+
realtime_client
|
42
|
+
end
|
43
|
+
|
44
|
+
def realtime_clients
|
45
|
+
@realtime_clients ||= []
|
46
|
+
end
|
47
|
+
|
25
48
|
# Allows multiple Deferrables to be passed in and calls the provided block when
|
26
49
|
# all success callbacks have completed
|
27
50
|
def when_all(*deferrables)
|
@@ -48,7 +71,7 @@ module RSpec
|
|
48
71
|
end
|
49
72
|
|
50
73
|
deferrable.errback do |error|
|
51
|
-
raise RuntimeError, "Deferrable failed: #{error
|
74
|
+
raise RuntimeError, "Error: Deferrable failed: #{error}"
|
52
75
|
end
|
53
76
|
end
|
54
77
|
end
|
@@ -56,9 +79,12 @@ module RSpec
|
|
56
79
|
def wait_until(condition_block, &block)
|
57
80
|
raise ArgumentError, 'Block required' unless block_given?
|
58
81
|
|
59
|
-
|
60
|
-
|
61
|
-
|
82
|
+
if condition_block.call
|
83
|
+
yield
|
84
|
+
else
|
85
|
+
::EventMachine.add_timer(0.1) do
|
86
|
+
wait_until condition_block, &block
|
87
|
+
end
|
62
88
|
end
|
63
89
|
end
|
64
90
|
end
|
@@ -1,12 +1,15 @@
|
|
1
1
|
module RSpec
|
2
2
|
module ProtocolHelper
|
3
|
-
|
4
|
-
JSON
|
3
|
+
SUPPORTED_PROTOCOLS = {
|
4
|
+
json: 'JSON',
|
5
|
+
msgpack: 'MsgPack'
|
6
|
+
}
|
7
|
+
|
8
|
+
PROTOCOLS = if ENV['PROTOCOL']
|
9
|
+
protocol = ENV['PROTOCOL'].downcase.to_sym
|
10
|
+
{ protocol => SUPPORTED_PROTOCOLS[protocol] }
|
5
11
|
else
|
6
|
-
|
7
|
-
json: 'JSON',
|
8
|
-
msgpack: 'MsgPack'
|
9
|
-
}
|
12
|
+
SUPPORTED_PROTOCOLS
|
10
13
|
end
|
11
14
|
|
12
15
|
def vary_by_protocol(&block)
|
data/spec/unit/auth_spec.rb
CHANGED
@@ -70,6 +70,14 @@ describe Ably::Models::TokenDetails do
|
|
70
70
|
expect(subject.expired?).to eql(false)
|
71
71
|
end
|
72
72
|
end
|
73
|
+
|
74
|
+
context 'when expires is not available (i.e. string tokens)' do
|
75
|
+
subject { Ably::Models::TokenDetails.new() }
|
76
|
+
|
77
|
+
it 'is always false' do
|
78
|
+
expect(subject.expired?).to eql(false)
|
79
|
+
end
|
80
|
+
end
|
73
81
|
end
|
74
82
|
end
|
75
83
|
|
@@ -82,7 +82,7 @@ describe Ably::Modules::AsyncWrapper, :api_private do
|
|
82
82
|
expect(result).to eql(result)
|
83
83
|
EventMachine.add_timer(sleep_time * 2) { stop_reactor }
|
84
84
|
end
|
85
|
-
deferrable.errback do |
|
85
|
+
deferrable.errback do |error|
|
86
86
|
raise 'Errback should not have been called'
|
87
87
|
end
|
88
88
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ably
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lewis Marshall
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-10-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: eventmachine
|