aboutsummaryrefslogtreecommitdiffstats
path: root/lib/action_cable/channel/periodic_timers.rb
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2015-07-06 19:32:02 +0200
committerDavid Heinemeier Hansson <david@loudthinking.com>2015-07-07 19:03:57 +0200
commite04c95e5e6af2765503b90364ef147cc0eb40cd4 (patch)
tree75581676a540f071af9a937ae748df61ae4548ad /lib/action_cable/channel/periodic_timers.rb
parent53c4b4160a5298ca19ce6bc9c37acc0770a5d053 (diff)
downloadrails-e04c95e5e6af2765503b90364ef147cc0eb40cd4.tar.gz
rails-e04c95e5e6af2765503b90364ef147cc0eb40cd4.tar.bz2
rails-e04c95e5e6af2765503b90364ef147cc0eb40cd4.zip
Extract periodic timers concern
Diffstat (limited to 'lib/action_cable/channel/periodic_timers.rb')
-rw-r--r--lib/action_cable/channel/periodic_timers.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/action_cable/channel/periodic_timers.rb b/lib/action_cable/channel/periodic_timers.rb
new file mode 100644
index 0000000000..d7f6b52e3d
--- /dev/null
+++ b/lib/action_cable/channel/periodic_timers.rb
@@ -0,0 +1,38 @@
+module ActionCable
+ module Channel
+ module PeriodicTimers
+ extend ActiveSupport::Concern
+
+ included do
+ class_attribute :periodic_timers, instance_reader: false
+ self.periodic_timers = []
+
+ on_subscribe :start_periodic_timers
+ on_unsubscribe :stop_periodic_timers
+ end
+
+ module ClassMethods
+ def periodically(callback, every:)
+ self.periodic_timers += [ [ callback, every: every ] ]
+ end
+ end
+
+ private
+ def active_periodic_timers
+ @active_periodic_timers ||= []
+ end
+
+ def start_periodic_timers
+ self.class.periodic_timers.each do |callback, options|
+ active_periodic_timers << EventMachine::PeriodicTimer.new(options[:every]) do
+ worker_pool.async.run_periodic_timer(self, callback)
+ end
+ end
+ end
+
+ def stop_periodic_timers
+ active_periodic_timers.each { |timer| timer.cancel }
+ end
+ end
+ end
+end \ No newline at end of file