2222require_relative 'optimizely/decision_service'
2323require_relative 'optimizely/error_handler'
2424require_relative 'optimizely/event_builder'
25+ require_relative 'optimizely/event/forwarding_event_processor'
26+ require_relative 'optimizely/event/event_factory'
27+ require_relative 'optimizely/event/user_event_factory'
2528require_relative 'optimizely/event_dispatcher'
2629require_relative 'optimizely/exceptions'
2730require_relative 'optimizely/helpers/constants'
@@ -35,8 +38,8 @@ module Optimizely
3538 class Project
3639 attr_reader :notification_center
3740 # @api no-doc
38- attr_reader :config_manager , :decision_service , :error_handler ,
39- :event_builder , :event_dispatcher , :logger
41+ attr_reader :config_manager , :decision_service , :error_handler , :event_dispatcher ,
42+ :event_processor , :logger , :stopped
4043
4144 # Constructor for Projects.
4245 #
@@ -51,6 +54,7 @@ class Project
5154 # Must provide at least one of datafile or sdk_key.
5255 # @param config_manager - Optional Responds to get_config.
5356 # @param notification_center - Optional Instance of NotificationCenter.
57+ # @param event_processor - Optional Responds to process.
5458
5559 def initialize (
5660 datafile = nil ,
@@ -61,7 +65,8 @@ def initialize(
6165 user_profile_service = nil ,
6266 sdk_key = nil ,
6367 config_manager = nil ,
64- notification_center = nil
68+ notification_center = nil ,
69+ event_processor = nil
6570 )
6671 @logger = logger || NoOpLogger . new
6772 @error_handler = error_handler || NoOpErrorHandler . new
@@ -91,8 +96,14 @@ def initialize(
9196 else
9297 StaticProjectConfigManager . new ( datafile , @logger , @error_handler , skip_json_validation )
9398 end
99+
94100 @decision_service = DecisionService . new ( @logger , @user_profile_service )
95- @event_builder = EventBuilder . new ( @logger )
101+
102+ @event_processor = if event_processor . respond_to? ( :process )
103+ event_processor
104+ else
105+ ForwardingEventProcessor . new ( @event_dispatcher , @logger )
106+ end
96107 end
97108
98109 # Buckets visitor and sends impression event to Optimizely.
@@ -243,19 +254,14 @@ def track(event_key, user_id, attributes = nil, event_tags = nil)
243254 return nil
244255 end
245256
246- conversion_event = @event_builder . create_conversion_event ( config , event , user_id , attributes , event_tags )
257+ user_event = UserEventFactory . create_conversion_event ( config , event , user_id , attributes , event_tags )
258+ @event_processor . process ( user_event )
247259 @logger . log ( Logger ::INFO , "Tracking event '#{ event_key } ' for user '#{ user_id } '." )
248- @logger . log ( Logger ::INFO ,
249- "Dispatching conversion event to URL #{ conversion_event . url } with params #{ conversion_event . params } ." )
250- begin
251- @event_dispatcher . dispatch_event ( conversion_event )
252- rescue => e
253- @logger . log ( Logger ::ERROR , "Unable to dispatch conversion event. Error: #{ e } " )
254- end
255260
261+ log_event = EventFactory . create_log_event ( user_event , @logger )
256262 @notification_center . send_notifications (
257263 NotificationCenter ::NOTIFICATION_TYPES [ :TRACK ] ,
258- event_key , user_id , attributes , event_tags , conversion_event
264+ event_key , user_id , attributes , event_tags , log_event
259265 )
260266 nil
261267 end
@@ -507,6 +513,14 @@ def is_valid
507513 config . is_a? ( Optimizely ::ProjectConfig )
508514 end
509515
516+ def close
517+ return if @stopped
518+
519+ @stopped = true
520+ @config_manager . stop! if @config_manager . respond_to? ( :stop! )
521+ @event_processor . stop! if @event_processor . respond_to? ( :stop! )
522+ end
523+
510524 private
511525
512526 def get_variation_with_config ( experiment_key , user_id , attributes , config )
@@ -692,18 +706,15 @@ def validate_instantiation_options
692706 def send_impression ( config , experiment , variation_key , user_id , attributes = nil )
693707 experiment_key = experiment [ 'key' ]
694708 variation_id = config . get_variation_id_from_key ( experiment_key , variation_key )
695- impression_event = @event_builder . create_impression_event ( config , experiment , variation_id , user_id , attributes )
696- @logger . log ( Logger ::INFO ,
697- "Dispatching impression event to URL #{ impression_event . url } with params #{ impression_event . params } ." )
698- begin
699- @event_dispatcher . dispatch_event ( impression_event )
700- rescue => e
701- @logger . log ( Logger ::ERROR , "Unable to dispatch impression event. Error: #{ e } " )
702- end
709+ user_event = UserEventFactory . create_impression_event ( config , experiment , variation_id , user_id , attributes )
710+ @event_processor . process ( user_event )
711+
712+ @logger . log ( Logger ::INFO , "Activating user '#{ user_id } ' in experiment '#{ experiment_key } '." )
703713 variation = config . get_variation_from_id ( experiment_key , variation_id )
714+ log_event = EventFactory . create_log_event ( user_event , @logger )
704715 @notification_center . send_notifications (
705716 NotificationCenter ::NOTIFICATION_TYPES [ :ACTIVATE ] ,
706- experiment , user_id , attributes , variation , impression_event
717+ experiment , user_id , attributes , variation , log_event
707718 )
708719 end
709720
0 commit comments