Sha256: f2c5f0fbd7d244388ad45ca05773a19e074ecbb77eac7674f3cd9a2272daca3a

Contents?: true

Size: 1.56 KB

Versions: 7

Compression:

Stored size: 1.56 KB

Contents

module Denko
  module Behaviors
    module Callbacks
      include State
      attr_reader :callback_mutex

      def initialize(options={})
        @callback_mutex = Mutex.new
        remove_callbacks
        super(options)
      end

      def callbacks
        callback_mutex.synchronize { @callbacks }
      end

      def add_callback(key=:persistent, &block)
        callback_mutex.synchronize do
          @callbacks[key] ||= []
          @callbacks[key] << block
        end
      end

      def remove_callback(key=nil)
        callback_mutex.synchronize do
          key ? @callbacks.delete(key) : @callbacks = {}
        end
      end

      alias :on_data :add_callback
      alias :remove_callbacks :remove_callback

      def update(data)
        # nil will unblock #read without running callbacks.
        unless data
          remove_callback(:read)
          return nil
        end

        filtered_data = pre_callback_filter(data)

        # nil will unblock #read without running callbacks.
        unless filtered_data
          remove_callback(:read)
          return nil
        end

        callback_mutex.synchronize do
          @callbacks.each_value do |array|
            array.each do |callback|
              callback.call(filtered_data)
            end
          end
          # Remove one-time callbacks added by #read.
          @callbacks.delete(:read)
        end

        update_state(filtered_data)
      end

      # Override to process data before giving to callbacks and state.
      def pre_callback_filter(data)
        data
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
denko-0.13.6 lib/denko/behaviors/callbacks.rb
denko-0.13.5 lib/denko/behaviors/callbacks.rb
denko-0.13.4 lib/denko/behaviors/callbacks.rb
denko-0.13.3 lib/denko/behaviors/callbacks.rb
denko-0.13.2 lib/denko/behaviors/callbacks.rb
denko-0.13.1 lib/denko/behaviors/callbacks.rb
denko-0.13.0 lib/denko/behaviors/callbacks.rb