alondra 0.0.3 → 0.0.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/Gemfile.lock CHANGED
@@ -1,138 +1,134 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- alondra (0.0.2)
4
+ alondra (0.0.4)
5
5
  daemons
6
6
  em-websocket
7
- em-zeromq (= 0.2.1)
8
- eventmachine (>= 1.0.0.beta.3)
9
- ffi-rzmq (= 0.8.0)
7
+ em-zeromq (= 0.2.2)
10
8
  rails (>= 3.1.0)
11
9
  uuidtools
12
10
 
13
11
  GEM
14
12
  remote: http://rubygems.org/
15
13
  specs:
16
- actionmailer (3.1.1)
17
- actionpack (= 3.1.1)
18
- mail (~> 2.3.0)
19
- actionpack (3.1.1)
20
- activemodel (= 3.1.1)
21
- activesupport (= 3.1.1)
14
+ actionmailer (3.2.0)
15
+ actionpack (= 3.2.0)
16
+ mail (~> 2.4.0)
17
+ actionpack (3.2.0)
18
+ activemodel (= 3.2.0)
19
+ activesupport (= 3.2.0)
22
20
  builder (~> 3.0.0)
23
21
  erubis (~> 2.7.0)
24
- i18n (~> 0.6)
25
- rack (~> 1.3.2)
22
+ journey (~> 1.0.0)
23
+ rack (~> 1.4.0)
26
24
  rack-cache (~> 1.1)
27
- rack-mount (~> 0.8.2)
28
25
  rack-test (~> 0.6.1)
29
- sprockets (~> 2.0.2)
30
- activemodel (3.1.1)
31
- activesupport (= 3.1.1)
26
+ sprockets (~> 2.1.2)
27
+ activemodel (3.2.0)
28
+ activesupport (= 3.2.0)
32
29
  builder (~> 3.0.0)
33
- i18n (~> 0.6)
34
- activerecord (3.1.1)
35
- activemodel (= 3.1.1)
36
- activesupport (= 3.1.1)
37
- arel (~> 2.2.1)
30
+ activerecord (3.2.0)
31
+ activemodel (= 3.2.0)
32
+ activesupport (= 3.2.0)
33
+ arel (~> 3.0.0)
38
34
  tzinfo (~> 0.3.29)
39
- activeresource (3.1.1)
40
- activemodel (= 3.1.1)
41
- activesupport (= 3.1.1)
42
- activesupport (3.1.1)
35
+ activeresource (3.2.0)
36
+ activemodel (= 3.2.0)
37
+ activesupport (= 3.2.0)
38
+ activesupport (3.2.0)
39
+ i18n (~> 0.6)
43
40
  multi_json (~> 1.0)
44
41
  addressable (2.2.6)
45
- arel (2.2.1)
42
+ arel (3.0.2)
46
43
  builder (3.0.0)
47
- capybara (1.1.1)
44
+ capybara (1.1.2)
48
45
  mime-types (>= 1.16)
49
46
  nokogiri (>= 1.3.3)
50
47
  rack (>= 1.0.0)
51
48
  rack-test (>= 0.5.4)
52
49
  selenium-webdriver (~> 2.0)
53
50
  xpath (~> 0.1.4)
54
- capybara-webkit (0.7.2)
51
+ capybara-webkit (0.8.0)
55
52
  capybara (>= 1.0.0, < 1.2)
56
- childprocess (0.2.2)
53
+ json
54
+ childprocess (0.3.0)
57
55
  ffi (~> 1.0.6)
58
56
  coffee-script (2.2.0)
59
57
  coffee-script-source
60
58
  execjs
61
- coffee-script-source (1.1.2)
62
- daemons (1.1.4)
63
- em-websocket (0.3.5)
59
+ coffee-script-source (1.2.0)
60
+ daemons (1.1.8)
61
+ em-websocket (0.3.6)
64
62
  addressable (>= 2.1.1)
65
63
  eventmachine (>= 0.12.9)
66
- em-zeromq (0.2.1)
67
- eventmachine (>= 1.0.0.beta.3)
68
- ffi-rzmq (>= 0.7.2)
64
+ em-zeromq (0.2.2)
65
+ eventmachine (>= 1.0.0.beta.4)
66
+ ffi (>= 1.0.0)
67
+ ffi-rzmq (~> 0.9.0)
69
68
  erubis (2.7.0)
70
69
  eventmachine (1.0.0.beta.4)
71
- execjs (1.2.9)
70
+ execjs (1.3.0)
72
71
  multi_json (~> 1.0)
73
- factory_girl (2.2.0)
72
+ factory_girl (2.5.0)
74
73
  activesupport
75
- ffi (1.0.9)
76
- ffi-rzmq (0.8.0)
74
+ ffi (1.0.11)
75
+ ffi-rzmq (0.9.3)
76
+ ffi
77
77
  hike (1.2.1)
78
78
  i18n (0.6.0)
79
- jquery-rails (1.0.16)
80
- railties (~> 3.0)
79
+ journey (1.0.0)
80
+ jquery-rails (2.0.0)
81
+ railties (>= 3.2.0.beta, < 5.0)
81
82
  thor (~> 0.14)
82
- json (1.6.1)
83
- json_pure (1.6.1)
83
+ json (1.6.5)
84
84
  launchy (2.0.5)
85
85
  addressable (~> 2.2.6)
86
- mail (2.3.0)
86
+ mail (2.4.4)
87
87
  i18n (>= 0.4.0)
88
88
  mime-types (~> 1.16)
89
89
  treetop (~> 1.4.8)
90
90
  mime-types (1.17.2)
91
- multi_json (1.0.3)
92
- mysql2 (0.3.7)
91
+ multi_json (1.0.4)
92
+ mysql2 (0.3.11)
93
93
  nokogiri (1.5.0)
94
94
  polyglot (0.3.3)
95
- rack (1.3.5)
95
+ rack (1.4.1)
96
96
  rack-cache (1.1)
97
97
  rack (>= 0.4)
98
- rack-mount (0.8.3)
99
- rack (>= 1.0.0)
100
98
  rack-ssl (1.3.2)
101
99
  rack
102
100
  rack-test (0.6.1)
103
101
  rack (>= 1.0)
104
- rails (3.1.1)
105
- actionmailer (= 3.1.1)
106
- actionpack (= 3.1.1)
107
- activerecord (= 3.1.1)
108
- activeresource (= 3.1.1)
109
- activesupport (= 3.1.1)
102
+ rails (3.2.0)
103
+ actionmailer (= 3.2.0)
104
+ actionpack (= 3.2.0)
105
+ activerecord (= 3.2.0)
106
+ activeresource (= 3.2.0)
107
+ activesupport (= 3.2.0)
110
108
  bundler (~> 1.0)
111
- railties (= 3.1.1)
112
- railties (3.1.1)
113
- actionpack (= 3.1.1)
114
- activesupport (= 3.1.1)
109
+ railties (= 3.2.0)
110
+ railties (3.2.0)
111
+ actionpack (= 3.2.0)
112
+ activesupport (= 3.2.0)
115
113
  rack-ssl (~> 1.3.2)
116
114
  rake (>= 0.8.7)
117
115
  rdoc (~> 3.4)
118
116
  thor (~> 0.14.6)
119
117
  rake (0.9.2.2)
120
- rdoc (3.11)
118
+ rdoc (3.12)
121
119
  json (~> 1.4)
122
- rubyzip (0.9.4)
123
- sass (3.1.10)
124
- sass-rails (3.1.4)
125
- actionpack (~> 3.1.0)
126
- railties (~> 3.1.0)
127
- sass (>= 3.1.4)
128
- sprockets (~> 2.0.0)
129
- tilt (~> 1.3.2)
130
- selenium-webdriver (2.10.0)
131
- childprocess (>= 0.2.1)
132
- ffi (= 1.0.9)
133
- json_pure
120
+ rubyzip (0.9.5)
121
+ sass (3.1.12)
122
+ sass-rails (3.2.3)
123
+ railties (~> 3.2.0.beta)
124
+ sass (>= 3.1.10)
125
+ tilt (~> 1.3)
126
+ selenium-webdriver (2.17.0)
127
+ childprocess (>= 0.2.5)
128
+ ffi (~> 1.0.9)
129
+ multi_json (~> 1.0.4)
134
130
  rubyzip
135
- sprockets (2.0.3)
131
+ sprockets (2.1.2)
136
132
  hike (~> 1.2)
137
133
  rack (~> 1.0)
138
134
  tilt (~> 1.1, != 1.3.0)
@@ -141,8 +137,8 @@ GEM
141
137
  treetop (1.4.10)
142
138
  polyglot
143
139
  polyglot (>= 0.3.1)
144
- tzinfo (0.3.31)
145
- uglifier (1.0.4)
140
+ tzinfo (0.3.32)
141
+ uglifier (1.2.2)
146
142
  execjs (>= 0.3.0)
147
143
  multi_json (>= 1.0.2)
148
144
  uuidtools (2.1.2)
data/alondra.gemspec CHANGED
@@ -4,7 +4,7 @@ Gem::Specification.new do |s|
4
4
  s.name = "alondra"
5
5
  s.summary = "Add real time capabilities to your rails app"
6
6
  s.description = "Add real time capabilities to your rails app"
7
- s.version = "0.0.3"
7
+ s.version = "0.0.4"
8
8
  s.authors = ['Alberto F. Capel', 'Ryan LeCompte']
9
9
 
10
10
  s.files = `git ls-files`.split("\n")
@@ -16,8 +16,6 @@ Gem::Specification.new do |s|
16
16
  s.add_dependency('daemons')
17
17
  s.add_dependency('uuidtools')
18
18
  s.add_dependency('rails', '>= 3.1.0')
19
- s.add_dependency('eventmachine', '>= 1.0.0.beta.3')
20
19
  s.add_dependency('em-websocket')
21
- s.add_dependency('ffi-rzmq', '0.8.0')
22
- s.add_dependency('em-zeromq', '0.2.1')
20
+ s.add_dependency('em-zeromq', '0.2.2')
23
21
  end
@@ -7,57 +7,61 @@
7
7
  window.WEB_SOCKET_SWF_LOCATION = "<%= asset_path 'WebSocketMain.swf' %>"
8
8
 
9
9
  class @AlondraClient
10
- constructor: (host, port, channels, token = null, retry = 5000) ->
11
- @channels = channels
12
- @token = token
13
- @retry = retry
14
- @url = "ws://#{host}:#{port}"
15
-
10
+ constructor: (@server, @channels=[], @token = null, @retry = 10000) ->
11
+
12
+ @channels = [@channels] unless @channels instanceof Array
13
+
14
+ @url = "ws://#{@server}"
16
15
  @url += "?token=#{@token}" if @token
17
16
 
18
- this.connect()
17
+ @connect()
19
18
 
20
- subscribe: (channel) ->
19
+ subscribe: (channel) =>
20
+ if @socket.readyState == 0 # Socket is connecting
21
+ @channels.push(channel) # Schedule for later subscription
22
+ return
23
+
21
24
  subscription =
22
25
  command: 'subscribe'
23
26
  channel: channel
24
27
 
25
28
  @socket.send $.toJSON(subscription)
26
-
27
- connect: ->
28
- @socket = new WebSocket(@url)
29
-
30
- @socket.onopen = () =>
31
- if @reconnectInterval
32
- clearInterval(@reconnectInterval)
33
- @reconnectInterval = null
34
-
35
- if @channels instanceof Array
36
- this.subscribe(channel) for channel in @channels
37
- else
38
- this.subscribe(@channels)
29
+ @
30
+
31
+ connected: () =>
32
+ if @reconnectInterval
33
+ clearInterval(@reconnectInterval)
34
+ @reconnectInterval = null
35
+
36
+ @subscribe(channel) for channel in @channels
37
+
38
+ connect: =>
39
+ @socket = new WebSocket(@url)
40
+
41
+ @socket.onopen = @connected
39
42
 
40
43
  @socket.onclose = () =>
41
44
  this.reconnect()
42
45
 
43
-
44
46
  @socket.onmessage = (message) =>
45
47
  msg = $.parseJSON(message.data)
46
48
  if msg.event
47
- this.process(msg)
49
+ @process(msg)
48
50
  else
49
- this.execute(msg)
51
+ @execute(msg)
50
52
 
51
53
 
52
54
  @socket.onerror = (error) =>
53
- this.reconnect()
55
+ @reconnect()
56
+
57
+ @
54
58
 
55
59
  process: (serverEvent) ->
56
60
  eventName = serverEvent.event
57
61
  resourceType = serverEvent.resource_type
58
62
  resource = serverEvent.resource
59
63
 
60
- $(this).trigger("#{eventName}.#{resourceType}", resource)
64
+ $(@).trigger("#{eventName}.#{resourceType}", resource)
61
65
 
62
66
  execute: (message) ->
63
67
  eval(message.message)
data/lib/alondra.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require_relative 'alondra/log'
1
2
  require_relative 'alondra/message'
2
3
  require_relative 'alondra/event'
3
4
  require_relative 'alondra/connection'
@@ -27,6 +28,13 @@ module Alondra
27
28
  config.port = Rails.env == 'test' ? 12346 : 12345
28
29
  config.host = 'localhost'
29
30
  config.queue_socket = 'ipc:///tmp/alondra.ipc'
31
+
32
+ initializer "configure EM thread pool" do
33
+ # If we have more threads than db connections we will exhaust the conn pool
34
+ threadpool_size = ActiveRecord::Base.connection_pool.instance_variable_get :@size
35
+ threadpool_size -= 2 if threadpool_size > 2
36
+ EM.threadpool_size = threadpool_size
37
+ end
30
38
 
31
39
  initializer "enable sessions for flash websockets" do
32
40
  Rails.application.config.session_store :cookie_store, httponly: false
@@ -35,9 +43,13 @@ module Alondra
35
43
  initializer "load listeners" do
36
44
  listeners_dir = File.join(Rails.root, 'app', 'listeners')
37
45
 
38
- Rails.logger.info "Loading event listeners in #{listeners_dir}"
46
+ Log.info "Loading event listeners in #{listeners_dir}"
39
47
  Dir[File.join(listeners_dir, '*.rb')].each { |file| require_dependency file }
40
48
  end
49
+
50
+ config.after_initialize do
51
+ PushController.send :include, Rails.application.routes.url_helpers
52
+ end
41
53
 
42
54
  def self.start_server_in_new_thread!
43
55
  Thread.new do
@@ -46,29 +58,29 @@ module Alondra
46
58
  end
47
59
 
48
60
  def self.start_server!
61
+
62
+ start_server_proc = Proc.new do
63
+ MessageQueue.instance.start_listening
64
+ Server.run
65
+ die_gracefully_on_signal
66
+ end
67
+
49
68
  if EM.reactor_running?
50
- EM.schedule do
51
- MessageQueue.instance.start_listening
52
- Server.run
53
- end
69
+ EM.schedule(start_server_proc)
54
70
  else
55
- Rails.logger.info "starting EM reactor"
56
- EM.run do
57
- MessageQueue.instance.start_listening
58
- Server.run
59
- end
60
- die_gracefully_on_signal
71
+ Log.info "starting EM reactor"
72
+ EM.run(start_server_proc)
61
73
  end
62
74
  end
63
75
 
64
76
  def self.die_gracefully_on_signal
65
77
  Signal.trap("INT") do
66
- Rails.logger.warn "INT signal trapped. Shutting down EM reactor"
78
+ Log.warn "INT signal trapped. Shutting down EM reactor"
67
79
  EM.stop
68
80
  end
69
81
 
70
82
  Signal.trap("TERM") do
71
- Rails.logger.warn "TERM signal trapped. Shutting down EM reactor"
83
+ Log.warn "TERM signal trapped. Shutting down EM reactor"
72
84
  EM.stop
73
85
  end
74
86
  end
@@ -27,10 +27,12 @@ module Alondra
27
27
  end
28
28
 
29
29
  def fire_event(event_type)
30
- event_hash = {:event => event_type,
31
- :resource => @connection.session,
32
- :resource_type => @connection.session.class.name,
33
- :channel => @channel_name}
30
+ event_hash = {
31
+ :event => event_type,
32
+ :resource => @connection.session,
33
+ :resource_type => @connection.session.class.name,
34
+ :channel => @channel_name
35
+ }
34
36
 
35
37
  Event.new(event_hash, nil, connection).fire!
36
38
  end
@@ -40,7 +40,7 @@ module Alondra
40
40
  end
41
41
 
42
42
  def receive(event_or_message)
43
- Rails.logger.debug "sending: #{event_or_message.to_json}"
43
+ Log.info "sending: #{event_or_message.to_json}"
44
44
  websocket.send event_or_message.to_json
45
45
  end
46
46
 
data/lib/alondra/event.rb CHANGED
@@ -11,20 +11,8 @@ module Alondra
11
11
  @type = event_hash[:event].to_sym
12
12
  @json_encoded = from_json
13
13
 
14
- if Hash === event_hash[:resource]
15
- @resource = fetch(event_hash[:resource_type], event_hash[:resource])
16
- else
17
- @resource = event_hash[:resource]
18
- end
19
-
20
- @resource_type = event_hash[:resource_type] || resource.class.name
21
-
22
- if event_hash[:channel].present?
23
- @channel_name = event_hash[:channel]
24
- else
25
- channel_type = type == :updated ? :member : :collection
26
- Channel.default_name_for(resource, channel_type)
27
- end
14
+ set_resource_from(event_hash)
15
+ set_channel_from(event_hash)
28
16
  end
29
17
 
30
18
  def channel
@@ -70,5 +58,24 @@ module Alondra
70
58
  resource.assign_attributes(filtered_attributes, :without_protection => true)
71
59
  resource
72
60
  end
61
+
62
+ def set_resource_from(event_hash)
63
+ if Hash === event_hash[:resource]
64
+ @resource = fetch(event_hash[:resource_type], event_hash[:resource])
65
+ else
66
+ @resource = event_hash[:resource]
67
+ end
68
+
69
+ @resource_type = event_hash[:resource_type] || resource.class.name
70
+ end
71
+
72
+ def set_channel_from(event_hash)
73
+ if event_hash[:channel].present?
74
+ @channel_name = event_hash[:channel]
75
+ else
76
+ channel_type = type == :updated ? :member : :collection
77
+ Channel.default_name_for(resource, channel_type)
78
+ end
79
+ end
73
80
  end
74
81
  end
@@ -64,9 +64,9 @@ module Alondra
64
64
  begin
65
65
  new_instance.instance_exec(event, &callback.proc)
66
66
  rescue Exception => ex
67
- Rails.logger.error 'Error while processing event listener callback'
68
- Rails.logger.error ex.message
69
- Rails.logger.error ex.stacktrace if ex.respond_to? :stacktrace
67
+ Log.error 'Error while processing event listener callback'
68
+ Log.error ex.message
69
+ Log.error ex.backtrace.join("\n")
70
70
  end
71
71
  end
72
72
  end
@@ -0,0 +1,43 @@
1
+ module Alondra
2
+ module Log
3
+ extend self
4
+
5
+ NUMBER_TO_NAME_MAP = {0=>'DEBUG', 1=>'INFO', 2=>'WARN', 3=>'ERROR', 4=>'FATAL', 5=>'UNKNOWN'}
6
+ NUMBER_TO_COLOR_MAP = {0=>'0;37', 1=>'32', 2=>'33', 3=>'31', 4=>'31', 5=>'37'}
7
+
8
+
9
+ def debug(message)
10
+ add(ActiveSupport::BufferedLogger::Severity::DEBUG, message)
11
+ end
12
+
13
+ def info(message)
14
+ add(ActiveSupport::BufferedLogger::Severity::INFO, message)
15
+ end
16
+
17
+ def warn(message)
18
+ add(ActiveSupport::BufferedLogger::Severity::WARN, message)
19
+ end
20
+
21
+ def error(message)
22
+ add(ActiveSupport::BufferedLogger::Severity::ERROR, message)
23
+ end
24
+
25
+ def fatal(message)
26
+ add(ActiveSupport::BufferedLogger::Severity::FATAL, message)
27
+ end
28
+
29
+ def unkwon(message)
30
+ add(ActiveSupport::BufferedLogger::Severity::UNKNOWN, message)
31
+ end
32
+
33
+ private
34
+
35
+ def add(severity, message = nil, progname = 'ALONDRA')
36
+ sevstring = NUMBER_TO_NAME_MAP[severity]
37
+ color = NUMBER_TO_COLOR_MAP[severity]
38
+
39
+ message = "\n\033[35m#{progname}:\033[0m[\033[#{color}m#{sevstring}\033[0m] #{message.strip}\033\n"
40
+ Rails.logger.add(severity, message, progname)
41
+ end
42
+ end
43
+ end
@@ -7,10 +7,10 @@ module Alondra
7
7
  include Singleton
8
8
 
9
9
  def start_listening
10
- Rails.logger.info "Starting message queue"
10
+ Log.info "Starting message queue"
11
11
 
12
12
  if @connection
13
- Rails.logger.warn 'Push connection to message queue started twice'
13
+ Log.warn 'Push connection to message queue started twice'
14
14
  reset!
15
15
  end
16
16
 
@@ -23,9 +23,9 @@ module Alondra
23
23
  begin
24
24
  parse received.copy_out_string
25
25
  rescue Exception => ex
26
- Rails.logger.error "Error raised while processing message"
27
- Rails.logger.error "#{ex.class}: #{ex.message}"
28
- Rails.logger.error ex.backtrace.join("\n") if ex.respond_to? :backtrace
26
+ Log.error "Error raised while processing message"
27
+ Log.error "#{ex.class}: #{ex.message}"
28
+ Log.error ex.backtrace.join("\n") if ex.respond_to? :backtrace
29
29
  end
30
30
  end
31
31
  end
@@ -40,7 +40,7 @@ module Alondra
40
40
  message = Message.new(received_hash[:message], received_hash[:channel_names])
41
41
  message.send_to_channels
42
42
  else
43
- Rails.logger.warn "Unrecognized message type #{received_string}"
43
+ Log.warn "Unrecognized message type #{received_string}"
44
44
  end
45
45
  end
46
46
 
@@ -32,7 +32,7 @@ module Alondra
32
32
  begin
33
33
  push_socket.send_msg(message.to_json)
34
34
  rescue Exception => ex
35
- Rails.logger.error "Exception while sending message to message queue: #{ex.message}"
35
+ Log.error "Exception while sending message to message queue: #{ex.message}"
36
36
  end
37
37
  end
38
38
  end
@@ -52,7 +52,7 @@ module Alondra
52
52
  begin
53
53
  push_socket.send_string(message.to_json)
54
54
  rescue Exception => ex
55
- Rails.logger.error "Exception while sending message to message queue: #{ex.message}"
55
+ Log.error "Exception while sending message to message queue: #{ex.message}"
56
56
  end
57
57
  end
58
58
 
@@ -6,22 +6,23 @@ module Alondra
6
6
  include AbstractController::Helpers
7
7
  include AbstractController::Translation
8
8
  include AbstractController::AssetPaths
9
- include AbstractController::ViewPaths
9
+ include ActionController::RequestForgeryProtection
10
10
 
11
11
  attr_accessor :channel_names
12
+ attr_accessor :request
12
13
 
13
- def initialize(context, to)
14
+ def initialize(context, to, request = nil)
14
15
  @channel_names = Channel.names_for(to)
15
-
16
+ @request = request
17
+
16
18
  self.class.view_paths = ActionController::Base.view_paths
17
19
  copy_instance_variables_from(context)
18
20
  end
19
21
 
20
22
  def render_push(options)
21
-
22
23
  if EM.reactor_thread?
23
- Rails.logger.warn('Your are rendering a view from the Event Machine reactor thread')
24
- Rails.logger.warn('Rendering a view is a possibly blocking operation, so be careful')
24
+ Log.warn 'You are rendering a view from the Event Machine reactor thread'
25
+ Log.warn 'Rendering a view is a possibly blocking operation, so be careful'
25
26
  end
26
27
 
27
28
  message_content = render_to_string(*options)
@@ -36,7 +37,7 @@ module Alondra
36
37
  def view_paths
37
38
  @view_paths ||= ApplicationController.send '_view_paths'
38
39
  end
39
-
40
+
40
41
  def action_name
41
42
  'push'
42
43
  end
@@ -7,7 +7,12 @@ module Alondra
7
7
  raise PushingException.new('You need to specify the channel to push') unless args.last[:to].present?
8
8
 
9
9
  to = args.last.delete(:to)
10
- controller = PushController.new(self, to)
10
+
11
+ # If we are called in the context of a request we save this information
12
+ # so we can create proper routes
13
+ caller_request = self.respond_to?(:request) ? request : nil
14
+
15
+ controller = PushController.new(self, to, caller_request)
11
16
  controller.render_push(args)
12
17
  end
13
18
  end
@@ -5,39 +5,39 @@ module Alondra
5
5
  extend self
6
6
 
7
7
  def run
8
- Rails.logger.info "Server starting on port #{Alondra.config.port}"
8
+ Log.info "Server starting on port #{Alondra.config.port}"
9
9
 
10
10
  EM::WebSocket.start(:host => '0.0.0.0', :port => Alondra.config.port) do |websocket|
11
11
 
12
12
  websocket.onopen do
13
13
  session = SessionParser.parse(websocket)
14
-
15
- Rails.logger.info "client connected."
14
+
15
+ Log.info "client connected."
16
16
  Connection.new(websocket, session)
17
17
  end
18
18
 
19
19
  websocket.onclose do
20
- Rails.logger.info "Connection closed"
20
+ Log.info "Connection closed"
21
21
  Connections[websocket].destroy! if Connections[websocket].present?
22
22
  end
23
23
 
24
24
  websocket.onerror do |ex|
25
25
  puts "Error: #{ex.message}"
26
- Rails.logger.error "Error: #{ex.message}"
27
- Rails.logger.error ex.backtrace.join("\n")
26
+ Log.error "Error: #{ex.message}"
27
+ Log.error ex.backtrace.join("\n")
28
28
  Connections[websocket].destroy! if Connections[websocket]
29
29
  end
30
30
 
31
31
  websocket.onmessage do |msg|
32
- Rails.logger.info "received: #{msg}"
32
+ Log.info "received: #{msg}"
33
33
  CommandDispatcher.dispatch(msg, Connections[websocket])
34
34
  end
35
35
  end
36
36
 
37
37
  EM.error_handler do |error|
38
38
  puts "Error raised during event loop: #{error.message}"
39
- Rails.logger.error "Error raised during event loop: #{error.message}"
40
- Rails.logger.error error.stacktrace if error.respond_to? :stacktrace
39
+ Log.error "Error raised during event loop: #{error.message}"
40
+ Log.error error.backtrace.join("\n")
41
41
  end
42
42
  end
43
43
  end
@@ -29,10 +29,10 @@ module Alondra
29
29
  encoded_session = cookies.detect{|c| c.include?(session_key)}.gsub("#{session_key}=",'').strip
30
30
  verifier.verify(CGI.unescape(encoded_session))
31
31
  rescue ActiveSupport::MessageVerifier::InvalidSignature => ex
32
- Rails.logger.error "invalid session cookie: #{cookie}"
32
+ Log.error "invalid session cookie: #{cookie}"
33
33
  Hash.new
34
34
  rescue Exception => ex
35
- Rails.logger.error "Exception parsing session from cookie: #{ex.message}"
35
+ Log.error "Exception parsing session from cookie: #{ex.message}"
36
36
  end
37
37
  end
38
38
 
@@ -41,7 +41,7 @@ module Alondra
41
41
  decoded_token = verifier.verify(token)
42
42
  ActiveSupport::JSON.decode(decoded_token)
43
43
  rescue ActiveSupport::MessageVerifier::InvalidSignature => ex
44
- Rails.logger.error "invalid session token: #{token}"
44
+ Log.error "invalid session token: #{token}"
45
45
  Hash.new
46
46
  end
47
47
  end
@@ -6,28 +6,25 @@ require 'rubygems'
6
6
  require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
7
7
  require 'daemons'
8
8
 
9
-
10
- log_dir = File.expand_path('../log', File.dirname(__FILE__))
11
-
12
9
  options = {
13
10
  :app_name => 'alondra',
14
11
  :dir_mode => :script,
15
- :dir => 'log',
16
- :log_dir => log_dir
12
+ :dir => 'tmp/pids'
17
13
  }
18
14
 
19
15
  Daemons.run_proc 'alondra', options do
20
16
 
21
17
  ENV["ALONDRA_SERVER"] = 'true'
18
+
22
19
  require_relative File.join('..', 'config', 'environment')
23
-
24
- log_path = File.join(log_path, 'alondra.log')
20
+
21
+ log_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'log', 'alondra.log'))
22
+
25
23
  Rails.logger = ActiveSupport::BufferedLogger.new(log_path)
26
24
 
27
- Alondra::Alondra.start_server!
28
-
29
- Rails.logger.info "Started alondra server... #{EM.reactor_running?}"
25
+ Log.info "Started alondra server on port #{Alondra::Alondra.config.port}... #{EM.reactor_running?}"
30
26
 
31
27
  EM.reactor_thread.join
32
- Rails.logger.info 'Alondra server terminated'
28
+
29
+ Log.info 'Alondra server terminated'
33
30
  end
@@ -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(@path) %>', '<%= encrypted_token %>');
39
+ var client = new AlondraClient('localhost:<%= Alondra::Alondra.config.port %>', '<%= chat_path(@path) %>', '<%= encrypted_token %>');
40
40
 
41
41
  $(client).bind('subscribed.Chat', function(event, resource){
42
42
  console.log('Received subscribed event!');
@@ -31,7 +31,7 @@ module Alondra
31
31
 
32
32
  chat.update_attributes! :name => 'A chat about everything'
33
33
 
34
- sleep(0.5)
34
+ sleep(0.1)
35
35
 
36
36
  wait_until(15) do
37
37
  page.has_content? 'A chat about everything'
@@ -31,6 +31,8 @@ module Alondra
31
31
  end
32
32
 
33
33
  push :partial => '/shared/message', :to => chat_path
34
+
35
+ sleep(0.1)
34
36
 
35
37
  wait_until 20 do
36
38
  page.has_content? "#{@user.username} says hola!"
@@ -40,7 +40,7 @@ module Alondra
40
40
 
41
41
  assert EM.reactor_running?
42
42
 
43
- sleep(0.5) # Leave event machine to catch up
43
+ sleep(0.1) # Leave event machine to catch up
44
44
 
45
45
  last_message = @connection.messages.last
46
46
  assert_equal event.to_json, last_message
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.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-12-24 00:00:00.000000000Z
13
+ date: 2012-03-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: daemons
17
- requirement: &2152723200 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,15 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2152723200
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: uuidtools
28
- requirement: &2152722760 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ! '>='
@@ -33,10 +38,15 @@ dependencies:
33
38
  version: '0'
34
39
  type: :runtime
35
40
  prerelease: false
36
- version_requirements: *2152722760
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: rails
39
- requirement: &2152722260 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ! '>='
@@ -44,21 +54,15 @@ dependencies:
44
54
  version: 3.1.0
45
55
  type: :runtime
46
56
  prerelease: false
47
- version_requirements: *2152722260
48
- - !ruby/object:Gem::Dependency
49
- name: eventmachine
50
- requirement: &2152721740 !ruby/object:Gem::Requirement
57
+ version_requirements: !ruby/object:Gem::Requirement
51
58
  none: false
52
59
  requirements:
53
60
  - - ! '>='
54
61
  - !ruby/object:Gem::Version
55
- version: 1.0.0.beta.3
56
- type: :runtime
57
- prerelease: false
58
- version_requirements: *2152721740
62
+ version: 3.1.0
59
63
  - !ruby/object:Gem::Dependency
60
64
  name: em-websocket
61
- requirement: &2152721360 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
62
66
  none: false
63
67
  requirements:
64
68
  - - ! '>='
@@ -66,29 +70,28 @@ dependencies:
66
70
  version: '0'
67
71
  type: :runtime
68
72
  prerelease: false
69
- version_requirements: *2152721360
70
- - !ruby/object:Gem::Dependency
71
- name: ffi-rzmq
72
- requirement: &2152720780 !ruby/object:Gem::Requirement
73
+ version_requirements: !ruby/object:Gem::Requirement
73
74
  none: false
74
75
  requirements:
75
- - - =
76
+ - - ! '>='
76
77
  - !ruby/object:Gem::Version
77
- version: 0.8.0
78
- type: :runtime
79
- prerelease: false
80
- version_requirements: *2152720780
78
+ version: '0'
81
79
  - !ruby/object:Gem::Dependency
82
80
  name: em-zeromq
83
- requirement: &2152720280 !ruby/object:Gem::Requirement
81
+ requirement: !ruby/object:Gem::Requirement
84
82
  none: false
85
83
  requirements:
86
- - - =
84
+ - - '='
87
85
  - !ruby/object:Gem::Version
88
- version: 0.2.1
86
+ version: 0.2.2
89
87
  type: :runtime
90
88
  prerelease: false
91
- version_requirements: *2152720280
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - '='
93
+ - !ruby/object:Gem::Version
94
+ version: 0.2.2
92
95
  description: Add real time capabilities to your rails app
93
96
  email:
94
97
  executables: []
@@ -121,6 +124,7 @@ files:
121
124
  - lib/alondra/event_listener.rb
122
125
  - lib/alondra/event_router.rb
123
126
  - lib/alondra/listener_callback.rb
127
+ - lib/alondra/log.rb
124
128
  - lib/alondra/message.rb
125
129
  - lib/alondra/message_queue.rb
126
130
  - lib/alondra/message_queue_client.rb
@@ -231,7 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
231
235
  version: '0'
232
236
  requirements: []
233
237
  rubyforge_project:
234
- rubygems_version: 1.8.11
238
+ rubygems_version: 1.8.21
235
239
  signing_key:
236
240
  specification_version: 3
237
241
  summary: Add real time capabilities to your rails app
@@ -314,3 +318,4 @@ test_files:
314
318
  - test/support/mocks/mock_event_router.rb
315
319
  - test/support/mocks/mock_listener.rb
316
320
  - test/test_helper.rb
321
+ has_rdoc: