Class: Kameleoon::DataManager::VisitorManager

Inherits:
Object
  • Object
show all
Defined in:
lib/kameleoon/data/manager/visitor_manager.rb

Overview

VisitorManager stores Visitor instances and manages visitor sessions. It is thread-safe except stop method

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(expiration_period, log_func = nil) ⇒ VisitorManager

Returns a new instance of VisitorManager.



16
17
18
19
20
21
# File 'lib/kameleoon/data/manager/visitor_manager.rb', line 16

def initialize(expiration_period, log_func = nil)
  @expiration_period = expiration_period
  @visitors = Concurrent::Map.new
  @log_func = log_func
  start
end

Instance Attribute Details

#custom_data_infoObject

Returns the value of attribute custom_data_info.



14
15
16
# File 'lib/kameleoon/data/manager/visitor_manager.rb', line 14

def custom_data_info
  @custom_data_info
end

#expiration_periodObject (readonly)

Returns the value of attribute expiration_period.



13
14
15
# File 'lib/kameleoon/data/manager/visitor_manager.rb', line 13

def expiration_period
  @expiration_period
end

Instance Method Details

#add_data(visitor_code, *args) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/kameleoon/data/manager/visitor_manager.rb', line 54

def add_data(visitor_code, *args)
  visitor = get_or_create_visitor(visitor_code)
  for custom_data in args
    next unless custom_data.is_a?(Kameleoon::CustomData)
    # We shouldn't send custom data with local only type
    custom_data.mark_as_sent if @custom_data_info.local_only?(custom_data.id)
    # If mappingIdentifier is passed, we should link anonymous visitor with real unique userId.
    # After authorization, customer must be able to continue work with userId, but hash for variation
    # should be calculated based on anonymous visitor code, that's why set MappingIdentifier to visitor.
    if @custom_data_info.mapping_identifier?(custom_data.id) && custom_data.values.size > 0 && custom_data.values[0].size > 0
      custom_data.is_mapping_identifier = true
      visitor.mapping_identifier = visitor_code
      target_visitor_code = custom_data.values[0]
      @visitors[target_visitor_code] = visitor if visitor_code != target_visitor_code
    end
  end
  visitor.add_data(@log_func, *args)
  visitor
end

#enumerate(&blk) ⇒ Object



46
47
48
# File 'lib/kameleoon/data/manager/visitor_manager.rb', line 46

def enumerate(&blk)
  @visitors.each_pair { |vc, v| blk.call(vc, v) }
end

#get_or_create_visitor(visitor_code) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/kameleoon/data/manager/visitor_manager.rb', line 37

def get_or_create_visitor(visitor_code)
  @visitors.compute(visitor_code) do |former_v|
    next DataManager::Visitor.new if former_v.nil?

    former_v.update_last_activity_time
    former_v
  end
end

#get_visitor(visitor_code) ⇒ Object



30
31
32
33
34
35
# File 'lib/kameleoon/data/manager/visitor_manager.rb', line 30

def get_visitor(visitor_code)
  @visitors.compute_if_present(visitor_code) do |visitor|
    visitor.update_last_activity_time
    visitor
  end
end

#sizeObject



50
51
52
# File 'lib/kameleoon/data/manager/visitor_manager.rb', line 50

def size
  @visitors.size
end

#stopObject



23
24
25
26
27
28
# File 'lib/kameleoon/data/manager/visitor_manager.rb', line 23

def stop
  return if @purge_job.nil?

  @purge_job.unschedule
  @purge_job = nil
end