alondra 0.0.4 → 0.1.0
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/Gemfile.lock +71 -69
- data/Rakefile +2 -19
- data/alondra.gemspec +5 -4
- data/app/assets/javascripts/alondra-client.js.coffee.erb +14 -10
- data/app/assets/javascripts/vendor/web_socket.js +29 -19
- data/app/assets/swf/WebSocketMain.swf +0 -0
- data/lib/alondra/message_queue.rb +27 -8
- data/lib/alondra/message_queue_client.rb +6 -2
- data/lib/alondra/push_controller.rb +12 -3
- data/lib/alondra/version.rb +3 -0
- data/lib/alondra.rb +0 -15
- data/test/dummy/app/views/chats/show.html.erb +1 -1
- data/test/integration/push_changes_test.rb +2 -2
- data/test/integration/push_messages_test.rb +2 -2
- data/test/models/event_listener_test.rb +1 -1
- data/test/models/message_queue_test.rb +22 -22
- data/test/models/pushing_test.rb +1 -1
- data/test/support/factories.rb +17 -15
- metadata +12 -6
data/Gemfile.lock
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
alondra (0.0
|
|
4
|
+
alondra (0.1.0)
|
|
5
5
|
daemons
|
|
6
6
|
em-websocket
|
|
7
|
-
em-zeromq (= 0.
|
|
7
|
+
em-zeromq (= 0.3.0)
|
|
8
8
|
rails (>= 3.1.0)
|
|
9
9
|
uuidtools
|
|
10
10
|
|
|
11
11
|
GEM
|
|
12
12
|
remote: http://rubygems.org/
|
|
13
13
|
specs:
|
|
14
|
-
actionmailer (3.2.
|
|
15
|
-
actionpack (= 3.2.
|
|
16
|
-
mail (~> 2.4.
|
|
17
|
-
actionpack (3.2.
|
|
18
|
-
activemodel (= 3.2.
|
|
19
|
-
activesupport (= 3.2.
|
|
14
|
+
actionmailer (3.2.8)
|
|
15
|
+
actionpack (= 3.2.8)
|
|
16
|
+
mail (~> 2.4.4)
|
|
17
|
+
actionpack (3.2.8)
|
|
18
|
+
activemodel (= 3.2.8)
|
|
19
|
+
activesupport (= 3.2.8)
|
|
20
20
|
builder (~> 3.0.0)
|
|
21
21
|
erubis (~> 2.7.0)
|
|
22
|
-
journey (~> 1.0.
|
|
22
|
+
journey (~> 1.0.4)
|
|
23
23
|
rack (~> 1.4.0)
|
|
24
|
-
rack-cache (~> 1.
|
|
24
|
+
rack-cache (~> 1.2)
|
|
25
25
|
rack-test (~> 0.6.1)
|
|
26
|
-
sprockets (~> 2.1.
|
|
27
|
-
activemodel (3.2.
|
|
28
|
-
activesupport (= 3.2.
|
|
26
|
+
sprockets (~> 2.1.3)
|
|
27
|
+
activemodel (3.2.8)
|
|
28
|
+
activesupport (= 3.2.8)
|
|
29
29
|
builder (~> 3.0.0)
|
|
30
|
-
activerecord (3.2.
|
|
31
|
-
activemodel (= 3.2.
|
|
32
|
-
activesupport (= 3.2.
|
|
33
|
-
arel (~> 3.0.
|
|
30
|
+
activerecord (3.2.8)
|
|
31
|
+
activemodel (= 3.2.8)
|
|
32
|
+
activesupport (= 3.2.8)
|
|
33
|
+
arel (~> 3.0.2)
|
|
34
34
|
tzinfo (~> 0.3.29)
|
|
35
|
-
activeresource (3.2.
|
|
36
|
-
activemodel (= 3.2.
|
|
37
|
-
activesupport (= 3.2.
|
|
38
|
-
activesupport (3.2.
|
|
35
|
+
activeresource (3.2.8)
|
|
36
|
+
activemodel (= 3.2.8)
|
|
37
|
+
activesupport (= 3.2.8)
|
|
38
|
+
activesupport (3.2.8)
|
|
39
39
|
i18n (~> 0.6)
|
|
40
40
|
multi_json (~> 1.0)
|
|
41
|
-
addressable (2.2
|
|
41
|
+
addressable (2.3.2)
|
|
42
42
|
arel (3.0.2)
|
|
43
43
|
builder (3.0.0)
|
|
44
44
|
capybara (1.1.2)
|
|
@@ -48,100 +48,102 @@ GEM
|
|
|
48
48
|
rack-test (>= 0.5.4)
|
|
49
49
|
selenium-webdriver (~> 2.0)
|
|
50
50
|
xpath (~> 0.1.4)
|
|
51
|
-
capybara-webkit (0.
|
|
51
|
+
capybara-webkit (0.12.1)
|
|
52
52
|
capybara (>= 1.0.0, < 1.2)
|
|
53
53
|
json
|
|
54
|
-
childprocess (0.3.
|
|
55
|
-
ffi (~> 1.0.6)
|
|
54
|
+
childprocess (0.3.5)
|
|
55
|
+
ffi (~> 1.0, >= 1.0.6)
|
|
56
56
|
coffee-script (2.2.0)
|
|
57
57
|
coffee-script-source
|
|
58
58
|
execjs
|
|
59
|
-
coffee-script-source (1.
|
|
60
|
-
daemons (1.1.
|
|
61
|
-
em-websocket (0.3.
|
|
59
|
+
coffee-script-source (1.3.3)
|
|
60
|
+
daemons (1.1.9)
|
|
61
|
+
em-websocket (0.3.8)
|
|
62
62
|
addressable (>= 2.1.1)
|
|
63
63
|
eventmachine (>= 0.12.9)
|
|
64
|
-
em-zeromq (0.
|
|
65
|
-
eventmachine (
|
|
64
|
+
em-zeromq (0.3.0)
|
|
65
|
+
eventmachine (= 1.0.0.beta.4)
|
|
66
66
|
ffi (>= 1.0.0)
|
|
67
|
-
ffi-rzmq (
|
|
67
|
+
ffi-rzmq (= 0.9.3)
|
|
68
68
|
erubis (2.7.0)
|
|
69
69
|
eventmachine (1.0.0.beta.4)
|
|
70
|
-
execjs (1.
|
|
70
|
+
execjs (1.4.0)
|
|
71
71
|
multi_json (~> 1.0)
|
|
72
|
-
factory_girl (
|
|
73
|
-
activesupport
|
|
74
|
-
ffi (1.
|
|
72
|
+
factory_girl (4.0.0)
|
|
73
|
+
activesupport (>= 3.0.0)
|
|
74
|
+
ffi (1.1.5)
|
|
75
75
|
ffi-rzmq (0.9.3)
|
|
76
76
|
ffi
|
|
77
77
|
hike (1.2.1)
|
|
78
78
|
i18n (0.6.0)
|
|
79
|
-
journey (1.0.
|
|
80
|
-
jquery-rails (2.0.
|
|
81
|
-
railties (>= 3.2.0
|
|
79
|
+
journey (1.0.4)
|
|
80
|
+
jquery-rails (2.0.2)
|
|
81
|
+
railties (>= 3.2.0, < 5.0)
|
|
82
82
|
thor (~> 0.14)
|
|
83
|
-
json (1.
|
|
84
|
-
launchy (2.
|
|
85
|
-
addressable (~> 2.
|
|
83
|
+
json (1.7.4)
|
|
84
|
+
launchy (2.1.2)
|
|
85
|
+
addressable (~> 2.3)
|
|
86
|
+
libwebsocket (0.1.5)
|
|
87
|
+
addressable
|
|
86
88
|
mail (2.4.4)
|
|
87
89
|
i18n (>= 0.4.0)
|
|
88
90
|
mime-types (~> 1.16)
|
|
89
91
|
treetop (~> 1.4.8)
|
|
90
|
-
mime-types (1.
|
|
91
|
-
multi_json (1.
|
|
92
|
+
mime-types (1.19)
|
|
93
|
+
multi_json (1.3.6)
|
|
92
94
|
mysql2 (0.3.11)
|
|
93
|
-
nokogiri (1.5.
|
|
95
|
+
nokogiri (1.5.5)
|
|
94
96
|
polyglot (0.3.3)
|
|
95
97
|
rack (1.4.1)
|
|
96
|
-
rack-cache (1.
|
|
98
|
+
rack-cache (1.2)
|
|
97
99
|
rack (>= 0.4)
|
|
98
100
|
rack-ssl (1.3.2)
|
|
99
101
|
rack
|
|
100
102
|
rack-test (0.6.1)
|
|
101
103
|
rack (>= 1.0)
|
|
102
|
-
rails (3.2.
|
|
103
|
-
actionmailer (= 3.2.
|
|
104
|
-
actionpack (= 3.2.
|
|
105
|
-
activerecord (= 3.2.
|
|
106
|
-
activeresource (= 3.2.
|
|
107
|
-
activesupport (= 3.2.
|
|
104
|
+
rails (3.2.8)
|
|
105
|
+
actionmailer (= 3.2.8)
|
|
106
|
+
actionpack (= 3.2.8)
|
|
107
|
+
activerecord (= 3.2.8)
|
|
108
|
+
activeresource (= 3.2.8)
|
|
109
|
+
activesupport (= 3.2.8)
|
|
108
110
|
bundler (~> 1.0)
|
|
109
|
-
railties (= 3.2.
|
|
110
|
-
railties (3.2.
|
|
111
|
-
actionpack (= 3.2.
|
|
112
|
-
activesupport (= 3.2.
|
|
111
|
+
railties (= 3.2.8)
|
|
112
|
+
railties (3.2.8)
|
|
113
|
+
actionpack (= 3.2.8)
|
|
114
|
+
activesupport (= 3.2.8)
|
|
113
115
|
rack-ssl (~> 1.3.2)
|
|
114
116
|
rake (>= 0.8.7)
|
|
115
117
|
rdoc (~> 3.4)
|
|
116
|
-
thor (
|
|
118
|
+
thor (>= 0.14.6, < 2.0)
|
|
117
119
|
rake (0.9.2.2)
|
|
118
120
|
rdoc (3.12)
|
|
119
121
|
json (~> 1.4)
|
|
120
|
-
rubyzip (0.9.
|
|
121
|
-
sass (3.
|
|
122
|
-
sass-rails (3.2.
|
|
123
|
-
railties (~> 3.2.0
|
|
122
|
+
rubyzip (0.9.9)
|
|
123
|
+
sass (3.2.0)
|
|
124
|
+
sass-rails (3.2.5)
|
|
125
|
+
railties (~> 3.2.0)
|
|
124
126
|
sass (>= 3.1.10)
|
|
125
127
|
tilt (~> 1.3)
|
|
126
|
-
selenium-webdriver (2.
|
|
128
|
+
selenium-webdriver (2.25.0)
|
|
127
129
|
childprocess (>= 0.2.5)
|
|
128
|
-
|
|
129
|
-
multi_json (~> 1.0
|
|
130
|
+
libwebsocket (~> 0.1.3)
|
|
131
|
+
multi_json (~> 1.0)
|
|
130
132
|
rubyzip
|
|
131
|
-
sprockets (2.1.
|
|
133
|
+
sprockets (2.1.3)
|
|
132
134
|
hike (~> 1.2)
|
|
133
135
|
rack (~> 1.0)
|
|
134
136
|
tilt (~> 1.1, != 1.3.0)
|
|
135
|
-
thor (0.
|
|
137
|
+
thor (0.15.4)
|
|
136
138
|
tilt (1.3.3)
|
|
137
139
|
treetop (1.4.10)
|
|
138
140
|
polyglot
|
|
139
141
|
polyglot (>= 0.3.1)
|
|
140
|
-
tzinfo (0.3.
|
|
141
|
-
uglifier (1.2.
|
|
142
|
+
tzinfo (0.3.33)
|
|
143
|
+
uglifier (1.2.7)
|
|
142
144
|
execjs (>= 0.3.0)
|
|
143
|
-
multi_json (
|
|
144
|
-
uuidtools (2.1.
|
|
145
|
+
multi_json (~> 1.3)
|
|
146
|
+
uuidtools (2.1.3)
|
|
145
147
|
xpath (0.1.4)
|
|
146
148
|
nokogiri (~> 1.3)
|
|
147
149
|
|
data/Rakefile
CHANGED
|
@@ -1,27 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env rake
|
|
2
2
|
begin
|
|
3
3
|
require 'bundler/setup'
|
|
4
|
+
require "bundler/gem_tasks"
|
|
5
|
+
require 'rake/testtask'
|
|
4
6
|
rescue LoadError
|
|
5
7
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
6
8
|
end
|
|
7
|
-
begin
|
|
8
|
-
require 'rdoc/task'
|
|
9
|
-
rescue LoadError
|
|
10
|
-
require 'rdoc/rdoc'
|
|
11
|
-
require 'rake/rdoctask'
|
|
12
|
-
RDoc::Task = Rake::RDocTask
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
RDoc::Task.new(:rdoc) do |rdoc|
|
|
16
|
-
rdoc.rdoc_dir = 'rdoc'
|
|
17
|
-
rdoc.title = 'Alondra'
|
|
18
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
|
19
|
-
rdoc.rdoc_files.include('README.rdoc')
|
|
20
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
require 'rake/testtask'
|
|
25
9
|
|
|
26
10
|
Rake::TestTask.new(:test) do |t|
|
|
27
11
|
t.libs << 'lib'
|
|
@@ -30,5 +14,4 @@ Rake::TestTask.new(:test) do |t|
|
|
|
30
14
|
t.verbose = false
|
|
31
15
|
end
|
|
32
16
|
|
|
33
|
-
|
|
34
17
|
task :default => :test
|
data/alondra.gemspec
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require File.expand_path('../lib/alondra/version', __FILE__)
|
|
3
|
+
|
|
3
4
|
Gem::Specification.new do |s|
|
|
4
5
|
s.name = "alondra"
|
|
5
6
|
s.summary = "Add real time capabilities to your rails app"
|
|
6
7
|
s.description = "Add real time capabilities to your rails app"
|
|
7
|
-
s.version =
|
|
8
|
+
s.version = Alondra::VERSION
|
|
8
9
|
s.authors = ['Alberto F. Capel', 'Ryan LeCompte']
|
|
9
10
|
|
|
10
11
|
s.files = `git ls-files`.split("\n")
|
|
@@ -17,5 +18,5 @@ Gem::Specification.new do |s|
|
|
|
17
18
|
s.add_dependency('uuidtools')
|
|
18
19
|
s.add_dependency('rails', '>= 3.1.0')
|
|
19
20
|
s.add_dependency('em-websocket')
|
|
20
|
-
s.add_dependency('em-zeromq', '0.
|
|
21
|
+
s.add_dependency('em-zeromq', '0.3.0')
|
|
21
22
|
end
|
|
@@ -8,9 +8,9 @@ window.WEB_SOCKET_SWF_LOCATION = "<%= asset_path 'WebSocketMain.swf' %>"
|
|
|
8
8
|
|
|
9
9
|
class @AlondraClient
|
|
10
10
|
constructor: (@server, @channels=[], @token = null, @retry = 10000) ->
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
@channels = [@channels] unless @channels instanceof Array
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
@url = "ws://#{@server}"
|
|
15
15
|
@url += "?token=#{@token}" if @token
|
|
16
16
|
|
|
@@ -20,28 +20,31 @@ class @AlondraClient
|
|
|
20
20
|
if @socket.readyState == 0 # Socket is connecting
|
|
21
21
|
@channels.push(channel) # Schedule for later subscription
|
|
22
22
|
return
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
subscription =
|
|
25
25
|
command: 'subscribe'
|
|
26
26
|
channel: channel
|
|
27
27
|
|
|
28
28
|
@socket.send $.toJSON(subscription)
|
|
29
29
|
@
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
|
|
31
|
+
opened: () =>
|
|
32
32
|
if @reconnectInterval
|
|
33
33
|
clearInterval(@reconnectInterval)
|
|
34
34
|
@reconnectInterval = null
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
@subscribe(channel) for channel in @channels
|
|
37
|
-
|
|
37
|
+
$(this).trigger('connected')
|
|
38
|
+
true
|
|
39
|
+
|
|
38
40
|
connect: =>
|
|
39
41
|
@socket = new WebSocket(@url)
|
|
40
|
-
|
|
41
|
-
@socket.onopen = @
|
|
42
|
+
|
|
43
|
+
@socket.onopen = @opened
|
|
42
44
|
|
|
43
45
|
@socket.onclose = () =>
|
|
44
46
|
this.reconnect()
|
|
47
|
+
$(this).trigger('disconnected')
|
|
45
48
|
|
|
46
49
|
@socket.onmessage = (message) =>
|
|
47
50
|
msg = $.parseJSON(message.data)
|
|
@@ -53,7 +56,8 @@ class @AlondraClient
|
|
|
53
56
|
|
|
54
57
|
@socket.onerror = (error) =>
|
|
55
58
|
@reconnect()
|
|
56
|
-
|
|
59
|
+
$(this).trigger('error', error)
|
|
60
|
+
|
|
57
61
|
@
|
|
58
62
|
|
|
59
63
|
process: (serverEvent) ->
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
// Copyright: Hiroshi Ichikawa <http://gimite.net/en/>
|
|
2
2
|
// License: New BSD License
|
|
3
3
|
// Reference: http://dev.w3.org/html5/websockets/
|
|
4
|
-
// Reference: http://tools.ietf.org/html/
|
|
4
|
+
// Reference: http://tools.ietf.org/html/rfc6455
|
|
5
5
|
|
|
6
6
|
(function() {
|
|
7
7
|
|
|
8
|
-
if (window.
|
|
8
|
+
if (window.WEB_SOCKET_FORCE_FLASH) {
|
|
9
|
+
// Keeps going.
|
|
10
|
+
} else if (window.WebSocket) {
|
|
11
|
+
return;
|
|
12
|
+
} else if (window.MozWebSocket) {
|
|
13
|
+
// Firefox.
|
|
14
|
+
window.WebSocket = MozWebSocket;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
9
17
|
|
|
10
18
|
var logger;
|
|
11
19
|
if (window.WEB_SOCKET_LOGGER) {
|
|
@@ -30,14 +38,14 @@
|
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
/**
|
|
33
|
-
*
|
|
41
|
+
* Our own implementation of WebSocket class using Flash.
|
|
34
42
|
* @param {string} url
|
|
35
43
|
* @param {array or string} protocols
|
|
36
44
|
* @param {string} proxyHost
|
|
37
45
|
* @param {int} proxyPort
|
|
38
46
|
* @param {string} headers
|
|
39
47
|
*/
|
|
40
|
-
WebSocket = function(url, protocols, proxyHost, proxyPort, headers) {
|
|
48
|
+
window.WebSocket = function(url, protocols, proxyHost, proxyPort, headers) {
|
|
41
49
|
var self = this;
|
|
42
50
|
self.__id = WebSocket.__nextId++;
|
|
43
51
|
WebSocket.__instances[self.__id] = self;
|
|
@@ -91,10 +99,10 @@
|
|
|
91
99
|
*/
|
|
92
100
|
WebSocket.prototype.close = function() {
|
|
93
101
|
if (this.__createTask) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
102
|
+
clearTimeout(this.__createTask);
|
|
103
|
+
this.__createTask = null;
|
|
104
|
+
this.readyState = WebSocket.CLOSED;
|
|
105
|
+
return;
|
|
98
106
|
}
|
|
99
107
|
if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) {
|
|
100
108
|
return;
|
|
@@ -213,6 +221,7 @@
|
|
|
213
221
|
WebSocket.CLOSING = 2;
|
|
214
222
|
WebSocket.CLOSED = 3;
|
|
215
223
|
|
|
224
|
+
WebSocket.__initialized = false;
|
|
216
225
|
WebSocket.__flash = null;
|
|
217
226
|
WebSocket.__instances = {};
|
|
218
227
|
WebSocket.__tasks = [];
|
|
@@ -232,7 +241,9 @@
|
|
|
232
241
|
* Loads WebSocketMain.swf and creates WebSocketMain object in Flash.
|
|
233
242
|
*/
|
|
234
243
|
WebSocket.__initialize = function() {
|
|
235
|
-
|
|
244
|
+
|
|
245
|
+
if (WebSocket.__initialized) return;
|
|
246
|
+
WebSocket.__initialized = true;
|
|
236
247
|
|
|
237
248
|
if (WebSocket.__swfLocation) {
|
|
238
249
|
// For backword compatibility.
|
|
@@ -290,7 +301,9 @@
|
|
|
290
301
|
if (!e.success) {
|
|
291
302
|
logger.error("[WebSocket] swfobject.embedSWF failed");
|
|
292
303
|
}
|
|
293
|
-
}
|
|
304
|
+
}
|
|
305
|
+
);
|
|
306
|
+
|
|
294
307
|
};
|
|
295
308
|
|
|
296
309
|
/**
|
|
@@ -365,15 +378,12 @@
|
|
|
365
378
|
};
|
|
366
379
|
|
|
367
380
|
if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
WebSocket.__initialize();
|
|
375
|
-
});
|
|
376
|
-
}
|
|
381
|
+
// NOTE:
|
|
382
|
+
// This fires immediately if web_socket.js is dynamically loaded after
|
|
383
|
+
// the document is loaded.
|
|
384
|
+
swfobject.addDomLoadEvent(function() {
|
|
385
|
+
WebSocket.__initialize();
|
|
386
|
+
});
|
|
377
387
|
}
|
|
378
388
|
|
|
379
389
|
})();
|
|
Binary file
|
|
@@ -9,13 +9,15 @@ module Alondra
|
|
|
9
9
|
def start_listening
|
|
10
10
|
Log.info "Starting message queue"
|
|
11
11
|
|
|
12
|
-
if @
|
|
13
|
-
Log.warn '
|
|
12
|
+
if @pull_socket || @push_socket
|
|
13
|
+
Log.warn 'Connections to message queue started twice'
|
|
14
14
|
reset!
|
|
15
15
|
end
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
|
|
17
|
+
push_socket
|
|
18
|
+
pull_socket
|
|
19
|
+
|
|
20
|
+
self
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
def on_readable(socket, messages)
|
|
@@ -47,13 +49,30 @@ module Alondra
|
|
|
47
49
|
def receive(event)
|
|
48
50
|
event_router.process(event)
|
|
49
51
|
end
|
|
52
|
+
|
|
53
|
+
def push_socket
|
|
54
|
+
@push_socket ||= begin
|
|
55
|
+
push_socket = context.socket(ZMQ::PUSH)
|
|
56
|
+
push_socket.connect(Alondra.config.queue_socket)
|
|
57
|
+
push_socket
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def pull_socket
|
|
62
|
+
@pull_socket ||= begin
|
|
63
|
+
pull_socket = context.socket(ZMQ::PULL, self)
|
|
64
|
+
pull_socket.bind(Alondra.config.queue_socket)
|
|
65
|
+
pull_socket
|
|
66
|
+
end
|
|
67
|
+
end
|
|
50
68
|
|
|
51
69
|
def reset!
|
|
52
|
-
@
|
|
53
|
-
|
|
54
|
-
|
|
70
|
+
@push_socket.close()
|
|
71
|
+
@pull_socket.close()
|
|
72
|
+
|
|
55
73
|
@context = nil
|
|
56
74
|
@push_socket = nil
|
|
75
|
+
@pull_socket = nil
|
|
57
76
|
end
|
|
58
77
|
|
|
59
78
|
private
|
|
@@ -38,7 +38,11 @@ module Alondra
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def push_socket
|
|
41
|
-
@push_socket ||=
|
|
41
|
+
@push_socket ||= begin
|
|
42
|
+
push_socket = context.socket(ZMQ::PUSH)
|
|
43
|
+
push_socket.connect(Alondra.config.queue_socket)
|
|
44
|
+
push_socket
|
|
45
|
+
end
|
|
42
46
|
end
|
|
43
47
|
|
|
44
48
|
def context
|
|
@@ -58,7 +62,7 @@ module Alondra
|
|
|
58
62
|
|
|
59
63
|
def push_socket
|
|
60
64
|
@push_socket ||= begin
|
|
61
|
-
socket = context.socket(ZMQ::
|
|
65
|
+
socket = context.socket(ZMQ::PUSH)
|
|
62
66
|
socket.connect(Alondra.config.queue_socket)
|
|
63
67
|
socket
|
|
64
68
|
end
|
|
@@ -6,7 +6,8 @@ module Alondra
|
|
|
6
6
|
include AbstractController::Helpers
|
|
7
7
|
include AbstractController::Translation
|
|
8
8
|
include AbstractController::AssetPaths
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
helper_method :protect_against_forgery?
|
|
10
11
|
|
|
11
12
|
attr_accessor :channel_names
|
|
12
13
|
attr_accessor :request
|
|
@@ -14,7 +15,7 @@ module Alondra
|
|
|
14
15
|
def initialize(context, to, request = nil)
|
|
15
16
|
@channel_names = Channel.names_for(to)
|
|
16
17
|
@request = request
|
|
17
|
-
|
|
18
|
+
|
|
18
19
|
self.class.view_paths = ActionController::Base.view_paths
|
|
19
20
|
copy_instance_variables_from(context)
|
|
20
21
|
end
|
|
@@ -37,11 +38,19 @@ module Alondra
|
|
|
37
38
|
def view_paths
|
|
38
39
|
@view_paths ||= ApplicationController.send '_view_paths'
|
|
39
40
|
end
|
|
40
|
-
|
|
41
|
+
|
|
41
42
|
def action_name
|
|
42
43
|
'push'
|
|
43
44
|
end
|
|
44
45
|
|
|
46
|
+
def protect_against_forgery?
|
|
47
|
+
false
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def self.protect_against_forgery?
|
|
51
|
+
false
|
|
52
|
+
end
|
|
53
|
+
|
|
45
54
|
private
|
|
46
55
|
|
|
47
56
|
def copy_instance_variables_from(context)
|
data/lib/alondra.rb
CHANGED
|
@@ -18,7 +18,6 @@ require_relative 'alondra/changes_push'
|
|
|
18
18
|
require_relative 'alondra/server'
|
|
19
19
|
|
|
20
20
|
module Alondra
|
|
21
|
-
|
|
22
21
|
ActiveRecord::Base.extend ChangesPush
|
|
23
22
|
ActionController::Base.send :include, Pushing
|
|
24
23
|
|
|
@@ -58,11 +57,9 @@ module Alondra
|
|
|
58
57
|
end
|
|
59
58
|
|
|
60
59
|
def self.start_server!
|
|
61
|
-
|
|
62
60
|
start_server_proc = Proc.new do
|
|
63
61
|
MessageQueue.instance.start_listening
|
|
64
62
|
Server.run
|
|
65
|
-
die_gracefully_on_signal
|
|
66
63
|
end
|
|
67
64
|
|
|
68
65
|
if EM.reactor_running?
|
|
@@ -72,18 +69,6 @@ module Alondra
|
|
|
72
69
|
EM.run(start_server_proc)
|
|
73
70
|
end
|
|
74
71
|
end
|
|
75
|
-
|
|
76
|
-
def self.die_gracefully_on_signal
|
|
77
|
-
Signal.trap("INT") do
|
|
78
|
-
Log.warn "INT signal trapped. Shutting down EM reactor"
|
|
79
|
-
EM.stop
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
Signal.trap("TERM") do
|
|
83
|
-
Log.warn "TERM signal trapped. Shutting down EM reactor"
|
|
84
|
-
EM.stop
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
72
|
end
|
|
88
73
|
end
|
|
89
74
|
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
<%= javascript_include_tag 'alondra-client' %>
|
|
37
37
|
|
|
38
38
|
<script type="text/javascript">
|
|
39
|
-
var client = new AlondraClient('localhost:<%= Alondra::Alondra.config.port %>', '<%= chat_path(@
|
|
39
|
+
var client = new AlondraClient('localhost:<%= Alondra::Alondra.config.port %>', '<%= chat_path(@chat) %>', '<%= encrypted_token %>');
|
|
40
40
|
|
|
41
41
|
$(client).bind('subscribed.Chat', function(event, resource){
|
|
42
42
|
console.log('Received subscribed event!');
|
|
@@ -16,8 +16,8 @@ module Alondra
|
|
|
16
16
|
|
|
17
17
|
test "push chat changes to client" do
|
|
18
18
|
|
|
19
|
-
user =
|
|
20
|
-
chat =
|
|
19
|
+
user = FactoryGirl.create :user
|
|
20
|
+
chat = FactoryGirl.create :chat, :name => 'A chat about nothing'
|
|
21
21
|
|
|
22
22
|
login_as user
|
|
23
23
|
|
|
@@ -16,10 +16,10 @@ module Alondra
|
|
|
16
16
|
test "execute messages in client" do
|
|
17
17
|
self.extend Pushing
|
|
18
18
|
|
|
19
|
-
@user =
|
|
19
|
+
@user = FactoryGirl.create :user
|
|
20
20
|
@text = 'hola!'
|
|
21
21
|
|
|
22
|
-
chat =
|
|
22
|
+
chat = FactoryGirl.create :chat, :name => 'A chat to receive messages'
|
|
23
23
|
|
|
24
24
|
login_as @user
|
|
25
25
|
|
|
@@ -17,28 +17,28 @@ module Alondra
|
|
|
17
17
|
MessageQueue.instance.instance_variable_set :@event_router, @original_event_router
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
test "a message pushed asynchronously to the queue is received by the event router" do
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
test "a message pushed synchronously to the queue is received by the event router" do
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
end
|
|
20
|
+
# test "a message pushed asynchronously to the queue is received by the event router" do
|
|
21
|
+
# assert MessageQueueClient.instance.class == AsyncMessageQueueClient
|
|
22
|
+
#
|
|
23
|
+
# MessageQueueClient.push @event
|
|
24
|
+
#
|
|
25
|
+
# sleep(0.1)
|
|
26
|
+
#
|
|
27
|
+
# assert received(@event)
|
|
28
|
+
# end
|
|
29
|
+
#
|
|
30
|
+
# test "a message pushed synchronously to the queue is received by the event router" do
|
|
31
|
+
#
|
|
32
|
+
# client = MessageQueueClient.sync_instance
|
|
33
|
+
# context = client.send :context
|
|
34
|
+
# assert context.class == ZMQ::Context
|
|
35
|
+
#
|
|
36
|
+
# client.send_message(@event)
|
|
37
|
+
#
|
|
38
|
+
# sleep(0.1)
|
|
39
|
+
#
|
|
40
|
+
# assert received(@event)
|
|
41
|
+
# end
|
|
42
42
|
|
|
43
43
|
test "message queue still works when an exception is thrown while processing an event" do
|
|
44
44
|
3.times do
|
data/test/models/pushing_test.rb
CHANGED
|
@@ -5,7 +5,7 @@ module Alondra
|
|
|
5
5
|
class PushingTest < ActiveSupport::TestCase
|
|
6
6
|
|
|
7
7
|
test "publish created events to the specified channel" do
|
|
8
|
-
chat =
|
|
8
|
+
chat = FactoryGirl.create :chat
|
|
9
9
|
connection = MockConnection.new
|
|
10
10
|
message = chat.messages.build(:text => 'test message')
|
|
11
11
|
|
data/test/support/factories.rb
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
FactoryGirl.define do
|
|
2
|
+
factory :chat do
|
|
3
|
+
name 'Test chat'
|
|
4
|
+
end
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
end
|
|
6
|
+
factory :message do
|
|
7
|
+
association :chat
|
|
8
|
+
text 'Test message'
|
|
9
|
+
end
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
end
|
|
11
|
+
sequence :username do |i|
|
|
12
|
+
"user#{i}"
|
|
13
|
+
end
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
factory :user do
|
|
16
|
+
username { FactoryGirl.generate(:username) }
|
|
17
|
+
email { |u| "#{u.username}@example.com" }
|
|
18
|
+
password 'secret'
|
|
19
|
+
password_confirmation 'secret'
|
|
20
|
+
end
|
|
19
21
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: alondra
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2012-
|
|
13
|
+
date: 2012-08-12 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: daemons
|
|
@@ -83,7 +83,7 @@ dependencies:
|
|
|
83
83
|
requirements:
|
|
84
84
|
- - '='
|
|
85
85
|
- !ruby/object:Gem::Version
|
|
86
|
-
version: 0.
|
|
86
|
+
version: 0.3.0
|
|
87
87
|
type: :runtime
|
|
88
88
|
prerelease: false
|
|
89
89
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -91,7 +91,7 @@ dependencies:
|
|
|
91
91
|
requirements:
|
|
92
92
|
- - '='
|
|
93
93
|
- !ruby/object:Gem::Version
|
|
94
|
-
version: 0.
|
|
94
|
+
version: 0.3.0
|
|
95
95
|
description: Add real time capabilities to your rails app
|
|
96
96
|
email:
|
|
97
97
|
executables: []
|
|
@@ -132,6 +132,7 @@ files:
|
|
|
132
132
|
- lib/alondra/pushing.rb
|
|
133
133
|
- lib/alondra/server.rb
|
|
134
134
|
- lib/alondra/session_parser.rb
|
|
135
|
+
- lib/alondra/version.rb
|
|
135
136
|
- lib/generators/alondra/USAGE
|
|
136
137
|
- lib/generators/alondra/alondra_generator.rb
|
|
137
138
|
- lib/generators/alondra/templates/alondra
|
|
@@ -227,15 +228,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
227
228
|
- - ! '>='
|
|
228
229
|
- !ruby/object:Gem::Version
|
|
229
230
|
version: '0'
|
|
231
|
+
segments:
|
|
232
|
+
- 0
|
|
233
|
+
hash: 3172633701329526512
|
|
230
234
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
235
|
none: false
|
|
232
236
|
requirements:
|
|
233
237
|
- - ! '>='
|
|
234
238
|
- !ruby/object:Gem::Version
|
|
235
239
|
version: '0'
|
|
240
|
+
segments:
|
|
241
|
+
- 0
|
|
242
|
+
hash: 3172633701329526512
|
|
236
243
|
requirements: []
|
|
237
244
|
rubyforge_project:
|
|
238
|
-
rubygems_version: 1.8.
|
|
245
|
+
rubygems_version: 1.8.23
|
|
239
246
|
signing_key:
|
|
240
247
|
specification_version: 3
|
|
241
248
|
summary: Add real time capabilities to your rails app
|
|
@@ -318,4 +325,3 @@ test_files:
|
|
|
318
325
|
- test/support/mocks/mock_event_router.rb
|
|
319
326
|
- test/support/mocks/mock_listener.rb
|
|
320
327
|
- test/test_helper.rb
|
|
321
|
-
has_rdoc:
|