# Copyright (c) 2015 Sqreen. All Rights Reserved. # Please refer to our terms for more information: https://www.sqreen.com/terms.html # TODO: remove class vars require 'sqreen/exception' module Sqreen # Implements actions (behavior taken in response to agent signals) module Actions # Base class for actions # subclasses must also implement some methods in their singleton classes # (actions_matching, index and clear) class Base attr_reader :id, :expiry, :send_response def initialize(id, opts) @id = id duration = opts[:duration] @expiry = Time.new + duration unless duration.nil? @send_response = if opts[:send_response].nil? true else opts[:send_response] ? true : false end end # See Sqreen::CB for return values def run(*args) return if expiry && Time.new > expiry ret = do_run(*args) unless ret.nil? || !@send_response Sqreen.internal_track(event_name, 'properties' => { 'output' => event_properties(*args), 'action_id' => id, }) end ret end protected def do_run(*_args) raise ::Sqreen::NotImplementedYet, "do_run not implemented in #{self.class}" # implement in subclasses end def event_properties(*_run_args) raise ::Sqreen::NotImplementedYet, "event_properties not implemented in #{self.class}" # implement in subclasses end private def event_name "sq.action.#{self.class.type_name}" end @@subclasses = {} # rubocop:disable Style/ClassVars class << self private :new attr_reader :type_name def get_type_class(name) subclasses[name] end def known_subclasses subclasses.values end def known_types subclasses.keys end # all actions matching, possibly already expired def actions_matching(_key) raise 'implement in singletons of subclasses' end def index(_params, _action) raise 'implement in singletons of subclasses' end def clear raise 'implement in singletons of subclasses' end def inherited(subclass) class << subclass public :new end end protected def subclasses @@subclasses end def type_name=(name) @type_name = name subclasses[name] = self end end end end end