mbuzz 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mbuzz/middleware/tracking.rb +73 -66
- data/lib/mbuzz/version.rb +1 -1
- metadata +3 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b9b7f19e320205070a57b6af96ea48f602bae0c47dbd1820cf9dad16b459654c
|
|
4
|
+
data.tar.gz: d3e096d77166f68d07fade770c3345ac23cd110acaefb70dff0e060ad314dec2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d1efd4303b4231615e0ead723970d6880b1567df106741fa51ed55ac2bc3d442b390677d97fb2ac2b2a7d73bf36c1de606ba33559fdc2ba3909539229a38e697
|
|
7
|
+
data.tar.gz: 43e1a0c65b9c23e99d63c33044d6b6c8ef5b413d15ddfda302248a5f2af3063799fd2fe480c612e7f64e93a9c236b809ff6d5629a0f80988fb1ba6591eb02d55
|
|
@@ -5,28 +5,25 @@ require "rack"
|
|
|
5
5
|
module Mbuzz
|
|
6
6
|
module Middleware
|
|
7
7
|
class Tracking
|
|
8
|
-
attr_reader :app, :request
|
|
9
|
-
|
|
10
8
|
def initialize(app)
|
|
11
9
|
@app = app
|
|
12
10
|
end
|
|
13
11
|
|
|
14
12
|
def call(env)
|
|
15
|
-
return app.call(env) if skip_request?(env)
|
|
13
|
+
return @app.call(env) if skip_request?(env)
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
request = Rack::Request.new(env)
|
|
16
|
+
context = build_request_context(request)
|
|
19
17
|
|
|
20
|
-
env[ENV_VISITOR_ID_KEY] = visitor_id
|
|
21
|
-
env[ENV_USER_ID_KEY] = user_id
|
|
22
|
-
env[ENV_SESSION_ID_KEY] = session_id
|
|
18
|
+
env[ENV_VISITOR_ID_KEY] = context[:visitor_id]
|
|
19
|
+
env[ENV_USER_ID_KEY] = context[:user_id]
|
|
20
|
+
env[ENV_SESSION_ID_KEY] = context[:session_id]
|
|
23
21
|
|
|
24
22
|
RequestContext.with_context(request: request) do
|
|
25
|
-
create_session_if_new
|
|
23
|
+
create_session_if_new(context, request)
|
|
26
24
|
|
|
27
|
-
status, headers, body = app.call(env)
|
|
28
|
-
|
|
29
|
-
set_session_cookie(headers)
|
|
25
|
+
status, headers, body = @app.call(env)
|
|
26
|
+
set_cookies(headers, context, request)
|
|
30
27
|
[status, headers, body]
|
|
31
28
|
end
|
|
32
29
|
end
|
|
@@ -49,76 +46,64 @@ module Mbuzz
|
|
|
49
46
|
|
|
50
47
|
private
|
|
51
48
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
49
|
+
# Build all request-specific context as a frozen hash
|
|
50
|
+
# This ensures thread-safety by using local variables only
|
|
51
|
+
def build_request_context(request)
|
|
52
|
+
visitor_id = visitor_id_from_cookie(request) || Visitor::Identifier.generate
|
|
53
|
+
session_id = session_id_from_cookie(request) || generate_session_id
|
|
54
|
+
user_id = user_id_from_session(request)
|
|
55
|
+
new_session = session_id_from_cookie(request).nil?
|
|
58
56
|
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
{
|
|
58
|
+
visitor_id: visitor_id,
|
|
59
|
+
session_id: session_id,
|
|
60
|
+
user_id: user_id,
|
|
61
|
+
new_session: new_session
|
|
62
|
+
}.freeze
|
|
61
63
|
end
|
|
62
64
|
|
|
63
|
-
def visitor_id_from_cookie
|
|
65
|
+
def visitor_id_from_cookie(request)
|
|
64
66
|
request.cookies[VISITOR_COOKIE_NAME]
|
|
65
67
|
end
|
|
66
68
|
|
|
67
|
-
def
|
|
68
|
-
|
|
69
|
+
def session_id_from_cookie(request)
|
|
70
|
+
request.cookies[SESSION_COOKIE_NAME]
|
|
69
71
|
end
|
|
70
72
|
|
|
71
|
-
def user_id_from_session
|
|
73
|
+
def user_id_from_session(request)
|
|
72
74
|
request.session[SESSION_USER_ID_KEY] if request.session
|
|
73
75
|
end
|
|
74
76
|
|
|
75
|
-
def set_visitor_cookie(headers)
|
|
76
|
-
Rack::Utils.set_cookie_header!(headers, VISITOR_COOKIE_NAME, visitor_cookie_options)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def visitor_cookie_options
|
|
80
|
-
base_cookie_options.merge(
|
|
81
|
-
value: visitor_id,
|
|
82
|
-
max_age: VISITOR_COOKIE_MAX_AGE
|
|
83
|
-
)
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# Session ID management
|
|
87
|
-
|
|
88
|
-
def session_id
|
|
89
|
-
@session_id ||= session_id_from_cookie || generate_session_id
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def session_id_from_cookie
|
|
93
|
-
request.cookies[SESSION_COOKIE_NAME]
|
|
94
|
-
end
|
|
95
|
-
|
|
96
77
|
def generate_session_id
|
|
97
78
|
SecureRandom.hex(32)
|
|
98
79
|
end
|
|
99
80
|
|
|
100
|
-
def new_session?
|
|
101
|
-
session_id_from_cookie.nil?
|
|
102
|
-
end
|
|
103
|
-
|
|
104
81
|
# Session creation
|
|
105
82
|
|
|
106
|
-
def create_session_if_new
|
|
107
|
-
return unless new_session
|
|
83
|
+
def create_session_if_new(context, request)
|
|
84
|
+
return unless context[:new_session]
|
|
108
85
|
|
|
109
|
-
create_session_async
|
|
86
|
+
create_session_async(context, request)
|
|
110
87
|
end
|
|
111
88
|
|
|
112
|
-
def create_session_async
|
|
113
|
-
|
|
89
|
+
def create_session_async(context, request)
|
|
90
|
+
# Capture values in local variables for thread safety
|
|
91
|
+
visitor_id = context[:visitor_id]
|
|
92
|
+
session_id = context[:session_id]
|
|
93
|
+
url = request.url
|
|
94
|
+
referrer = request.referer
|
|
95
|
+
|
|
96
|
+
Thread.new do
|
|
97
|
+
create_session(visitor_id, session_id, url, referrer)
|
|
98
|
+
end
|
|
114
99
|
end
|
|
115
100
|
|
|
116
|
-
def create_session
|
|
101
|
+
def create_session(visitor_id, session_id, url, referrer)
|
|
117
102
|
Client.session(
|
|
118
103
|
visitor_id: visitor_id,
|
|
119
104
|
session_id: session_id,
|
|
120
|
-
url:
|
|
121
|
-
referrer:
|
|
105
|
+
url: url,
|
|
106
|
+
referrer: referrer
|
|
122
107
|
)
|
|
123
108
|
rescue => e
|
|
124
109
|
log_session_error(e)
|
|
@@ -128,22 +113,44 @@ module Mbuzz
|
|
|
128
113
|
Mbuzz.config.logger&.error("Session creation failed: #{error.message}")
|
|
129
114
|
end
|
|
130
115
|
|
|
131
|
-
#
|
|
116
|
+
# Cookie setting
|
|
132
117
|
|
|
133
|
-
def
|
|
134
|
-
|
|
118
|
+
def set_cookies(headers, context, request)
|
|
119
|
+
set_visitor_cookie(headers, context, request)
|
|
120
|
+
set_session_cookie(headers, context, request)
|
|
135
121
|
end
|
|
136
122
|
|
|
137
|
-
def
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
123
|
+
def set_visitor_cookie(headers, context, request)
|
|
124
|
+
Rack::Utils.set_cookie_header!(
|
|
125
|
+
headers,
|
|
126
|
+
VISITOR_COOKIE_NAME,
|
|
127
|
+
visitor_cookie_options(context, request)
|
|
128
|
+
)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def set_session_cookie(headers, context, request)
|
|
132
|
+
Rack::Utils.set_cookie_header!(
|
|
133
|
+
headers,
|
|
134
|
+
SESSION_COOKIE_NAME,
|
|
135
|
+
session_cookie_options(context, request)
|
|
136
|
+
)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def visitor_cookie_options(context, request)
|
|
140
|
+
base_cookie_options(request).merge(
|
|
141
|
+
value: context[:visitor_id],
|
|
142
|
+
max_age: VISITOR_COOKIE_MAX_AGE
|
|
141
143
|
)
|
|
142
144
|
end
|
|
143
145
|
|
|
144
|
-
|
|
146
|
+
def session_cookie_options(context, request)
|
|
147
|
+
base_cookie_options(request).merge(
|
|
148
|
+
value: context[:session_id],
|
|
149
|
+
max_age: SESSION_COOKIE_MAX_AGE
|
|
150
|
+
)
|
|
151
|
+
end
|
|
145
152
|
|
|
146
|
-
def base_cookie_options
|
|
153
|
+
def base_cookie_options(request)
|
|
147
154
|
options = {
|
|
148
155
|
path: VISITOR_COOKIE_PATH,
|
|
149
156
|
httponly: true,
|
data/lib/mbuzz/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mbuzz
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.6.
|
|
4
|
+
version: 0.6.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- mbuzz team
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: rack
|
|
@@ -67,7 +66,6 @@ metadata:
|
|
|
67
66
|
source_code_uri: https://github.com/mbuzz/mbuzz-ruby
|
|
68
67
|
changelog_uri: https://github.com/mbuzz/mbuzz-ruby/blob/main/CHANGELOG.md
|
|
69
68
|
documentation_uri: https://mbuzz.co/docs
|
|
70
|
-
post_install_message:
|
|
71
69
|
rdoc_options: []
|
|
72
70
|
require_paths:
|
|
73
71
|
- lib
|
|
@@ -82,8 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
82
80
|
- !ruby/object:Gem::Version
|
|
83
81
|
version: '0'
|
|
84
82
|
requirements: []
|
|
85
|
-
rubygems_version: 3.
|
|
86
|
-
signing_key:
|
|
83
|
+
rubygems_version: 3.6.7
|
|
87
84
|
specification_version: 4
|
|
88
85
|
summary: Server-side multi-touch attribution for Ruby
|
|
89
86
|
test_files: []
|