aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2015-06-22 14:15:28 +0200
committerDavid Heinemeier Hansson <david@loudthinking.com>2015-06-22 14:15:28 +0200
commit8115d25033a0af2d29b57e1e5a6afaa70038a3d4 (patch)
tree912a737f663a4b36e88e20b73d9cab8c2ac96f52
parente0926038983177f5491e45cc338e5dc091e3a86d (diff)
downloadrails-8115d25033a0af2d29b57e1e5a6afaa70038a3d4.tar.gz
rails-8115d25033a0af2d29b57e1e5a6afaa70038a3d4.tar.bz2
rails-8115d25033a0af2d29b57e1e5a6afaa70038a3d4.zip
WIP: Extract processor
-rw-r--r--lib/action_cable/connection/base.rb13
-rw-r--r--lib/action_cable/connection/processor.rb54
2 files changed, 56 insertions, 11 deletions
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