From 0e4c2df1e105871f3afa9503043a22489822110e Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 20 Jun 2015 16:01:44 +0200 Subject: Add new convention method for performing channel actions --- lib/assets/javascripts/channel.js.coffee | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/assets/javascripts/channel.js.coffee b/lib/assets/javascripts/channel.js.coffee index 058bcc03aa..a324a62a1b 100644 --- a/lib/assets/javascripts/channel.js.coffee +++ b/lib/assets/javascripts/channel.js.coffee @@ -11,6 +11,7 @@ class @Cable.Channel onReceiveData: @received }) + connected: => # Override in the subclass @@ -20,8 +21,14 @@ class @Cable.Channel received: (data) => # Override in the subclass + # Perform a channel action with the optional data passed as an attribute + perform: (action, data = {}) -> + data.action = action + cable.sendData @channelIdentifier, JSON.stringify data + send: (data) -> cable.sendData @channelIdentifier, JSON.stringify data + underscore: (value) -> value.replace(/[A-Z]/g, (match) => "_#{match.toLowerCase()}").substr(1) \ No newline at end of file -- cgit v1.2.3 From 404867d332069d8b87547e1eae5ed1d0a7a1b95c Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 20 Jun 2015 16:21:21 +0200 Subject: TOC order --- lib/action_cable/channel/base.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/action_cable/channel/base.rb b/lib/action_cable/channel/base.rb index 6060ccf681..c39c2fcf0b 100644 --- a/lib/action_cable/channel/base.rb +++ b/lib/action_cable/channel/base.rb @@ -31,6 +31,12 @@ module ActionCable perform_connection end + def perform_connection + logger.info "#{channel_name} connecting" + connect + run_subscribe_callbacks + end + def perform_action(data) if authorized? action = extract_action(data) @@ -52,11 +58,6 @@ module ActionCable logger.info "#{channel_name} disconnected" end - def perform_connection - logger.info "#{channel_name} connecting" - connect - run_subscribe_callbacks - end protected # Override in subclasses -- cgit v1.2.3 From 294a277a8409e05c6b98cd8e46a8e0745f68b40d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 20 Jun 2015 16:22:40 +0200 Subject: Rename broadcast to transmit for the connection/channel->subscriber communication MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disambiguate it from the broadcast to channel method used by the broadcaster (which actually has several listeners, whereas a connection/channel instance only ever has one listener – hence not much of a BROADcast). --- lib/action_cable/channel/base.rb | 6 +++--- lib/action_cable/channel/redis.rb | 3 +-- lib/action_cable/connection/base.rb | 10 +++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/action_cable/channel/base.rb b/lib/action_cable/channel/base.rb index c39c2fcf0b..4c90849a06 100644 --- a/lib/action_cable/channel/base.rb +++ b/lib/action_cable/channel/base.rb @@ -79,10 +79,10 @@ module ActionCable end - def broadcast(data) + def transmit(data, via: nil) if authorized? - logger.info "#{channel_name} broadcasting #{data.inspect}" - connection.broadcast({ identifier: @channel_identifier, message: data }.to_json) + logger.info "#{channel_name} transmitting #{data.inspect} #{via}" + connection.transmit({ identifier: @channel_identifier, message: data }.to_json) else unauthorized end diff --git a/lib/action_cable/channel/redis.rb b/lib/action_cable/channel/redis.rb index b5fc812919..bdd6ab9dcf 100644 --- a/lib/action_cable/channel/redis.rb +++ b/lib/action_cable/channel/redis.rb @@ -29,8 +29,7 @@ module ActionCable protected def default_subscription_callback(channel) -> (message) do - logger.info "Received a message over the redis channel: #{channel}" - broadcast ActiveSupport::JSON.decode(message) + transmit ActiveSupport::JSON.decode(message), via: "incoming action from #{channel}" end end end diff --git a/lib/action_cable/connection/base.rb b/lib/action_cable/connection/base.rb index d6e5bfa2d2..52f94a7ab0 100644 --- a/lib/action_cable/connection/base.rb +++ b/lib/action_cable/connection/base.rb @@ -34,8 +34,8 @@ 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 } + transmit_ping_timestamp + @ping_timer = EventMachine.add_periodic_timer(PING_INTERVAL) { transmit_ping_timestamp } worker_pool.async.invoke(self, :initialize_connection) end @@ -87,7 +87,7 @@ module ActionCable end end - def broadcast(data) + def transmit(data) @websocket.send data end @@ -127,8 +127,8 @@ module ActionCable disconnect if respond_to?(:disconnect) end - def broadcast_ping_timestamp - broadcast({ identifier: '_ping', message: Time.now.to_i }.to_json) + def transmit_ping_timestamp + transmit({ identifier: '_ping', message: Time.now.to_i }.to_json) end def subscribe_channel(data) -- cgit v1.2.3 From f6daf0ef6d811053301c7e9b2991911caa57e841 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 20 Jun 2015 16:34:27 +0200 Subject: Assume channel names include the _channel extension --- lib/assets/javascripts/channel.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/assets/javascripts/channel.js.coffee b/lib/assets/javascripts/channel.js.coffee index a324a62a1b..2f07affb19 100644 --- a/lib/assets/javascripts/channel.js.coffee +++ b/lib/assets/javascripts/channel.js.coffee @@ -1,6 +1,6 @@ class @Cable.Channel constructor: (params = {}) -> - @channelName ?= @underscore @constructor.name + @channelName ?= "#{@underscore(@constructor.name)}_channel" params['channel'] = @channelName @channelIdentifier = JSON.stringify params -- cgit v1.2.3 From 995c101caae06ec38d0106dcd9ee36954a489687 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 20 Jun 2015 16:51:11 +0200 Subject: More logging improvements --- lib/action_cable/broadcaster.rb | 2 +- lib/action_cable/channel/base.rb | 2 +- lib/action_cable/channel/redis.rb | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/action_cable/broadcaster.rb b/lib/action_cable/broadcaster.rb index 38c56b8262..7d8cc90970 100644 --- a/lib/action_cable/broadcaster.rb +++ b/lib/action_cable/broadcaster.rb @@ -10,8 +10,8 @@ module ActionCable end def broadcast(message) + logger.info "[ActionCable] Broadcasting to #{channel}: #{message}" redis.publish channel, message.to_json - logger.info "[ActionCable] Broadcasting to channel (#{channel}): #{message}" end end end diff --git a/lib/action_cable/channel/base.rb b/lib/action_cable/channel/base.rb index 4c90849a06..e6ca45ddcc 100644 --- a/lib/action_cable/channel/base.rb +++ b/lib/action_cable/channel/base.rb @@ -81,7 +81,7 @@ module ActionCable def transmit(data, via: nil) if authorized? - logger.info "#{channel_name} transmitting #{data.inspect} #{via}" + logger.info "#{channel_name} transmitting #{data.inspect}".tap { |m| m << " (via #{via})" if via } connection.transmit({ identifier: @channel_identifier, message: data }.to_json) else unauthorized diff --git a/lib/action_cable/channel/redis.rb b/lib/action_cable/channel/redis.rb index bdd6ab9dcf..0f77dc0418 100644 --- a/lib/action_cable/channel/redis.rb +++ b/lib/action_cable/channel/redis.rb @@ -14,14 +14,14 @@ module ActionCable @_redis_channels << [ redis_channel, callback ] pubsub.subscribe(redis_channel, &callback) - logger.info "#{channel_name} subscribed to incoming actions from #{redis_channel}" + logger.info "#{channel_name} subscribed to broadcasts from #{redis_channel}" end def unsubscribe_from_all_channels if @_redis_channels @_redis_channels.each do |redis_channel, callback| pubsub.unsubscribe_proc(redis_channel, callback) - logger.info "#{channel_name} unsubscribed from incoming actions #{redis_channel}" + logger.info "#{channel_name} unsubscribed to broadcasts from #{redis_channel}" end end end @@ -29,7 +29,7 @@ module ActionCable protected def default_subscription_callback(channel) -> (message) do - transmit ActiveSupport::JSON.decode(message), via: "incoming action from #{channel}" + transmit ActiveSupport::JSON.decode(message), via: "broadcast from #{channel}" end end end -- cgit v1.2.3 From 082c6317f0b680f4bcd3b1643e6481bed4606139 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 20 Jun 2015 17:03:43 +0200 Subject: Update request to do the env_config merge and add cookies helper --- lib/action_cable/connection/base.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/action_cable/connection/base.rb b/lib/action_cable/connection/base.rb index 52f94a7ab0..295b71ecb3 100644 --- a/lib/action_cable/connection/base.rb +++ b/lib/action_cable/connection/base.rb @@ -109,6 +109,14 @@ module ActionCable end protected + def request + @request ||= ActionDispatch::Request.new(Rails.application.env_config.merge(env)) + end + + def cookies + request.cookie_jar + end + def initialize_connection server.add_connection(self) @@ -173,10 +181,6 @@ module ActionCable @websocket && @websocket.ready_state == Faye::WebSocket::API::OPEN end - def request - @request ||= ActionDispatch::Request.new(env) - end - def websocket? @is_websocket ||= Faye::WebSocket.websocket?(@env) end -- cgit v1.2.3