Class: SessionVision::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/sessionvision/client.rb

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ Client

Returns a new instance of Client.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/sessionvision/client.rb', line 8

def initialize(config)
  @config = config
  @lock = Mutex.new
  @registered = {}
  @shutdown_called = false

  @logger = config.debug ? Logger.new($stdout, progname: "sessionvision") : nil

  @transport = Transport.new(
    ingest_host: config.ingest_host,
    max_retries: config.max_retries,
    retry_delays: config.retry_delays,
    gzip_threshold: config.gzip_threshold,
    on_error: config.on_error,
    logger: @logger
  )

  @buffer = EventBuffer.new(
    flush_size: config.flush_size,
    flush_interval: config.flush_interval,
    send_fn: method(:send_batch),
    logger: @logger
  )
  @buffer.start

  at_exit { shutdown }

  @logger&.debug("Client initialized (host=#{config.ingest_host})")
end

Instance Method Details

#capture(event_name, user_id: nil, anonymous_id: nil, session_id: nil, properties: {}) ⇒ Object

Raises:

  • (ArgumentError)


38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/sessionvision/client.rb', line 38

def capture(event_name, user_id: nil, anonymous_id: nil, session_id: nil, properties: {})
  raise ArgumentError, "event_name must be a non-empty string" unless event_name.is_a?(String) && !event_name.empty?
  raise ArgumentError, "Either user_id or anonymous_id is required" if user_id.nil? && anonymous_id.nil?

  merged_props = @lock.synchronize { @registered.merge(properties || {}) }

  event = {
    "event" => event_name,
    "timestamp" => (Time.now.to_f * 1000).to_i,
    "properties" => merged_props,
    "sessionId" => session_id || SecureRandom.uuid
  }
  event["userId"] = user_id if user_id
  event["anonymousId"] = anonymous_id if anonymous_id

  @logger&.debug("Event captured: #{event_name}")
  @buffer.push(event)
end

#flushObject



78
79
80
# File 'lib/sessionvision/client.rb', line 78

def flush
  @buffer.flush
end

#identify(user_id, **traits) ⇒ Object

Raises:

  • (ArgumentError)


57
58
59
60
61
# File 'lib/sessionvision/client.rb', line 57

def identify(user_id, **traits)
  raise ArgumentError, "user_id must be a non-empty string" unless user_id.is_a?(String) && !user_id.empty?

  capture("$identify", user_id: user_id, properties: traits.transform_keys(&:to_s))
end

#register(**properties) ⇒ Object



63
64
65
66
67
# File 'lib/sessionvision/client.rb', line 63

def register(**properties)
  @lock.synchronize do
    properties.each { |k, v| @registered[k.to_s] = v }
  end
end

#register_once(**properties) ⇒ Object



69
70
71
72
73
74
75
76
# File 'lib/sessionvision/client.rb', line 69

def register_once(**properties)
  @lock.synchronize do
    properties.each do |k, v|
      key = k.to_s
      @registered[key] = v unless @registered.key?(key)
    end
  end
end

#resetObject



93
94
95
# File 'lib/sessionvision/client.rb', line 93

def reset
  @lock.synchronize { @registered.clear }
end

#shutdownObject



82
83
84
85
86
87
88
89
90
91
# File 'lib/sessionvision/client.rb', line 82

def shutdown
  @lock.synchronize do
    return if @shutdown_called

    @shutdown_called = true
  end

  @logger&.debug("Shutting down")
  @buffer.shutdown
end