message_bus 1.1.0 → 1.1.1
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/CHANGELOG +7 -0
- data/README.md +50 -9
- data/assets/message-bus.js +2 -4
- data/lib/message_bus.rb +7 -7
- data/lib/message_bus/client.rb +2 -2
- data/lib/message_bus/version.rb +1 -1
- data/spec/lib/client_spec.rb +25 -0
- data/vendor/assets/javascripts/message-bus.js +2 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 00b86d8f7631445d13999cf03c8474c94a5c6df0
|
4
|
+
data.tar.gz: da3f677b77b8695d27cb5d6997c22894ea33bd5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7bba577513285f36a95898d524e2cc60f832be1e1c7bb92d63313fe82b5862dd3ddeb48930fff071bde92d85be03eea102836af19513633f23e0962c645e8d1d
|
7
|
+
data.tar.gz: bbb1d8c326c2e8c85ddacce97a37aabdf0562ac15b0bd7153ce1fec6ebebbd7c7d68d14a36ec45e1afaa2a1b911ca2e01facf4a86da521669251bf86e97143e2
|
data/CHANGELOG
CHANGED
data/README.md
CHANGED
@@ -4,6 +4,10 @@ A reliable, robust messaging bus for Ruby processes and web clients built on Red
|
|
4
4
|
|
5
5
|
MessageBus implements a Server to Server channel based protocol and Server to Web Client protocol (using polling or long-polling)
|
6
6
|
|
7
|
+
Long-polling is implemented using Rack Hijack and Thin::Async, all common Ruby web server can run MessageBus (Thin, Puma, Unicorn) and handle a large amount of concurrent connections that wait on messages.
|
8
|
+
|
9
|
+
MessageBus is implemented as Rack middleware and can be used by and Rails / Sinatra or pure Rack application.
|
10
|
+
|
7
11
|
|
8
12
|
## Installation
|
9
13
|
|
@@ -78,8 +82,14 @@ MessageBus.publish "/channel", "some message"
|
|
78
82
|
|
79
83
|
# you may publish messages to ALL sites using the /global/ prefix
|
80
84
|
MessageBus.publish "/global/channel", "will go to all sites"
|
85
|
+
|
81
86
|
```
|
82
87
|
|
88
|
+
### Client support
|
89
|
+
|
90
|
+
MessageBus ships a simple ~300 line JavaScript library which provides an API to interact with the server.
|
91
|
+
|
92
|
+
|
83
93
|
JavaScript can listen on any channel (and receive notification via polling or long polling):
|
84
94
|
|
85
95
|
```html
|
@@ -96,9 +106,41 @@ MessageBus.subscribe("/channel", function(data){
|
|
96
106
|
// data shipped from server
|
97
107
|
});
|
98
108
|
|
99
|
-
|
100
109
|
```
|
101
110
|
|
111
|
+
**Client settings**:
|
112
|
+
|
113
|
+
|
114
|
+
All client settings are settable via `MessageBus.OPTION`
|
115
|
+
|
116
|
+
Setting|Default|
|
117
|
+
----|---|---|
|
118
|
+
enableLongPolling|true|Allow long-polling (provided it is enable by the server)
|
119
|
+
callbackInterval|15000|Safeguard to ensure background polling does not exceed this interval (in milliseconds)
|
120
|
+
backgroundCallbackInterval|60000|Interval to poll when long polling is disabled (either explicitly or due to browser being in backgroud)
|
121
|
+
maxPollInterval|180000|If request to the server start failing, MessageBus will backoff, this is the upper limit of the backoff.
|
122
|
+
alwaysLongPoll|false|For debugging you may want to disable the "is browser in background" check and always long-poll
|
123
|
+
baseUrl|/|If message bus is mounted in a subdirectory of different domain, you may configure it to perform requests there
|
124
|
+
ajax|$.ajax|The only dependency on jQuery, you may set up a custom ajax function here
|
125
|
+
|
126
|
+
**API**:
|
127
|
+
|
128
|
+
`MessageBus.diagnostics()` : Returns a log that may be used for diagnostics on the status of message bus
|
129
|
+
|
130
|
+
`MessageBus.pause()` : Pause all MessageBus activity
|
131
|
+
|
132
|
+
`MessageBus.resume()` : Resume MessageBus activity
|
133
|
+
|
134
|
+
`MessageBus.stop()` : Stop all MessageBus activity
|
135
|
+
|
136
|
+
`MessageBus.start()` : Must be called to startup the MessageBus poller
|
137
|
+
|
138
|
+
`MessageBus.subscribe(channel,func,lastId)` : Subscribe to a channel, optionally you may specify the id of the last message you received in the channel.
|
139
|
+
|
140
|
+
`MessageBus.unsubscribe(channel,func)` : Unsubscribe callback from a particular channel
|
141
|
+
|
142
|
+
|
143
|
+
|
102
144
|
## Configuration
|
103
145
|
|
104
146
|
### Redis
|
@@ -145,14 +187,13 @@ after_fork do |server, worker|
|
|
145
187
|
end
|
146
188
|
```
|
147
189
|
|
148
|
-
##
|
190
|
+
## Want to help?
|
191
|
+
|
192
|
+
If you are looking to contribute to this project here are some ideas
|
149
193
|
|
150
|
-
|
194
|
+
- Build an in-memory storage backend to ease testing and for very simple deployments
|
195
|
+
- Build a PostgreSQL backend using NOTIFY and LISTEN
|
196
|
+
- Improve general documentation
|
197
|
+
- Port the test suite to MiniTest
|
151
198
|
|
152
|
-
## Contributing
|
153
199
|
|
154
|
-
1. Fork it
|
155
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
156
|
-
3. Commit your changes (`git commit -am 'Added some feature'`)
|
157
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
158
|
-
5. Create new Pull Request
|
data/assets/message-bus.js
CHANGED
@@ -174,7 +174,7 @@ window.MessageBus = (function() {
|
|
174
174
|
baseUrl: baseUrl,
|
175
175
|
// TODO we can make the dependency on $ and jQuery conditional
|
176
176
|
// all we really need is an implementation of ajax
|
177
|
-
ajax: $.ajax,
|
177
|
+
ajax: ($ && $.ajax),
|
178
178
|
|
179
179
|
diagnostics: function(){
|
180
180
|
console.log("Stopped: " + stopped + " Started: " + started);
|
@@ -200,15 +200,13 @@ window.MessageBus = (function() {
|
|
200
200
|
},
|
201
201
|
|
202
202
|
// Start polling
|
203
|
-
start: function(
|
203
|
+
start: function() {
|
204
204
|
var poll, delayPollTimeout;
|
205
205
|
|
206
206
|
if (started) return;
|
207
207
|
started = true;
|
208
208
|
stopped = false;
|
209
209
|
|
210
|
-
if (!opts) opts = {};
|
211
|
-
|
212
210
|
poll = function() {
|
213
211
|
var data;
|
214
212
|
|
data/lib/message_bus.rb
CHANGED
@@ -232,10 +232,10 @@ module MessageBus::Implementation
|
|
232
232
|
ENCODE_SITE_TOKEN = "$|$"
|
233
233
|
|
234
234
|
# encode channel name to include site
|
235
|
-
def encode_channel_name(channel)
|
236
|
-
if site_id_lookup && !global?(channel)
|
235
|
+
def encode_channel_name(channel, site_id=nil)
|
236
|
+
if (site_id || site_id_lookup) && !global?(channel)
|
237
237
|
raise ArgumentError.new channel if channel.include? ENCODE_SITE_TOKEN
|
238
|
-
"#{channel}#{ENCODE_SITE_TOKEN}#{site_id_lookup.call}"
|
238
|
+
"#{channel}#{ENCODE_SITE_TOKEN}#{site_id || site_id_lookup.call}"
|
239
239
|
else
|
240
240
|
channel
|
241
241
|
end
|
@@ -268,10 +268,10 @@ module MessageBus::Implementation
|
|
268
268
|
backlog(nil, last_id)
|
269
269
|
end
|
270
270
|
|
271
|
-
def backlog(channel=nil, last_id=nil)
|
271
|
+
def backlog(channel=nil, last_id=nil, site_id=nil)
|
272
272
|
old =
|
273
273
|
if channel
|
274
|
-
reliable_pub_sub.backlog(encode_channel_name(channel), last_id)
|
274
|
+
reliable_pub_sub.backlog(encode_channel_name(channel,site_id), last_id)
|
275
275
|
else
|
276
276
|
reliable_pub_sub.global_backlog(last_id)
|
277
277
|
end
|
@@ -282,8 +282,8 @@ module MessageBus::Implementation
|
|
282
282
|
old
|
283
283
|
end
|
284
284
|
|
285
|
-
def last_id(channel)
|
286
|
-
reliable_pub_sub.last_id(encode_channel_name(channel))
|
285
|
+
def last_id(channel,site_id=nil)
|
286
|
+
reliable_pub_sub.last_id(encode_channel_name(channel,site_id))
|
287
287
|
end
|
288
288
|
|
289
289
|
def last_message(channel)
|
data/lib/message_bus/client.rb
CHANGED
@@ -89,7 +89,7 @@ class MessageBus::Client
|
|
89
89
|
r = []
|
90
90
|
@subscriptions.each do |k,v|
|
91
91
|
next if v.to_i < 0
|
92
|
-
messages = @bus.backlog(k,v)
|
92
|
+
messages = @bus.backlog(k, v, site_id)
|
93
93
|
messages.each do |msg|
|
94
94
|
r << msg if allowed?(msg)
|
95
95
|
end
|
@@ -99,7 +99,7 @@ class MessageBus::Client
|
|
99
99
|
@subscriptions.each do |k,v|
|
100
100
|
if v.to_i == -1
|
101
101
|
status_message ||= {}
|
102
|
-
status_message[k] = @bus.last_id(k)
|
102
|
+
status_message[k] = @bus.last_id(k, site_id)
|
103
103
|
end
|
104
104
|
end
|
105
105
|
r << MessageBus::Message.new(-1, -1, '/__status', status_message) if status_message
|
data/lib/message_bus/version.rb
CHANGED
data/spec/lib/client_spec.rb
CHANGED
@@ -15,6 +15,31 @@ describe MessageBus::Client do
|
|
15
15
|
@bus.destroy
|
16
16
|
end
|
17
17
|
|
18
|
+
it "does not bleed data accross sites" do
|
19
|
+
@client.site_id = "test"
|
20
|
+
|
21
|
+
@client.subscribe('/hello', nil)
|
22
|
+
@bus.publish '/hello', 'world'
|
23
|
+
log = @client.backlog
|
24
|
+
log.length.should == 0
|
25
|
+
end
|
26
|
+
|
27
|
+
it "does not bleed status accross sites" do
|
28
|
+
@client.site_id = "test"
|
29
|
+
|
30
|
+
@client.subscribe('/hello', -1)
|
31
|
+
@bus.publish '/hello', 'world'
|
32
|
+
log = @client.backlog
|
33
|
+
log[0].data.should == {"/hello" => 0}
|
34
|
+
end
|
35
|
+
|
36
|
+
it "provides status" do
|
37
|
+
@client.subscribe('/hello', -1)
|
38
|
+
log = @client.backlog
|
39
|
+
log.length.should == 1
|
40
|
+
log[0].data.should == {"/hello" => 0}
|
41
|
+
end
|
42
|
+
|
18
43
|
it "should provide a list of subscriptions" do
|
19
44
|
@client.subscribe('/hello', nil)
|
20
45
|
@client.subscriptions['/hello'].should_not be_nil
|
@@ -174,7 +174,7 @@ window.MessageBus = (function() {
|
|
174
174
|
baseUrl: baseUrl,
|
175
175
|
// TODO we can make the dependency on $ and jQuery conditional
|
176
176
|
// all we really need is an implementation of ajax
|
177
|
-
ajax: $.ajax,
|
177
|
+
ajax: ($ && $.ajax),
|
178
178
|
|
179
179
|
diagnostics: function(){
|
180
180
|
console.log("Stopped: " + stopped + " Started: " + started);
|
@@ -200,15 +200,13 @@ window.MessageBus = (function() {
|
|
200
200
|
},
|
201
201
|
|
202
202
|
// Start polling
|
203
|
-
start: function(
|
203
|
+
start: function() {
|
204
204
|
var poll, delayPollTimeout;
|
205
205
|
|
206
206
|
if (started) return;
|
207
207
|
started = true;
|
208
208
|
stopped = false;
|
209
209
|
|
210
|
-
if (!opts) opts = {};
|
211
|
-
|
212
210
|
poll = function() {
|
213
211
|
var data;
|
214
212
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: message_bus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|