ably 0.7.2 → 0.7.4
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.
- data/LICENSE.txt +1 -1
- data/README.md +107 -24
- data/SPEC.md +531 -398
- data/lib/ably/auth.rb +23 -15
- data/lib/ably/exceptions.rb +9 -0
- data/lib/ably/models/message.rb +17 -9
- data/lib/ably/models/paginated_resource.rb +12 -8
- data/lib/ably/models/presence_message.rb +18 -10
- data/lib/ably/models/protocol_message.rb +15 -4
- data/lib/ably/modules/async_wrapper.rb +4 -3
- data/lib/ably/modules/event_emitter.rb +31 -2
- data/lib/ably/modules/message_emitter.rb +77 -0
- data/lib/ably/modules/safe_deferrable.rb +71 -0
- data/lib/ably/modules/safe_yield.rb +41 -0
- data/lib/ably/modules/state_emitter.rb +28 -8
- data/lib/ably/realtime.rb +0 -5
- data/lib/ably/realtime/channel.rb +24 -29
- data/lib/ably/realtime/channel/channel_manager.rb +54 -11
- data/lib/ably/realtime/channel/channel_state_machine.rb +21 -6
- data/lib/ably/realtime/client.rb +7 -2
- data/lib/ably/realtime/client/incoming_message_dispatcher.rb +29 -26
- data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +4 -4
- data/lib/ably/realtime/connection.rb +41 -9
- data/lib/ably/realtime/connection/connection_manager.rb +72 -24
- data/lib/ably/realtime/connection/connection_state_machine.rb +26 -4
- data/lib/ably/realtime/connection/websocket_transport.rb +19 -6
- data/lib/ably/realtime/presence.rb +74 -208
- data/lib/ably/realtime/presence/members_map.rb +264 -0
- data/lib/ably/realtime/presence/presence_manager.rb +59 -0
- data/lib/ably/realtime/presence/presence_state_machine.rb +64 -0
- data/lib/ably/rest/channel.rb +1 -1
- data/lib/ably/rest/client.rb +6 -2
- data/lib/ably/rest/presence.rb +1 -1
- data/lib/ably/util/pub_sub.rb +3 -1
- data/lib/ably/util/safe_deferrable.rb +18 -0
- data/lib/ably/version.rb +1 -1
- data/spec/acceptance/realtime/channel_history_spec.rb +2 -2
- data/spec/acceptance/realtime/channel_spec.rb +28 -6
- data/spec/acceptance/realtime/connection_failures_spec.rb +116 -46
- data/spec/acceptance/realtime/connection_spec.rb +55 -10
- data/spec/acceptance/realtime/message_spec.rb +32 -0
- data/spec/acceptance/realtime/presence_spec.rb +456 -96
- data/spec/acceptance/realtime/stats_spec.rb +2 -2
- data/spec/acceptance/realtime/time_spec.rb +2 -2
- data/spec/acceptance/rest/auth_spec.rb +75 -7
- data/spec/shared/client_initializer_behaviour.rb +8 -0
- data/spec/shared/safe_deferrable_behaviour.rb +71 -0
- data/spec/support/api_helper.rb +1 -1
- data/spec/support/event_machine_helper.rb +1 -1
- data/spec/support/test_app.rb +13 -7
- data/spec/unit/models/message_spec.rb +15 -14
- data/spec/unit/models/paginated_resource_spec.rb +4 -4
- data/spec/unit/models/presence_message_spec.rb +17 -17
- data/spec/unit/models/stat_spec.rb +4 -4
- data/spec/unit/modules/async_wrapper_spec.rb +28 -9
- data/spec/unit/modules/event_emitter_spec.rb +50 -0
- data/spec/unit/modules/state_emitter_spec.rb +76 -2
- data/spec/unit/realtime/channel_spec.rb +51 -20
- data/spec/unit/realtime/channels_spec.rb +3 -3
- data/spec/unit/realtime/connection_spec.rb +30 -0
- data/spec/unit/realtime/presence_spec.rb +52 -26
- data/spec/unit/realtime/safe_deferrable_spec.rb +12 -0
- metadata +85 -39
- checksums.yaml +0 -7
- data/.ruby-version.old +0 -1
@@ -2,8 +2,8 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Ably::Realtime::Channels do
|
5
|
-
let(:connection) { instance_double('Ably::Realtime::Connection',
|
6
|
-
let(:client) { instance_double('Ably::Realtime::Client', connection: connection) }
|
5
|
+
let(:connection) { instance_double('Ably::Realtime::Connection', unsafe_on: true, on_resume: true) }
|
6
|
+
let(:client) { instance_double('Ably::Realtime::Client', connection: connection, client_id: 'clientId') }
|
7
7
|
let(:channel_name) { 'unique' }
|
8
8
|
let(:options) { { 'bizarre' => 'value' } }
|
9
9
|
|
@@ -41,7 +41,7 @@ describe Ably::Realtime::Channels do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
context 'destroying channels' do
|
44
|
-
it '#release
|
44
|
+
it '#release detaches and then releases the channel resources' do
|
45
45
|
released_channel = subject.get(channel_name, options)
|
46
46
|
expect(released_channel).to receive(:detach).and_yield
|
47
47
|
subject.release(channel_name)
|
@@ -30,4 +30,34 @@ describe Ably::Realtime::Connection do
|
|
30
30
|
|
31
31
|
it_behaves_like 'an incoming protocol message bus'
|
32
32
|
it_behaves_like 'an outgoing protocol message bus'
|
33
|
+
|
34
|
+
describe 'connection resume callbacks', api_private: true do
|
35
|
+
let(:callbacks) { [] }
|
36
|
+
|
37
|
+
describe '#resumed' do
|
38
|
+
it 'triggers callbacks' do
|
39
|
+
subject.on_resume { callbacks << true }
|
40
|
+
subject.resumed
|
41
|
+
expect(callbacks.count).to eql(1)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#on_resume' do
|
46
|
+
it 'registers a callback' do
|
47
|
+
subject.on_resume { callbacks << true }
|
48
|
+
subject.resumed
|
49
|
+
expect(callbacks.count).to eql(1)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#off_resume' do
|
54
|
+
it 'registers a callback' do
|
55
|
+
subject.on_resume { callbacks << true }
|
56
|
+
additional_proc = proc { raise 'This should not be called' }
|
57
|
+
subject.off_resume &additional_proc
|
58
|
+
subject.resumed
|
59
|
+
expect(callbacks.count).to eql(1)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
33
63
|
end
|
@@ -28,7 +28,7 @@ describe Ably::Realtime::Presence do
|
|
28
28
|
Ably::Models::PresenceMessage.new({
|
29
29
|
'action' => 0,
|
30
30
|
'connection_id' => random_str,
|
31
|
-
}, instance_double('Ably::Models::ProtocolMessage'))
|
31
|
+
}, protocol_message: instance_double('Ably::Models::ProtocolMessage'))
|
32
32
|
end
|
33
33
|
let(:msgbus) { subject.__incoming_msgbus__ }
|
34
34
|
|
@@ -47,63 +47,89 @@ describe Ably::Realtime::Presence do
|
|
47
47
|
|
48
48
|
context 'subscriptions' do
|
49
49
|
let(:message_history) { Hash.new { |hash, key| hash[key] = 0 } }
|
50
|
-
let(:
|
51
|
-
let(:
|
52
|
-
instance_double('Ably::Models::PresenceMessage', action:
|
50
|
+
let(:enter_action) { Ably::Models::PresenceMessage::ACTION.Enter }
|
51
|
+
let(:enter_message) do
|
52
|
+
instance_double('Ably::Models::PresenceMessage', action: enter_action, connection_id: random_str, decode: true, member_key: random_str)
|
53
|
+
end
|
54
|
+
let(:leave_message) do
|
55
|
+
instance_double('Ably::Models::PresenceMessage', action: Ably::Models::PresenceMessage::ACTION.Leave, connection_id: random_str, decode: true, member_key: random_str)
|
56
|
+
end
|
57
|
+
let(:update_message) do
|
58
|
+
instance_double('Ably::Models::PresenceMessage', action: Ably::Models::PresenceMessage::ACTION.Update, connection_id: random_str, decode: true, member_key: random_str)
|
53
59
|
end
|
54
60
|
|
55
61
|
context '#subscribe' do
|
56
|
-
|
57
|
-
subject.
|
62
|
+
specify 'without a block raises an invalid ArgumentError' do
|
63
|
+
expect { subject.subscribe }.to raise_error ArgumentError
|
58
64
|
end
|
59
65
|
|
60
|
-
specify 'to all
|
66
|
+
specify 'with no action specified subscribes the provided block to all action' do
|
61
67
|
subject.subscribe { |message| message_history[:received] += 1}
|
62
|
-
subject.__incoming_msgbus__.publish(:presence,
|
68
|
+
subject.__incoming_msgbus__.publish(:presence, enter_message)
|
63
69
|
expect(message_history[:received]).to eql(1)
|
64
70
|
end
|
65
71
|
|
66
|
-
specify '
|
67
|
-
subject.subscribe(
|
72
|
+
specify 'with a single action argument subscribes that block to matching actions' do
|
73
|
+
subject.subscribe(enter_action) { |message| message_history[:received] += 1 }
|
68
74
|
subject.subscribe(:leave) { |message| message_history[:received] += 1 }
|
69
|
-
subject.__incoming_msgbus__.publish(:presence,
|
75
|
+
subject.__incoming_msgbus__.publish(:presence, enter_message)
|
70
76
|
expect(message_history[:received]).to eql(1)
|
71
77
|
end
|
72
|
-
end
|
73
78
|
|
74
|
-
|
75
|
-
|
76
|
-
subject.
|
79
|
+
specify 'with a multiple action arguments subscribes that block to all of those actions' do
|
80
|
+
subject.subscribe(:leave, enter_action) { |message| message_history[:received] += 1 }
|
81
|
+
subject.__incoming_msgbus__.publish(:presence, enter_message)
|
82
|
+
expect(message_history[:received]).to eql(1)
|
83
|
+
subject.__incoming_msgbus__.publish(:presence, leave_message)
|
84
|
+
expect(message_history[:received]).to eql(2)
|
85
|
+
|
86
|
+
# This message should be ignored as subscribed to :leave and :enter
|
87
|
+
subject.__incoming_msgbus__.publish(:presence, update_message)
|
88
|
+
expect(message_history[:received]).to eql(2)
|
77
89
|
end
|
78
90
|
|
91
|
+
specify 'with a multiple duplicate action arguments subscribes that block to all of those unique actions once' do
|
92
|
+
subject.subscribe(enter_action, enter_action) { |message| message_history[:received] += 1 }
|
93
|
+
subject.__incoming_msgbus__.publish(:presence, enter_message)
|
94
|
+
expect(message_history[:received]).to eql(1)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context '#unsubscribe' do
|
79
99
|
let(:callback) do
|
80
100
|
Proc.new { |message| message_history[:received] += 1 }
|
81
101
|
end
|
82
102
|
before do
|
83
|
-
subject.subscribe(
|
103
|
+
subject.subscribe(enter_action, &callback)
|
84
104
|
end
|
85
105
|
|
86
|
-
specify '
|
106
|
+
specify 'with no action specified unsubscribes that block from all events' do
|
87
107
|
subject.unsubscribe &callback
|
88
|
-
subject.__incoming_msgbus__.publish(:presence,
|
108
|
+
subject.__incoming_msgbus__.publish(:presence, enter_message)
|
109
|
+
expect(message_history[:received]).to eql(0)
|
110
|
+
end
|
111
|
+
|
112
|
+
specify 'with a single action argument unsubscribes the provided block with the matching action' do
|
113
|
+
subject.unsubscribe enter_action, &callback
|
114
|
+
subject.__incoming_msgbus__.publish(:presence, enter_message)
|
89
115
|
expect(message_history[:received]).to eql(0)
|
90
116
|
end
|
91
117
|
|
92
|
-
specify '
|
93
|
-
subject.unsubscribe
|
94
|
-
subject.__incoming_msgbus__.publish(:presence,
|
118
|
+
specify 'with multiple action arguments unsubscribes each of those matching actions with the provided block' do
|
119
|
+
subject.unsubscribe :update, :leave, enter_action, &callback
|
120
|
+
subject.__incoming_msgbus__.publish(:presence, enter_message)
|
95
121
|
expect(message_history[:received]).to eql(0)
|
96
122
|
end
|
97
123
|
|
98
|
-
specify '
|
124
|
+
specify 'with a non-matching action argument has no effect' do
|
99
125
|
subject.unsubscribe :leave, &callback
|
100
|
-
subject.__incoming_msgbus__.publish(:presence,
|
126
|
+
subject.__incoming_msgbus__.publish(:presence, enter_message)
|
101
127
|
expect(message_history[:received]).to eql(1)
|
102
128
|
end
|
103
129
|
|
104
|
-
specify 'all
|
105
|
-
subject.unsubscribe
|
106
|
-
subject.__incoming_msgbus__.publish(:presence,
|
130
|
+
specify 'with no block argument unsubscribes all blocks for the action argument' do
|
131
|
+
subject.unsubscribe enter_action
|
132
|
+
subject.__incoming_msgbus__.publish(:presence, enter_message)
|
107
133
|
expect(message_history[:received]).to eql(0)
|
108
134
|
end
|
109
135
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'shared/safe_deferrable_behaviour'
|
4
|
+
require 'ably/realtime'
|
5
|
+
|
6
|
+
[Ably::Models::ProtocolMessage, Ably::Models::Message, Ably::Models::PresenceMessage].each do |model_klass|
|
7
|
+
describe model_klass do
|
8
|
+
subject { model_klass.new(action: 1) }
|
9
|
+
|
10
|
+
it_behaves_like 'a safe Deferrable'
|
11
|
+
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ably
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.4
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Lewis Marshall
|
@@ -9,202 +10,230 @@ authors:
|
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2015-
|
13
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: eventmachine
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
17
19
|
requirements:
|
18
|
-
- -
|
20
|
+
- - ~>
|
19
21
|
- !ruby/object:Gem::Version
|
20
22
|
version: '1.0'
|
21
23
|
type: :runtime
|
22
24
|
prerelease: false
|
23
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
24
27
|
requirements:
|
25
|
-
- -
|
28
|
+
- - ~>
|
26
29
|
- !ruby/object:Gem::Version
|
27
30
|
version: '1.0'
|
28
31
|
- !ruby/object:Gem::Dependency
|
29
32
|
name: em-http-request
|
30
33
|
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
31
35
|
requirements:
|
32
|
-
- -
|
36
|
+
- - ~>
|
33
37
|
- !ruby/object:Gem::Version
|
34
38
|
version: '1.1'
|
35
39
|
type: :runtime
|
36
40
|
prerelease: false
|
37
41
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
38
43
|
requirements:
|
39
|
-
- -
|
44
|
+
- - ~>
|
40
45
|
- !ruby/object:Gem::Version
|
41
46
|
version: '1.1'
|
42
47
|
- !ruby/object:Gem::Dependency
|
43
48
|
name: statesman
|
44
49
|
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
45
51
|
requirements:
|
46
|
-
- -
|
52
|
+
- - ~>
|
47
53
|
- !ruby/object:Gem::Version
|
48
54
|
version: 1.0.0
|
49
55
|
type: :runtime
|
50
56
|
prerelease: false
|
51
57
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
52
59
|
requirements:
|
53
|
-
- -
|
60
|
+
- - ~>
|
54
61
|
- !ruby/object:Gem::Version
|
55
62
|
version: 1.0.0
|
56
63
|
- !ruby/object:Gem::Dependency
|
57
64
|
name: faraday
|
58
65
|
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
59
67
|
requirements:
|
60
|
-
- -
|
68
|
+
- - ~>
|
61
69
|
- !ruby/object:Gem::Version
|
62
70
|
version: '0.9'
|
63
71
|
type: :runtime
|
64
72
|
prerelease: false
|
65
73
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
66
75
|
requirements:
|
67
|
-
- -
|
76
|
+
- - ~>
|
68
77
|
- !ruby/object:Gem::Version
|
69
78
|
version: '0.9'
|
70
79
|
- !ruby/object:Gem::Dependency
|
71
80
|
name: json
|
72
81
|
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
73
83
|
requirements:
|
74
|
-
- -
|
84
|
+
- - ! '>='
|
75
85
|
- !ruby/object:Gem::Version
|
76
86
|
version: '0'
|
77
87
|
type: :runtime
|
78
88
|
prerelease: false
|
79
89
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
80
91
|
requirements:
|
81
|
-
- -
|
92
|
+
- - ! '>='
|
82
93
|
- !ruby/object:Gem::Version
|
83
94
|
version: '0'
|
84
95
|
- !ruby/object:Gem::Dependency
|
85
96
|
name: websocket-driver
|
86
97
|
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
87
99
|
requirements:
|
88
|
-
- -
|
100
|
+
- - ~>
|
89
101
|
- !ruby/object:Gem::Version
|
90
102
|
version: '0.3'
|
91
103
|
type: :runtime
|
92
104
|
prerelease: false
|
93
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
94
107
|
requirements:
|
95
|
-
- -
|
108
|
+
- - ~>
|
96
109
|
- !ruby/object:Gem::Version
|
97
110
|
version: '0.3'
|
98
111
|
- !ruby/object:Gem::Dependency
|
99
112
|
name: msgpack-ably
|
100
113
|
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
101
115
|
requirements:
|
102
|
-
- -
|
116
|
+
- - ~>
|
103
117
|
- !ruby/object:Gem::Version
|
104
118
|
version: 0.5.10
|
105
119
|
type: :runtime
|
106
120
|
prerelease: false
|
107
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
108
123
|
requirements:
|
109
|
-
- -
|
124
|
+
- - ~>
|
110
125
|
- !ruby/object:Gem::Version
|
111
126
|
version: 0.5.10
|
112
127
|
- !ruby/object:Gem::Dependency
|
113
128
|
name: bundler
|
114
129
|
requirement: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
115
131
|
requirements:
|
116
|
-
- -
|
132
|
+
- - ~>
|
117
133
|
- !ruby/object:Gem::Version
|
118
134
|
version: '1.3'
|
119
135
|
type: :development
|
120
136
|
prerelease: false
|
121
137
|
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
122
139
|
requirements:
|
123
|
-
- -
|
140
|
+
- - ~>
|
124
141
|
- !ruby/object:Gem::Version
|
125
142
|
version: '1.3'
|
126
143
|
- !ruby/object:Gem::Dependency
|
127
144
|
name: rake
|
128
145
|
requirement: !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
129
147
|
requirements:
|
130
|
-
- -
|
148
|
+
- - ! '>='
|
131
149
|
- !ruby/object:Gem::Version
|
132
150
|
version: '0'
|
133
151
|
type: :development
|
134
152
|
prerelease: false
|
135
153
|
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
136
155
|
requirements:
|
137
|
-
- -
|
156
|
+
- - ! '>='
|
138
157
|
- !ruby/object:Gem::Version
|
139
158
|
version: '0'
|
140
159
|
- !ruby/object:Gem::Dependency
|
141
160
|
name: redcarpet
|
142
161
|
requirement: !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
143
163
|
requirements:
|
144
|
-
- -
|
164
|
+
- - ! '>='
|
145
165
|
- !ruby/object:Gem::Version
|
146
166
|
version: '0'
|
147
167
|
type: :development
|
148
168
|
prerelease: false
|
149
169
|
version_requirements: !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
150
171
|
requirements:
|
151
|
-
- -
|
172
|
+
- - ! '>='
|
152
173
|
- !ruby/object:Gem::Version
|
153
174
|
version: '0'
|
154
175
|
- !ruby/object:Gem::Dependency
|
155
176
|
name: rspec
|
156
177
|
requirement: !ruby/object:Gem::Requirement
|
178
|
+
none: false
|
157
179
|
requirements:
|
158
|
-
- -
|
180
|
+
- - ~>
|
159
181
|
- !ruby/object:Gem::Version
|
160
182
|
version: 3.1.0
|
161
183
|
type: :development
|
162
184
|
prerelease: false
|
163
185
|
version_requirements: !ruby/object:Gem::Requirement
|
186
|
+
none: false
|
164
187
|
requirements:
|
165
|
-
- -
|
188
|
+
- - ~>
|
166
189
|
- !ruby/object:Gem::Version
|
167
190
|
version: 3.1.0
|
168
191
|
- !ruby/object:Gem::Dependency
|
169
192
|
name: rspec-retry
|
170
193
|
requirement: !ruby/object:Gem::Requirement
|
194
|
+
none: false
|
171
195
|
requirements:
|
172
|
-
- -
|
196
|
+
- - ! '>='
|
173
197
|
- !ruby/object:Gem::Version
|
174
198
|
version: '0'
|
175
199
|
type: :development
|
176
200
|
prerelease: false
|
177
201
|
version_requirements: !ruby/object:Gem::Requirement
|
202
|
+
none: false
|
178
203
|
requirements:
|
179
|
-
- -
|
204
|
+
- - ! '>='
|
180
205
|
- !ruby/object:Gem::Version
|
181
206
|
version: '0'
|
182
207
|
- !ruby/object:Gem::Dependency
|
183
208
|
name: yard
|
184
209
|
requirement: !ruby/object:Gem::Requirement
|
210
|
+
none: false
|
185
211
|
requirements:
|
186
|
-
- -
|
212
|
+
- - ! '>='
|
187
213
|
- !ruby/object:Gem::Version
|
188
214
|
version: '0'
|
189
215
|
type: :development
|
190
216
|
prerelease: false
|
191
217
|
version_requirements: !ruby/object:Gem::Requirement
|
218
|
+
none: false
|
192
219
|
requirements:
|
193
|
-
- -
|
220
|
+
- - ! '>='
|
194
221
|
- !ruby/object:Gem::Version
|
195
222
|
version: '0'
|
196
223
|
- !ruby/object:Gem::Dependency
|
197
224
|
name: webmock
|
198
225
|
requirement: !ruby/object:Gem::Requirement
|
226
|
+
none: false
|
199
227
|
requirements:
|
200
|
-
- -
|
228
|
+
- - ! '>='
|
201
229
|
- !ruby/object:Gem::Version
|
202
230
|
version: '0'
|
203
231
|
type: :development
|
204
232
|
prerelease: false
|
205
233
|
version_requirements: !ruby/object:Gem::Requirement
|
234
|
+
none: false
|
206
235
|
requirements:
|
207
|
-
- -
|
236
|
+
- - ! '>='
|
208
237
|
- !ruby/object:Gem::Version
|
209
238
|
version: '0'
|
210
239
|
description: A Ruby client library for ably.io, the real-time messaging service
|
@@ -215,10 +244,9 @@ executables: []
|
|
215
244
|
extensions: []
|
216
245
|
extra_rdoc_files: []
|
217
246
|
files:
|
218
|
-
-
|
219
|
-
-
|
220
|
-
-
|
221
|
-
- ".travis.yml"
|
247
|
+
- .gitignore
|
248
|
+
- .rspec
|
249
|
+
- .travis.yml
|
222
250
|
- Gemfile
|
223
251
|
- LICENSE.txt
|
224
252
|
- README.md
|
@@ -252,8 +280,11 @@ files:
|
|
252
280
|
- lib/ably/modules/event_emitter.rb
|
253
281
|
- lib/ably/modules/event_machine_helpers.rb
|
254
282
|
- lib/ably/modules/http_helpers.rb
|
283
|
+
- lib/ably/modules/message_emitter.rb
|
255
284
|
- lib/ably/modules/message_pack.rb
|
256
285
|
- lib/ably/modules/model_common.rb
|
286
|
+
- lib/ably/modules/safe_deferrable.rb
|
287
|
+
- lib/ably/modules/safe_yield.rb
|
257
288
|
- lib/ably/modules/state_emitter.rb
|
258
289
|
- lib/ably/modules/state_machine.rb
|
259
290
|
- lib/ably/modules/statesman_monkey_patch.rb
|
@@ -272,6 +303,9 @@ files:
|
|
272
303
|
- lib/ably/realtime/connection/websocket_transport.rb
|
273
304
|
- lib/ably/realtime/models/nil_channel.rb
|
274
305
|
- lib/ably/realtime/presence.rb
|
306
|
+
- lib/ably/realtime/presence/members_map.rb
|
307
|
+
- lib/ably/realtime/presence/presence_manager.rb
|
308
|
+
- lib/ably/realtime/presence/presence_state_machine.rb
|
275
309
|
- lib/ably/rest.rb
|
276
310
|
- lib/ably/rest/channel.rb
|
277
311
|
- lib/ably/rest/channels.rb
|
@@ -286,6 +320,7 @@ files:
|
|
286
320
|
- lib/ably/rest/presence.rb
|
287
321
|
- lib/ably/util/crypto.rb
|
288
322
|
- lib/ably/util/pub_sub.rb
|
323
|
+
- lib/ably/util/safe_deferrable.rb
|
289
324
|
- lib/ably/version.rb
|
290
325
|
- spec/acceptance/realtime/channel_history_spec.rb
|
291
326
|
- spec/acceptance/realtime/channel_spec.rb
|
@@ -313,6 +348,7 @@ files:
|
|
313
348
|
- spec/shared/client_initializer_behaviour.rb
|
314
349
|
- spec/shared/model_behaviour.rb
|
315
350
|
- spec/shared/protocol_msgbus_behaviour.rb
|
351
|
+
- spec/shared/safe_deferrable_behaviour.rb
|
316
352
|
- spec/spec_helper.rb
|
317
353
|
- spec/support/api_helper.rb
|
318
354
|
- spec/support/event_machine_helper.rb
|
@@ -348,6 +384,7 @@ files:
|
|
348
384
|
- spec/unit/realtime/incoming_message_dispatcher_spec.rb
|
349
385
|
- spec/unit/realtime/presence_spec.rb
|
350
386
|
- spec/unit/realtime/realtime_spec.rb
|
387
|
+
- spec/unit/realtime/safe_deferrable_spec.rb
|
351
388
|
- spec/unit/realtime/websocket_transport_spec.rb
|
352
389
|
- spec/unit/rest/channel_spec.rb
|
353
390
|
- spec/unit/rest/channels_spec.rb
|
@@ -358,26 +395,33 @@ files:
|
|
358
395
|
homepage: http://github.com/ably/ably-ruby
|
359
396
|
licenses:
|
360
397
|
- MIT
|
361
|
-
metadata: {}
|
362
398
|
post_install_message:
|
363
399
|
rdoc_options: []
|
364
400
|
require_paths:
|
365
401
|
- lib
|
366
402
|
required_ruby_version: !ruby/object:Gem::Requirement
|
403
|
+
none: false
|
367
404
|
requirements:
|
368
|
-
- -
|
405
|
+
- - ! '>='
|
369
406
|
- !ruby/object:Gem::Version
|
370
407
|
version: '0'
|
408
|
+
segments:
|
409
|
+
- 0
|
410
|
+
hash: 3024375831519817759
|
371
411
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
412
|
+
none: false
|
372
413
|
requirements:
|
373
|
-
- -
|
414
|
+
- - ! '>='
|
374
415
|
- !ruby/object:Gem::Version
|
375
416
|
version: '0'
|
417
|
+
segments:
|
418
|
+
- 0
|
419
|
+
hash: 3024375831519817759
|
376
420
|
requirements: []
|
377
421
|
rubyforge_project:
|
378
|
-
rubygems_version:
|
422
|
+
rubygems_version: 1.8.23.2
|
379
423
|
signing_key:
|
380
|
-
specification_version:
|
424
|
+
specification_version: 3
|
381
425
|
summary: A Ruby client library for ably.io, the real-time messaging service
|
382
426
|
test_files:
|
383
427
|
- spec/acceptance/realtime/channel_history_spec.rb
|
@@ -406,6 +450,7 @@ test_files:
|
|
406
450
|
- spec/shared/client_initializer_behaviour.rb
|
407
451
|
- spec/shared/model_behaviour.rb
|
408
452
|
- spec/shared/protocol_msgbus_behaviour.rb
|
453
|
+
- spec/shared/safe_deferrable_behaviour.rb
|
409
454
|
- spec/spec_helper.rb
|
410
455
|
- spec/support/api_helper.rb
|
411
456
|
- spec/support/event_machine_helper.rb
|
@@ -441,6 +486,7 @@ test_files:
|
|
441
486
|
- spec/unit/realtime/incoming_message_dispatcher_spec.rb
|
442
487
|
- spec/unit/realtime/presence_spec.rb
|
443
488
|
- spec/unit/realtime/realtime_spec.rb
|
489
|
+
- spec/unit/realtime/safe_deferrable_spec.rb
|
444
490
|
- spec/unit/realtime/websocket_transport_spec.rb
|
445
491
|
- spec/unit/rest/channel_spec.rb
|
446
492
|
- spec/unit/rest/channels_spec.rb
|