/
tracker.rb
81 lines (68 loc) · 1.98 KB
/
tracker.rb
1
2
3
4
5
6
7
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
37
38
39
40
41
42
43
44
45
46
47
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
76
77
78
79
80
81
require "open-uri"
require 'base64'
require 'json'
require 'thread'
module Mixpanel
class Tracker
require 'mixpanel/async'
require 'mixpanel/event'
require 'mixpanel/person'
extend Mixpanel::Async
include Mixpanel::Event
include Mixpanel::Person
def initialize(token, options={})
@token = token
@async = !!options.fetch(:async, false)
@persist = !!options.fetch(:persist, false)
@env = options.fetch :env, {}
@api_key = options.fetch :api_key, nil
# Make sure queue object is instantiated to an array. If not persisted, set queue object to empty array.
if @persist
@env['rack.session'] ||= {}
@env['rack.session']['mixpanel_events'] ||= []
else
@env['mixpanel_events'] = []
end
end
def queue
@persist ? @env['rack.session']['mixpanel_events'] : @env['mixpanel_events']
end
def append(type, *args)
queue << [type, args.collect {|arg| arg.to_json}]
end
protected
def ip
(@env['HTTP_X_FORWARDED_FOR'] || @env['REMOTE_ADDR'] || '').split(',').last
end
# Walk through each property and see if it is in the special_properties.
# If so, change the key to have a $ in front of it.
def properties_hash(properties, special_properties)
properties.inject({}) do |props, (key, value)|
key = "$#{key}" if special_properties.include?(key.to_s)
value = value.to_i if value.class == Time
props[key.to_sym] = value
props
end
end
def encoded_data(parameters)
Base64.encode64(JSON.generate(parameters)).gsub(/\n/,'')
end
def request(url, async)
async ? send_async(url) : open(url).read
end
def parse_response(response)
response.to_i == 1
end
def send_async(url)
w = Mixpanel::Tracker.worker
begin
url << "\n"
w.write url
1
rescue Errno::EPIPE => e
Mixpanel::Tracker.dispose_worker w
0
end
end
end
end