message_bus 2.0.8 → 2.0.9
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of message_bus might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.travis.yml +3 -4
- data/CHANGELOG +7 -0
- data/Gemfile +2 -3
- data/README.md +5 -2
- data/Rakefile +16 -3
- data/lib/message_bus/client.rb +12 -6
- data/lib/message_bus/message.rb +7 -2
- data/lib/message_bus/version.rb +1 -1
- data/message_bus.gemspec +3 -3
- data/spec/lib/message_bus/backends/redis_spec.rb +191 -159
- data/spec/lib/message_bus/rack/middleware_spec.rb +20 -0
- data/vendor/assets/javascripts/.gitignore +2 -0
- metadata +16 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 558fcebb3ac3abe9031039c73f996264da91cf27
|
4
|
+
data.tar.gz: f1bc3ef44e127a51952a8f27acf33e0980494a51
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64fde0c29746bd402f04c9502aa304b700ea8b27eff505a9385f88de11f054cdb84f12f006478b6efcc4de9b897dbaf2c0d4e0ac485497ce32fa7e47ead9caae
|
7
|
+
data.tar.gz: 3f8dd7191ef89cdf0ec82211098a5a310382d91525c9ea39006d326f13e2e61b5b59dac4ddc6b77b60e1fd74973d00d0d7a12eb9913c772abc2b3cc4091dd740
|
data/.travis.yml
CHANGED
data/CHANGELOG
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -24,7 +24,10 @@ If you are looking to contribute to this project here are some ideas
|
|
24
24
|
- Improve general documentation (Add examples, refine existing examples)
|
25
25
|
- Make MessageBus a nice website
|
26
26
|
- Add optional transports for websocket and shared web workers
|
27
|
-
|
27
|
+
|
28
|
+
## Ruby version support
|
29
|
+
|
30
|
+
MessageBus only support officially supported versions of Ruby, as of 11-2017 this means we only support Ruby version 2.2 and up.
|
28
31
|
|
29
32
|
## Can you handle concurrent requests?
|
30
33
|
|
@@ -216,7 +219,7 @@ backgroundCallbackInterval|60000|Interval to poll when long polling is disabled
|
|
216
219
|
maxPollInterval|180000|If request to the server start failing, MessageBus will backoff, this is the upper limit of the backoff.
|
217
220
|
alwaysLongPoll|false|For debugging you may want to disable the "is browser in background" check and always long-poll
|
218
221
|
baseUrl|/|If message bus is mounted in a subdirectory of different domain, you may configure it to perform requests there
|
219
|
-
ajax|$.ajax or XMLHttpRequest|MessageBus will first attempt to use jQuery and then fallback to a plain XMLHttpRequest version that's contained in the `
|
222
|
+
ajax|$.ajax or XMLHttpRequest|MessageBus will first attempt to use jQuery and then fallback to a plain XMLHttpRequest version that's contained in the `message-bus-ajax.js` file. `message-bus-ajax.js` must be loaded after `message-bus.js` for it to be used.
|
220
223
|
headers|{}|Extra headers to be include with request. Properties and values of object must be valid values for HTTP Headers, i.e. no spaces and control characters.
|
221
224
|
**API**:
|
222
225
|
|
data/Rakefile
CHANGED
@@ -10,7 +10,20 @@ load 'jasmine/tasks/jasmine.rake'
|
|
10
10
|
|
11
11
|
Bundler.require(:default, :test)
|
12
12
|
|
13
|
-
task :
|
13
|
+
task default: :spec
|
14
|
+
|
15
|
+
module CustomBuild
|
16
|
+
def build_gem
|
17
|
+
`cp assets/message-bus* vendor/assets/javascripts`
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module Bundler
|
23
|
+
class GemHelper
|
24
|
+
prepend CustomBuild
|
25
|
+
end
|
26
|
+
end
|
14
27
|
|
15
28
|
run_spec = proc do |backend|
|
16
29
|
begin
|
@@ -21,9 +34,9 @@ run_spec = proc do |backend|
|
|
21
34
|
end
|
22
35
|
end
|
23
36
|
|
24
|
-
task :
|
37
|
+
task spec: [:spec_redis, :spec_postgres, :spec_memory, :spec_client_js]
|
25
38
|
|
26
|
-
task :
|
39
|
+
task spec_client_js: 'jasmine:ci'
|
27
40
|
|
28
41
|
task :spec_redis do
|
29
42
|
run_spec.call('redis')
|
data/lib/message_bus/client.rb
CHANGED
@@ -124,12 +124,18 @@ class MessageBus::Client
|
|
124
124
|
next if v.to_i < 0
|
125
125
|
messages = @bus.backlog(k, v, site_id)
|
126
126
|
|
127
|
-
messages.
|
128
|
-
if
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
127
|
+
if messages.length == 0
|
128
|
+
if v.to_i > @bus.last_id(k, site_id)
|
129
|
+
@subscriptions[k] = -1
|
130
|
+
end
|
131
|
+
else
|
132
|
+
messages.each do |msg|
|
133
|
+
if allowed?(msg)
|
134
|
+
r << msg
|
135
|
+
else
|
136
|
+
new_message_ids ||= {}
|
137
|
+
new_message_ids[k] = msg.message_id
|
138
|
+
end
|
133
139
|
end
|
134
140
|
end
|
135
141
|
end
|
data/lib/message_bus/message.rb
CHANGED
@@ -9,8 +9,13 @@ class MessageBus::Message < Struct.new(:global_id, :message_id, :channel , :data
|
|
9
9
|
s2 = encoded.index("|", s1 + 1)
|
10
10
|
s3 = encoded.index("|", s2 + 1)
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
global_id = encoded[0, s1 + 1].to_i
|
13
|
+
message_id = encoded[(s1 + 1), (s2 - s1 - 1)].to_i
|
14
|
+
channel = encoded[(s2 + 1), (s3 - s2 - 1)]
|
15
|
+
channel.gsub!("$$123$$", "|")
|
16
|
+
data = encoded[(s3 + 1), encoded.size]
|
17
|
+
|
18
|
+
MessageBus::Message.new(global_id, message_id, channel, data)
|
14
19
|
end
|
15
20
|
|
16
21
|
# only tricky thing to encode is pipes in a channel name ... do a straight replace
|
data/lib/message_bus/version.rb
CHANGED
data/message_bus.gemspec
CHANGED
@@ -9,14 +9,14 @@ Gem::Specification.new do |gem|
|
|
9
9
|
gem.summary = %q{}
|
10
10
|
gem.homepage = "https://github.com/SamSaffron/message_bus"
|
11
11
|
gem.license = "MIT"
|
12
|
-
|
13
|
-
|
12
|
+
gem.files = `git ls-files`.split($\) +
|
13
|
+
["vendor/assets/javascripts/message-bus.js", "vendor/assets/javascripts/message-bus-ajax.js"]
|
14
14
|
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
15
15
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
16
16
|
gem.name = "message_bus"
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
gem.version = MessageBus::VERSION
|
19
|
-
gem.required_ruby_version = ">=
|
19
|
+
gem.required_ruby_version = ">= 2.2.0"
|
20
20
|
gem.add_runtime_dependency 'rack', '>= 1.1.3'
|
21
21
|
gem.add_development_dependency 'redis'
|
22
22
|
gem.add_development_dependency 'pg'
|
@@ -2,220 +2,252 @@ require_relative '../../../spec_helper'
|
|
2
2
|
require 'message_bus'
|
3
3
|
|
4
4
|
if MESSAGE_BUS_CONFIG[:backend] == :redis
|
5
|
-
describe PUB_SUB_CLASS do
|
5
|
+
describe PUB_SUB_CLASS do
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
def new_test_bus
|
8
|
+
PUB_SUB_CLASS.new(MESSAGE_BUS_CONFIG.merge(db: 10))
|
9
|
+
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
before do
|
12
|
+
@bus = new_test_bus
|
13
|
+
@bus.reset!
|
14
|
+
end
|
15
15
|
|
16
|
-
|
16
|
+
describe "readonly" do
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
after do
|
19
|
+
@bus.pub_redis.slaveof "no", "one"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be able to store messages in memory for a period while in read only" do
|
21
23
|
|
22
|
-
|
24
|
+
skip "This spec changes redis behavior that in turn means other specs run slow"
|
23
25
|
|
24
|
-
|
26
|
+
@bus.pub_redis.slaveof "127.0.0.80", "666"
|
27
|
+
@bus.max_in_memory_publish_backlog = 2
|
25
28
|
|
26
|
-
|
27
|
-
|
29
|
+
current_threads = Thread.list
|
30
|
+
current_threads_length = current_threads.count
|
28
31
|
|
29
|
-
|
30
|
-
|
32
|
+
3.times do
|
33
|
+
result = @bus.publish "/foo", "bar"
|
34
|
+
assert_nil result
|
35
|
+
Thread.list.length.must_equal (current_threads_length + 1)
|
36
|
+
end
|
31
37
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
Thread.list
|
38
|
+
@bus.pub_redis.slaveof "no", "one"
|
39
|
+
sleep 0.01
|
40
|
+
|
41
|
+
(Thread.list - current_threads).each(&:join)
|
42
|
+
Thread.list.length.must_equal current_threads_length
|
43
|
+
|
44
|
+
@bus.backlog("/foo", 0).map(&:data).must_equal ["bar", "bar"]
|
36
45
|
end
|
46
|
+
end
|
37
47
|
|
38
|
-
|
39
|
-
|
48
|
+
it "can set backlog age" do
|
49
|
+
@bus.max_backlog_age = 100
|
50
|
+
@bus.publish "/foo", "bar"
|
51
|
+
@bus.pub_redis.ttl(@bus.backlog_key("/foo")).must_be :<=, 100
|
52
|
+
@bus.pub_redis.ttl(@bus.backlog_key("/foo")).must_be :>, 0
|
53
|
+
end
|
40
54
|
|
41
|
-
|
42
|
-
|
55
|
+
it "should be able to access the backlog" do
|
56
|
+
@bus.publish "/foo", "bar"
|
57
|
+
@bus.publish "/foo", "baz"
|
43
58
|
|
44
|
-
@bus.backlog("/foo", 0).
|
59
|
+
@bus.backlog("/foo", 0).to_a.must_equal [
|
60
|
+
MessageBus::Message.new(1, 1, '/foo', 'bar'),
|
61
|
+
MessageBus::Message.new(2, 2, '/foo', 'baz')
|
62
|
+
]
|
45
63
|
end
|
46
|
-
end
|
47
64
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
@bus.pub_redis.ttl(@bus.backlog_key("/foo")).must_be :<=, 100
|
52
|
-
@bus.pub_redis.ttl(@bus.backlog_key("/foo")).must_be :>, 0
|
53
|
-
end
|
65
|
+
it "should initialize with max_backlog_size" do
|
66
|
+
PUB_SUB_CLASS.new({}, 2000).max_backlog_size.must_equal 2000
|
67
|
+
end
|
54
68
|
|
55
|
-
|
56
|
-
|
57
|
-
|
69
|
+
it "should truncate channels correctly" do
|
70
|
+
@bus.max_backlog_size = 2
|
71
|
+
4.times do |t|
|
72
|
+
@bus.publish "/foo", t.to_s
|
73
|
+
end
|
58
74
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
75
|
+
@bus.backlog("/foo").to_a.must_equal [
|
76
|
+
MessageBus::Message.new(3, 3, '/foo', '2'),
|
77
|
+
MessageBus::Message.new(4, 4, '/foo', '3'),
|
78
|
+
]
|
79
|
+
end
|
64
80
|
|
65
|
-
|
66
|
-
|
67
|
-
|
81
|
+
it "should truncate global backlog correctly" do
|
82
|
+
@bus.max_global_backlog_size = 2
|
83
|
+
@bus.publish "/foo", "1"
|
84
|
+
@bus.publish "/bar", "2"
|
85
|
+
@bus.publish "/baz", "3"
|
68
86
|
|
69
|
-
|
70
|
-
@bus.max_backlog_size = 2
|
71
|
-
4.times do |t|
|
72
|
-
@bus.publish "/foo", t.to_s
|
87
|
+
@bus.global_backlog.length.must_equal 2
|
73
88
|
end
|
74
89
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
90
|
+
it "should be able to grab a message by id" do
|
91
|
+
id1 = @bus.publish "/foo", "bar"
|
92
|
+
id2 = @bus.publish "/foo", "baz"
|
93
|
+
@bus.get_message("/foo", id2).must_equal MessageBus::Message.new(2, 2, "/foo", "baz")
|
94
|
+
@bus.get_message("/foo", id1).must_equal MessageBus::Message.new(1, 1, "/foo", "bar")
|
95
|
+
end
|
80
96
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
97
|
+
it "should be able to access the global backlog" do
|
98
|
+
@bus.publish "/foo", "bar"
|
99
|
+
@bus.publish "/hello", "world"
|
100
|
+
@bus.publish "/foo", "baz"
|
101
|
+
@bus.publish "/hello", "planet"
|
102
|
+
|
103
|
+
@bus.global_backlog.to_a.must_equal [
|
104
|
+
MessageBus::Message.new(1, 1, "/foo", "bar"),
|
105
|
+
MessageBus::Message.new(2, 1, "/hello", "world"),
|
106
|
+
MessageBus::Message.new(3, 2, "/foo", "baz"),
|
107
|
+
MessageBus::Message.new(4, 2, "/hello", "planet")
|
108
|
+
]
|
109
|
+
end
|
86
110
|
|
87
|
-
|
88
|
-
|
111
|
+
it "should correctly omit dropped messages from the global backlog" do
|
112
|
+
@bus.max_backlog_size = 1
|
113
|
+
@bus.publish "/foo", "a"
|
114
|
+
@bus.publish "/foo", "b"
|
115
|
+
@bus.publish "/bar", "a"
|
116
|
+
@bus.publish "/bar", "b"
|
117
|
+
|
118
|
+
@bus.global_backlog.to_a.must_equal [
|
119
|
+
MessageBus::Message.new(2, 2, "/foo", "b"),
|
120
|
+
MessageBus::Message.new(4, 2, "/bar", "b")
|
121
|
+
]
|
122
|
+
end
|
89
123
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
124
|
+
it "should have the correct number of messages for multi threaded access" do
|
125
|
+
threads = []
|
126
|
+
4.times do
|
127
|
+
threads << Thread.new do
|
128
|
+
bus = new_test_bus
|
129
|
+
25.times {
|
130
|
+
bus.publish "/foo", "."
|
131
|
+
}
|
132
|
+
end
|
133
|
+
end
|
96
134
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
@bus.publish "/foo", "baz"
|
101
|
-
@bus.publish "/hello", "planet"
|
102
|
-
|
103
|
-
@bus.global_backlog.to_a.must_equal [
|
104
|
-
MessageBus::Message.new(1, 1, "/foo", "bar"),
|
105
|
-
MessageBus::Message.new(2, 1, "/hello", "world"),
|
106
|
-
MessageBus::Message.new(3, 2, "/foo", "baz"),
|
107
|
-
MessageBus::Message.new(4, 2, "/hello", "planet")
|
108
|
-
]
|
109
|
-
end
|
135
|
+
threads.each(&:join)
|
136
|
+
@bus.backlog("/foo").length == 100
|
137
|
+
end
|
110
138
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
@bus.publish "/bar", "a"
|
116
|
-
@bus.publish "/bar", "b"
|
117
|
-
|
118
|
-
@bus.global_backlog.to_a.must_equal [
|
119
|
-
MessageBus::Message.new(2, 2, "/foo", "b"),
|
120
|
-
MessageBus::Message.new(4, 2, "/bar", "b")
|
121
|
-
]
|
122
|
-
end
|
139
|
+
it "should be able to subscribe globally with recovery" do
|
140
|
+
@bus.publish("/foo", "1")
|
141
|
+
@bus.publish("/bar", "2")
|
142
|
+
got = []
|
123
143
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
bus = new_test_bus
|
129
|
-
25.times {
|
130
|
-
bus.publish "/foo", "."
|
131
|
-
}
|
144
|
+
t = Thread.new do
|
145
|
+
new_test_bus.global_subscribe(0) do |msg|
|
146
|
+
got << msg
|
147
|
+
end
|
132
148
|
end
|
149
|
+
|
150
|
+
@bus.publish("/bar", "3")
|
151
|
+
|
152
|
+
wait_for(100) do
|
153
|
+
got.length == 3
|
154
|
+
end
|
155
|
+
|
156
|
+
t.kill
|
157
|
+
|
158
|
+
got.length.must_equal 3
|
159
|
+
got.map { |m| m.data }.must_equal ["1", "2", "3"]
|
133
160
|
end
|
134
161
|
|
135
|
-
|
136
|
-
|
137
|
-
|
162
|
+
it "should be able to encode and decode messages properly" do
|
163
|
+
m = MessageBus::Message.new 1, 2, '||', '||'
|
164
|
+
MessageBus::Message.decode(m.encode).must_equal m
|
165
|
+
end
|
138
166
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
167
|
+
it "should handle subscribe on single channel, with recovery" do
|
168
|
+
@bus.publish("/foo", "1")
|
169
|
+
@bus.publish("/bar", "2")
|
170
|
+
got = []
|
143
171
|
|
144
|
-
|
145
|
-
|
146
|
-
|
172
|
+
t = Thread.new do
|
173
|
+
new_test_bus.subscribe("/foo", 0) do |msg|
|
174
|
+
got << msg
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
@bus.publish("/foo", "3")
|
179
|
+
|
180
|
+
wait_for(100) do
|
181
|
+
got.length == 2
|
147
182
|
end
|
148
|
-
end
|
149
183
|
|
150
|
-
|
184
|
+
t.kill
|
151
185
|
|
152
|
-
|
153
|
-
got.length == 3
|
186
|
+
got.map { |m| m.data }.must_equal ["1", "3"]
|
154
187
|
end
|
155
188
|
|
156
|
-
|
189
|
+
it "should not get backlog if subscribe is called without params" do
|
190
|
+
@bus.publish("/foo", "1")
|
191
|
+
got = []
|
157
192
|
|
158
|
-
|
159
|
-
|
160
|
-
|
193
|
+
t = Thread.new do
|
194
|
+
new_test_bus.subscribe("/foo") do |msg|
|
195
|
+
got << msg
|
196
|
+
end
|
197
|
+
end
|
161
198
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
end
|
199
|
+
# sleep 50ms to allow the bus to correctly subscribe,
|
200
|
+
# I thought about adding a subscribed callback, but outside of testing it matters less
|
201
|
+
sleep 0.05
|
166
202
|
|
167
|
-
|
168
|
-
@bus.publish("/foo", "1")
|
169
|
-
@bus.publish("/bar", "2")
|
170
|
-
got = []
|
203
|
+
@bus.publish("/foo", "2")
|
171
204
|
|
172
|
-
|
173
|
-
|
174
|
-
got << msg
|
205
|
+
wait_for(100) do
|
206
|
+
got.length == 1
|
175
207
|
end
|
176
|
-
end
|
177
208
|
|
178
|
-
|
209
|
+
t.kill
|
179
210
|
|
180
|
-
|
181
|
-
got.length == 2
|
211
|
+
got.map { |m| m.data }.must_equal ["2"]
|
182
212
|
end
|
183
213
|
|
184
|
-
|
214
|
+
it "should cope with a redis reset cleanly" do
|
185
215
|
|
186
|
-
|
187
|
-
|
216
|
+
@bus.publish("/foo", "1")
|
217
|
+
got = []
|
218
|
+
|
219
|
+
t = Thread.new do
|
220
|
+
new_test_bus.subscribe("/foo") do |msg|
|
221
|
+
got << msg
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
# sleep 50ms to allow the bus to correctly subscribe,
|
226
|
+
# I thought about adding a subscribed callback, but outside of testing it matters less
|
227
|
+
sleep 0.05
|
228
|
+
|
229
|
+
@bus.publish("/foo", "2")
|
230
|
+
|
231
|
+
@bus.pub_redis.flushdb
|
188
232
|
|
189
|
-
|
190
|
-
@bus.publish("/foo", "1")
|
191
|
-
got = []
|
233
|
+
@bus.publish("/foo", "3")
|
192
234
|
|
193
|
-
|
194
|
-
|
195
|
-
got << msg
|
235
|
+
wait_for(100) do
|
236
|
+
got.length == 2
|
196
237
|
end
|
197
|
-
end
|
198
238
|
|
199
|
-
|
200
|
-
# I thought about adding a subscribed callback, but outside of testing it matters less
|
201
|
-
sleep 0.05
|
239
|
+
t.kill
|
202
240
|
|
203
|
-
|
241
|
+
got.map { |m| m.data }.must_equal ["2", "3"]
|
242
|
+
got[1].global_id.must_equal 1
|
204
243
|
|
205
|
-
wait_for(100) do
|
206
|
-
got.length == 1
|
207
244
|
end
|
208
245
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
246
|
+
it "should allow us to get last id on a channel" do
|
247
|
+
@bus.last_id("/foo").must_equal 0
|
248
|
+
@bus.publish("/foo", "1")
|
249
|
+
@bus.last_id("/foo").must_equal 1
|
250
|
+
end
|
213
251
|
|
214
|
-
it "should allow us to get last id on a channel" do
|
215
|
-
@bus.last_id("/foo").must_equal 0
|
216
|
-
@bus.publish("/foo", "1")
|
217
|
-
@bus.last_id("/foo").must_equal 1
|
218
252
|
end
|
219
|
-
|
220
|
-
end
|
221
253
|
end
|
@@ -164,6 +164,26 @@ describe MessageBus::Rack::Middleware do
|
|
164
164
|
last_response.ok?.must_equal true
|
165
165
|
end
|
166
166
|
|
167
|
+
# this means we recover from redis reset
|
168
|
+
it "should understand that larger than position is the same as -1" do
|
169
|
+
@bus.publish('/foo', 'bar')
|
170
|
+
@bus.publish('/baz', 'test')
|
171
|
+
@bus.publish('/boom', 'bang')
|
172
|
+
|
173
|
+
post "/message-bus/ABCD",
|
174
|
+
'/foo' => 1_000_000,
|
175
|
+
'/baz' => @bus.last_id('/baz') + 1,
|
176
|
+
'/boom' => 1_000_000
|
177
|
+
|
178
|
+
last_response.ok?.must_equal true
|
179
|
+
parsed = JSON.parse(last_response.body)
|
180
|
+
|
181
|
+
parsed.length.must_equal 1
|
182
|
+
parsed[0]["channel"].must_equal "/__status"
|
183
|
+
parsed[0]["data"]["/foo"].must_equal @bus.last_id("/foo")
|
184
|
+
parsed[0]["data"]["/boom"].must_equal @bus.last_id("/boom")
|
185
|
+
end
|
186
|
+
|
167
187
|
it "should correctly understand that -1 means stuff from now onwards" do
|
168
188
|
|
169
189
|
# even if allow chunked
|
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: message_bus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 1.1.3
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.1.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: redis
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pg
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
description: A message bus for rack
|
@@ -59,9 +59,9 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
-
- .gitignore
|
63
|
-
- .rubocop.yml
|
64
|
-
- .travis.yml
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rubocop.yml"
|
64
|
+
- ".travis.yml"
|
65
65
|
- CHANGELOG
|
66
66
|
- Gemfile
|
67
67
|
- Guardfile
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- spec/lib/message_bus/timer_thread_spec.rb
|
120
120
|
- spec/lib/message_bus_spec.rb
|
121
121
|
- spec/spec_helper.rb
|
122
|
+
- vendor/assets/javascripts/.gitignore
|
122
123
|
- vendor/assets/javascripts/message-bus-ajax.js
|
123
124
|
- vendor/assets/javascripts/message-bus.js
|
124
125
|
homepage: https://github.com/SamSaffron/message_bus
|
@@ -131,17 +132,17 @@ require_paths:
|
|
131
132
|
- lib
|
132
133
|
required_ruby_version: !ruby/object:Gem::Requirement
|
133
134
|
requirements:
|
134
|
-
- -
|
135
|
+
- - ">="
|
135
136
|
- !ruby/object:Gem::Version
|
136
|
-
version:
|
137
|
+
version: 2.2.0
|
137
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
139
|
requirements:
|
139
|
-
- -
|
140
|
+
- - ">="
|
140
141
|
- !ruby/object:Gem::Version
|
141
142
|
version: '0'
|
142
143
|
requirements: []
|
143
144
|
rubyforge_project:
|
144
|
-
rubygems_version: 2.
|
145
|
+
rubygems_version: 2.6.13
|
145
146
|
signing_key:
|
146
147
|
specification_version: 4
|
147
148
|
summary: ''
|