Class: Optimizely::NotificationCenter

Inherits:
Object
  • Object
show all
Defined in:
lib/optimizely/notification_center.rb

Constant Summary collapse

NOTIFICATION_TYPES =
{
  # DEPRECATED: ACTIVATE notification type is deprecated since relase 3.1.0.
  ACTIVATE: 'ACTIVATE: experiment, user_id, attributes, variation, event',
  DECISION: 'DECISION: type, user_id, attributes, decision_info',
  LOG_EVENT: 'LOG_EVENT: type, log_event',
  OPTIMIZELY_CONFIG_UPDATE: 'optimizely_config_update',
  TRACK: 'TRACK: event_key, user_id, attributes, event_tags, event'
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(logger, error_handler) ⇒ NotificationCenter

Returns a new instance of NotificationCenter.



32
33
34
35
36
37
38
# File 'lib/optimizely/notification_center.rb', line 32

def initialize(logger, error_handler)
  @notification_id = 1
  @notifications = {}
  NOTIFICATION_TYPES.each_value { |value| @notifications[value] = [] }
  @logger = logger
  @error_handler = error_handler
end

Instance Attribute Details

#notification_idObject (readonly)



21
22
23
# File 'lib/optimizely/notification_center.rb', line 21

def notification_id
  @notification_id
end

#notificationsObject (readonly)



21
22
23
# File 'lib/optimizely/notification_center.rb', line 21

def notifications
  @notifications
end

Instance Method Details

#add_notification_listener(notification_type, notification_callback = nil) { ... } ⇒ notification ID

Adds notification callback to the notification center

Parameters:

  • notification_type
    • One of the constants in NOTIFICATION_TYPES

  • notification_callback (lambda, Method, Callable) (defaults to: nil)

    (default: block) - Called when the event is sent

Yields:

  • Block to be used as callback if callback omitted.

Returns:

  • (notification ID)

    Used to remove the notification



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/optimizely/notification_center.rb', line 48

def add_notification_listener(notification_type, notification_callback = nil, &block)
  return nil unless notification_type_valid?(notification_type)

  if notification_callback && block_given?
    @logger.log Logger::ERROR, 'Callback and block are mutually exclusive.'
    return nil
  end

  notification_callback ||= block

  unless notification_callback
    @logger.log Logger::ERROR, 'Callback can not be empty.'
    return nil
  end

  unless notification_callback.respond_to? :call
    @logger.log Logger::ERROR, 'Invalid notification callback given.'
    return nil
  end

  @notifications[notification_type].each do |notification|
    return -1 if notification[:callback] == notification_callback
  end
  @notifications[notification_type].push(notification_id: @notification_id, callback: notification_callback)
  notification_id = @notification_id
  @notification_id += 1
  notification_id
end

#clean_all_notificationsObject

Deprecated.


117
118
119
120
# File 'lib/optimizely/notification_center.rb', line 117

def clean_all_notifications
  @logger.log Logger::WARN, "'clean_all_notifications' is deprecated. Call 'clear_all_notification_listeners' instead."
  clear_all_notification_listeners
end

#clear_all_notification_listenersObject

Removes all notifications



123
124
125
# File 'lib/optimizely/notification_center.rb', line 123

def clear_all_notification_listeners
  @notifications.each_key { |key| @notifications[key] = [] }
end

#clear_notification_listeners(notification_type) ⇒ Object

Removes notifications for a certain notification type

Parameters:

  • notification_type
    • one of the constants in NOTIFICATION_TYPES



109
110
111
112
113
114
# File 'lib/optimizely/notification_center.rb', line 109

def clear_notification_listeners(notification_type)
  return nil unless notification_type_valid?(notification_type)

  @notifications[notification_type] = []
  @logger.log Logger::INFO, "All callbacks for notification type #{notification_type} have been removed."
end

#clear_notifications(notification_type) ⇒ Object

Deprecated.


100
101
102
103
# File 'lib/optimizely/notification_center.rb', line 100

def clear_notifications(notification_type)
  @logger.log Logger::WARN, "'clear_notifications' is deprecated. Call 'clear_notification_listeners' instead."
  clear_notification_listeners(notification_type)
end

#notification_count(notification_type) ⇒ Object



149
150
151
# File 'lib/optimizely/notification_center.rb', line 149

def notification_count(notification_type)
  @notifications.include?(notification_type) ? @notifications[notification_type].count : 0
end

#remove_notification_listener(notification_id) ⇒ Boolean

Removes previously added notification callback

Parameters:

  • notification_id

Returns:

  • (Boolean)

    true if found and removed, false otherwise



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/optimizely/notification_center.rb', line 83

def remove_notification_listener(notification_id)
  unless notification_id
    @logger.log Logger::ERROR, 'Notification ID can not be empty.'
    return nil
  end
  @notifications.each_key do |key|
    @notifications[key].each do |notification|
      if notification_id == notification[:notification_id]
        @notifications[key].delete(notification_id: notification_id, callback: notification[:callback])
        return true
      end
    end
  end
  false
end

#send_notifications(notification_type, *args) ⇒ Object

Sends off the notification for the specific event. Uses var args to pass in a arbitrary list of parameters according to which notification type was sent

Parameters:

  • notification_type
    • one of the constants in NOTIFICATION_TYPES

  • args
    • list of arguments to the callback



134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/optimizely/notification_center.rb', line 134

def send_notifications(notification_type, *args)
  return nil unless notification_type_valid?(notification_type)

  @notifications[notification_type].each do |notification|
    begin
      notification_callback = notification[:callback]
      notification_callback.call(*args)
      @logger.log Logger::INFO, "Notification #{notification_type} sent successfully."
    rescue => e
      @logger.log(Logger::ERROR, "Problem calling notify callback. Error: #{e}")
      return nil
    end
  end
end