aboutsummaryrefslogtreecommitdiffstats
path: root/lib/action_cable
diff options
context:
space:
mode:
Diffstat (limited to 'lib/action_cable')
-rw-r--r--lib/action_cable/engine.rb4
-rw-r--r--lib/action_cable/server.rb14
2 files changed, 18 insertions, 0 deletions
diff --git a/lib/action_cable/engine.rb b/lib/action_cable/engine.rb
new file mode 100644
index 0000000000..6c943c7971
--- /dev/null
+++ b/lib/action_cable/engine.rb
@@ -0,0 +1,4 @@
+module ActionCable
+ class Engine < ::Rails::Engine
+ end
+end
diff --git a/lib/action_cable/server.rb b/lib/action_cable/server.rb
index 8f72d2ca7b..2449837105 100644
--- a/lib/action_cable/server.rb
+++ b/lib/action_cable/server.rb
@@ -8,6 +8,8 @@ module ActionCable
cattr_accessor(:logger, instance_reader: true) { Rails.logger }
+ PING_INTERVAL = 3
+
class << self
def register_channels(*channel_classes)
self.registered_channels += channel_classes
@@ -32,6 +34,11 @@ module ActionCable
@websocket = Faye::WebSocket.new(@env)
+ @websocket.on(:open) do |event|
+ broadcast_ping_timestamp
+ @ping_timer = EventMachine.add_periodic_timer(PING_INTERVAL) { broadcast_ping_timestamp }
+ end
+
@websocket.on(:message) do |event|
message = event.data
worker_pool.async.invoke(self, :received_data, message) if message.is_a?(String)
@@ -40,6 +47,8 @@ module ActionCable
@websocket.on(:close) do |event|
worker_pool.async.invoke(self, :cleanup_subscriptions)
worker_pool.async.invoke(self, :disconnect) if respond_to?(:disconnect)
+
+ EventMachine.cancel_timer(@ping_timer) if @ping_timer
end
@websocket.rack_response
@@ -77,6 +86,10 @@ module ActionCable
end
private
+ def broadcast_ping_timestamp
+ broadcast({ identifier: '_ping', message: Time.now.to_i }.to_json)
+ end
+
def subscribe_channel(data)
id_key = data['identifier']
id_options = ActiveSupport::JSON.decode(id_key).with_indifferent_access
@@ -108,5 +121,6 @@ module ActionCable
def invalid_request
[404, {'Content-Type' => 'text/plain'}, ['Page not found']]
end
+
end
end