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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c9557bce57bad2c91864640fcfff650794bb4de6d56afd3497eaa693247cc10
4
- data.tar.gz: fef9164f73131538bc7e6df11e2b5fc802a967580b65b26426aa671e5d68cc26
3
+ metadata.gz: b9b7f19e320205070a57b6af96ea48f602bae0c47dbd1820cf9dad16b459654c
4
+ data.tar.gz: d3e096d77166f68d07fade770c3345ac23cd110acaefb70dff0e060ad314dec2
5
5
  SHA512:
6
- metadata.gz: 2c0a78057cf989d08703c758f70b2c6711542c12994662ae47e5b9c67d1462aacd6e80d65b790bb287bb70e6ca03d61c60342eecb16f6c62059f4762359233ad
7
- data.tar.gz: 8a6782fb3f84ce855438f64066becfb411f46f3db8ae68504dc5a96774b6a9ed4b0a04607da386888fca6683663c2ceddd1bd466b448df2fe82f4900fc03eee5
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
- reset_request_state!
18
- @request = Rack::Request.new(env)
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
- set_visitor_cookie(headers)
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
- def reset_request_state!
53
- @request = nil
54
- @visitor_id = nil
55
- @session_id = nil
56
- @user_id = nil
57
- end
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
- def visitor_id
60
- @visitor_id ||= visitor_id_from_cookie || Visitor::Identifier.generate
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 user_id
68
- @user_id ||= user_id_from_session
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
- Thread.new { create_session }
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: request.url,
121
- referrer: request.referer
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
- # Session cookie
116
+ # Cookie setting
132
117
 
133
- def set_session_cookie(headers)
134
- Rack::Utils.set_cookie_header!(headers, SESSION_COOKIE_NAME, session_cookie_options)
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 session_cookie_options
138
- base_cookie_options.merge(
139
- value: session_id,
140
- max_age: SESSION_COOKIE_MAX_AGE
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
- # Shared cookie options
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mbuzz
4
- VERSION = "0.6.2"
4
+ VERSION = "0.6.3"
5
5
  end
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.2
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: 2025-12-12 00:00:00.000000000 Z
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.5.16
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: []