提交 7fef6b01 编写于 作者: P Pratik Naik

No cramp and use celluloid workers to run callbacks

上级 55c956b3
source 'http://rubygems.org'
gemspec
gem 'cramp', github: "lifo/cramp"
group :test do
gem 'rake'
gem 'puma'
......
......@@ -10,7 +10,6 @@
s.homepage = 'http://basecamp.com'
s.add_dependency('activesupport', '~> 4.2.0')
s.add_dependency('cramp', '~> 0.15.4')
s.files = Dir['README', 'lib/**/*']
s.has_rdoc = false
......
require 'cramp'
require 'active_support'
require 'active_support/json'
require 'active_support/concern'
require 'active_support/core_ext/hash/indifferent_access'
require 'active_support/callbacks'
module ActionCable
VERSION = '0.0.1'
autoload :Channel, 'action_cable/channel'
autoload :Worker, 'action_cable/worker'
autoload :Server, 'action_cable/server'
end
......@@ -41,13 +41,13 @@ def receive(data)
def subscribe
self.class.on_subscribe_callbacks.each do |callback|
EM.next_tick { send(callback) }
send(callback)
end
end
def unsubscribe
self.class.on_unsubscribe_callbacks.each do |callback|
EM.next_tick { send(callback) }
send(callback)
end
end
......
require 'set'
require 'faye/websocket'
require 'celluloid'
module ActionCable
class Server < Cramp::Websocket
on_data :received_data
on_finish :cleanup_subscriptions
Celluloid::Actor[:worker_pool] = ActionCable::Worker.pool(size: 100)
module ActionCable
class Server
class_attribute :registered_channels
self.registered_channels = Set.new
......@@ -12,12 +13,35 @@ class << self
def register_channels(*channel_classes)
self.registered_channels += channel_classes
end
def call(env)
new(env).process
end
end
def initialize(*)
@subscriptions = {}
def initialize(env)
@env = env
end
def process
if Faye::WebSocket.websocket?(@env)
@subscriptions = {}
@websocket = Faye::WebSocket.new(@env)
super
@websocket.on(:message) do |event|
message = event.data
Celluloid::Actor[:worker_pool].async.received_data(self, message) if message.is_a?(String)
end
@websocket.on(:close) do |event|
Celluloid::Actor[:worker_pool].async.cleanup_subscriptions(self)
end
@websocket.rack_response
else
invalid_request
end
end
def received_data(data)
......@@ -40,7 +64,7 @@ def cleanup_subscriptions
end
def broadcast(data)
render data
@websocket.send data
end
private
......@@ -71,5 +95,8 @@ def unsubscribe_channel(data)
@subscriptions.delete(id_key)
end
def invalid_request
[404, {'Content-Type' => 'text/plain'}, ['Page not found']]
end
end
end
module ActionCable
class Worker
include ActiveSupport::Callbacks
include Celluloid
define_callbacks :work
def received_data(connection, data)
run_callbacks :work do
connection.received_data(data)
end
end
def cleanup_subscriptions(connection)
connection.cleanup_subscriptions
end
end
end
......@@ -15,9 +15,8 @@
require 'logger'
logger = Logger.new(File.join(File.dirname(__FILE__), "tests.log"))
logger.level = Logger::DEBUG
Cramp.logger = logger
class ActionCableTest < Cramp::TestCase
class ActionCableTest < ActiveSupport::TestCase
PORT = 420420
setup :start_puma_server
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册