From 8115d25033a0af2d29b57e1e5a6afaa70038a3d4 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 22 Jun 2015 14:15:28 +0200 Subject: WIP: Extract processor --- lib/action_cable/connection/base.rb | 13 ++------ lib/action_cable/connection/processor.rb | 54 ++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 lib/action_cable/connection/processor.rb diff --git a/lib/action_cable/connection/base.rb b/lib/action_cable/connection/base.rb index 71e84aed99..1fdc6f0fe8 100644 --- a/lib/action_cable/connection/base.rb +++ b/lib/action_cable/connection/base.rb @@ -18,6 +18,7 @@ module ActionCable @heartbeat = ActionCable::Connection::Heartbeat.new(self) @subscriptions = ActionCable::Connection::Subscriptions.new(self) + @processor = ActionCable::Connection::Processor.new(self) end def process @@ -32,17 +33,7 @@ module ActionCable end @websocket.on(:message) do |event| - message = event.data - - if message.is_a?(String) - if accepting_messages? - worker_pool.async.invoke(self, :receive, message) - else - queue_message message - end - else - logger.error "Couldn't handle non-string message: #{message.class}" - end + processor.handle event.data end @websocket.on(:close) do |event| diff --git a/lib/action_cable/connection/processor.rb b/lib/action_cable/connection/processor.rb new file mode 100644 index 0000000000..2060392478 --- /dev/null +++ b/lib/action_cable/connection/processor.rb @@ -0,0 +1,54 @@ +module ActionCable + module Connection + class Processor + def initialize(connection) + @connection = connection + @pending_messages = [] + end + + def handle(message) + if valid? message + if ready? + process message + else + queue message + end + end + end + + def ready? + @ready + end + + def ready! + @ready = true + handle_pending_messages + end + + private + attr_reader :connection + attr_accessor :pending_messages + + def process(message) + connection.worker_pool.async.invoke(connection, :receive, message) + end + + def queue(message) + pending_messages << message + end + + def valid?(message) + if message.is_a?(String) + true + else + connection.logger.error "Couldn't handle non-string message: #{message.class}" + false + end + end + + def handle_pending_messages + process pending_messages.shift until pending_messages.empty? + end + end + end +end \ No newline at end of file -- cgit v1.2.3