aboutsummaryrefslogtreecommitdiffstats
path: root/lib/action_cable/connection/processor.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/action_cable/connection/processor.rb')
-rw-r--r--lib/action_cable/connection/processor.rb54
1 files changed, 54 insertions, 0 deletions
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